Morning lead list
Turn "who started hiring X this week" into a clean, deduplicated lead list with buying-trigger context attached.
API basics
Base URL https://api.reqbeat.com. Auth header: X-API-Key (read from $RB_KEY or $REQBEAT_API_KEY; never print the key). All responses are JSON.
Primary endpoint:
GET /v1/reqs/search?role={role}&geo={country}&limit={n}
Filters: role (free text), geo (FULL country name, URL-encoded: United%20Kingdom, United%20States — full names resolve most reliably), since, industry, headcount_band, exclude_agencies (true when selling to employers, false when the targets ARE agencies), limit, cursor for pagination.
Company detail endpoints (per company_id): /v1/companies/{id}/hiring-pulse, /open-reqs, /enrichment, /first-hire, /repost-pain, /pre-action-brief.
Keyless demo (for users without a key yet): POST to https://mcp.reqbeat.com/mcp with headers Content-Type: application/json AND Accept: application/json, text/event-stream, JSON-RPC tool who_is_hiring_for with {role, geo, limit}.
Reading the response
Each company row carries a pulse object with precomputed intelligence — use it, do not recompute:
is_surge: true+direction: "up"= hottest tier, lead with thesevelocityandnew_roles_30d= hiring speed, useful for rankingmomentum= weekly buckets, quote in outreach ("from 8 to 78 open roles in a week")coverage_status: "ats_direct_hit"= data came straight from the company's ATS, highest confidencematched_reqs[]= the actual roles: useraw_title(human text),first_seen(recency claim),boards(source),country_code
Output format
Produce a table sorted by heat (surge first, then velocity):
| company | domain | matched role | first_seen | open reqs | surge | why it matters |
Rules:
- Dedupe by
company_id. Ifcompany_domainis null, mark the rowneeds-domain— it cannot be enriched or emailed until resolved (try/v1/companies/{id}/enrichment, then manual lookup). titlecan be null; fall back toraw_title.- Always report the pull timestamp (
as_of) and the exact query used, so the list is reproducible. - Paginate with
next_cursoruntil the requested list size or the well runs dry; say which happened. - Never fabricate rows. An empty result is an empty result: report it and suggest widening role text or dropping filters one at a time to find which filter zeroed it.
Prospecting recipes
- Morning list: role + geo + limit 25, keep surge/up rows, output table + one-line trigger per row.
- Agency-in-buying-mode (selling TO recruitment agencies): search BD/business development/consultant roles with
exclude_agencies=false, keep companies whose names look like agencies (Recruitment, Search, Talent, Staffing, Resourcing) — an agency hiring revenue people is an agency short of clients. - Niche spike: same role query on consecutive days; diff against yesterday's list (ask for it or store one); new entrants are the "reason to care this morning" rows.
- Watch instead of poll: offer
POST /v1/watcheswith criteria +POST /v1/webhookswhen the user wants push instead of a daily pull.
Budget behavior
Check /v1/usage when a session does many calls; tell the user their call count. Prefer one limit=25 call over five limit=5 calls.
Incremental pulls (new since server.json v1.0)
For a true morning diff, the MCP server also ships get_changes: a ledger of hiring events with since-cursor pagination. Instead of re-searching and deduplicating, pull only what changed since your last cursor and append it to the list. Store the cursor between runs.