How this compares
Including the cases where somebody else is the better buy. Every figure about another vendor below is quoted from their own page, or is an HTTP request we actually sent, on the date shown — never a reading of their marketing.
Techmap sells job data by the country: “Starting at 333 € per month per country”, daily exports as JSON files, one country without data limits. Their AWS Data Exchange route is “4800 € per year per country”. Read from techmap.io/pricing on 2026-08-08.
Signal is €299 / month for one country with no record limit — the same shape and the same unit — plus an incremental delta feed, so you fetch what changed rather than a full export every day. That is the whole comparison. It is the only one in this market we can make without an asterisk, which is why it is the one we lead with.
Before buying it, check how much of your country we actually hold at /coverage/countries. If the whole market fits inside €80 / month's monthly record allowance, buy that instead — the uncapped single country buys you nothing.
Sent from a machine outside our network to each vendor's own documented job-search endpoint, with no credentials. This is the column worth checking yourself, because it takes ten seconds and it is the one thing in this table nobody can phrase their way out of.
| Vendor | No-key request | CORS |
|---|---|---|
| Job Opportunities API | 200 — rows returned | Access-Control-Allow-Origin: * |
| jobdataapi | 400 — key required | none |
| TheirStack | 405 — bearer token required | none |
| Coresignal | 404 — no route without a key | none |
| Techmap (via RapidAPI) | 401 — invalid API key | none |
| Adzuna | 400 — app_id + app_key required | none |
curl 'https://api.jobopportunitiesapi.org/public/jobs?country=GB&require_fields=description&limit=3'Rows come back with a field_sources block marking every field published, inferred or absent, and a completeness object saying how many such rows exist in the ledger.
To be exact about what "without an account" means here: one page per filter, up to 50 rows, at about two requests a second. Change the filters and you get different rows. Paging through the corpus needs a key — the free one does it. This is stated rather than discovered, because a page arguing that our claims survive checking should not have an asterisk you find at request 51.
- Structured salary is 6.6% of rows. Employers mostly do not publish one and we will not model it.
?require_fields=salaryreturns the ones that do, at 100%, and tells you how many that is. - Full advert text is 79% of the ledger, and it is very uneven by country — the table publishes every country including the weak ones.
- Some sources give us rows and no advert text at all. Three of them are at zero. /public/providers publishes the per-source figure, zeroes included.
- Everything above is checkable without an account.
/public/coverage,/public/coverage/countries,/public/providersand/public/freshnessall answer with no key — the last of those reports how recently every live row was re-confirmed at its source, which is the claim a data buyer checks second. - 599,803 of the ledger is European (EU, EFTA and the UK) out of 3,424,320 live rows. If you need depth outside Europe, weigh that before you buy.
Competitors change their pricing and we will not always notice on the day. If something here is out of date or wrong, tell us at /contact and it gets corrected — a comparison page nobody can correct is an advertisement.