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

Use job_types (plural) — job_type (singular) is silently ignored and your filter will not apply.
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.
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). Using job_type (singular) is silently ignored — the request succeeds but the filter is not applied.
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).
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.
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
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", "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.