# Licensing

> Can I display or resell the jobs I get from BetterJobs?

Source: https://docs.betterjobs.cc/concepts/licensing/

Every job carries a `license` object with two flags. Read them before a job leaves your team.

```json
"license": { "display": true, "resale": false }
```

| Flag              | `true` means                                     |
| ----------------- | ------------------------------------------------ |
| `license.display` | You may show this job to your end users.         |
| `license.resale`  | You may resell or redistribute this job as data. |

Both are always present and always `true` or `false`. Never `null`.

## In plain English

| `display` | `resale` | You may                                                                                       | You may not                                                                 |
| --------- | -------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| `true`    | `true`   | Show it in your product and pass the data on to others.                                       |                                                                             |
| `true`    | `false`  | Show it in your product, for example on a job board, in an app, or in an alert to your users. | Sell or hand over the data itself, for example as a file, a feed or an API. |
| `false`   | `true`   | Pass the data on as data.                                                                     | Show it to end users in your product.                                       |
| `false`   | `false`  |                                                                                               | Show it to end users, or resell it.                                         |

What you may do inside your own team, such as research or enriching your own CRM, is set by your agreement with BetterJobs, not by these flags.

## Common cases

- **Sales prospecting in your own CRM.** Internal use. Your agreement covers it; the flags matter once jobs reach people outside your team.
- **A job board or job alerts for your users.** Keep only jobs with `license.display: true`.
- **An agency sending shortlists to clients.** Your clients are end users. Keep only `license.display: true`.
- **Selling a dataset, a feed or an API built on these jobs.** Keep only `license.resale: true`.
- **Training data or a public dump.** That is redistribution. Keep only `license.resale: true`, and check your agreement.

> Check per job, not per search
>
> Flags are set on each job. One page of results can mix jobs with different flags. Filter on every job, every time, including jobs that arrive in webhook events.

## Filter before you publish

There is no search filter for license, so filter the response. This keeps only jobs you may show:

**curl**

```bash
curl https://api.betterjobs.cc/v1/jobs/search \
  -H "Authorization: Bearer $BETTERJOBS_API_KEY" \
  -H "BetterJobs-Version: 2026-10-01" \
  -H "Content-Type: application/json" \
  -d '{
    "filters": { "title_or": ["Head of RevOps"], "country_code_or": ["DE", "AT", "CH"], "posted_within_days": 7 },
    "waterfall": { "max_credits": 100 }
  }' \
  | jq '.data | map(select(.license.display))'
```

**Python**

```python
import os
import requests


resp = requests.post(
    "https://api.betterjobs.cc/v1/jobs/search",
    headers={
        "Authorization": f"Bearer {os.environ['BETTERJOBS_API_KEY']}",
        "BetterJobs-Version": "2026-10-01",
    },
    json={
        "filters": {
            "title_or": ["Head of RevOps"],
            "country_code_or": ["DE", "AT", "CH"],
            "posted_within_days": 7,
        },
        "waterfall": {"max_credits": 100},
    },
)
resp.raise_for_status()
showable = [job for job in resp.json()["data"] if job["license"]["display"]]
```

**TypeScript**

```ts
const resp = await fetch('https://api.betterjobs.cc/v1/jobs/search', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.BETTERJOBS_API_KEY}`,
    'BetterJobs-Version': '2026-10-01',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    filters: { title_or: ['Head of RevOps'], country_code_or: ['DE', 'AT', 'CH'], posted_within_days: 7 },
    waterfall: { max_credits: 100 },
  }),
});
if (!resp.ok) throw new Error(`BetterJobs ${resp.status}`);
const { data } = await resp.json();
const showable = data.filter((job: { license: { display: boolean } }) => job.license.display);
```

Jobs you filter out are still charged, because they were returned. If most of your results are not usable for your case, tell us: the mix depends on the sources a search routes to.

## Simplest licensing: `own_only`

The `own_only` strategy uses only the [BetterJobs index](https://docs.betterjobs.cc/providers/betterjobs-index.md), with no partner providers. One source means one set of terms. It is the strategy to start with when licensing matters more than coverage. See [the waterfall](https://docs.betterjobs.cc/concepts/waterfall.md#strategies).

Partner providers have their own terms with BetterJobs. The `license` flags on each job are where those terms reach you. You do not need to read six provider contracts.

## This is not legal advice

These flags summarize what BetterJobs allows. Your agreement with BetterJobs is what binds you. If you plan to resell or publish at scale, read it or ask us before you ship.

## Related

- [Provenance and confidence](https://docs.betterjobs.cc/concepts/provenance-and-confidence.md): `sources[]` shows which providers a job came from
- [Field dictionary](https://docs.betterjobs.cc/data/field-dictionary.md#field-job-license-display)
- [When BetterJobs is the wrong tool](https://docs.betterjobs.cc/resources/when-not-to-use.md)
