Job Opportunities API

Check the data. Then trust it.

website

Every page and every form

The complete route list, what the header and footer link to, and every form on the site with the fields it collects and where they go.

Last verified 2026-08-22 · Assumes: Nothing. · Markdown copy

2Every route on the site

Twenty-odd public pages, four account pages, an admin console, and the machine-readable files. This is all of them.

In depthWhy it exists, what it is not, what people get wrong
RouteWhat it is
/The ledger browser. Detail.
/companiesEmployer directory.
/company/<slug>One employer and their open roles.
/job/<slug>One listing. Detail.
/docsThis documentation. /guides redirects here.
/docs/ai/*.mdThe machine-readable mirror.
/apiThe API sales page: pitch, quick reference, plans.
/pricingThe price list, rendered from the live plans table.
/checkoutBuy a plan. /checkout/done and /checkout/failed are its outcomes.
/registerHow to get a key; routes to /login for the free one, and to a grant application.
/loginPasswordless sign-in.
/auth/verifyConsumes the magic-link token. Not a page you visit directly.
/dashboardYour keys. Detail.
/coverageThe coverage report, rendered.
/coverage/countriesPer-country coverage.
/provenanceWhere rows come from, and the sources we refuse.
/factsCheckable claims, each with the endpoint that proves it.
/compareHow this compares with the alternatives.
/aboutHow the ledger works.
/statusIs the data current. Detail.
/postEmployer listing submission form.
/optoutSite-owner removal. Detail.
/contactContact form, topic-aware.
/newsletterNewsletter subscription.
/confirmConfirms a newsletter subscription from an emailed link.
/unsubscribeUnsubscribes, from an emailed link.
/invoice/<token>A customer's invoice, reached from an email. No session needed.
/privacy, /cookies, /terms, /aiLegal. Detail.
/admin/*Operator console. Not for customers; separately authenticated.
/openapi.json, /openapi.yamlThe machine contract.
/llms.txtShort doorway for machine readers.
/robots.txt, /sitemap.xml, /sitemaps/<kind>/<page>Crawler files.
Exact contractTypes, defaults, ranges, errors, edge cases

/api and /docs are deliberately different pages for different moments. /api is the pitch and the price list — “can this do the thing, and what does it cost”. /docs is the reference — “how exactly does it work”. They cross-link and do not duplicate; the full parameter reference lives here, not there.

/admin/* is the operator console — ads, donations, keys, messages, providers, submissions — behind its own authentication and deliberately plain. It is listed here for completeness, not as something to use. Its nav entry is coloured differently from every other nav item precisely so it cannot be reached by accident or mistaken for a customer surface.

3Every form, and where it posts

Six public forms. Each posts to one of the site's own JSON routes, which forwards to the API; most are protected by a bot check.

In depthWhy it exists, what it is not, what people get wrong
FormFieldsPosts toProtection
Search (home)q, plus every active filter as hidden fieldsGET / — it is a link, not a POSTnone needed
Sign in (/login)email/api/auth/requestPOST /public/auth/requestrate limited
Add a listing (/post)title, company, category, city, country, remote, employment type, salary, apply URL, contact email, description, plus a hidden honeypot/api/submitPOST /public/submissionsTurnstile + honeypot
Contact (/contact)topic, email, name, message, hidden honeypot/api/contactPOST /public/contactTurnstile + honeypot
Newsletter (/newsletter)email, topic checkboxes/api/subscribePOST /public/subscribeTurnstile
Remove my website (/optout)domain, email at that domain; then a six-digit code/api/optoutPOST /public/optout/request then /verifydomain-verified code
Checkout (/checkout)plan, name, email, country, VAT number/api/checkoutPOST /public/checkoutTurnstile
Documentation feedback (every /docs page)up or down; a comment box on down/api/docs-feedbackone vote per page per browser

The honeypot is an off-screen field named website with tabIndex={-1} and autocomplete off. A human never fills it; a naive bot does, and the submission is discarded.

Exact contractTypes, defaults, ranges, errors, edge cases

The /api/* routes are the website's own JSON endpoints, not part of the public API, and they exist so that the browser never talks to the API host directly — the API base URL stays internal and the forms inherit the site's own edge protections. They are excluded from crawling in robots.txt and they are explicitly allowlisted at the edge, because a bot challenge in front of an XHR is a challenge no XHR can solve. That was once true of /api/checkout, and the consequence was that the buy button could not work.

Turnstile
A privacy-preserving bot check. It runs in the browser; the token is verified server-side before the submission is accepted.
The opt-out code
Six digits, cryptographically random, stored only as a domain-salted hash. Five attempts, thirty-minute expiry, two-minute resend window.
Failure behaviour
Every form reports the API's own message rather than a generic one, and none of them clears what you typed on failure.

4The account surfaces

Four routes: sign in, verify, dashboard, and the register page that explains the options before you commit to one.

In depthWhy it exists, what it is not, what people get wrong
/register
Explains the free key and the grant key and routes to each. Start — get a free key → goes to /login; Apply for a grant key goes to /contact?topic=grant.
/login
One email field and one button. Passwordless.
/auth/verify
Consumes the one-time token from the email and sets the session cookie. Not visited directly.
/dashboard
Your keys, their limits, their usage, and the rotate / cancel controls. Signed out, it offers a sign-in link and a Check a key box that reports one key's status from its secret.

All four are explicitly exempt from the site's bot challenge. A challenge on /login is friction on the only funnel there is; a challenge on /auth/verify silently breaks every emailed link, because mail clients and link scanners do not solve interstitials.

Exact contractTypes, defaults, ranges, errors, edge cases

The dashboard is rendered per request rather than cached, because it is per customer. Everything on it is described control by control in the dashboard tour.

This page was rendered 11 September 2026, 13:07 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.