# HyperJobs API

> A jobs dataset with the hiring company embedded in every posting — one request, no second call.

Source: https://hyperjobs.io/docs

HyperJobs is a read-only HTTP API over a continuously refreshed dataset of job
postings scraped directly from company ATS boards — Greenhouse, Lever, Ashby,
Workday, SmartRecruiters and 60-odd others — enriched with skills, seniority,
salary, and location, and joined to firmographics for the company doing the
hiring.

The defining property is the join. Every job carries its company inline:

```json
{
  "id": "ashby:0f2c…",
  "title": "Senior C++ Engineer",
  "company": {
    "slug": "stripe",
    "name": "Stripe",
    "domain": "stripe.com",
    "industry": "Financial Services",
    "employee_count": 8000,
    "hq": { "country": "US", "locality": "South San Francisco" }
  },
  "location": { "remote": false, "countries": ["United States"], "cities": ["New York"] },
  "salary": { "annual_min": 180000, "annual_max": 240000, "currency": "USD" },
  "skills": ["cpp", "cuda"],
  "keywords": ["distributed systems"]
}
```

Most jobs APIs hand you an employer *name* and leave you to resolve it. Here the
company object is already attached, so a query like "remote Rust jobs at
Series-B fintechs with more than 200 employees" is one request instead of a
search plus N lookups.

<CardGroup cols={2}>
  <Card title="Quickstart" icon="Rocket" href="/docs/quickstart">
    Your first request in about two minutes.
  </Card>
  <Card title="Authentication" icon="KeyRound" href="/docs/authentication">
    API keys, headers, and the browser caveat.
  </Card>
  <Card title="Filtering jobs" icon="Funnel" href="/docs/guides/filtering">
    The filter vocabulary, and the semantics that surprise people.
  </Card>
  <Card title="API reference" icon="Code" href="/docs/api-reference">
    Every endpoint, parameter, and response field.
  </Card>
</CardGroup>

## Base URL

<EndpointHeader method="GET" path="/v1/jobs" />

Every endpoint lives under `/v1`. There is no other version; when a breaking
change becomes necessary it will ship as `/v2` and `/v1` will keep working —
see [changelog](/docs/changelog) for the compatibility policy.

## What's in the dataset

Numbers move hourly. These are indicative; call
[`/v1/meta`](/docs/api-reference/meta) for live counts and per-field coverage
percentages — we publish what we actually hold.

| Metric | Value |
| --- | --- |
| Active job postings | ~597,000 |
| Companies with firmographics | ~158,000 |
| ATS boards tracked | ~108,000 |
| Sources supported (ATS, job boards, LinkedIn) | 64 |
| Postings with a parsed salary | ~36% |
| Postings with extracted skills | ~84% |
| Remote postings | ~14% |
| Refresh cadence | Hourly (full pool every few hours) |

<Note>
  The dataset is scraped from employers' own boards, not resold from an
  aggregator. That's why `apply_url` points at the real application form and why
  postings disappear when the employer takes them down — see
  [duplicates & collapsing](/docs/guides/deduplication).
</Note>

## The shape of the API

All read-only, all `GET`. The highlights:

| Endpoint | Purpose |
| --- | --- |
| [`/v1/jobs`](/docs/api-reference/jobs-list) | The search. Filter, page, sort by recency. |
| [`/v1/jobs/count`](/docs/api-reference/jobs-count) | Match counts without fetching rows. |
| [`/v1/jobs/feed`](/docs/api-reference/jobs-feed) | Everything indexed since a cutoff — for incremental sync. |
| [`/v1/jobs/expired`](/docs/api-reference/jobs-expired) | What expired since a cutoff — so a mirror can purge. |
| [`/v1/jobs/modified`](/docs/api-reference/jobs-modified) | What changed since a cutoff, and which fields. |
| [`/v1/jobs/{id}`](/docs/api-reference/jobs-retrieve) | One posting. |
| [`/v1/companies`](/docs/api-reference/companies-list) | Firmographics. |
| [`/v1/meta`](/docs/api-reference/meta) | Counts, freshness, source breakdown, per-field coverage. |

There are no `POST`/`PUT`/`DELETE` routes, no webhooks, and no streaming. Sync
is pull-based via the feeds — new, expired, and modified cover the full
lifecycle; [syncing the feed](/docs/guides/feed-sync) covers the pattern. The
[full reference](/docs/api-reference) lists every endpoint, including the
keyless [`/v1/health`](/docs/api-reference/health) and the live
[`/openapi.json`](https://api.hyperjobs.io/openapi.json) spec.

## Where to go next

If you're evaluating: run the [quickstart](/docs/quickstart), then read
[filtering](/docs/guides/filtering) — it's where the dataset's real query
surface is, and it has two behaviours that will otherwise cost you an afternoon.

If you're integrating: [the Job object](/docs/objects/job) is the page to keep
open.
