# Providers

> Which sources does BetterJobs query, and what does each one bring?

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

A **provider** is one upstream source of job data. BetterJobs can route a search to seven of them: its own index and six partner providers. You never call a provider yourself. You send one request, BetterJobs asks the providers your plan enables, merges what they return and bills you 1 credit per unique job.

One signup, one key, one invoice. Not a separate signup, key and invoice for every provider.

## The sources

### [BetterJobs index](https://docs.betterjobs.cc/providers/betterjobs-index.md)

`betterjobs`

Our own job sources: an owned crawl of employer career pages and ATSs.

Every plan.

Facts BetterJobs.

### [Reqbeat](https://docs.betterjobs.cc/providers/reqbeat.md)

`reqbeat`

Deduplicated, normalized job postings and hiring events from ATSs, job boards and aggregators.

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

Facts per Reqbeat docs.

### [SignalsAPI](https://docs.betterjobs.cc/providers/signalsapi.md)

`signalsapi`

Recruiter-focused hiring signals plus the hiring owner's verified work email.

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

Facts per SignalsAPI docs.

### [TheirStack](https://docs.betterjobs.cc/providers/theirstack.md)

`theirstack`

Global job postings, technographics inferred from job text, buying intent and firmographics.

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

Facts per TheirStack docs.

### [JobsPipe](https://docs.betterjobs.cc/providers/jobspipe.md)

`jobspipe`

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

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

Facts per JobsPipe docs.

### [Coresignal](https://docs.betterjobs.cc/providers/coresignal.md)

`coresignal`

Large historical job-posting dataset plus company and employee records.

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

Facts per Coresignal docs.

### [Techmap](https://docs.betterjobs.cc/providers/techmap.md)

`techmap`

High-volume job feeds from ATSs, job boards and public employment offices (jobdatafeeds.com).

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

Facts per Techmap (jobdatafeeds.com).

