Skip to content
API v1 preview — endpoints and fields may change before general availability.

Get a job

Get a job. Fetch one canonical job by id.

Cost: 1 credit / jobFree if you already paid for this job, otherwise 1 credit.

GET
/jobs/{id}
curl --request GET \
--url https://api.betterjobs.cc/v1/jobs/job_01JC8X4M2Q7RV3T9KD5W6YH0AB \
--header 'Authorization: Bearer <token>' \
--header 'BetterJobs-Version: 2026-10-01'

Fetch one canonical job by id. Free if you already paid for it, otherwise 1 credit.

id
required
string
/^job_/
Example
job_01JC8X4M2Q7RV3T9KD5W6YH0AB

Canonical job id (job_...).

BetterJobs-Version
string
Allowed values: 2026-10-01
Example
2026-10-01

Date-pinned API version. Changes within a version are additive only. Defaults to your account’s pinned version.

The canonical job.

Media typeapplication/json

A canonical job: one real opening, merged from every source that saw it. Null semantics: null = unknown; [] = verified none; field omitted = not part of this payload (for example the lifecycle-only job in job.closed and job.reposted events).

object
id
required

Canonical job id. Stable across sources and requests.

string
/^job_/
title
required
string
company
required

Company reference embedded in jobs, events and profiles.

object
id
required
string
/^cmp_/
name
required
string
domain
required

Primary web domain. null when unknown.

string | null
location
required
object
city
required
string | null
region
required
string | null
country_code
required

ISO 3166-1 alpha-2.

string | null
remote
required

true remote, false on-site or hybrid, null unknown.

boolean | null
employment_type
required
One of:
string
Allowed values: full_time part_time contract internship temporary
seniority
required
One of:
string
Allowed values: intern junior mid senior lead director vp c_level
job_family
required
string | null
salary
required
One of:
object
min
required
number | null
max
required
number | null
currency
required

ISO 4217.

string
period
required
string
Allowed values: year month hour
origin
required

declared = stated in the posting. inferred = estimated by a source.

string
Allowed values: declared inferred
description
required

Plain-text job description.

string | null
apply_url
required
string | null format: uri
posted_at
required

Date the employer posted the job, if known.

string | null format: date-time
first_seen_at
required

Earliest time any source saw the job.

string format: date-time
last_seen_at
required

Latest time any source saw the job.

string format: date-time
last_verified_at
required

Latest time the job was confirmed live at its origin.

string | null format: date-time
status
required
string
Allowed values: open closed
closed_reason
required

Why the job closed. null while open.

string | null
Allowed values: filled expired removed unknown
repost_count
required

Times the same job was re-listed.

integer
p_real
required

Probability (0-1) that the job is a real open req, from cross-source corroboration.

number
<= 1
sources
required
Array<object>

One provider’s view of the canonical job.

object
provider
required

Source slug. betterjobs is the BetterJobs index.

string
Allowed values: betterjobs reqbeat signalsapi theirstack jobspipe coresignal techmap
provider_job_id
required
string
url
required
string | null format: uri
first_seen_at
required
string format: date-time
last_seen_at
required
string format: date-time
fields
required

Job fields this source contributed to the canonical record.

Array<string>
license
required
object
display
required

You may show this job to your end users.

boolean
resale
required

You may resell or redistribute this job as data.

boolean
Examples
Examplejob

Canonical job (illustrative)

