Job Schema

Every field returned for a job, plus the response metadata.

POST /v1/jobs/search returns { metadata, data }, where data is an array of job objects. Every job has the same shape whatever its source. Most fields are null when the source does not supply them.

Metadata

FieldTypeDescription
total_resultsnumber | nullTotal matches. null unless include_total_results was set.
truncated_resultsnumberNumber of jobs returned in this data array.
total_companiesnumber | nullTotal distinct companies across matches, when computed.
truncated_companiesnumberDistinct companies in this page.
next_cursorstring | nullCursor for the next page, or null if there are no more results.
credits_charged, jobs_already_paid, credits_remaining, credits_allowancenumberWhat the call cost and what is left. See jobs search.
FieldTypeDescription
idstring | numberStable ID of the posting on its source. Store it to look the job up later.
job_titlestringThe posting's job title.
normalized_titlestring | nullTitle normalized to a canonical form.
urlstring | nullCanonical posting URL.
final_urlstring | nullAlways null. See reserved fields.
source_urlstring | nullURL on the source the job was first seen on.
sourcesobject[]Every source the job has been seen on.
companystring | nullHiring company name.
company_domainstring | nullCompany website domain, for CRM and account matching.
company_objectobject | nullStructured company details, or null when nothing beyond the name is known.

id is the posting's ID on its source, so its format varies (a number, a UUID, a hex string). Treat it as an opaque string.

A role listed on two boards is returned as one record, attributed to one source. Look it up by that source's ID; the other board's ID returns nothing.

company_object

FieldTypeDescription
namestring | nullCompany name.
domainstring | nullBare website host, e.g. stripe.com.
urlstring | nullCompany website.
logostring | nullLogo image URL.
employee_countnumber | nullHeadcount. May be an estimate.
employee_count_minnumber | nullLower bound when only a size band is known (10000 for "10,000+").
linkedin_urlstring | nullCompany LinkedIn page.
descriptionstring | nullCompany description.
locationobject | nullHeadquarters: street, city, region, postal_code, country.
foundedstring | nullYear the company was founded, where known.
intelligenceobject | nullRevenue, legal identity and entity type of the employer. See below.

Every field can be null on its own, so a job may carry a domain and a logo but no employee_count. The object is null when nothing beyond the name is known, so if (job.company_object) is a safe test.

company_object.intelligence

The employer as a business: revenue, type of organisation and legal identity. It is resolved in the posting's country, so the same name in two countries can carry two different records.

FieldTypeDescription
revenue_usdnumber | nullMost recent known annual revenue, converted to US dollars.
revenue_yearnumber | nullFiscal year the revenue figure refers to.
revenue_sourcestring | nullShort identifier of the revenue figure's origin.
revenue_confidencestring | nullHow the figure was obtained. One of the values below.
entity_kindstring | nullcompany, branch, public_sector or staffing_agency.
founded_yearnumber | nullYear the legal entity was founded or registered.
headcountnumber | nullEmployee count recorded for the legal entity. Can differ from employee_count.
industrystring | nullIndustry of the legal entity.
hq_regionstring | nullRegion or state of the headquarters, e.g. California.
hq_citystring | nullCity of the headquarters.
revenue_low_usdnumber | nullLower bound of the revenue range in US dollars, when a range is known.
revenue_high_usdnumber | nullUpper bound of the revenue range in US dollars, when a range is known.
headcount_lownumber | nullLower bound of the headcount range, when a range is known.
headcount_highnumber | nullUpper bound of the headcount range, when a range is known.
leistring | nullThe company's Legal Entity Identifier (ISO 17442), 20 characters.
legal_namestring | nullThe registered legal name of the entity lei identifies.
group_leistring | nullThe LEI of the corporate group the company belongs to: its ultimate parent, or its direct parent when no ultimate parent is recorded.
group_namestring | nullThe registered legal name of the entity group_lei identifies.

revenue_confidence tells you how far to trust revenue_usd, strongest first:

