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.
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
Request body
Response
Successful Response
Changes
No recorded changes to this operation across all 1 revision of this API.