Search Reed.co.uk jobs with a real salary number on every row
The Reed.co.uk API returns UK job listings as clean JSON.
4 active endpoints. Every call is 1 credit.
- POST/reed/v1/search
- POST/reed/v1/detail
- POST/reed/v1/company-jobs
- POST/reed/v1/sector
What Reed.co.uk endpoints does ReefAPI ship?
4 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Reed.co.uk API
3 of 4 endpoints, ready to run
UK postings by keyword, with a numeric salary range, a posting timestamp and an expiry date on every row.
// Press "Try it" and this pane shows exactly what the // live site returned this second — including an empty // result, if that is the truth. No key, no account.
How the Reed.co.uk API works
Reed.co.uk is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 185 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Build a UK pay band from postings rather than from estimates
Reed is the one engine in this batch where the pay number is on the search row itself, numerically, on every row — so a band is arithmetic over a crawl, not a model output.
{"keywords": "python developer", "location": "London", "salary_from": 80000, "page": 1}salary_from, salary_to, currency and salary_period came back on 25 of 25 rows, with the human salary_description next to them. The banded salary filter narrows the set server-side.
{..., "page": <n>} — through to the reported last pageThe total is honest: 517 results across 21 pages, and page 21 returned the last 17 rows. Page 50 is a clean NOT_FOUND rather than a silent repeat.
Every advertised salary in a UK query, as numbers, with the posting date and the expiry date beside each one.
curl -X POST https://api.reefapi.com/reed/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"keywords":"python developer","location":"London"}'{
"ok": true,
"data": { … },
"meta": {
"api": "reed",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}Reed's salary, date and id fields, and where each one is actually filled
Reed is UK-only and its pay data is genuinely structured, not a snippet you have to regex. The catch is that the search action and the detail action fill different fields, rename two of them, and format the same salary string differently. Measured on 'python developer' in London (512 jobs across 21 pages), a contract sweep that returned per-day and per-hour rows, job 57258187 in detail, and the it, accountancy and healthcare sectors.
| Field | Measured shape | Where it comes from |
|---|---|---|
| job_id | 8-digit integer: 57258187. It is the last path segment of reed.co.uk/jobs/<title-slug>/<id>. | search, sector and company-jobs rows. The detail action takes it as job_id, or accepts the full URL. |
| salary_from / salary_to | Numbers, not strings, and not always integers: an hourly role came back as 31.87. | Both actions. currency was GBP on every row we sampled. |
| salary_period | 'per annum', 'per day' or 'per hour' | Both actions. In one contract sweep, 20 of 25 rows were per day. |
| salary_from_per_annum / salary_to_per_annum | Reed's own annualized figures, detail only | GBP 450-600 per day became 117000-156000, a 260-day year. GBP 31.87 per hour became 62146.5, which is 1950 hours. This is the only way to compare a day rate with a salary. |
| salary_description | Display string. Search: '£450 - £600 per day'. Detail: '£ 450.00 - £ 600.00 per day'. | The spacing and decimals differ between the two actions, so do not use it as a join key. |
| posted_date / expiry_date | ISO-8601 with milliseconds and no timezone: '2026-08-20T09:24:11.977'. Expiry always lands at 23:55:00. | Both actions. Detail adds created_date and updated_date, which drift from posted_date by milliseconds and by days respectively. |
| remote_option | 'Remote', 'Hybrid', 'On-Site' or 'NotSpecified' -- it is a string, never null | search. Detail renames it remote_type, lowercases the value ('hybrid'), and adds a separate is_remote boolean. |
| description_text | null on every search row we pulled | Only the detail action fills it: 2,929 characters of plain text for job 57258187, alongside 3,737 characters of description_html. |
| sector | Two levels, named differently per action | search gives sector_top 'Developer' plus sector 'Python Developer'. Detail gives sector 'Software Developer' (sector_id 58) under parent_sector 'IT & Telecoms' (parent_sector_id 52), plus a taxonomy path string. |
| company_slug | Two shapes: lowercase 'mcgregor-boyall-associates-limited', and Title-Case with a trailing number 'Tenth-Revolution-Group-91770' | That trailing number is not the employer id you get in detail: the same job reported company_profile_id 72466, not 91770. |
| pagination | 25 jobs per page, page 1 to 200 | meta.pagination carries page, total_pages, has_more and next_page. 'python developer' in London: total 512 across 21 pages. Sector 'it': 6,952 jobs across 279 pages. |
An unrecognized sector slug is not an error. sector='zzzz' returned ok:true with total 0 and an empty jobs array, and an unknown company behaves the same way. Check total rather than trusting the 200.
The most complete grid in this batch, and the one field missing from it
Measured on 2026-08-28 by exhausting one query and comparing the keyword, sector and company surfaces.
There is no Reed login in the path and nothing is tied to a candidate account of yours. Your ReefAPI key's quota is the only limit you are under.
This is the reason to reach for Reed over the other UK sources here. salary_from, salary_to, currency GBP and salary_period were filled on 25 of 25 rows, together with the human salary_description ("£125,000 - £160,000 per annum"). Every other jobs engine in this batch either gives you pay as prose, on a minority of rows, or not at all.
A London query reported 517 results across 21 pages. Page 21 returned the final 17 rows. Page 50 came back ok:false with NOT_FOUND — an explicit end rather than an empty page or, worse, a silent repeat of page 1. You can crawl this to the floor and know when you got there.
posted_date is a full timestamp to the millisecond on 25 of 25 rows, and expiry_date is filled on 25 of 25 alongside it — the only engine in this batch that tells you when a posting stops being live. date_posted today narrowed one query to 3 rows, all three stamped that morning.
Against us. description_text was null on 25 of 25 search rows; the text lives in the detail action. That is one extra call per row if you filter on requirements, and it is a real cost at crawl scale. Everything else you would want for a shortlist — title, company, location, county, job type, salary, remote arrangement, sector — is already on the row.
remote_option came back On-Site, Hybrid or Remote on 25 of 25 rows, and is_full_time, is_part_time, is_easy_apply and is_promoted were filled on all of them too. The promoted flag actually discriminates here, unlike the sponsored flag on some other boards in this batch.
One country, one currency, one set of sector slugs. There is no country parameter to get wrong and no silent fallback to another market.
Keyword search, a sector browse and an employer's board all return the same row. An IT sector browse in Manchester reported 603 results; one large employer's board reported 420. The company_slug on a row is what company-jobs takes, so a crawl can pivot from a keyword to an employer without any name matching.
The posting and the advertiser: title, company, location, county, job type, salary, remote arrangement, sector, apply link and dates. Not candidate profiles, not recruiter names, not applications.
What people build with Reed.co.uk
The jobs this data is most often used for.
endpoints
credit per call
UK job boards call search to aggregate fresh Reed listings by role and location.
Labor-market analysts use sector and search to measure hiring demand across the UK.
Recruiting tools use company-jobs to track a specific employer's open roles.
What Reed.co.uk data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 185 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/reed/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"keywords":"python developer","location":"London"}'import requests
r = requests.post(
"https://api.reefapi.com/reed/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"keywords": "python developer",
"location": "London"
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Reed.co.uk.
Get a free key →Is Reed's salary structured or a free-text string?▾
Structured, and this is the main reason to use Reed rather than a scraped board. Every priced row carries numeric salary_from and salary_to, a currency of GBP, and a salary_period of 'per annum', 'per day' or 'per hour'. salary_description is a separate human-readable string ('£450 - £600 per day') that you can display but should not parse.
How do I compare a contract day rate with a permanent salary?▾
Use the detail action, which adds salary_from_per_annum and salary_to_per_annum. We measured the conversion: a £450-£600 per day contract became 117000-156000, which is a 260-day working year, and a £31.87 per hour role became 62146.5, which is 1950 hours. Search results do not carry those fields, only the raw figure and the period.
Why is description_text null in search results?▾
Reed's listing payload does not include the body, so search, sector and company-jobs all return description_text as null. Call detail with the job_id for the postings you care about and you get both description_text and description_html. For job 57258187 that was 2,929 characters of text and 3,737 of HTML, the HTML being simple paragraph and list markup.
What timezone are posted_date and expiry_date in?▾
There is no offset in the string at all: you get '2026-08-20T09:24:11.977'. Reed is a UK-only board, so treat these as UK local time and be careful in summer, when that is UTC+1. expiry_date is always set to 23:55:00 on the closing day, which makes it a date rather than a real deadline time.
Can I feed company_slug from a search result into the company-jobs action?▾
Not blindly. In our tests plain lowercase slugs resolved ('lhh-recruitment-solutions' returned 12 jobs, 'fdm-group' 97), but slugs ending in a number returned ok:true with total 0 and a null company block, and one of them returned a different employer's listings altogether. Check that data.company.name matches what you asked for, or search the employer name instead, which returned 26 jobs for 'McGregor Boyall'.
What sector slugs does the sector action take?▾
Reed's own category slugs. 'it' returned 6,952 jobs, 'accountancy' 4,931 and 'healthcare' 9,954, and 'engineering', 'sales', 'marketing', 'education', 'construction', 'hospitality' and 'legal' follow the same pattern. A slug Reed does not recognize returns ok:true with total 0 rather than an error, so always look at total before deciding a sector is empty.
Which field tells me whether a job is permanent, contract or temporary?▾
Use the detail action's contract_type together with the is_permanent, is_temporary and is_contract booleans. The search action's job_type field is not dependable: filtering job_type='permanent' labeled rows 'Permanent', filtering 'contract' labeled comparable rows 'Temporary', and filtering 'temporary' returned the raw code 4 instead of a label. The filters themselves work; it is the returned label that is inconsistent.
How deep can I page, and how many results per page?▾
25 jobs per page, and the page parameter accepts 1 to 200, so 5,000 rows per query is the practical ceiling. meta.pagination.total_pages tells you where to stop: 21 pages for 'python developer' in London, 279 for the whole IT sector. Reed caps its own result sets, so loop against total_pages rather than dividing total by 25 yourself.
What is the Reed.co.uk API?▾
Reed.co.uk API is a ReefAPI endpoint group for reed.co.uk It returns live JSON through POST requests under /reed/v1.
Is the Reed.co.uk API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Reed.co.uk calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Reed.co.uk login or account?▾
No login to Reed.co.uk is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Reed.co.uk data?▾
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Reed.co.uk API use?▾
Reed.co.uk actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Reed.co.uk from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call reed actions with the same key, credit pool and JSON envelope used by normal REST requests.
15 Jobs & Hiring APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Reed.co.uk, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-28.