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.
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
| Route | What it is |
|---|---|
/ | The ledger browser. Detail. |
/companies | Employer directory. |
/company/<slug> | One employer and their open roles. |
/job/<slug> | One listing. Detail. |
/docs | This documentation. /guides redirects here. |
/docs/ai/*.md | The machine-readable mirror. |
/api | The API sales page: pitch, quick reference, plans. |
/pricing | The price list, rendered from the live plans table. |
/checkout | Buy a plan. /checkout/done and /checkout/failed are its outcomes. |
/register | How to get a key; routes to /login for the free one, and to a grant application. |
/login | Passwordless sign-in. |
/auth/verify | Consumes the magic-link token. Not a page you visit directly. |
/dashboard | Your keys. Detail. |
/coverage | The coverage report, rendered. |
/coverage/countries | Per-country coverage. |
/provenance | Where rows come from, and the sources we refuse. |
/facts | Checkable claims, each with the endpoint that proves it. |
/compare | How this compares with the alternatives. |
/about | How the ledger works. |
/status | Is the data current. Detail. |
/post | Employer listing submission form. |
/optout | Site-owner removal. Detail. |
/contact | Contact form, topic-aware. |
/newsletter | Newsletter subscription. |
/confirm | Confirms a newsletter subscription from an emailed link. |
/unsubscribe | Unsubscribes, from an emailed link. |
/invoice/<token> | A customer's invoice, reached from an email. No session needed. |
/privacy, /cookies, /terms, /ai | Legal. Detail. |
/admin/* | Operator console. Not for customers; separately authenticated. |
/openapi.json, /openapi.yaml | The machine contract. |
/llms.txt | Short 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
| Form | Fields | Posts to | Protection |
|---|---|---|---|
| Search (home) | q, plus every active filter as hidden fields | GET / — it is a link, not a POST | none needed |
Sign in (/login) | /api/auth/request → POST /public/auth/request | rate limited | |
Add a listing (/post) | title, company, category, city, country, remote, employment type, salary, apply URL, contact email, description, plus a hidden honeypot | /api/submit → POST /public/submissions | Turnstile + honeypot |
Contact (/contact) | topic, email, name, message, hidden honeypot | /api/contact → POST /public/contact | Turnstile + honeypot |
Newsletter (/newsletter) | email, topic checkboxes | /api/subscribe → POST /public/subscribe | Turnstile |
Remove my website (/optout) | domain, email at that domain; then a six-digit code | /api/optout → POST /public/optout/request then /verify | domain-verified code |
Checkout (/checkout) | plan, name, email, country, VAT number | /api/checkout → POST /public/checkout | Turnstile |
Documentation feedback (every /docs page) | up or down; a comment box on down | /api/docs-feedback | one 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.