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

FieldTypeDescription
limitnumberMax results to return. Capped by your plan's page size (Free 25, Builder and Growth 100, Scale and Business 500).
offsetnumberNumber of results to skip (offset pagination).
pagenumberPage index (alternative to offset).
cursorstringOpaque cursor for the next page, from metadata.next_cursor.
include_total_resultsbooleanInclude the total match count in metadata.total_results (otherwise null).
order_byobject[]Only newest first is supported: [{ "field": "posted_at", "desc": true }]. See ordering.

See pagination for how these interact.

Technologies

FieldTypeDescription
include_technologiesbooleanAdd technologies, the graded list of technologies each posting names, to every job. Default false, and the field is then absent from the response.

include_technologies does not change which jobs match; it adds a field, and it is billed. Each returned job that names at least one technology costs 1 extra credit, once per job per calendar month. A job with no technologies costs nothing extra. metadata.technologies_credits_charged and metadata.technologies_already_paid report this part, and metadata.credits_charged includes it. To filter jobs by the technologies their company uses, see company_technology_slug_or.

Job title

FieldTypeDescription
job_title_orstring[]Match jobs whose title contains any of these.
job_title_notstring[]Exclude jobs whose title contains any of these.

Both match a case-insensitive substring of the title, so "engineer" also matches "Engineering Manager", and "product manager" already covers Senior, Staff and Principal Product Manager. There is no synonym expansion: "ML engineer" does not match "Machine Learning Engineer", so list each phrasing you want once. Terms of four characters or fewer ("UX", "MLE") match as whole words, so "UX" finds "UX Designer" but not "Flux Engineer". job_title_not drops a job that contains any of its terms.

Description

FieldTypeDescription
description_orstring[]Match jobs whose description contains every word of any of these phrases.
description_notstring[]Exclude jobs whose description contains every word of any of these phrases.

This is word matching, not phrase matching. A job matches when its description contains every word of a phrase, case-insensitive, in any order: "senior python" matches a posting with "Python" in one paragraph and "senior" in another. Phrases in the array are ORed. When the term is a known skill, skills_or is the better filter.

Location

FieldTypeDescription
job_country_code_orstring[]Match any of these ISO country codes, e.g. ["US","GB"].
job_country_code_notstring[]Exclude these ISO country codes.
job_location_orstring[]Match jobs whose city or region contains any of these, e.g. ["Seattle","WA"]. Metro wrappers are stripped, a subdivision named outright matches every spelling of it, short terms are codes or exact names, and a country matches the whole country (see below). Combine with job_country_code_or to disambiguate same-named cities.
city_orstring[]Whole city names, e.g. ["London","Munich"]. Matches the job's normalized_city (so "München" finds Munich, and a posting filed under a district such as Mayfair is found by London), and the stored spelling case-insensitively with any metro wrapper ignored. A city we hold no canonical name for matches its stored value exactly.
region_orstring[]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".
metro_code_orstring[]Match any of these US CBSA metro codes, e.g. ["35620"] for New York. Resolved from the job's city/region; non-US jobs never match.
remotebooleantrue for remote-only, false to exclude remote.
work_arrangement_orstring[]Match any of "remote", "hybrid", "onsite".

region_or is the precise way to ask for a state or province, and city_or for a city. job_location_or substring-matches the city or the region, so ["Ontario"] also returns jobs in Ontario, California, while region_or: ["CA-ON"] returns only the province; ["London"] also returns Londonderry, while city_or: ["London"] returns London in every spelling a board used.

job_location_or also matches common variants of a term: "Greater London" matches London, "Greater Toronto Area" matches Toronto, "NYC" matches New York, and a US state, Canadian province or UK nation by name ("Pennsylvania", "Ontario", "England") also matches its code (PA, ON, ENG). "City, Region" still means the city: "Dallas, Texas" does not widen to all of Texas.

Terms of three characters or fewer match whole values, never substrings: "WA" is Washington state, "NSW" is New South Wales, "Ulm" is Ulm (send "Neu-Ulm" separately). A country by code ("UK", "AE") or name ("Portugal") matches the whole country. Where a two-letter code is both a US state and a country (CA, DE, IN, PA), the state wins; use job_country_code_or for the country. "Jersey" is the Channel Island, not Jersey City, and "Panama" is the country, not Panama City.

