Find live reqs matching an ICP

The live reqs matching a full ICP definition -- "senior Go roles at 51-200-person fintechs in the EU, agencies excluded" -- as a page you pull, rather than a webhook you register and wait on.

criteria is the same closed vocabulary a watch takes (POST /v1/watches), evaluated here in SQL instead of on the dispatcher's tick: three namespaced groups (company, req, event), AND across groups and fields, OR within a field. A field outside the vocabulary is a 422, and so is one this projection cannot answer -- event.function (a Python-derived taxonomy bucket, not a column; use req.function) and event.event_type (a ledger transition, where a row here is a live posting; use /v1/events). Never a silently-ignored filter: a dropped criterion answers a wider question than the caller asked.

A NULL fact never matches (fail-closed), so a criterion on a sparse facet is honestly narrow rather than wrong. The one exception is req.q_excludes, which vetoes and therefore does NOT fire on an absent title -- an unknown fact cannot prove an exclusion either.

POST rather than GET because criteria is a nested object; a URL-encoded AND-of-ORs would be an invented serialization, which is the open grammar the closed vocabulary exists to refuse.

Rows carry the normalized req layer no other route serves -- skills, seniority, job family, declared and inferred compensation (with salary_estimate_samples, so an estimate can be judged rather than trusted), the eligibility block, apply actionability, lifecycle and dedup -- plus req_key, the ledger's own identity for the req, so a page joins to /v1/events.

salary_min_usd and salary_max_usd are the pay band: either alone is half-open, both together bracket one comparable yearly-USD figure per row. That figure is the employer's declared salary when there is one (the midpoint of a declared range) and our inferred median otherwise, and the inferred one qualifies only above a sample floor -- so a band is never satisfied by a thinly-evidenced guess, and never half by the employer's number and half by ours. A req with no salary at all matches no band (fail-closed), and an inverted band is a 422 rather than a confidently empty page.

exclude_agencies (default true) removes staffing agencies, aggregators and job boards, so a row names the employer. live_only (default true) keeps expired and superseded postings out. Keyset-paginated: pass the previous page's next_cursor, which is monotone, so it doubles as "everything new since my last call". limit is bounded -- this endpoint meters the billed source_row atom off its own serialized rows, so an out-of-range page is a 422 rather than a silent truncation.

include_pulse (default false) adds companies: the hiring pulse of every company on the page, keyed by company_id and shaped like the pulse /v1/reqs/search embeds, so a page of reqs needs no follow-up call per company. It is not billed separately; the page still bills per row.

Requires the read scope.

post/v1/reqs/qualified

Request

  • Base URL: https://api.reqbeat.com
  • URL: https://api.reqbeat.com/v1/reqs/qualified
  • Auth: one of:
    • API key in header X-API-Key
    • HTTP bearer

Headers

Idempotency-Keystring nullable

Request body

exclude_agenciesboolean
live_onlyboolean
salary_min_usdnumber nullable
salary_max_usdnumber nullable
sincestring date-time nullable
cursorinteger nullable
limitinteger
include_pulseboolean

Also return companies: the hiring pulse of each company on the page, once per company.

Response

Successful Response

next_cursorinteger nullable required
as_ofstring date-time required
companiesobject nullable

Only with include_pulse: each company on the page, keyed by company_id, with the same hiring pulse /v1/reqs/search embeds.

Changes

No recorded changes to this operation across all 1 revision of this API.