01 / THE SIGNAL
Measure published demand, not the whole labor market
Active postings are useful evidence of what employers are advertising now. They can support hiring-activity monitors, role and skill demand analyses, location comparisons, compensation research, and focused feeds for candidates or sales teams.
Keep the interpretation narrow. A posting is not a confirmed hire, budget, vacancy count, or promise that a role remains open. Clair prepares observable public postings; your product decides which comparisons are meaningful.
02 / NORMALIZED DIMENSIONS
Compare fields instead of reparsing every ATS
Clair maps supported ATS records into one schema with company, location, country, workplace type, employment type, department, team, compensation, seniority, career track, title family, and canonical skills. Each result retains the original provider, board, external ID, posting link, and application link.
Use q only for a title substring such as data engineer. It is not semantic search and it does not search descriptions. Use skills_all or skills_any for the supported skill vocabulary and structured filters for the other dimensions.
03 / MARKET CUTS
Define a segment that another analyst can reproduce
A useful market cut states its filters. For example: newly discovered remote data roles in Germany that mention Python, ordered by Clair discovery time. That definition is more defensible than a dashboard assembled from fuzzy title guesses and unrecorded cleanup steps.
GET /v1/jobs
?q=data engineer
&country=DE
&workplace_type=remote
&skills_any=python
&first_seen_after=2026-08-01T00:00:00Z
&sort=first_seen_at
&limit=100Request include_total=true only when an exact canonical count is itself part of the result. For feeds and exports, meta.has_more and meta.next_cursor avoid the extra distinct-count query.
04 / INCREMENTAL DATA
Build alerts and warehouse loads on discovery time
Filter with first_seen_after, sort by first_seen_at, and retain the next cursor until that result set is exhausted. Cursors are bound to the complete filter and sort contract, so changing inputs while reusing one fails explicitly.
Store the Clair ID as the ingestion key and preserve posted_at, first_seen_at, and last_verified_at as different facts. Publisher time supports publication-date research; discovery time supports your pipeline; verification time describes the latest successful crawl that still contained the posting.
05 / COMPENSATION
Segment salary analysis before aggregating it
Keep currency and interval attached to every bound. Clair does not silently convert currencies or annualize hourly, daily, weekly, or monthly figures. A valid comparison either stays within one currency and interval or applies an explicit conversion policy downstream.
Preserve compensation.source. The value distinguishes a structured ATS field from a figure Clair extracted from employer-written prose. Report salary coverage beside any median or range, and exclude unknown values rather than treating them as zero.
06 / FRESHNESS & COVERAGE
Show the health of the index beside the result
Every response includes index status, the latest successful crawl time, and active and stale board counts. Every posting includes its own last_verified_at. The response-level signal describes collection health; the record-level timestamp describes one posting.
Coverage is part of the methodology, not a footnote. The Active Jobs Dataset page publishes the current index size, field completeness, classifications, source mix, and calculation time from a scheduled snapshot.
07 / BOUNDARIES
State what the API does not measure
The API searches the current active index; it is not a precomputed historical time series. It does not measure applications, interviews, hires, layoffs, filled headcount, or unique vacancies across unrelated employers. Provider-aware deduplication removes supported source aliases without using fuzzy title similarity that could merge different openings.
Descriptions are excluded by default. When requested, the API returns a plain-text excerpt capped at 2,000 characters, not a complete archival copy. Follow the employer link to confirm current role details and availability.
08 / FAQ
Questions from data teams
What can job postings tell me about a market?
They can show observable demand: which roles, skills, locations, workplace models, and stated compensation bands appear in active postings. They do not reveal actual hires, applicant volume, headcount, or employer intent.
Does q search every field or use semantic matching?
No. q is a case-insensitive substring filter over job titles. Use the structured company, country, workplace, seniority, track, department, skills, compensation, time, and source filters for the rest of the schema.
Should an incremental feed use posted_at or first_seen_at?
Use first_seen_at because Clair always records when it discovered a posting. Publisher-provided posted_at may be absent or may reflect a source-side update.
Does a null salary mean the role is unpaid?
No. It means the source did not state a usable value or Clair could not derive one safely. Keep nulls out of salary averages instead of treating them as zero.