[Provider docs ↗](https://jobdatafeeds.com)

Each card links to the provider’s page. Provider facts there are the provider’s own published claims, attributed to them. They are not BetterJobs measurements.

### At a glance

| Source                                                                       | Slug         | Refresh (as published)                                                                                   | Cheapest plan          |
| ---------------------------------------------------------------------------- | ------------ | -------------------------------------------------------------------------------------------------------- | ---------------------- |
| [BetterJobs index](https://docs.betterjobs.cc/providers/betterjobs-index.md) | `betterjobs` | Published at GA. Each job carries first\_seen\_at, last\_seen\_at and last\_verified\_at. *(BetterJobs)* | [Free](#plan-free)     |
| [Reqbeat](https://docs.betterjobs.cc/providers/reqbeat.md)                   | `reqbeat`    | Corpus refreshed every 3 hours *(per Reqbeat docs)*                                                      | [Growth](#plan-growth) |
| [SignalsAPI](https://docs.betterjobs.cc/providers/signalsapi.md)             | `signalsapi` | Sources rechecked every 15 minutes *(per SignalsAPI docs)*                                               | [Growth](#plan-growth) |
| [TheirStack](https://docs.betterjobs.cc/providers/theirstack.md)             | `theirstack` | 73% of jobs discovered the same day, 91% by the end of the next day *(per TheirStack docs)*              | [Growth](#plan-growth) |
| [JobsPipe](https://docs.betterjobs.cc/providers/jobspipe.md)                 | `jobspipe`   | Under 6h on Builder, under 1h on Scale *(per JobsPipe docs)*                                             | [Growth](#plan-growth) |
| [Coresignal](https://docs.betterjobs.cc/providers/coresignal.md)             | `coresignal` | Active postings rechecked within 24h *(per Coresignal docs)*                                             | [Growth](#plan-growth) |
| [Techmap](https://docs.betterjobs.cc/providers/techmap.md)                   | `techmap`    | Daily country feeds via AWS Data Exchange *(per Techmap (jobdatafeeds.com))*                             | [Growth](#plan-growth) |

## Which plan includes which provider

- **Free and Starter:** the [BetterJobs index](https://docs.betterjobs.cc/providers/betterjobs-index.md) only. No partner providers.
- **Growth:** the BetterJobs index plus 2 partner providers.
- **Pro, Scale and Enterprise:** the BetterJobs index plus all six partner providers.

| Plan       | Price / month | Credits / month | $ / 1k credits | Providers                         | Includes                                                               |
| ---------- | ------------- | --------------- | -------------- | --------------------------------- | ---------------------------------------------------------------------- |
| Free       | $0            | 1,000           | —              | Own job sources only              | 1,000 credits to test, No card required                                |
| Starter    | $19           | 5,000           | $3.80          | Own job sources only              | No partner providers                                                   |
| Growth     | $49           | 10,000          | $4.90          | Own sources + 2 partner providers | API, CSV, MCP                                                          |
| Pro        | $199          | 60,000          | $3.32          | Max coverage: all six providers   | Everything in Growth, plus Webhooks, CRM sync                          |
| Scale      | $599          | 250,000         | $2.40          | All six providers                 | Everything in Pro, plus Bring your own provider keys, Priority support |
| Enterprise | from $1,500   | Custom          | —              | Contact sales                     | —                                                                      |

Your key’s exact set is live data, not a table on this page. `GET /v1/providers` returns every source with `enabled_on_your_plan` and its live `status`. `GET /v1/account` returns the same set as `providers_enabled`.

**curl**

```bash
curl https://api.betterjobs.cc/v1/providers \
  -H "Authorization: Bearer $BETTERJOBS_API_KEY" \
  -H "BetterJobs-Version: 2026-10-01"
```

**Python**

```python
import os
import requests


resp = requests.get(
    "https://api.betterjobs.cc/v1/providers",
    headers={
        "Authorization": f"Bearer {os.environ['BETTERJOBS_API_KEY']}",
        "BetterJobs-Version": "2026-10-01",
    },
)
resp.raise_for_status()
for p in resp.json()["data"]:
    print(p["slug"], p["enabled_on_your_plan"], p["status"])
```

**TypeScript**

```ts
const resp = await fetch('https://api.betterjobs.cc/v1/providers', {
  headers: {
    Authorization: `Bearer ${process.env.BETTERJOBS_API_KEY}`,
    'BetterJobs-Version': '2026-10-01',
  },
});
if (!resp.ok) throw new Error(`BetterJobs ${resp.status}`);
const { data } = await resp.json();
for (const p of data) console.log(p.slug, p.enabled_on_your_plan, p.status);
```

The call is free. Illustrative response, seen from a Growth plan:

```json
{
  "data": [
    { "slug": "betterjobs", "name": "BetterJobs index", "enabled_on_your_plan": true, "status": "operational", "last_checked_at": "2026-10-11T09:00:00Z" },
    { "slug": "theirstack", "name": "TheirStack", "enabled_on_your_plan": true, "status": "operational", "last_checked_at": "2026-10-11T09:00:00Z" },
    { "slug": "coresignal", "name": "Coresignal", "enabled_on_your_plan": false, "status": "degraded", "last_checked_at": "2026-10-11T09:00:00Z" }
  ]
}
```

Trimmed to three rows. The full example is in [List providers](/api/operations/listproviders/).

## How routing works

You do not pick providers per request unless you want to. The `waterfall.strategy` on the request decides which sources are asked and in what order. The default is `cheapest_first`: it starts with the BetterJobs index and adds partner providers only until the page is full. `max_coverage` asks every provider on your plan. `own_only` asks the BetterJobs index only.

To pin sources yourself, list them in `waterfall.providers`:

```json
"waterfall": { "providers": ["betterjobs", "theirstack"], "max_credits": 100 }
```

Every slug must be enabled on your plan. If one is not, the request returns `403 plan_required` with `required_plan` and `upgrade_url`. See [plan\_required](https://docs.betterjobs.cc/platform/errors.md#plan_required).

Each source gets the query translated into its own grammar and field names. Records that describe the same opening merge into one [canonical job](https://docs.betterjobs.cc/concepts/canonical-jobs.md). `sources[]` on each job lists every provider that saw it and the fields it contributed. The full flow is in [The waterfall](https://docs.betterjobs.cc/concepts/waterfall.md). For picking a strategy, see [Choose a strategy](https://docs.betterjobs.cc/guides/choose-a-strategy.md).

## When a provider fails

A failing or slow provider never fails your request. You still get `200`. The response tells you what happened:

- `metadata.status` is `partial` instead of `complete`.
- `metadata.providers.failed` lists each provider that dropped out, with code `provider_timeout` (it missed `waterfall.timeout_ms`) or `provider_error`.
- You are billed only for jobs actually returned. A provider that failed costs nothing.

```json
"metadata": {
  "status": "partial",
  "credits_charged": 1,
  "providers": {
    "tried": ["betterjobs", "techmap", "theirstack", "coresignal"],
    "hit": ["betterjobs", "techmap", "theirstack"],
    "failed": [{ "provider": "coresignal", "code": "provider_timeout" }],
    "contributions": { "betterjobs": 1, "techmap": 0, "theirstack": 0 }
  }
}
```

Illustrative, from the spec’s partial example.

> Branch on metadata.status, not on the HTTP code
>
> A partial result is a `200`. If coverage matters for the run, such as a backfill or market count, check `metadata.status` and retry later when it is `partial`. Jobs you already got are free on the retry: they count in `metadata.jobs_already_paid`.

Async searches report the same way: `GET /v1/searches/{id}` finishes with `status: partial` when a provider failed. See [Errors and partial results](https://docs.betterjobs.cc/platform/errors.md#provider_timeout).

## Is a provider up right now?

Check `status` in `GET /v1/providers`: `operational`, `degraded` or `down`, with `last_checked_at`. How to use it, and what we publish about provider health, is on [Provider status](https://docs.betterjobs.cc/resources/provider-status.md).

> Coverage and fill-rate numbers
>
> The API is a v1 preview. We do not publish measured coverage, fill rates or freshness per provider yet. They are published at GA. Until then, every search reports its own numbers live: `metadata.providers.contributions` (unique jobs each provider added first) and `metadata.field_coverage` (share of returned jobs with each field filled).

## Related

- [The waterfall](https://docs.betterjobs.cc/concepts/waterfall.md)
- [Provenance and confidence](https://docs.betterjobs.cc/concepts/provenance-and-confidence.md): reading `sources[]`
- [Field dictionary](https://docs.betterjobs.cc/data/field-dictionary.md): provider field names next to ours
- [Credits and billing](https://docs.betterjobs.cc/concepts/credits-and-billing.md)
