Filter Reference
Every filter accepted by POST /v1/jobs/search.
All filters are optional fields in the JSON request body of POST /v1/jobs/search. Filters combine with AND. Array filters ending in _or match any of their values; those ending in _not exclude their values.
Pagination & ordering
| Field | Type | Description |
|---|---|---|
limit | number | Max results to return. Capped by your plan's page size (Free 25 / Builder 100 / Scale 500). |
offset | number | Number of results to skip (offset pagination). |
page | number | Page index (alternative to offset). |
cursor | string | Opaque cursor for the next page, from metadata.next_cursor. |
order_by | object[] | Sort order, e.g. [{ "field": "date_posted", "desc": true }]. |
include_total_results | boolean | Include the total match count in metadata.total_results (otherwise null). |
See pagination for how these interact.
Job title
| Field | Type | Description |
|---|---|---|
job_title_or | string[] | Match jobs whose title contains any of these. |
job_title_not | string[] | Exclude jobs whose title contains any of these. |
Both match a case-insensitive substring of the title, so "engineer" also matches
"Engineering Manager". job_title_not terms are excluded independently: a job is dropped if it
contains any of them.
Description
| Field | Type | Description |
|---|---|---|
description_or | string[] | Match jobs whose description contains any of these. |
description_not | string[] | Exclude jobs whose description contains any of these. |
The same case-insensitive substring match, run over the full posting text. Use it for a
requirement that rarely appears in the title. When the term is in the skills lexicon, skills_or
asks the same question against the extracted slugs and is the better filter.
Location
| Field | Type | Description |
|---|---|---|
job_country_code_or | string[] | Match any of these ISO country codes, e.g. ["US","GB"]. |
job_country_code_not | string[] | Exclude these ISO country codes. |
job_location_or | string[] | Match jobs whose city or region contains any of these, e.g. ["Seattle","WA"]. Combine with job_country_code_or to disambiguate same-named cities. |
region_or | string[] | US states and Canadian provinces as ISO 3166-2 codes, e.g. ["US-NY","CA-ON"]. Matches every spelling a job board publishes, so "CA-ON" finds both "ON" and "Ontario". |
remote | boolean | true for remote-only, false to exclude remote. |
work_arrangement_or | string[] | Match any of "remote", "hybrid", "onsite". |
region_or is the precise way to ask for a state or province. job_location_or substring-matches
the city or the region, so ["Ontario"] also returns jobs in Ontario, California, while
["CA-ON"] returns only the province.
work_arrangement_or is finer than remote, which answers false for hybrid and onsite alike
and so cannot separate the two. Jobs whose arrangement we do not know never match it, which makes
it stricter than the boolean rather than a drop-in replacement.
work_arrangement is not populated yet, so work_arrangement_or currently matches zero jobs. It
fills in as postings are re-ingested and backfilled - use remote until then. See
field coverage.
Posted date
| Field | Type | Description |
|---|---|---|
posted_at_max_age_days | number | Only postings newer than this many days. |
posted_at_gte | string | Only postings on or after this date (YYYY-MM-DD). |
posted_at_lte | string | Only postings on or before this date (YYYY-MM-DD). |
discovered_at_gte | string | Only postings JobsPipe first saw at or after this UTC datetime (YYYY-MM-DD HH:MM:SS). |
discovered_at_gte tracks when we first saw a posting, not when it was posted. That makes it the
one to poll with: pass the timestamp of your last run and you get everything new to the corpus
since then, including older postings we discovered late, which a posted_at_gte window would miss.
Status
| Field | Type | Description |
|---|---|---|
status | string | active (default), closed, or any. |
Search returns only active postings unless you ask otherwise. closed returns postings a recheck
found gone, and any returns both. Closed jobs carry closed_at and closed_reason, which is
closed, gone or stale.
Company
| Field | Type | Description |
|---|---|---|
company_name_or | string[] | Match any of these company names (exact). |
company_name_partial_match_or | string[] | Match any of these company names (partial / contains). |
min_employee_count | number | Companies with at least this many employees. |
max_employee_count | number | Companies with at most this many employees. |
min_employee_count uses the exact headcount where we have one and otherwise the lower bound of
the company's size band, since a "10,000+" company certainly has at least 10,000 people.
max_employee_count uses the exact headcount only -- a band has no known upper bound, so those
companies are excluded rather than wrongly included. Either way, narrowing by company size also
narrows to companies whose size we know. To filter by industry instead, use
isic_division_or, which classifies the hiring company under ISIC Rev.4.
Source
| Field | Type | Description |
|---|---|---|
source_or | string[] | Match any of these collector sources (OR). |
source_not | string[] | Exclude these collector sources. |
Accepted values: linkedin, indeed, ycombinator (aliases: yc, y combinator), workday,
greenhouse, workable, smartrecruiters, ashby, lever, paylocity.
To get only ATS-direct postings, exclude the boards — this keeps working as new ATS sources are added:
{ "source_not": ["indeed", "linkedin"] }Or pin an exact include list when you want only specific sources:
{ "source_or": ["workday", "greenhouse", "workable", "smartrecruiters", "ashby", "lever", "paylocity"] }An unrecognized source is not an error: in source_or it matches nothing (the request returns
zero jobs, so assert a non-zero count in integrations), and in source_not it excludes nothing.
Employer type
| Field | Type | Description |
|---|---|---|
employer_type_or | string[] | Match any of employer, agency, broker. |
employer_type_not | string[] | Exclude these employer types. |
employer hires for itself, agency is a staffing or recruitment firm posting for a client, and
broker is a job board republishing another company's listing.
The classifier behind this has not run yet, so every stored posting is unclassified and comes back
as "employer". employer_type_or: ["employer"] therefore matches everything, because unclassified
postings are deliberately included in it; ["agency"] or ["broker"] matches nothing; and
employer_type_not excludes nothing, because unclassified postings are not any of the three
values. Both filters are accepted and stable, but neither narrows results today.
Seniority
| Field | Type | Description |
|---|---|---|
job_seniority_or | string[] | Match any of these seniority levels, e.g. ["Senior"]. |
include_unlabeled_seniority | boolean | Also return jobs whose seniority is unknown. |
Responses report entry_level, mid_level, senior, director and executive. The filter
accepts those and also entry, mid, lead, exec, internship and associate, matched
case-insensitively. director and lead are the same bucket, which is why an
individual-contributor principal can appear under director - use
is_manager to tell them apart.
Most postings state no level at all - 31.2% carry one in the
coverage sample - and job_seniority_or drops every
unlabeled job. Set include_unlabeled_seniority: true to keep them.
Employment type
| Field | Type | Description |
|---|---|---|
employment_type_or | string[] | Match any of full-time, part-time, contract, temporary, internship. |
Underscored and unhyphenated spellings work too (full_time, fulltime), as do temp and
intern. Postings whose type the source never stated match none of the values.
Occupation, industry & skills
Every posting is classified against international standards: the role into an ISCO-08 occupation unit group, the employer into an ISIC Rev.4 industry division, and the text against a curated skills lexicon.
| Field | Type | Description |
|---|---|---|
skills_or | string[] | Match jobs tagged with any of these skill slugs, e.g. ["python", "kubernetes"]. |
occupation_code_or | string[] | ISCO-08 occupation codes. 4-digit codes match exactly ("2512" Software Developers); 1-3 digits match as prefixes ("25" = all ICT professionals). |
isic_division_or | string[] | ISIC Rev.4 industry divisions of the employer (2-digit), e.g. ["62"] Computer programming and consultancy. |
By ID
| Field | Type | Description |
|---|---|---|
job_id_or | string[] | Return jobs matching any of these IDs. |
job_ids | string[] | Look up a specific set of job IDs. |
Preview mode
| Field | Type | Description |
|---|---|---|
blur_company_data | boolean | Mask employer identity and links, and charge no credits. |
With blur_company_data: true the response masks company, company_domain, url, source_url,
description and every identifying field of company_object, empties hiring_team, and sets
has_blurred_data: true. Job titles, locations, salary, dates and the result counts stay readable,
and the call bills zero credits, so it is the way to size a search before paying for it.
The request schema is strict: unknown or misspelled fields are rejected with an HTTP 400, and the error names the offending field. The fields above are the supported, stable filters - use them exactly as spelled.