Skip to main content
POST
Search Jobs
Search for jobs using common filters such as job titles, experience level, salary range, etc., in the JSON request body. All requests require an API key (x-api-key header) — see Authentication. API calls bill 1 unit of m_jobs_api_calls per job returned — see Usage Headers & Metering. The easiest way to start using our API is to use our Export button on our Search Page, this allows you to edit the tune the request using our Job Filters UI and easily export as a Javascript or cURL request.

Endpoint

Request Body

Unknown parameters are rejected with a 422 rather than silently ignored. Use job_types (plural) — job_type (singular) returns 422, as does locations (use geo_locations).
Note:
  • All request body fields are optional.
  • Filter combinations can be mixed and matched.
  • Use specific filters to narrow down search results and obtain relevant matches.
string[]
Array of job titles to search for (matched against the parsed job_title field). Multiple entries are OR’d together. Each entry supports the following syntax:
  • Unquoted, multi-word ("data scientist" as a JSON string) — matches titles containing all of the words, in any order or position. Example match: “Scientist/Sr. Scientist, Bioinformatics Data”.
  • Quoted ("\"data scientist\"" — escaped quotes inside the JSON string) — matches the exact phrase only.
  • - prefix ("-senior") — excludes titles containing the term. Works in any position in the array.
Example — engineers, but not senior ones, plus exact-phrase data scientists:
Special characters: Slashes are supported ("AI/ML Engineer" works). Parentheses and square brackets are not accepted and return a 422 validation error. Avoid a spaced hyphen ("engineer - data") inside a title — it currently returns a 500 error.
string[]
Array of keywords matched against description, technologies, skills, and benefits. Multiple entries are OR’d together.Keywords are a relevance signal, not a hard filter: results containing the exact phrase rank highest, followed by results containing all of the words, then results containing any of the words. Rare phrases will still return partial matches rather than zero results.Prefix an entry with - to exclude jobs matching it, e.g. ["machine learning", "-blockchain"]. A keywords array may consist solely of exclusions. Exclusions apply to the same four fields — they do not apply to job titles, so use job_titles negation for that.
⚠️ Multi-word exclusions are word-level, not phrase-level. A multi-word exclusion excludes jobs containing any of its words, not just the exact phrase. "-language models" excludes jobs mentioning “language” or “models” — including e.g. “predictive models”. For precise exclusions, prefer single distinctive words.
string[]
Array of keywords to match in company descriptions, services, and products
string[]
Array of work arrangements. Accepted values: "Remote", "Hybrid", "In-Person".
object[]
Array of structured location objects with city, region, and country.
A job can carry several locations and matches if any of them fits your filter, so a matched job’s locations array may list a different city or region first. Check the whole array, not just locations[0].
object
Geographic filtering configuration
Geo filtering is approximate — results are weighted toward the target area but may include some out-of-radius locations, especially in auto mode. The default (auto) performs metro-area fuzzy matching, not exact-city matching: searching a city will also return jobs in its surrounding metro area. Use mode: "strict" if you need exact location matching.
string[]
Array of experience levels. Accepted values: "Entry", "Junior", "Mid", "Senior", "Executive".
Any other value will return a 422 Unprocessable Entity error.
object
Years of experience range object
string[]
Array of employment types. Accepted values: "Full Time", "Part Time", "Contract", "Internship".
The "Contract" value matches roles whose returned job_type is "Contract / Temporary" — request token and response label differ.
The correct field name is job_types (plural). job_type (singular) returns a 422 validation error.
string[]
Filter by one or more job category tags (e.g., "Engineering Jobs", "Marketing Jobs"). See the full category list.
string[]
Filter jobs by the hiring company’s headcount bucket. Accepted values: "1-10", "11-50", "51-200", "201-500", "501-1000", "1001-5000", "5001-10000", "10000+". Pass multiple values to combine ranges (e.g., ["11-50", "51-200"]).
This parameter is named company_types for historical reasons but currently filters by company size. A separate classification filter (Public Company / Non-Profit / etc.) will be added in a future API update.
string[]
Filter by the source job board (e.g., “iCIMS”, “Lever”, “Greenhouse”).
string
Filter by specific company name
string[]
Filter by the unique company slug (used for deep linking or specific company targeting). Can be a single string or an array of strings; an array returns jobs from any of them (e.g., ["stripe", "airbnb"]).
object
Salary range object
string[]
Filter by industry sector. Can be a single string or an array of strings. See List Industries for accepted values.
string[]
Filter by sub-industry (e.g., "Fintech"). Can be a single string or an array of strings; jobs match if their company has any of the listed sub-industries. See List Subindustries for accepted values; any other value returns 422.Applied in addition to industry. When both are sent, sub-industries that do not belong to one of the listed industries are dropped, and if none remain only industry is applied.
integer
How many days ago to filter for. Days Ago set to 3 will return jobs posted on and after 3 days ago.
string
Filter by a specific posted date (format: YYYY-MM-DD). Returns jobs posted on or after this date.
string
ISO-8601 datetime, e.g. "2026-10-20T04:00:00Z" (UTC if no offset is given). Returns only jobs Hirebase first saved at or after this time, whatever their date_posted. Use it to poll for new jobs: unlike days_ago, it doesn’t return the same jobs again on the next run, and it still catches jobs we discover days after they were posted. Each job carries the value as first_ingested.
Polling for new jobs: store the time of each run and pass it as ingested_after on the next one, minus a 2-hour overlap, with sort_by: "first_ingested" and sort_order: "asc". Then upsert by _id. The overlap matters because a job can become searchable up to about 90 minutes after its first_ingested time. A job that disappears from its source for several days and then comes back is saved again, so it counts as new.
string
ISO-8601 datetime. Returns only jobs Hirebase first saved before this time. Combine with ingested_after for a fixed window.
string
Currency code to use when applying the salary filter (e.g., "USD", "EUR", "GBP").
string
Filter for jobs that offer visa sponsorship ("true" or "false").
string
Filter out recruiter agency repostings ("true" or "false").
string
Include jobs that do not specify a salary ("true" or "false") when a salary filter is applied.
string
Include jobs that do not specify years of experience ("true" or "false") when a yoe filter is applied.
string
Omit jobs the current user has already viewed ("true" or "false"). Requires user_id.
string
Filter out jobs with incomplete listing data ("true" or "false").
string
Set to "true" to include the full original HTML description from the ATS source on each job object.
Getting full job descriptions: By default, job results return a cleaned/summarized description field (~900 chars). To get the full original HTML description from the ATS source, set return_raw_description to "true" — each job will then include a description_raw field with the complete HTML (~7,000+ chars typically).
  • description (always present) — cleaned/summarized version.
  • description_raw (only when return_raw_description: "true") — full original HTML from the ATS.
