Job postings, normalized

Scattered job postings. One schema.

Applicant tracking systems publish jobs in incompatible formats. Clair continuously refreshes a validated index across thousands of companies and serves it as one searchable collection, with derived fields, source provenance and explicit freshness in every response.

zshclair API
$ curl -G https://clair-job-search-api.p.rapidapi.com/v1/jobs \
-H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' \
-H 'X-RapidAPI-Host: clair-job-search-api.p.rapidapi.com' \
--data-urlencode 'q=data engineer' \
--data-urlencode 'workplace_type=remote' \
--data-urlencode 'limit=25'
{
"jobs": [
{
"title": "Senior Data Engineer",
"seniority": "senior",
"track": "ic",
"workplace_type": "remote",
"compensation": { "min": 155000, "max": 190000, "currency": "USD", "source": "description" },
"first_seen_at": "2026-07-25T09:14:00Z",
"last_verified_at": "2026-07-28T11:40:00Z",
"source": { "provider": "greenhouse" }
},
{
"title": "Data Engineer II",
"seniority": "mid",
"track": "ic",
"workplace_type": "remote",
"compensation": { "min": 140000, "max": 175000, "currency": "USD", "source": "ats" },
"first_seen_at": "2026-07-26T16:02:00Z",
"last_verified_at": "2026-07-28T11:40:00Z",
"source": { "provider": "lever" }
}
],
"meta": { "next_cursor": "eyJ2IjoxLC4uLi", "index": { "status": "healthy", "as_of": "2026-07-28T11:40:00Z" } }
}
$

Get started

View docs →
$curl -G https://clair-job-search-api.p.rapidapi.com/v1/jobs -H 'X-RapidAPI-Key: YOUR_RAPIDAPI_KEY' -H 'X-RapidAPI-Host: clair-job-search-api.p.rapidapi.com' --data-urlencode 'q=data engineer' --data-urlencode 'workplace_type=remote' --data-urlencode 'limit=25'

Search across companies and ATS platforms in one indexed collection. Every request is bounded; no customer-supplied URL is fetched.

How it works

The request stays simple. The index does the hard work.

Clair normalizes and enriches postings before you query them: seniority, title family, canonical skills, country and salary parsed from prose. GET /v1/jobs filters those indexed fields without an upstream crawl. Each result carries source and verification timestamps; response metadata carries an opaque next cursor and the index’s current freshness.

Salary from prose

Most boards don’t expose compensation as a field. Clair parses it out of the description and marks compensation.source so you know when a figure was extracted rather than published.

Seniority, including interns

Internships, co-ops and working-student roles resolve to seniority=intern; every posting also gets a track, title family and canonical skills computed from its title and text.

Freshness & provenance

Each result names its ATS, board and external ID, plus when Clair first saw and last verified it. Response metadata reports the index’s own freshness.

Access

Call the API, read the source, ask for what’s missing.

API

Read the market

Search one continuously refreshed collection across thousands of companies. Filter, sort and continue with an opaque cursor; every response reports index freshness.

Explore the API →

Documentation

Read the schema

See every filter, enum, response field, freshness signal, cursor rule, and stable error code before you integrate.

Read the docs →

Requests

Shape what's next

Need another ATS supported, a company added to indexed coverage, or a field that isn't here yet? Tell us what you're building.

Get in touch →

Build on the job market.

One indexed schema across major ATS platforms, with derived fields, source provenance, and freshness you can inspect.