Job Opportunities API

Check the data. Then trust it.

account

Plans

What each plan includes, rendered from the live price list, and what actually distinguishes them, which is records and entitlements, not features.

Last verified 2026-10-01 · Assumes: Nothing. · Markdown copy

1The plans

Every plan gets the search, job, company, closed-job and metadata endpoints; the delta feed (/v1/changes, /v1/jobs/expired) starts on Growth and bulk export on Signal. What changes up the ladder is the monthly record allowance, the request ceilings, and two entitlements.

In depthWhy it exists, what it is not, what people get wrong

There is no feature-gating of the data itself: the free plan queries the same live ledger, with the same fields and the same provenance, as the most expensive one. That is deliberate: a product whose pitch is auditability cannot ask you to pay to check its claims.

PlanPriceRecords / monthRequests / dayRequests / minDelta feedBulk export
Explore
explore
Free1,0005,00030nono
Starter
starter
€29/month10,00020,00060nono
Growth
growth
€80/month60,000100,000120yesno
Signal
signal
€299/month400,000400,000300yesyes
Scale
scale
€899/month2,000,0001,000,000600yesyes
Starter (annual)
starter_annual
€26110,00020,00060nono
Growth (annual)
growth_annual
€72060,000100,000120yesno
Signal (annual)
signal_annual
€2,691400,000400,000300yesyes
Scale (annual)
scale_annual
€8,0912,000,0001,000,000600yesyes

Rendered from /public/plans when this page was built. Only purchasable plans appear there, so this table is the price list: if a plan is not here, you cannot buy it. Compare on /pricing.

This table comes from /public/plans, which lists only purchasable plans. If a plan is not here, you cannot buy it. Compare and buy at /pricing.

Exact contractTypes, defaults, ranges, errors, edge cases
DimensionWhat it isWhere it bites
records_per_monthThe licence. How many rows you may receive in a month.The real ceiling on almost every integration. Exhausting it is a 402.
req_per_day / req_per_minBurst protection for the origin.Rarely the binding constraint above the free tier. Exceeding it is a 429.
delta_feedEntitlement: /v1/changes and /v1/jobs/expired.Without it, keeping a mirror current means re-reading listings (far more records).
bulk_exportEntitlement: /v1/export.Without it, a full-corpus pull means paging.
single_countryThe country-locked SKU: one country, exempt from the record meter for job rows.Detail.
max page sizeThe largest limit the plan allows.A plan property, not a constant. Published as max_page_size on /public/plans and in limits on /v1/me. A limit above it (within 1 to 200) is reduced to it, and the response carries X-JOA-Limit-Applied.

2Annual billing

Pay once for twelve months at nine months’ price: 25% off, on every paid plan, with identical entitlements to the monthly version.

In depthWhy it exists, what it is not, what people get wrong

Every paid plan also has an annual option: twelve months for the price of nine, charged once a year instead of once a month. Nothing about what the plan includes changes: the same records_per_month, the same request ceilings, the same delta_feed/bulk_export/single_country entitlements as the monthly plan of the same name. Annual buys a cheaper year, not a different product.

Choose it on /pricing with the monthly/annual toggle above the plan cards, which shows each plan’s annual total and its monthly-equivalent price before you buy; or go straight to checkout with ?billing=annual on the plan’s checkout link. The default, with no toggle and no parameter, is monthly.

PlanPriceRecords / monthRequests / dayRequests / minDelta feedBulk export
Explore
explore
Free1,0005,00030nono
Starter
starter
€29/month10,00020,00060nono
Growth
growth
€80/month60,000100,000120yesno
Signal
signal
€299/month400,000400,000300yesyes
Scale
scale
€899/month2,000,0001,000,000600yesyes
Starter (annual)
starter_annual
€26110,00020,00060nono
Growth (annual)
growth_annual
€72060,000100,000120yesno
Signal (annual)
signal_annual
€2,691400,000400,000300yesyes
Scale (annual)
scale_annual
€8,0912,000,0001,000,000600yesyes

Rendered from /public/plans when this page was built. Only purchasable plans appear there, so this table is the price list: if a plan is not here, you cannot buy it. Compare on /pricing.

The table above is /public/plans itself, so the _annual rows and their current prices are always this page’s live state, not a copy that can go stale. As one dated example: on 2026-10-01, Growth was €80/month or €720/year: nine months’ charge for twelve months’ access. Check the live table for today’s figures rather than this sentence.