For a multi-location posting, every place is listed in cities, and the filters match the first one. A posting whose location is only a country or "Remote" has no city or region, so a city or state filter drops it unless you pass include_unknown: ["location"] (see unknown values).

work_arrangement_or separates hybrid from onsite, which remote cannot. Jobs with an unknown arrangement never match it.

About 17% of postings carry an arrangement, so work_arrangement_or returns a partial slice. Use remote for breadth and work_arrangement_or when you need hybrid and onsite told apart. See field coverage.

Posted date

FieldTypeDescription
posted_at_max_age_daysnumberOnly postings newer than this many days.
posted_at_gtestringOnly postings on or after this date (YYYY-MM-DD).
posted_at_ltestringOnly postings on or before this date (YYYY-MM-DD).
discovered_at_gtestringOnly postings JobsPipe first saw at or after this UTC datetime (YYYY-MM-DD HH:MM:SS).

discovered_at_gte tracks when JobsPipe first saw a posting, not when it was posted. Use it to poll: pass the time of your last run to get everything new since then, including older postings found late, which a posted_at_gte window would miss.

Status

FieldTypeDescription
statusstringactive (default), closed, or any.
last_verified_max_age_daysnumberOnly jobs seen on their source within this many days.

Search returns only active postings unless you ask otherwise. closed returns closed postings and any returns both. Closed jobs carry closed_at and closed_reason: closed, gone, stale or superseded (an older copy of a posting now held under a newer id).

A posting stays active until a recheck finds it gone. last_verified_max_age_days: 14 keeps only jobs seen on their source in the last two weeks; each job's last_seen_at shows when.

Company

FieldTypeDescription
company_name_orstring[]Match any of these company names (exact).
company_name_partial_match_orstring[]Match any of these company names (partial / contains).
company_technology_slug_orstring[]Jobs at companies that use any of these technologies. At most 10.
min_employee_countnumberCompanies with at least this many employees.
max_employee_countnumberCompanies with at most this many employees.
min_revenue_usdnumberCompanies with at least this much annual revenue, in US dollars.
max_revenue_usdnumberCompanies with at most this much annual revenue, in US dollars.
lei_orstring[]Companies with one of these Legal Entity Identifiers, or in a group one of them heads.
company_key_orstring[]Exactly these companies, by the company ids the Companies endpoints return.
company_hq_country_orstring[]Companies headquartered in one of these countries (ISO 3166-1 alpha-2).
company_hq_country_notstring[]Companies headquartered outside these countries.

min_employee_count uses the exact headcount, or else the lower bound of the size band (a "10,000+" company has at least 10,000 people). max_employee_count uses the exact headcount, or else matches when the band starts at or below the maximum: an "11-50" company matches max_employee_count: 100 and a "10,000+" one does not. Companies of unknown size are dropped unless include_unknown contains company_size.

min_revenue_usd and max_revenue_usd filter on the company's estimated annual revenue in US dollars: revenue_usd, or the middle of the revenue_low_usd-revenue_high_usd band when only a band is known. Both bounds are inclusive. Companies with no revenue on record are dropped unless include_unknown contains company_revenue:

{
  "job_title_or": ["controller", "cfo"],
  "min_revenue_usd": 5000000,
  "max_revenue_usd": 10000000,
  "include_unknown": ["company_revenue"]
}

lei_or takes Legal Entity Identifiers (ISO 17442). Matches jobs at a company with one of these LEIs or at any company in the corporate group the LEI heads, so the LEI of a parent company returns the jobs of its subsidiaries too. Send 1 to 50 LEIs of 20 letters and digits; case is ignored, and a comma-separated string is accepted in place of a list. Jobs at companies without a known LEI never match. Each job shows the company's LEI and group in company_object.intelligence:

{
  "lei_or": ["5493001KJTIIGC8Y1R12"],
  "job_title_or": ["analyst"]
}

A malformed LEI, an empty list or more than 50 LEIs returns 400 naming lei_or. Like every search, a page that matches nothing costs no credits.

company_key_or takes company ids from the Companies endpoints: the key of a row of companies hiring for a search, or of a company profile. It matches only jobs at exactly those companies. company_name_or also matches longer names that start with the one you send, which suits a typed name; company_key_or never does, so Apple's id returns Apple's jobs and not Apple Bank's. Send 1 to 50 ids as strings of digits (they do not fit a JSON number); a comma-separated string is accepted:

