Search the public job catalog with cursor-based pagination. Returns a page of job summaries and a next_cursor for the following page. Add q for full-text search (Google-style: quoted "phrases", OR, -exclusion; a pure-exclusion query is rejected). Implicit AND binds tighter than OR and a -term attaches only to its adjacent group, so "machine learning" OR "data scientist" -senior means A OR (B AND NOT senior) and can still return Senior ML titles; to exclude everywhere, distribute the term: "machine learning" -senior OR "data scientist" -senior. By default q matches the job title only (precise — best for common role terms like developer/engineer, which otherwise match description boilerplate); pass q_scope=full to also search the description (broader reach — best for niche skills or tools named only in the requirements text). A phrase query under q_scope=full combined with very narrow filters (a small country, a rare language) can hit the search timeout; the default title scope is immune, so prefer it for phrase precision. q composes as a filter with the standard sorts: sort=posted_at (default) and sort=first_seen_at are descending keyset sorts with unbounded cursor pagination, applying q as a filter over the newest-first keyset. Symbol-bearing tech tokens (c++, c#, .net) are matched as a title substring rather than full-text (they collapse under English tokenization); a mixed query such as python c++ still runs as full-text. If a full-text search matches nothing, one title-substring fallback runs automatically and the response is flagged fuzzy: true. q respects the default 90-day freshness window unless a date filter is supplied. A well-formed but overly broad q that exceeds the search time budget returns 422 (narrow the query); a malformed q (too complex, or only exclusions) returns 400.
Authorization
bearerAuth Provide your secret API key (prefixed sk_) as a bearer token: Authorization: Bearer sk_....
In: header
Query Parameters
Case-insensitive substring match on the job title (3-200 characters).
3 <= length <= 200Full-text search across the job. Google-style syntax: quoted "exact phrase", OR, and -term exclusion (a query that is ONLY exclusions is rejected with 400). Operator precedence: implicit AND binds tighter than OR, and a -term attaches only to its adjacent group — so "machine learning" OR "data scientist" -senior parses as A OR (B AND NOT senior) and CAN still return Senior ML titles. To exclude a term everywhere, distribute it across each branch: "machine learning" -senior OR "data scientist" -senior. By default q matches the job TITLE only (precise — best for common role terms); pass q_scope=full to also search the description. Phrase queries under q_scope=full combined with very narrow filters (a small country, a rare language) can hit the search timeout; the default title scope is immune, so prefer it for phrase precision. q composes as a filter with the standard sort/cursor pagination (newest-first over the matches) and respects the default 90-day freshness window unless a date filter is given. Symbol-bearing tech tokens (c++, c#, .net) are matched as a title substring instead of full-text (they collapse under English tokenization). If a full-text search yields no rows a single title-substring fallback runs and its results are flagged fuzzy: true.
2 <= length <= 200Which fields q searches. title (default) matches the job title only — precise, best for common role terms (e.g. developer, engineer), which otherwise match description boilerplate. full also searches the description — broader reach, best for niche skills or tools that appear only in the requirements text (a language or framework not named in the title). Only affects results when q is set (ignored otherwise).
"title"Value in
- "title"
- "full"
Filter by ISO 3166-1 alpha-2 country code(s). Repeat the parameter or comma-separate values (e.g. country=us,de). A job matches if it is tagged with any of the given countries. Up to 20 values; case-insensitive.
items <= 20Filter by state / region reference code(s). Repeat the parameter or comma-separate values (e.g. state=CA,NY). A job matches if it is tagged with any of the given regions. Up to 20 values; case-insensitive.
items <= 20Case-insensitive substring match on the city name.
1 <= length <= 200Filter by workplace arrangement.
Value in
- "remote"
- "hybrid"
- "onsite"
Filter by employment type.
Value in
- "full_time"
- "part_time"
- "contract"
- "temporary"
- "internship"
Filter by seniority level.
Value in
- "intern"
- "entry"
- "mid"
- "senior"
- "staff"
- "lead"
- "executive"
Filter by ISO 639-1 language code (2 letters, case-insensitive).
2 <= length <= 2Keep jobs whose stated salary range reaches at least this amount. Jobs that state only a minimum (no maximum) match when that minimum is at least this value.
0 <= valueKeep jobs whose stated salary range starts at or below this amount.
0 <= valueFilter by ISO 4217 currency code (3 letters, case-insensitive).
3 <= length <= 3When true, return only jobs that specify a salary; when false, only jobs without a salary.
Filter by the numeric company id.
Filter by listing status. open (default) returns active listings; closed returns delisted ones.
"open"Value in
- "open"
- "closed"
Only jobs posted at or after this ISO-8601 timestamp, including a UTC offset (e.g. 2024-01-01T00:00:00+00:00). When none of posted_since, posted_until, or first_seen_since are provided and status is open, results default to the last 90 days.
date-timeOnly jobs posted at or before this ISO-8601 timestamp, including a UTC offset (e.g. 2024-01-01T00:00:00+00:00).
date-timeOnly jobs first seen at or after this ISO-8601 timestamp, including a UTC offset (e.g. 2024-01-01T00:00:00+00:00).
date-timeSort field for the descending keyset pagination. Defaults to posted_at. A full-text q composes with either sort as a filter.
"posted_at"Value in
- "posted_at"
- "first_seen_at"
Maximum number of jobs to return. Defaults to 100; values above 500 are clamped to 500.
0 < value100Opaque pagination cursor taken from a previous response next_cursor. Must be used with the same sort value that produced it.
Include the job description in each result: off (default, omitted), text (markdown as description_md), or html (description_html).
"off"Value in
- "off"
- "text"
- "html"
Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X GET "https://example.com/api/v1/jobs"{ "data": [ { "id": 0, "source_id": 0, "company_id": 0, "external_job_id": "string", "url": "string", "apply_url": "string", "title": "string", "location_raw": "string", "locations_raw": "string", "location": "string", "city": "string", "region": "string", "postal_code": "string", "country_code": "string", "latitude": 0, "longitude": 0, "usa": true, "country_codes": [ "string" ], "admin1_refs": [ "string" ], "workplace": "remote", "employment_type": "full_time", "level": "intern", "language": "string", "salary_raw": "string", "salary_min": 0, "salary_max": 0, "salary_currency": "string", "salary_period": "year", "posted_at": "string", "expires_at": "string", "content_hash": "string", "first_seen_at": "string", "closed_at": "string", "created_at": "string", "updated_at": "string", "description_md": "string", "description_html": "string", "company": { "id": 0, "name": "string", "website_url": "string", "logo_url": "string" } } ], "next_cursor": "string", "limit": 0, "fuzzy": true}{ "type": "string", "title": "string", "status": 0, "detail": "string", "errors": [ { "field": "string", "message": "string" } ]}{ "type": "string", "title": "string", "status": 0, "detail": "string", "errors": [ { "field": "string", "message": "string" } ]}{ "type": "string", "title": "string", "status": 0, "detail": "string", "errors": [ { "field": "string", "message": "string" } ]}{ "type": "string", "title": "string", "status": 0, "detail": "string", "errors": [ { "field": "string", "message": "string" } ]}