# JobsPipe

> What does JobsPipe contribute, and when does BetterJobs route to it?

Source: https://docs.betterjobs.cc/providers/jobspipe/

JobsPipe sells normalized job postings from 30+ sources with 12 months of history. BetterJobs uses it as one of six partner providers.

JobsPipe

`jobspipe`

Normalized job postings from 30+ sources with 12 months of history.

- Sources

  30+ sources incl. Greenhouse, Lever, Ashby, Workday, Indeed, LinkedIn

- History

  12 months

- Freshness

  Under 6h on Builder, under 1h on Scale

- Credits

  1 credit per job; one credit buys a job for the rest of the calendar month

Growth includes 2 partner providers; Pro and above include all six. GET /v1/providers shows what your plan enables.

Facts per JobsPipe docs.

## What it is strong at

All facts in this section are per JobsPipe docs.

- **Major ATSs and boards in one schema.** 30+ sources, including Greenhouse, Lever, Ashby, Workday, Indeed and LinkedIn.
- **History.** 12 months of postings.
- **Lifecycle timestamps.** `discovered_at`, `last_seen_at`, `verified_at` and `closed_reason` per job.
- **Ghost detection.** A `ghost_score` per job.
- **Standard taxonomies.** ISCO-08, ISIC and ESCO.

## What it contributes to a BetterJobs job

JobsPipe’s field names next to ours:

| BetterJobs                | JobsPipe        |
| ------------------------- | --------------- |
| `title`                   | `job_title`     |
| `seniority`               | `seniority`     |
| `salary`                  | `salary_usd`    |
| `posted_at`               | `date_posted`   |
| `first_seen_at`           | `discovered_at` |
| `last_seen_at`            | `last_seen_at`  |
| `last_verified_at`        | `verified_at`   |
| `closed_reason`           | `closed_reason` |
| `sources[].url`           | `url`           |
| `sources[].first_seen_at` | `discovered_at` |
| `sources[].last_seen_at`  | `last_seen_at`  |

What JobsPipe filled on a given job is in that job’s `sources[]` entry for `jobspipe`, under `fields`. In the spec’s illustrative async-search example, JobsPipe supplied title, description, apply URL, location, seniority and employment type.

## Refresh

Per JobsPipe docs, freshness is under 6 hours on its Builder plan and under 1 hour on its Scale plan. On each BetterJobs job, the `jobspipe` entry in `sources[]` carries `first_seen_at` and `last_seen_at` for that source. JobsPipe’s `verified_at` maps to our `last_verified_at`.

> Builder and Scale are JobsPipe's plan names
>
> The freshness tiers above refer to JobsPipe’s own plans. BetterJobs also has a plan called Scale. It is unrelated. Measured BetterJobs freshness is published at GA; until then, read `first_seen_at` and `last_verified_at` on each job.

## Notes and quirks we normalize

### ghost\_score becomes p\_real

JobsPipe scores how likely a posting is a ghost. BetterJobs returns the opposite question, `p_real`: the probability (0 to 1) that the job is a real open req. `p_real` comes from corroboration across every source that saw the job, not from JobsPipe alone. Read it as roughly the inverse of `ghost_score`, not as a rescaled copy. See [`p_real`](https://docs.betterjobs.cc/data/field-dictionary.md#field-job-p_real) and [Provenance and confidence](https://docs.betterjobs.cc/concepts/provenance-and-confidence.md).

### Paying once for a job

Per JobsPipe docs, 1 credit buys a job for the rest of the calendar month. BetterJobs bills 1 credit per unique job you have not already paid for. A job you already paid for is free on later reads and counts in `metadata.jobs_already_paid`. `GET /v1/billing/ledger?job_id=...` proves it. See [Credits and billing](https://docs.betterjobs.cc/concepts/credits-and-billing.md).

### Different search request

JobsPipe searches with `POST /v1/jobs/search`. BetterJobs uses the same method and path on its own host, `https://api.betterjobs.cc/v1/jobs/search`, but a different body: filters go under `filters` with suffix operators like `title_or`. Unknown filter fields return `400 unknown_filter`. The translation is in [Migrate from JobsPipe](https://docs.betterjobs.cc/guides/migrate-from-jobspipe.md).

### Salary currency

JobsPipe reports `salary_usd`. BetterJobs keeps pay in the job’s own currency: `salary.currency` (ISO 4217) with `min`, `max` and `period`. Convert yourself if you need USD.

### Taxonomies

JobsPipe classifies with ISCO-08, ISIC and ESCO. BetterJobs returns its own `job_family` and `seniority` values. See [Taxonomies](https://docs.betterjobs.cc/data/taxonomies.md).

## When BetterJobs routes to it

Only when JobsPipe is enabled on your plan. Then:

- `max_coverage` asks it on every search.
- `cheapest_first` asks it only if the BetterJobs index and earlier sources did not fill the page.
- `waterfall.providers: ["betterjobs", "jobspipe"]` pins it.

Check `metadata.providers.tried` and `metadata.providers.hit` to see whether it was asked and matched.

## Plans that include it

Growth includes 2 partner providers; Pro and above include all six. GET /v1/providers shows what your plan enables. See the [plan table](https://docs.betterjobs.cc/providers.md#which-plan-includes-which-provider).

## Provider docs

We do not link to JobsPipe’s docs from this site. Everything you need to use JobsPipe data through BetterJobs is on this page and in [Migrate from JobsPipe](https://docs.betterjobs.cc/guides/migrate-from-jobspipe.md).

## Related

- [Migrate from JobsPipe](https://docs.betterjobs.cc/guides/migrate-from-jobspipe.md)
- [All providers](https://docs.betterjobs.cc/providers.md)
- [Freshness and lifecycle](https://docs.betterjobs.cc/concepts/freshness-and-lifecycle.md)