{
  "company_key_or": ["14189461223778919517"],
  "posted_at_max_age_days": 30
}

An id that is not a string of digits, an empty list or more than 50 ids returns 400 naming company_key_or.

company_hq_country_or filters on where the company is headquartered, not where the job is. Combine it with job_country_code_or for, say, German companies hiring in the United States:

{
  "company_hq_country_or": ["DE"],
  "job_country_code_or": ["US"]
}

Codes are ISO 3166-1 alpha-2; case is ignored, and a comma-separated string is accepted in place of a list. Companies with no known headquarters match neither. Anything other than a two-letter code returns 400 naming the field.

To filter by industry instead, use isic_division_or.

company_technology_slug_or keeps jobs at companies whose own postings show any of up to 10 technologies at the likely evidence tier or stronger. It filters by company, so a matching company's other jobs are returned too; combine it with job_title_or or description_or to keep only the roles that name the technology.

Source

FieldTypeDescription
source_orstring[]Match any of these sources.
source_notstring[]Exclude these sources.

Accepted values, the same strings a job carries in sources[].provider:

GroupValues
Job boardslinkedin, indeed, cvlibrary, resumelibrary, ycombinator, arbeitnow, himalayas, jobicy, themuse, remoteok, workingnomads, landingjobs, remotive, rise, bayt
Public employment serviceseures, jobtech
ATS (company career sites)greenhouse, workday, ashby, lever, workable, recruitee, personio, smartrecruiters, breezy, paylocity, manatal, jobscore, teamtailor, pinpoint, hirehive

Matching ignores case, spaces and punctuation, so CV-Library, cv library and cvlibrary are the same value. Aliases: yc for ycombinator, breezyhr for breezy.

To get only ATS-direct postings, pin the ATS list. Excluding indeed and linkedin is not enough: the other job boards and public employment services would still match.

{ "source_or": ["greenhouse", "workday", "ashby", "lever", "workable", "recruitee", "personio", "smartrecruiters", "breezy", "paylocity", "manatal", "jobscore"] }

To drop the two largest boards and keep everything else:

{ "source_not": ["indeed", "linkedin"] }

An unrecognized source is not an error: in source_or it matches nothing, and in source_not it excludes nothing.

Employer type

FieldTypeDescription
employer_type_orstring[]Match any of employer, agency, broker.
employer_type_notstring[]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.

Companies are classified once, so a new company is unclassified for up to a day. Unclassified postings come back as "employer" and are included in employer_type_or: ["employer"]. employer_type_not excludes only classified agencies and brokers.

Seniority

FieldTypeDescription
job_seniority_orstring[]Match any of these seniority levels, e.g. ["Senior"].
include_unlabeled_senioritybooleanAlso return jobs whose seniority is unknown.

Responses report entry_level, mid_level, senior, director and executive. The filter also accepts entry, mid, lead, exec, internship and associate, case-insensitively. director and lead are the same level, so a principal individual contributor can appear under director; use is_manager to tell them apart.

Most postings state no level (about 10% carry one), and job_seniority_or drops unlabeled jobs. Set include_unknown: ["seniority"] (or include_unlabeled_seniority: true) to keep them.

Employment type

FieldTypeDescription
employment_type_orstring[]Match any of full-time, part-time, contract, temporary, internship.
include_unlabeled_employment_typebooleanAlso return jobs whose employment type is unknown.

Underscored and unhyphenated spellings work too (full_time, fulltime), as do temp and intern.

When a source gives no employment type, it is read from the title ("Paralegal - Contract") or a labelled field in the posting. A title that says intern, internship, co-op, extern or summer associate is always internship.

Postings with no type are dropped by employment_type_or. Few postings carry contract, so a company filter plus employment_type_or: ["contract"] often returns nothing. Set include_unknown: ["employment_type"] (or include_unlabeled_employment_type: true) to keep them.

Language

FieldTypeDescription
language_orstring[]Match postings written in any of these languages, as lowercase ISO 639-1 codes, e.g. ["en"].
language_notstring[]Exclude postings written in any of these languages.

This is the language a posting is written in, not the language of its country. Many Swedish and German postings are written in English, for example. To get English-language roles across the Nordics:

{ "job_country_code_or": ["SE", "NO", "DK", "FI"], "language_or": ["en"] }

Codes are two-letter ISO 639-1 (en, sv, de, fr). Anything else is ignored, so eng or en-GB does not mean en.

Unlabelled postings never match language_or and are never dropped by language_not. Set include_unknown: ["language"] to keep them in a language_or search.

Occupation, industry & skills

Each posting's role is classified into an ISCO-08 occupation, its employer into an ISIC Rev.4 industry division, and its text is tagged with skills.

FieldTypeDescription
skills_orstring[]Match jobs tagged with any of these skill slugs, e.g. ["python", "kubernetes"].
esco_skill_id_orstring[]Match jobs tagged with any of these ESCO skill concept IDs (exact match). See each job's esco_skills for the id/label pairs.
occupation_code_orstring[]ISCO-08 occupation codes. 4-digit codes match exactly ("2512" Software Developers); 1-3 digits match as prefixes ("25" = all ICT professionals).
isic_division_orstring[]ISIC Rev.4 industry divisions of the employer (2-digit), e.g. ["62"] Computer programming and consultancy.

Salary

FieldTypeDescription
min_salary_usdnumberOnly jobs whose posted salary reaches this annual USD amount.

It compares the top of the posted range, annualized. Jobs without a posted salary never match; estimated salaries are not used.

Visa sponsorship & benefits

FieldTypeDescription
visa_sponsorship_orstring[]Match any of offers, no, citizenship_required.
benefits_orstring[]Match jobs advertising any of these benefit slugs, e.g. ["401k", "health_insurance"].

visa_sponsorship_or matches the stance read from the posting text: offers (sponsorship available), no (explicitly not), or citizenship_required (citizenship or a security clearance required). Postings that say nothing never match.

Benefits come from a source's structured benefit fields, today mainly Indeed. Slugs: health_insurance, dental_insurance, vision_insurance, life_insurance, disability_insurance, paid_time_off, paid_holidays, 401k, 401k_matching, retirement_plan, tuition_reimbursement, parental_leave, flexible_spending_account, health_savings_account, employee_discount, commuter_assistance, employee_assistance_program, flexible_schedule, bonus, signing_bonus, profit_sharing, equity, paid_training, professional_development, free_parking, relocation_assistance, wellness_program, referral_program, childcare, loan_repayment, phone_reimbursement, work_from_home. Any spelling works: "health insurance" and "Health-Insurance" both mean health_insurance.

Unknown values & coverage

FieldTypeDescription
include_unknownstring[]Also match jobs whose value is unknown for these fields.

Every filter drops postings whose value is unknown: a job with no seniority never matches job_seniority_or. include_unknown keeps them for the fields you list: employment_type, seniority, work_arrangement, location, occupation, industry, visa_sponsorship, benefits, company_size, company_revenue, salary, language. location widens region_or within that region's country, and job_location_or only when job_country_code_or is also set. include_unknown_size, include_unlabeled_seniority and include_unlabeled_employment_type still work as aliases.

When a request filters on one of those fields, metadata.field_coverage reports the share of active postings from the last 30 days that carry it, overall and per source. A low number next to few results means "unknown", not "none exist".

"field_coverage": {
  "region_or": { "field": "region", "filled_pct": 91.4, "by_source": { "linkedin": 98.2, "greenhouse": 80.1 } }
}

Applicants & contacts

FieldTypeDescription
max_applicant_countnumberOnly jobs with at most this many applicants.
has_recruiter_emailbooleantrue for only jobs with a recruiter contact email parsed from the posting, false for only jobs without one.

Applicant counts exist only where the source publishes them (mainly LinkedIn), so max_applicant_count drops every job without a count.

Ghost score

FieldTypeDescription
max_ghost_scorenumberExclude jobs whose ghost-likelihood score (0-100) exceeds this.

Unscored jobs pass. See ghost_score.

By ID

FieldTypeDescription
job_id_orstring[]Return jobs matching any of these IDs.
job_idsstring[]Look up a specific set of job IDs.

Deprecated

blur_company_data is accepted but ignored, and has_blurred_data is always false. To size a search before paying for it, send include_total_results: true with limit: 1.

Unknown or misspelled fields are rejected with 400, and the error names the field.

On this page