string
Field to sort results by. Accepted values: "relevance", "date_posted", "first_ingested", "salary", "company", "yoe".
"company" orders by company prominence/size, not alphabetically by name. Invalid values are silently ignored and the default sort (relevance) is applied.
string
Sort direction ("asc" or "desc").
number
default:"1"
Page number for pagination
number
default:"10"
Number of results per page (maximum 100).
Values above 100 return 422. The pagination (page and limit) fields control the number of results returned and which subset of results is displayed.
Each job returned costs one unit of your jobs allowance, so limit is also your spend per call. The free plan includes 500 jobs a month: five calls at limit: 100 use all of it. On hard-capped plans a request whose limit exceeds the remaining allowance is refused with a 429 that states how many units are left. See Usage Headers & Metering.

Response

array
Array of job objects
number
Total number of matching jobs for the query
number
Number of unique companies represented in the result set
number
Current page number in the response
number
Number of job results returned per page
number
Total number of available pages for the query
Rate limit: 100 requests per 60 seconds per API key. Exceeding it returns 429 with a Retry-After header. A 429 with X-Billing-Code: limit_exceeded is a plan quota, not a rate limit — see Error Handling.

Example Request

Error Responses

Returns when the request contains invalid or improperly formatted data. Some possible reasons may include the following:
  • When the industry field is missing, not a string, or doesn’t match any value from the list of valid industries.
  • JSON decoding errors, such as malformed JSON or incorrect data types in the request body.
Returns when an unexpected error occurs on the server.
  • Also occurs during unhandled server-side failures or bugs that prevent the request from being processed.