Datasets API endpoint
Full-text + faceted search over every job posting crawled from every discovered company ATS board (Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Workable, Recruitee, Rippling, Personio, Teamtailor, Oracle, UKG, iCIMS, Eightfold, Gem, Pinpoint) plus 5 single-company big-tech careers platforms (Amazon, Apple, Google, Meta, Tesla). Open roles only by default (set include_closed=true for historical/filled roles). Salary is parsed from a structured field when the provider has one, or from an explicit pay figure stated in the description otherwise, so coverage varies by posting rather than by provider; min_salary/max_salary filter on it and require salary_currency, since comparing raw compensation numbers across currencies is meaningless. Location is also exposed as structured city/state/country fields alongside the free-text location string, so city/state/country filter on an exact match of those parsed components rather than substring-matching the display string. job_family is an exact level-2 ISCO family label assigned from ESCO occupation evidence; ambiguous postings remain unclassified and do not match that filter. employment_type is never populated for google-jobs/meta-jobs, and posted_at (so sort=posted_desc) is never populated for meta-jobs/tesla-jobs -- their upstream APIs expose no such field. provider enum: `greenhouse`, `lever`, `ashby`, `workday`, `smartrecruiters`, `workable`, `recruitee`, `rippling`, `personio`, `teamtailor`, `oracle`, `ukg`, `icims`, `eightfold`, `gem`, `pinpoint`, `amazon-jobs`, `apple-jobs`, `google-jobs`, `meta-jobs`, `tesla-jobs`. workplace_type enum: `onsite`, `hybrid`, `remote`. sort enum: `relevance`, `posted_desc`, `company_asc`. Billing: this search costs 1 credit per 10 records returned, rounded up, with a minimum of 1 (up to 10 records cost 1, a full page of 100 costs 10).
/datasets/jobs/searchQuery parameters:
q — full-text over title, company, description.company — company name match.provider — provider filter. Enum: greenhouse, lever, ashby, workday, smartrecruiters, workable, recruitee, rippling, personio, teamtailor, oracle, ukg, icims, eightfold, gem, pinpoint, amazon-jobs, apple-jobs, google-jobs, meta-jobs, tesla-jobs.department — exact department filter.location — location match.city — exact city filter (parsed location component).state — exact state/region filter (parsed location component).country — exact country filter (parsed location component); ISO country code or name, matched case-insensitively.employment_type — exact employment-type filter.job_family — exact level-2 ISCO family label returned by the occupation
classifier, for example
Information and communications technology professionals.remote (bool) — filter by remote.workplace_type — filter by workplace type. Enum: onsite, hybrid, remote.include_closed (bool) — include closed/filled roles (default false = open only).min_salary (number) — matches postings whose range reaches at least this. Requires salary_currency.max_salary (number) — matches postings whose range starts at or below this. Requires salary_currency.salary_currency — 3-letter ISO currency code (e.g. USD) the min_salary/max_salary bounds are in; required when either bound is set. Comparing raw salary numbers across currencies is meaningless (a JPY range is nominally 100x+ a USD one for similar real pay), so this endpoint never mixes currencies in a salary-bounded query. compensation_min/compensation_max/compensation_currency/compensation_period are populated either from a provider's structured field or from an explicit pay figure stated in the description, so coverage varies by posting rather than by provider — not every posting states a figure.sort — enum: relevance, posted_desc, company_asc.page, page_size — 1-based; page_size default 20, max 100; page*page_size <= 10000.Returns total, page, page_size, and jobs[] (postings, including compensation/compensation_min/compensation_max/compensation_currency/compensation_period). Dataset postings also carry one seniority_level: entry, mid, or senior. The classifier favors explicit title and responsibility/training evidence and assigns uncertain roles to mid. When title and skill evidence are sufficiently specific, a posting also carries occupation_id, occupation_label, isco_code, job_family_code, job_family, and occupation_confidence. These values map to the ESCO occupation taxonomy and its level-2 ISCO family; ambiguous titles are left unclassified rather than forced into a misleading category. Each posting also carries company_logo_url (a best-effort favicon for the hiring company's domain, when known) and structured location_city/location_state/location_country alongside the free-text location display string — these back the city/state/country filters above and are populated either directly from the provider or, for postings that only ever expose a free-text location, filled in over time (so coverage on older postings is not immediate).
1 credit per 10 records returned, rounded up, minimum 1. A search that returns up to 10 jobs costs 1 credit, 20 jobs cost 2, a full page of 100 costs 10, and an empty result costs 1. You are charged for what comes back, not for the page_size you ask for, but your balance must cover the requested page_size for the call to be accepted. The response header x-credit-cost shows what a call was charged.
| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| ai_tools_extractor_version | 20 | |
| ai_tools_mentioned | 0 | |
| apply_url | 20 | stripe.com and 1 other host |
| benefits_mentioned | 6 | median 1 entry |
| board_id | 20 | |
| company | 20 | |
| compensation | 6 | |
| compensation_currency | 6 | |
| compensation_max | 6 | 235,200 to 285,600, median 285,600 |
| compensation_min | 6 | 156,800 to 221,187, median 190,400 |
| compensation_period | 6 | |
| department | 20 | |
| description_html | 20 | median 3,507 characters |
| description_text | 20 | median 3,182 characters |
| education_level_required | 5 | median 1 entry |
| first_seen | 20 | 2026-07-16 to 2026-10-10 |
| id | 20 | |
| is_open | 20 | true in 20 of 20 |
| isco_code | 11 | |
| job_family | 11 | |
| job_family_code | 11 | |
| last_seen | 20 | 2026-10-10 |
| last_seen_ms | 20 | 1,791,603,748,930 to 1,791,605,999,772, median 1,791,605,999,772 |
| location | 20 | |
| locations | 20 | median 1 entry |
| occupation_confidence | 11 | 0.96 |
| occupation_extractor_version | 20 | |
| occupation_id | 11 | |
| occupation_label | 11 | |
| posted_at | 20 | 2025-02-18 to 2026-10-09 |
| posting_id | 20 | |
| provider | 20 | |
| req_id | 18 | |
| requirements_extractor_version | 20 | |
| security_clearance_required | 0 | |
| seniority_extractor_version | 20 | |
| seniority_level | 20 | |
| skills_extractor_version | 20 | |
| skills_mentioned | 18 | median 3 entries |
| title | 20 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | No | Full-text over title, company, description | ||
| company | string | No | Company name match | ||
| provider | string | No | Provider filter Allowed values: greenhouse, lever, ashby, workday, smartrecruiters, workable, recruitee, rippling, personio, teamtailor, oracle, ukg, icims, eightfold, gem, pinpoint, amazon-jobs, apple-jobs, google-jobs, meta-jobs, tesla-jobs. | ||
| department | string | No | Exact department filter | ||
| location | string | No | Location match | ||
| city | string | No | Exact city filter (parsed location component) | ||
| state | string | No | Exact state/region filter (parsed location component) | ||
| country | string | No | Exact country filter (parsed location component); ISO country code or name, matched case-insensitively | ||
| employment_type | string | No | Exact employment-type filter | ||
| job_family | string | No | Exact ESCO/ISCO job-family label filter | ||
| remote | boolean | No | Filter by remote (true or false) | ||
| workplace_type | string | No | Workplace type filter Allowed values: onsite, hybrid, remote. | ||
| include_closed | boolean | No | Include closed/filled roles (default false = open only) | ||
| min_salary | number | No | Minimum salary (matches postings whose range reaches at least this); requires salary_currency | ||
| max_salary | number | No | Maximum salary (matches postings whose range starts at or below this); requires salary_currency | ||
| salary_currency | string | No | 3-letter ISO currency code (e.g. USD) the min_salary/max_salary bounds are in; required when either bound is set | ||
| sort | string | No | Sort enum: relevance, posted_desc, company_asc Allowed values: relevance, posted_desc, company_asc. | ||
| page | integer | No | Page number, default 1 | ||
| page_size | integer | No | Page size, default 20, max 100; page*page_size must be <= 10000 | ||
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/datasets/jobs/search?q=coffee&provider=greenhouse&country=us&remote=true&workplace_type=onsite&include_closed=true&sort=relevance&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"total": 1,
"page": 1,
"page_size": 20,
"jobs": [
{
"posting_id": "greenhouse:ab12cd:9f0e",
"provider": "greenhouse",
"company": "Stripe",
"title": "Staff Software Engineer",
"seniority_level": "senior",
"occupation_label": "software developer",
"job_family": "Information and communications technology professionals",
"occupation_confidence": 0.88,
"location": "US Remote",
"remote": true,
"employment_type": "Full-time",
"url": "https://stripe.com/jobs/listing/5501234",
"posted_at": "2026-07-01T00:00:00Z",
"is_open": true
}
]
}
}Request schema
No body schema
Response schema
#/definitions/datasets.jobsSearchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | datasets.JobsSearchResponse | No | ||||
| data.jobs | array | No | Matching job postings on this page. | |||
| data.page | integer | No | Page number returned. | |||
| data.page_size | integer | No | Number of items per page. | |||
| data.total | integer | No | Total number of postings matching the filters. | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/datasets/jobs/search?q=coffee&provider=greenhouse&country=us&remote=true&workplace_type=onsite&include_closed=true&sort=relevance&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"