{
"id": "job_01JC8X4M2Q7RV3T9KD5W6YH0AB",
"title": "Head of Revenue Operations",
"company": {
"id": "cmp_4Rk7TzP1aQ",
"name": "Acme Robotics",
"domain": "acme-robotics.example"
},
"location": {
"city": "Berlin",
"region": "Berlin",
"country_code": "DE",
"remote": false
},
"employment_type": "full_time",
"seniority": "lead",
"job_family": "operations",
"salary": {
"min": 110000,
"max": 135000,
"currency": "EUR",
"period": "year",
"origin": "declared"
},
"description": "Acme Robotics is hiring a Head of Revenue Operations to own forecasting, CRM hygiene and the GTM tool stack across DACH.",
"apply_url": "https://jobs.acme-robotics.example/revops-lead/apply",
"posted_at": "2026-10-08T00:00:00Z",
"first_seen_at": "2026-10-08T06:40:00Z",
"last_seen_at": "2026-10-11T06:10:00Z",
"last_verified_at": "2026-10-11T06:10:00Z",
"status": "open",
"closed_reason": null,
"repost_count": 0,
"p_real": 0.94,
"sources": [
{
"provider": "betterjobs",
"provider_job_id": "bj_idx_5521907",
"url": "https://jobs.acme-robotics.example/revops-lead",
"first_seen_at": "2026-10-08T06:40:00Z",
"last_seen_at": "2026-10-11T06:10:00Z",
"fields": [
"title",
"description",
"apply_url",
"location",
"employment_type",
"posted_at"
]
},
{
"provider": "theirstack",
"provider_job_id": "ts_88213377",
"url": "https://jobs.acme-robotics.example/revops-lead",
"first_seen_at": "2026-10-08T07:12:00Z",
"last_seen_at": "2026-10-11T04:02:00Z",
"fields": [
"salary",
"seniority"
]
},
{
"provider": "techmap",
"provider_job_id": "tm_3f9a2c71",
"url": "https://boards.example/acme-robotics/revops-lead",
"first_seen_at": "2026-10-08T09:30:00Z",
"last_seen_at": "2026-10-10T23:40:00Z",
"fields": [
"job_family"
]
}
],
"license": {
"display": true,
"resale": false
}
}
X-Request-Id
string
Example
req_7Hc2LmQ9xT

Unique id for this request. Quote it to support.

X-Credits-Charged
integer
Example
1

Credits charged by this request.

X-Credits-Remaining
integer
Example
9841

Credits left on your account after this request.

RateLimit-Limit
integer
Example
60

Requests allowed in the current window.

RateLimit-Remaining
integer
Example
59

Requests left in the current window.

RateLimit-Reset
integer
Example
42

Seconds until the window resets.

Missing or invalid API key.

Media typeapplication/json
object
error
required
object
type
required
string
Allowed values: invalid_request_error authentication_error billing_error permission_error not_found_error conflict_error rate_limit_error api_error
code
required
string
Allowed values: invalid_request unknown_filter unauthorized insufficient_credits plan_required not_found idempotency_conflict rate_limited internal_error
message
required
string
doc_url
required
string format: uri
request_id
required
string
credits_needed

Present on insufficient_credits.

integer
required_plan
string
Allowed values: free starter growth pro scale enterprise
upgrade_url

Present on insufficient_credits and plan_required.

string format: uri
param

Offending field on invalid_request and unknown_filter.

string
key
additional properties
any
Examples
Exampleunauthorized
{
"error": {
"type": "authentication_error",
"code": "unauthorized",
"message": "Missing or invalid API key. Send 'Authorization Bearer bj_live_...'.",
"doc_url": "https://docs.betterjobs.cc/platform/errors/#unauthorized",
"request_id": "req_5Dl6EvN0xY"
}
}
X-Request-Id
string
Example
req_7Hc2LmQ9xT

Unique id for this request. Quote it to support.

Not enough credits for this request.

Media typeapplication/json
object
error
required
object
type
required
string
Allowed values: invalid_request_error authentication_error billing_error permission_error not_found_error conflict_error rate_limit_error api_error
code
required
string
Allowed values: invalid_request unknown_filter unauthorized insufficient_credits plan_required not_found idempotency_conflict rate_limited internal_error
message
required
string
doc_url
required
string format: uri
request_id
required
string
credits_needed

Present on insufficient_credits.

integer
required_plan
string
Allowed values: free starter growth pro scale enterprise
upgrade_url

Present on insufficient_credits and plan_required.

string format: uri
param

Offending field on invalid_request and unknown_filter.