ValueMeaning
filedTaken from the company's statutory accounts.
reportedStated by the company itself.
bandOnly an estimated range is known; revenue_usd is a representative figure within it.
derivedEstimated from funding or valuation.
extractedRead from public text about the company.
"intelligence": {
  "revenue_usd": 12500000,
  "revenue_year": 2025,
  "revenue_source": null,
  "revenue_confidence": "filed",
  "entity_kind": "company",
  "founded_year": 1998,
  "headcount": 140,
  "industry": "Software publishing",
  "hq_region": "California",
  "hq_city": "South San Francisco",
  "revenue_low_usd": null,
  "revenue_high_usd": null,
  "headcount_low": null,
  "headcount_high": null,
  "lei": "5493001KJTIIGC8Y1R12",
  "legal_name": "EXAMPLE SOFTWARE INC.",
  "group_lei": "213800ABCDEFGHIJKL12",
  "group_name": "EXAMPLE HOLDINGS PLC"
}

intelligence is null when there is no record for the company in that country. Inside it, every field is null when unknown: a company with no disclosed revenue still carries its entity_kind and lei, and a company known only by its legal entity still has an intelligence object.

The legal-entity fields are null when:

  • lei and legal_name: we have not identified the company's legal entity in the posting's country.
  • group_lei and group_name: the company has no recorded parent, or lei is null. A company that heads its own group can carry its own LEI as group_lei.

To search by LEI, including every company of a group, use lei_or.

sources

FieldTypeDescription
providerstringSource name, e.g. linkedin, greenhouse.
urlstring | nullThe posting's URL on that source.
seen_atstring | nullWhen the job was seen on that source.

sources is present on every job and normally holds one entry. Read it as an array, but do not expect it to list every board a role appears on. source_url matches sources[0].url.

Dates & lifecycle

FieldTypeDescription
date_postedstring | nullWhen the job was posted, in the source's own format.
discovered_atstring | nullWhen JobsPipe first ingested the posting.
last_seen_atstring | nullWhen we last saw the posting live, on a collection run or a recheck (YYYY-MM-DD HH:MM:SS, UTC). Usually null once the posting is closed.
verified_atstring | nullWhen we last updated the posting's status: a collection run, a recheck or a close (YYYY-MM-DD HH:MM:SS, UTC).
statusstringactive or closed. Only active postings are returned unless the status filter says otherwise.
closed_atstring | nullWhen the posting was detected closed.
closed_reasonstring | nullWhy it closed: closed, gone or stale.
repostedbooleanWhether the role was reposted.
date_repostedstring | nullAlways null. See reserved fields.
has_blurred_databooleanDeprecated. Always false: preview mode has been removed.

To tell whether a posting is still open, read status and closed_at. Don't compare verified_at with last_seen_at: on an open posting they describe the same check and can differ by minutes to hours, and a check that fails to reach the source is not recorded at all.

Timestamp formats differ. last_seen_at, verified_at and closed_at are UTC YYYY-MM-DD HH:MM:SS. discovered_at and sources[].seen_at are ISO-8601 with an offset. date_posted is as the source publishes it, usually ISO-8601 but sometimes a bare YYYY-MM-DD, so accept both.

Location

