Job Opportunities API

Check the data. Then trust it.

account

Billing, invoices and status

What happens between clicking buy and the key switching on, where the invoice comes from, and how to tell whether the data behind the API is current.

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

1Checkout

Pick a plan, enter your email, pay by card on Creem's hosted checkout page. The key is created immediately in a pending state and switches on when Creem's webhook confirms the payment.

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

Card payments are processed by Creem, our Merchant of Record: it sells and invoices the plan on our behalf, collects billing details and computes any VAT due on its own hosted checkout page, and takes the card number. The site's own checkout collects only what starts the order -- email, plan, and an optional single-country selection -- and never sees a card.

The key row is written before the payment completes, in a past_due state. That is why a key can appear on your dashboard showing Awaiting payment: it is not an error, and it needs nothing from you beyond finishing the payment. When Creem's webhook confirms the charge, the key activates.

Exact contractTypes, defaults, ranges, errors, edge cases
  1. /pricing or /api → Get access → /checkout?plan=<plan>.
  2. The form posts to the site's own /api/checkout, which forwards to POST /public/checkout on the API.
  3. The API validates the plan against the live plans table, writes a pending key, and creates a hosted checkout session at Creem.
  4. You are redirected to Creem's own card page, which collects billing details and computes VAT.
  5. On success you land on /checkout/done, with Creem's own redirect query parameters attached (including request_id, which is the JOA key id). On cancellation or failure, /checkout/failed. Neither page is what activates the key.
  6. Creem's webhook activates the key. This is the authoritative step -- the redirect is only a redirect, and /checkout/done polls GET /public/checkout/status?ref=<key_id> for a few seconds to show the moment it happens, then falls back to pointing at the dashboard.

Legacy webhook paths for previous providers (Viva and, before that, Revolut) still exist in the API and are retained for historical orders and for existing Viva subscribers who have not yet moved to Creem. Live checkout for anyone new goes through Creem exclusively.

2The launch discount

A time-limited discount code applied automatically at checkout, for as long as the current offer runs, and only on monthly plans.

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

A launch discount, where one is running, is applied automatically to a new monthly checkout: there is no code to type in. “For life” means what it says: the discounted rate persists for as long as that subscription stays active, not just for the first payment. It is not combined with the annual price, because the annual price is already a standing 25%-off discount for that interval; see Annual billing.

The current offer, if any, is published at GET /public/launch-offer, keyless, no account needed to check it. The same endpoint feeds the banner on /pricing, so the website never shows a discount that endpoint does not confirm is still running.

Exact contractTypes, defaults, ranges, errors, edge cases

See `GET /public/launch-offer` for the response shape. The offer is time-boxed on a published schedule and can also be withdrawn by the operator at any time; neither changes a subscription that already has the discount applied. Only new checkouts are affected.

3Partners: Creem affiliate programme

Join our affiliate programme on Creem and earn 25% of what a referred customer pays, recurring, for their first 12 months. Tracking is a 180-day link cookie and Creem pays affiliates directly, not us.

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

Join at affiliates.creem.io/join/jobopportunitiesapi. Creem reviews every application manually, usually within a few days. Once approved, Creem sets a 180-day cookie on your referral link and attributes any paid checkout within that window to you, for as long as the 12-month commission term runs. It works on every plan, monthly or annual: an annual referral earns a twelfth of the yearly commission each month, the same way the subscription itself is billed.

There is no fixed fee and no minimum. Creem pays affiliates directly from each sale, not us. Payouts run on the 1st and 15th, EUR 50 minimum balance, after Creem's own KYC check. Full terms and the FAQ are on /partners.

Exact contractTypes, defaults, ranges, errors, edge cases
Standard rate
25% recurring commission, for the referred customer's first 12 months as a paying subscriber.
Tracking
180-day attribution cookie on the affiliate link, set and honoured by Creem, not a code we issue ourselves.
Larger partners
An existing relevant audience, a live integration, a distribution deal: write to us to talk directly. Creem's affiliate programme runs one standard rate for every affiliate, so a different percentage cannot be promised through it.
Joining
affiliates.creem.io/join/jobopportunitiesapi, manual review by Creem, usually within a few days. No application form with us, no call required.
Payout
Paid directly by Creem from each sale, on the 1st and 15th, EUR 50 minimum balance, after Creem's own KYC. There is no invoice between us and no payout handled by us.