string
key
additional properties
any
Examples
ExampleinsufficientCredits
{
"error": {
"type": "billing_error",
"code": "insufficient_credits",
"message": "This request needs at least 25 credits; 3 remain.",
"credits_needed": 25,
"upgrade_url": "https://betterjobs.cc/pricing",
"doc_url": "https://docs.betterjobs.cc/platform/errors/#insufficient_credits",
"request_id": "req_6Ek5FuM9wX"
}
}
X-Request-Id
string
Example
req_7Hc2LmQ9xT

Unique id for this request. Quote it to support.

The resource does not exist.

Media typeapplication/json
object
error
required
object
type
required
string
Allowed values: invalid_request_error authentication_error billing_error permission_error not_found_error conflict_error rate_limit_error api_error
code
required
string
Allowed values: invalid_request unknown_filter unauthorized insufficient_credits plan_required not_found idempotency_conflict rate_limited internal_error
message
required
string
doc_url
required
string format: uri
request_id
required
string
credits_needed

Present on insufficient_credits.

integer
required_plan
string
Allowed values: free starter growth pro scale enterprise
upgrade_url

Present on insufficient_credits and plan_required.

string format: uri
param

Offending field on invalid_request and unknown_filter.

string
key
additional properties
any
Examples
ExamplenotFound
{
"error": {
"type": "not_found_error",
"code": "not_found",
"message": "No job with id 'job_01JC00000000000000000000XX'.",
"doc_url": "https://docs.betterjobs.cc/platform/errors/#not_found",
"request_id": "req_8Gi3HsK7uV"
}
}
X-Request-Id
string
Example
req_7Hc2LmQ9xT

Unique id for this request. Quote it to support.

Too many requests. Wait Retry-After seconds.

Media typeapplication/json
object
error
required
object
type
required
string
Allowed values: invalid_request_error authentication_error billing_error permission_error not_found_error conflict_error rate_limit_error api_error
code
required
string
Allowed values: invalid_request unknown_filter unauthorized insufficient_credits plan_required not_found idempotency_conflict rate_limited internal_error
message
required
string
doc_url
required
string format: uri
request_id
required
string
credits_needed

Present on insufficient_credits.

integer
required_plan
string
Allowed values: free starter growth pro scale enterprise
upgrade_url

Present on insufficient_credits and plan_required.

string format: uri
param

Offending field on invalid_request and unknown_filter.

string
key
additional properties
any
Examples
ExamplerateLimited
{
"error": {
"type": "rate_limit_error",
"code": "rate_limited",
"message": "Rate limit exceeded. Retry after 12 seconds.",
"doc_url": "https://docs.betterjobs.cc/platform/errors/#rate_limited",
"request_id": "req_0Ig1JqH5sT"
}
}
X-Request-Id
string
Example
req_7Hc2LmQ9xT

Unique id for this request. Quote it to support.

Retry-After
integer
Example
12

Seconds to wait before retrying.

RateLimit-Limit
integer
Example
60

Requests allowed in the current window.

RateLimit-Remaining
integer
Example
59

Requests left in the current window.

RateLimit-Reset
integer
Example
42

Seconds until the window resets.

Something failed on our side. Safe to retry with the same Idempotency-Key.

Media typeapplication/json
object
error
required
object
type
required
string
Allowed values: invalid_request_error authentication_error billing_error permission_error not_found_error conflict_error rate_limit_error api_error
code
required
string
Allowed values: invalid_request unknown_filter unauthorized insufficient_credits plan_required not_found idempotency_conflict rate_limited internal_error
message
required
string
doc_url
required
string format: uri
request_id
required
string
credits_needed

Present on insufficient_credits.

integer
required_plan
string
Allowed values: free starter growth pro scale enterprise
upgrade_url

Present on insufficient_credits and plan_required.

string format: uri
param

Offending field on invalid_request and unknown_filter.

string
key
additional properties
any
Examples
ExampleinternalError
{
"error": {
"type": "api_error",
"code": "internal_error",
"message": "Unexpected error. Retry with the same Idempotency-Key; you will not be charged twice.",
"doc_url": "https://docs.betterjobs.cc/platform/errors/#internal_error",
"request_id": "req_1Jf0KpG4rS"
}
}
X-Request-Id
string
Example
req_7Hc2LmQ9xT

Unique id for this request. Quote it to support.