FieldTypeDescription
locationstring | nullDisplay location string.
short_locationstring | nullCondensed location.
long_locationstring | nullFull location string.
countrystring | nullPrimary country name.
country_codestring | nullPrimary ISO country code.
countriesstring[]All associated country names.
country_codesstring[]All associated ISO country codes.
citiesstring[]Every city the posting names, primary first (a multi-location posting lists them all).
continentsstring[]Associated continents.
state_codestring | nullState or region, exactly as the source wrote it, so one response can carry CA for one posting and California for another. See normalized_region for the resolved code.
postal_codestring | nullPostal code.
latitudenumber | nullLatitude of the job's location: the source's coordinates for the posting, or else the centre of its city. null when there are none.
longitudenumber | nullLongitude, under the same rules as latitude.
coordinates_sourcestring | null"source" (published with the posting) or "city_centroid" (the centre of the posting's city, not the workplace address). null when there are no coordinates.
remoteboolean | nullRemote flag.
hybridboolean | nullHybrid flag.
work_arrangementstring | null"remote", "hybrid" or "onsite"; null when the posting doesn't say.
work_arrangement_sourcestring | nullHow work_arrangement was decided: "source" (declared by the job board) or "text" (parsed from the description).
metro_codestring | nullUS CBSA metro code resolved from the job's location. null outside covered metros.
metro_labelstring | nullMetro display name for metro_code, e.g. New York-Newark-Jersey City, NY-NJ.
normalized_citystring | nullThe city the posting's location names, in one canonical spelling: Munich for a posting stored as München, London for London Area or Mayfair. null when the location could not be placed (a region or placeholder in the city field). city_or matches on it.
normalized_regionstring | nullstate_code resolved to an ISO 3166-2 code, e.g. US-CA whether the source wrote CA or California. null when it could not be resolved. Use it to group or filter in your own code.

remote reads false for hybrid and onsite alike; work_arrangement separates them, and hybrid always agrees with it. Filter with work_arrangement_or. See field coverage.

Compensation

Pay is present only when the posting discloses it (roughly a quarter of postings). min_annual_salary and max_annual_salary are annualized (hourly, daily, weekly and monthly rates are scaled to a year); salary_string keeps the original text. The _usd fields convert other currencies at a fixed snapshot of European Central Bank rates, so treat them as approximate. They are null when the currency has no rate.

FieldTypeDescription
salary_stringstring | nullPay as written in the posting, e.g. $120K - $150K a year.
salary_currencystring | nullISO 4217 currency code, e.g. USD, GBP, EUR.
min_annual_salarynumber | nullMinimum pay annualized, in the original currency.
max_annual_salarynumber | nullMaximum pay annualized, in the original currency.
min_annual_salary_usdnumber | nullmin_annual_salary in USD, converted at the pinned ECB rate for non-USD pay; null when the currency has no rate.
max_annual_salary_usdnumber | nullmax_annual_salary in USD, converted the same way.
avg_annual_salary_usdnumber | nullMidpoint of the USD min and max, or the single known bound when only one is present.
salary_sourcestring | nullWhere the salary came from: "source" (structured data from the board) or "description" (parsed from the posting text).
salary_typestring | null"observed" when the posting itself carries pay, "estimated" when only the corpus benchmark does, null when neither.
estimated_min_annual_salary_usdnumber | null25th-percentile annual USD benchmark for this occupation and location.
estimated_avg_annual_salary_usdnumber | nullMedian benchmark.
estimated_max_annual_salary_usdnumber | null75th-percentile benchmark.

The estimated_* fields are a benchmark, not the employer's pay: percentiles of annual USD pay for the job's occupation and location, from public salary statistics or from pay posted for the same occupation in that country. They never replace observed pay; salary_type says which a job carries. The min_salary_usd filter uses observed pay only.

Classification & content

FieldTypeDescription
senioritystring | nullOne of entry_level, mid_level, senior, director, executive.
seniority_sourcestring | nullHow seniority was decided: "source", "title" or "onet_prior" (inferred from the occupation).
is_managerboolean | nullWhether the role manages people.
job_functionstring | nullBroad function of the role, e.g. Engineering.
languagestring | nullLanguage the posting text is written in, as a lowercase ISO 639-1 code, e.g. en. null until labelled.
employer_typestringWho posted the job: employer, agency or broker.
employment_statusesstring[]Employment types, e.g. ["full_time"].
easy_applyboolean | nullAlways null. See reserved fields.
technologiesobject[]Technologies the posting names, graded. Returned only when the request sets include_technologies: true, and then on every job; empty until the posting has been extracted. Each job that names at least one costs 1 extra credit, once per calendar month. Sorted required, preferred, mentioned, then confidence high to low, then name. See technologies.
technology_slugsstring[]Ungraded list of named technologies (languages, frameworks, products, tools, platforms, standards, certifications), e.g. python, snowflake, soc2. Broader skills such as ci/cd appear only in keyword_slugs. Prefer technologies.
keyword_slugsstring[]Skill slugs extracted from title + description against a curated lexicon.
esco_skillsobject[]ESCO skill concepts for the extracted skills, as stable { id, label } pairs. Filter on them with esco_skill_id_or.
occupation_codestring | nullISCO-08 unit group of the role (4-digit), e.g. 2512.
occupation_labelstring | nullHuman-readable ISCO-08 label, e.g. Software Developers.
isic_divisionstring | nullISIC Rev.4 industry division of the employer (2-digit), e.g. 62.
isic_division_labelstring | nullHuman-readable ISIC division label.
hiring_teamarrayAlways empty. See reserved fields.
descriptionstring | nullFull job description.
matching_phrasesstring[]Always empty.
matching_wordsstring[]Always empty.

employer_type is classified per company. A company not yet classified is returned as "employer". See employer type.

seniority: "director" also covers lead, staff and principal individual contributors. Use is_manager to tell them apart: a principal engineer with no reports is false, an actual director is true, and null means unknown.

language is the language the posting is written in, not the language of its country. Filter with language_or / language_not.

technologies

Opt-in: send include_technologies: true on POST /v1/jobs/search and every job carries this list; without it the field is absent. Each returned job that names at least one technology costs 1 extra credit, once per job per calendar month. See billing for technologies.

FieldTypeDescription
slugstringTaxonomy slug, e.g. snowflake, .net.
namestringDisplay name, e.g. Snowflake.
kindstringproduct, language, framework, methodology, certification or standard.
categorystringe.g. Databases; empty string when unknown.
parent_categorystringe.g. Software and tools; empty string when unknown.
logostring | nullAbsolute URL of the technology's logo; null when there is none.
strengthstringrequired (asked for), preferred (nice to have) or mentioned (named, not asked for).
confidencestringhigh when independent checks agree the posting names it; medium when it is required or in the title; low otherwise.
sectionsstring[]Posting sections it appears in, e.g. ["requirements"].
in_titlebooleanWhether the job title names it.
termsstring[]Case-insensitive text forms that find the mention in description.
terms_csstring[]Case-sensitive text forms, e.g. Go, R.

Hiring signals

FieldTypeDescription
visa_sponsorshipstring | nullVisa stance parsed from the posting: "offers", "no" or "citizenship_required". null where the posting says nothing.
benefitsstring[]Benefit slugs (health_insurance, 401k, ...) from a source's structured benefit fields. Empty where the source publishes none.
applicant_countnumber | nullNumber of applicants, where the source publishes it.
recruiter_emailsstring[]Recruiter contact emails parsed from the posting text.
listing_typestring | nullHow the posting was listed where the source exposes it.
expires_atstring | nullApplication deadline where the source publishes one (YYYY-MM-DD HH:MM:SS, UTC).
ghost_scorenumber | null0-100 likelihood the posting is stale or evergreen rather than a live vacancy. null until scored.

ghost_score is built from repost cadence, how long the posting has been up, and its content: 0 reads as a live vacancy, 100 as almost certainly not one. The max_ghost_score filter lets unscored jobs pass.

Field coverage

For a live figure on the fields a search filters on, read metadata.field_coverage in the response (see unknown values & coverage).

The table below is a sample of 500 recent postings (September 2026) from a broad query. Coverage varies by source, so a query narrowed to one source can differ a lot.

FieldPopulated
sources, description~100%
country, countries, country_code, continents97%
remote91%
state_code82%
latitude, longitude78%
keyword_slugs76%
cities74%
employment_statuses, last_seen_at, verified_at67%
esco_skills52%
min_annual_salary_usd47%
postal_code42%
company_object, company_domain38-40%
occupation_code, isic_division38%
technology_slugs36%
metro_code, metro_label24%
salary_string20%
normalized_title, job_function18%
work_arrangement, hybrid17%
ghost_score14%
seniority10%
is_manager, recruiter_emails4%
visa_sponsorship2%
applicant_count, benefits, expires_at, listing_type~0%

latitude and longitude come either from the source (coordinates_source: "source") or from the centre of the posting's city ("city_centroid"), which may be many kilometres from the workplace. No centroid is set for a country, a state, a metro area or Remote, or for the city-states (Singapore, Hong Kong, Macau).

Reserved for compatibility

These fields are always present and always empty:

FieldValueUse instead
final_urlnullurl, or source_url for the link on the source.
easy_applynull-
hiring_team[]-
date_repostednullreposted, which is populated.
matching_phrases[]-
matching_words[]-

Do not branch on them.

New fields are added over time. Ignore fields you don't recognise and read only the ones you need.

Data attributions

Some derived fields use public datasets:

  • esco_skills uses the ESCO classification (© European Union, CC BY 4.0).
  • seniority_source: "onet_prior" levels derive from the O*NET database by the U.S. Department of Labor, Employment and Training Administration (CC BY 4.0).
  • estimated_*_annual_salary_usd benchmarks derive from U.S. Bureau of Labor Statistics OEWS data and metro_code from U.S. Census Bureau CBSA delineations (both public domain).
  • City-centre coordinates (coordinates_source: "city_centroid") use the GeoNames geographical database (CC BY 4.0).

On this page