Download real-shaped records before you write any code. No key, no signup. Every sample record validates against its schema in the OpenAPI spec.
| File | Format | Contents | Schema |
|---|---|---|---|
jobs.json |
JSON array | 10 canonical jobs | Job |
jobs.csv |
CSV, header row | The same 10 jobs, flattened | Job, flattened |
companies.json |
JSON array | 3 company hiring profiles | CompanyProfile |
openapi.yaml |
OpenAPI 3.1 YAML | The full API spec: every endpoint, schema and example | — |
What the samples cover
Section titled “What the samples cover”The records are chosen to exercise the cases your code must handle, not just the happy path.
jobs.json
- Open and closed jobs. Closed jobs carry
closed_reason(filled,expired); open jobs haveclosed_reason: null. - Jobs with
salary: null(no source reported pay) next to jobs withsalary.origindeclaredandinferred. location.remoteastrue,falseandnull(unknown).posted_at: nullandlast_verified_at: nullon some jobs.- Re-listed jobs with
repost_countabove 0. - Several values of
seniority,employment_typeandjob_family. See Taxonomies. sources[]with one to three providers per job, each listing thefieldsit contributed.
companies.json has one profile per state of is_hiring.value: true (Acme Robotics), false (Globex Analytics) and null (Northwind Traders, no careers page or ATS found). See Companies.
CSV layout
Section titled “CSV layout”jobs.csv holds one row per canonical job. Nested objects are flattened into columns:
| Column | From |
|---|---|
company_id, company_name, company_domain |
company.* |
city, region, country_code, remote |
location.* |
salary_min, salary_max, salary_currency, salary_period, salary_origin |
salary.* |
source_providers |
sources[].provider, joined with | (for example betterjobs|theirstack|techmap) |
license_display, license_resale |
license.* |
All other columns keep their JSON names. An empty cell means null.
Load a sample
Section titled “Load a sample”curl -sO https://docs.betterjobs.cc/samples/jobs.jsoncurl -sO https://docs.betterjobs.cc/samples/jobs.csvcurl -sO https://docs.betterjobs.cc/samples/companies.jsoncurl -sO https://docs.betterjobs.cc/openapi.yamlimport requests
jobs = requests.get("https://docs.betterjobs.cc/samples/jobs.json", timeout=30).json()
for job in jobs: remote = job["location"]["remote"] # True, False or None (unknown) pay = job["salary"] # None = no source reported pay print(job["id"], job["status"], remote, pay and pay["min"])const jobs: any[] = await (await fetch("https://docs.betterjobs.cc/samples/jobs.json")).json();
for (const job of jobs) { const remote = job.location.remote; // true, false or null (unknown) const pay = job.salary; // null = no source reported pay console.log(job.id, job.status, remote, pay?.min ?? null);}To generate types instead of using any, point an OpenAPI generator at /openapi.yaml. See OpenAPI and SDKs.
Live samples
Section titled “Live samples”The keyless sandbox, POST /v1/sandbox/jobs/search, returns fixed illustrative data in the exact SearchResponse shape, including metadata. It charges nothing and calls no provider. Start at the Quickstart or the sandbox reference.
Every example in the API reference also validates against its schema, so you can use them as test fixtures.