4Invoices and refunds

Creem, our Merchant of Record, issues the invoice for every order and handles VAT. It also runs a customer portal for managing a card on file and viewing past invoices.

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

Because Creem sells and invoices on our behalf, the invoice for a Creem-billed order comes from Creem, not from Job Opportunities API -- and it is Creem, not us, that decides the VAT treatment and issues the document. This is the ordinary shape of a Merchant-of-Record relationship: the seller of record and the invoice issuer are the same party, and it is not us.

From your account page, a key billed through Creem shows a Manage billing button. It opens Creem's own customer portal, where a card on file can be changed and past invoices are listed -- Creem hosts that page, we only link to it.

For anything that is not self-service -- a refund, a question about a charge, a purchase-order reference -- /contact?topic=billing reaches a person, or Creem's own support can be contacted directly.

Exact contractTypes, defaults, ranges, errors, edge cases
VAT
Calculated by Creem at checkout, from your billing country and business status. JOA's checkout collects no VAT number or company details -- that happens on Creem's own hosted page.
Currency
EUR throughout.
Invoices
Issued by Creem, as Merchant of Record. Not issued by Job Opportunities API for any order placed through Creem.
Refunds
The 14-day no-questions refund for barely-used service, and a full refund for a genuine billing error, are unchanged from before the move to Creem -- only who processes the refund changed. Ask on /contact?topic=billing, or contact Creem support directly.
Manage billing
/dashboard → Manage billing, for any key with billing_provider creem -- opens Creem's customer portal.

5Fiscal transmission (Greece, myDATA) -- legacy Viva orders only

Job Opportunities API's own myDATA transmission to the Greek tax authority applies only to legacy orders billed through Viva. Creem, as Merchant of Record, handles VAT and invoicing for every order on its own -- JOA's fiscal pipeline plays no part in a Creem-billed sale.

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

For the Viva-billed orders this still covers, the business is registered in Greece, so every issued document was transmitted to AADE's myDATA platform. That was always invisible to the customer; it is documented here only because it constrains the invoice, and two of those constraints occasionally surprised people.

A name was required on a retail document
The customer is a person, not a VAT number. The tax authority enforces this, so Viva-era checkout asked for a name even when a company VAT number was supplied.
Corrections were credit notes
A transmitted document cannot be edited. A correction is a new, related document.
Exact contractTypes, defaults, ranges, errors, edge cases

None of this applies to a Creem-billed order: Creem decides the VAT treatment, issues its own invoice, and files whatever it is obliged to file in its own capacity as Merchant of Record. A customer asking “why does my Creem invoice look different from an old Job Opportunities API one” is asking a real question with a real answer -- they are now two different documents from two different issuers, by design.

6Status: is the data current?

/status answers whether the ledger is current, measured from the ledger itself, not whether the website replied to a ping.

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

A green dot on a conventional status page proves the site answered a probe. That is not the question a data buyer has. The question is whether the data moved, how much was re-verified in the last day, how much was added, how much was delisted, and how old the oldest verification is. Those are what /status reports, and all of them are read from the ledger.

The same figures are available programmatically at /public/status (keyless), and the deeper freshness report at `/public/freshness`.

Exact contractTypes, defaults, ranges, errors, edge cases
What `/status` reportsRead it as
stateok, degraded, or worse, computed from the figures below, not from a probe.
live_listingsRows currently servable.
reverified_last_24hRows re-confirmed at their source in the last day. The main sign of a healthy refresh.
added_last_24hNew rows in the last day. Absent (shown as n/a) where the stored snapshot predates the measurement.
delisted_last_24hRows that left in the last day.
oldest_verificationHow stale the least recently checked row is.
last_projectionWhen the served set was last rebuilt.

A missing figure renders as n/a rather than as 0, deliberately: a real zero and “not measured yet” must not look alike. Every number on that page comes from an endpoint that can legitimately not have measured something yet.

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.