Exact contractTypes, defaults, ranges, errors, edge cases
Renewal
An annual subscription renews yearly, the same webhook-driven flow as a monthly one renews monthly. See Checkout.
Cancel
Cancelling an annual plan works exactly like cancelling a monthly one: it takes effect at the end of the period already paid for, and nothing is charged again. See Can I cancel any time?.
Refund
The same policy as monthly: a barely-used plan is refunded if you ask within 14 days, and a genuine billing error is refunded regardless of the window. See Billing and invoices.
Launch discount
The time-limited launch discount (see the launch offer) applies to monthly checkout only. It is not sent on an annual checkout, because the 25%-off annual price is itself the discount for that interval, and Creem’s own discount code is scoped to the monthly products.

3The two entitlements

delta_feed and bulk_export are the only endpoints a plan can lack. Missing one is a 403 that names it in a header.

In depthWhy it exists, what it is not, what people get wrong

A plan without delta_feed cannot call /v1/changes or /v1/jobs/expired. A plan without bulk_export cannot call /v1/export. Everything else is available on every plan, including the free one.

The refusal is explicit rather than silent: HTTP 403 with X-JOA-Required-Feature: delta_feed or bulk_export, so a client can report exactly what is missing rather than “forbidden”.

Exact contractTypes, defaults, ranges, errors, edge cases
What a plan without the entitlement sees
curl -s -D - -o /dev/null -H "Authorization: Bearer $EXPLORE_KEY" \
  'https://api.jobopportunitiesapi.org/v1/changes?since=2026-08-01T00:00:00Z&limit=2'
# HTTP/2 403
# x-joa-required-feature: delta_feed

/v1/me reports the plan but not the entitlements directly; the dashboard shows them per key as an Includes row, and /public/plans lists them per plan. In code, read /public/plans and match on your plan name rather than hard-coding which tier has what.

4Choosing one

Estimate records, not requests: rows you will receive per month, including every re-read. That number picks the plan.

In depthWhy it exists, what it is not, what people get wrong
  1. Count the rows in your slice. /public/coverage/countries and /public/facets give you this keylessly, for free, before you buy anything.
  2. Decide how often you re-read them. This is where most estimates go wrong. A daily full re-read of a 60,000-row slice is 1.8 million records a month; the same slice kept current with /v1/changes is a fraction of that.
  3. Add the seed. The first full pull costs one record per row, once.
  4. Add a margin. Development, retries and re-processing are all real records.
  5. Then pick the plan whose records_per_month covers it, and check it has the entitlements your design needs.

If the answer is “a daily full re-read is too expensive”, the answer is usually not a bigger plan: it is the delta feed, which is specifically the tool for that problem and is included from Growth upward.

Exact contractTypes, defaults, ranges, errors, edge cases
ShapeRecords per month, roughlyNotes
Evaluation, by handhundredsOr close to none: the STATISTICAL /public/* routes are keyless; only a row you actually open costs a record.
A niche board, one country + category, delta-syncedseed + what movesThe seed dominates in month one and then almost nothing.
A board over a whole country, daily full re-readlive rows × 30Usually the wrong architecture. Switch to the delta feed.
CRM enrichment, 5,000 domains weeklyrows returned × 4Cap limit to what you store.
Research corpus, one-offthe corpus, onceUse /v1/export (needs bulk_export).
Whole-ledger mirror, kept currentseed + daily changesNeeds delta_feed; bulk_export makes the seed far easier.

Every one of these is measurable before you pay: run the query keylessly, look at the counts, and multiply. If you would rather have somebody check the arithmetic, /contact reaches a person.

5Grant keys and the free tier

The free Explore plan needs no card and does not expire. There is also a grant key for research and non-commercial work, by application.

In depthWhy it exists, what it is not, what people get wrong

Explore is not a trial. It has no expiry date, it needs no payment details, and it gives you the search, job, company and closed-job endpoints against the live ledger. What it does not have is the delta feed, bulk export, or a large record allowance.

The Growth trial. A free key created with a company email address starts on a 14-day Growth trial: Growth limits and the delta feed, no card. When it ends the key continues on Explore unless you choose a paid plan. There is one trial per company email domain; personal webmail, school and disposable addresses start on Explore (a research or non-commercial project can apply for a grant key instead, below). The dashboard says when the key is created whether the trial started and, if it did not, why.

Exact contractTypes, defaults, ranges, errors, edge cases

Because grant keys are not purchasable they do not appear on /public/plans, which lists active, buyable plans only. That is why a grant key's plan name may not match anything in the table on this page. Read your own key's limits from /v1/me and the dashboard rather than from the price list.

You can hold several keys at once, on different plans. The record allowance is per key, not per account, so splitting environments across two keys also splits the meter, which is usually what you want, since it stops a runaway staging job from spending production's allowance.

This page was rendered 27 October 2026, 11:29 UTC. Every figure on it comes from the endpoint named beside it, and every published request is re-sent against the live API before this site is allowed to build. If something here is wrong, the thumbs-down above reaches a person.