List Jobs

Fetch a list of jobs with filtering and search. Lists are paginated with opaque cursors: the response includes pagination.limit, pagination.next_page, and pagination.prev_page. There is no page query parameter.

How list pagination works
To fetch the next or previous window, send the same filters and sort_by as before, and pass the token from the last response as cursor, or pass the same string using the next_page or prev_page query parameter.
Freshness: published_after vs max_age
If you pass published_after (ISO 8601), the API does not apply max_age for the same request. Use published_after for a strict calendar lower bound; use max_age for a rolling window (e.g. 7d).
TypeScript

Full copy-paste types (including the FilterApplied union) live on the API types (TypeScript).

Allowed tokens for fields, exclude_fields, and extra_fields: id, title, location, locations, application_url, published, has_remote, is_active, expired_at, language, employment_type, salary_min, salary_max, salary_currency, salary_text, experience_level, experience_levels, company, description

GET
https://api.cleanjobdata.com/jobs
Default summary response (fastest)
GET
https://api.cleanjobdata.com/jobs?extra_fields=description
Includes full job description

Query Parameters

Search & Keywords

titlestring
Search by job title or keywords. Supports full-text search.
Example: software engineer
searchstring
Alias of title (same behavior).
Example: software engineer
sort_bystring
Sort order. Values: published (default), relevance (requires title).
Example: relevance

Geographic Filtering

Pro Tip: Use the Geo Suggest API to find IDs for 100% accuracy.

city_idnumber
Filter by specific city ID. Comma-separated.
Example: 5391959
state_idnumber
Filter by specific state ID. Comma-separated.
Example: 5332921
country_idnumber
Filter by specific country ID. Comma-separated.
Example: 233
locationstring
When no city_id, state_id, or country_id are provided: comma-separated ISO 3166-1 alpha-2 country codes (e.g. US,GB,DE). Invalid tokens are skipped.
Example: US,CA
remoteboolean
Set to true for remote-only jobs.
Example: true

Field selection (list only)

Default list responses return a summary set of columns (no full description). Use the parameters below to trim or extend the payload. Unknown field names are ignored.

fieldsstring
Comma-separated allowlist: response includes only these columns (must be from the allowed set). Replaces the default summary projection.
Example: id,title,company,published
include_fieldsstring
Legacy alias of fields — same behavior. Prefer fields for new integrations.
Example: id,title,company
extra_fieldsstring
Comma-separated columns to add on top of the default summary (e.g. description).
Example: description
exclude_fieldsstring
Comma-separated columns to remove from the resolved field set (applied after extra_fields).
Example: description,company

Compensation & Seniority

salarystring
Filter by salary range. Format: min,max. Omit max to get jobs with minimum salary only.
Example: 100000,150000 OR 100000(min)
experience_levelstring
Values: EN (Entry), MI (Mid), SE (Senior), EX (Executive). Comma-separated.
Example: SE,EX

Freshness & Pagination

published_afterstring
ISO 8601 timestamp: only jobs published at or after this instant. When set, max_age is not applied on the same request.
Example: 2024-05-01T00:00:00.000Z
max_agestring
Rolling window: positive integer with optional unit h (hours), d (days), w (weeks). A bare number is treated as days (e.g. 7 equals 7d). Omit if using published_after.
Example: 24h, 7d, 1w, or 7
limitnumber
Results per request. Max 100. Default 20.
Example: 50
cursorstring
Opaque token from the previous response’s pagination.next_page or pagination.prev_page.
Example: (value from prior response)
next_pagestring
Same token as pagination.next_page, sent as a query parameter to load the next window.
Example: (value from prior response)
prev_pagestring
Same token as pagination.prev_page, sent as a query parameter to load the previous window.
Example: (value from prior response)

Response Schema

The body includes data (jobs), pagination (see below), and meta.

Success Response Example
{
"data": [1 items],
"pagination": {3 keys},
"meta": {2 keys}
}

The Envelope

dataarray
An array of Job objects matching your filters.
paginationobject
Always has limit. next_page and prev_page are opaque cursor strings when more results exist in that direction; otherwise null or omitted. Pass those strings back as cursor, next_page, or prev_page on the following request.
metaobject
Includes query_time_ms and filters_applied: an array describing which filters were honored, with one object per logical filter (geo IDs may produce one row per ID). Shapes vary by key — see the FilterApplied union on the API types page.
meta.filters_applied shapes
  • title, experience_level: key, value, display_label.
  • salary: key, min, max, display_label.
  • published_after, max_age: key, value, display_label (value is hours since cutoff for max_age).
  • city_id / state_id / country_id: key, kind, name, display_label, plus the matching *_id field.
  • location (ISO2 codes from the location query param): key, value, display_label (code).
  • Remote-only filter (from remote=true): row key is remote_only; value is always true.

The Company Object

Nested

Verified metadata about the hiring organization, stored on the job object. Not every key is present for every listing—treat optional fields as nullable/missing.

company.namestring
Legal name of the company.
company.logostring | nullNullable
URL to the company's logo image.
company.website_urlstring | nullNullable
Primary website URL.
company.descriptionstring | nullNullable
A brief overview of the company.
company.industrystring | nullNullable
The primary sector (e.g., 'Fintech', 'SaaS').
company.employee_countstring | nullNullable
Estimated size range (e.g., '11-50', '5001-10000').
company.linkedin_urlstring | nullNullable
Direct link to the company's LinkedIn profile.
company.twitter_urlstring | nullNullable
Direct link to the company's Twitter/X profile.
company.github_urlstring | nullNullable
Direct link to the company's GitHub organization.
company.facebook_urlstring | nullNullable
Direct link to the company's Facebook page.
company.instagram_urlstring | nullNullable
Direct link to the company's Instagram profile.
company.youtube_urlstring | nullNullable
Direct link to the company's YouTube channel.
company.teamarray
An array of key team members. Each object contains:
  • name: Full name of the team member.
  • title: Job title or role (nullable).
  • linkedin_url: Link to their professional profile (nullable).
  • photo_url: URL to their profile photo (nullable).

The Location Object

Array Item

Each item in the locations[] array is a fully resolved geographic entity.

locations[].kindstring | nullNullable
The resolution granularity of this location.
  • city_state_country: Fully resolved.
  • city_country: City and country resolved.
  • city_state: City and state resolved.
  • city, state, or country: Single level resolved.
locations[].display_labelstring | nullNullable
Formatted name, e.g., 'San Francisco, CA, US'.
locations[].city_namestring | nullNullable
The name of the city.
locations[].city_idnumber | nullNullable
The unique ID for the city (if available).
locations[].state_namestring | nullNullable
The name of the state or province.
locations[].state_idnumber | nullNullable
The unique ID for the state (if available).
locations[].state_codestring | nullNullable
Short code for the state (e.g., 'CA').
locations[].country_namestring | nullNullable
The name of the country.
locations[].country_idnumber | nullNullable
The unique ID for the country (if available).
locations[].country_codestring | nullNullable
ISO 3166-1 alpha-2 country code.
locations[].timezonestring | nullNullable
The IANA timezone ID (e.g., 'America/Los_Angeles').
locations[].is_remoteboolean
Indicates if this specific location entry represents a remote setting.
locations[].is_primaryboolean
True if this is the primary location for the job.
Interactive Testing
To see live data without writing code, use our Live API Playground or download one of our Starter Templates.