Search UK jobs on Reed.
Searches Reed.co.uk, one of the UK's largest job boards, like its search: job title, employer or agency, location, contract type (permanent, contract, temporary), full or part time, remote/hybrid/on-site, salary range with its unit (per year, day or hour), posted and expiry dates, and the link, 25 per page with the total. Filters: distance, salary, contract type, hours. Promoted jobs are dropped by default; include_ads keeps them, marked.
- Site
- Reed, United Kingdom
- Version
- v1
- Runs, last 7 days
- No reports yet
- sha256
- 92cf06f7ac17…
Run it with your agent
after installing WieldAsk in plain words. Your agent finds this recipe and calls it:
“Search UK jobs on Reed.”
Read-only: it changes nothing on the site. No login needed.
{ "tool": "run", "arguments": { "recipe_id": "reed.co.uk/search-jobs", "params": { "contract": "permanent", "keywords": "python", "location": "london" } } }
Requests
sent from your browser, in order- 1GET/jobs/{{f.path | urlencode}}?contract&fullTime&pageno&partTime&perm&proximity&salaryFrom&salaryTo&tempReed's search page (/jobs/<keywords>-jobs-in-<location>, the URL its search form produces), a Next.js page whose __NEXT_DATA__ carries the results (searchResults.jobs, count). Filters are the page's own URL parameters.
Parameters
from your agentReturns
to your agentWhere it can send
- www.reed.co.uk
Anything else is blocked by the extension.
Reads from your session
Nothing. Your browser attaches the site's cookies by itself.
Used only in requests to the addresses on the left. Never sent to wield.run or your agent.
Checks
a run passes when- length(output.jobs) >= `10`
- output.total > `100`
- length(output.jobs[?promoted]) == `0`
- length(output.jobs[?contract == 'permanent']) == length(output.jobs)
- length(output.jobs[?starts_with(url, 'https://www.reed.co.uk/jobs/')]) == length(output.jobs)
- length(output.jobs[?salary_from != `null` && salary_per == 'year']) > `5`
Raw recipe
Served as canonical JSON from /api/v1/recipes/reed.co.uk/search-jobs, so its sha256 matches the ETag and the index.
curl -s https://wield.run/api/v1/recipes/reed.co.uk/search-jobs | shasum -a 256 # 92cf06f7ac172d7e1e52f6d3aefd271cc82d0fb1725d34408246def40e0a2f4e
{ "description": "Searches Reed.co.uk, one of the UK's largest job boards, like its search: job title, employer or agency, location, contract type (permanent, contract, temporary), full or part time, remote/hybrid/on-site, salary range with its unit (per year, day or hour), posted and expiry dates, and the link, 25 per page with the total. Filters: distance, salary, contract type, hours. Promoted jobs are dropped by default; include_ads keeps them, marked.", "effect": "read", "id": "reed.co.uk/search-jobs", "keywords": [ "reed", "reed.co.uk", "jobs", "uk jobs", "london jobs", "vacancies", "permanent", "contract", "temporary", "part time", "remote", "hybrid", "salary", "recruitment" ], "output": { "schema": { "properties": { "jobs": { "items": { "properties": { "company": { "description": "Employer or recruitment agency", "type": [ "string", "null" ] }, "contract": { "description": "permanent, contract or temporary", "type": [ "string", "null" ] }, "easy_apply": { "type": "boolean" }, "expires_at": { "type": [ "string", "null" ] }, "hours": { "description": "full_time, part_time or both", "type": [ "string", "null" ] }, "location": { "type": [ "string", "null" ] }, "posted_at": { "description": "UK local time, no offset", "type": [ "string", "null" ] }, "promoted": { "type": "boolean" }, "salary_from": { "description": "GBP", "type": [ "number", "null" ] }, "salary_per": { "description": "year, day or hour", "type": [ "string", "null" ] }, "salary_to": { "description": "GBP", "type": [ "number", "null" ] }, "title": { "type": "string" }, "url": { "type": "string" }, "working": { "description": "remote, hybrid or onSite", "type": [ "string", "null" ] } }, "type": "object" }, "type": "array" }, "keywords": { "type": "string" }, "location": { "type": [ "string", "null" ] }, "page": { "type": "integer" }, "total": { "type": [ "integer", "null" ] } }, "required": [ "keywords", "jobs" ], "type": "object" }, "value": "let $ads = params.include_ads == `true`, $s = steps.search[0] in {keywords: params.keywords, location: params.location || `null`, total: $s.count || `0`, page: params.page || `1`, jobs: map(&(let $ty = to_string(type), $pe = to_string(per) in {title: title, company: company || `null`, location: location || `null`, contract: (`[[\"1\",\"permanent\"],[\"2\",\"contract\"],[\"4\",\"temporary\"]]`[?@[0] == $ty] | [0][1]) || `null`, hours: (full && part && 'both') || (part && 'part_time') || (full && 'full_time') || `null`, working: working || `null`, salary_from: (from > `0` && from) || `null`, salary_to: (to > `0` && to) || `null`, salary_per: ((from > `0` || to > `0`) && (`[[\"5\",\"year\"],[\"2\",\"day\"],[\"1\",\"hour\"]]`[?@[0] == $pe] | [0][1])) || `null`, posted_at: posted || `null`, expires_at: expires || `null`, easy_apply: easy == `true`, promoted: promoted == `true`, url: join('', ['https://www.reed.co.uk', url])}), ($s.jobs || `[]`)[?$ads || promoted != `true`])}" }, "params": { "additionalProperties": false, "properties": { "contract": { "default": "any", "enum": [ "any", "permanent", "contract", "temporary" ], "type": "string" }, "distance_miles": { "default": 10, "description": "Only with location", "enum": [ 0, 1, 3, 5, 10, 15, 20, 30, 50 ], "type": "integer" }, "hours": { "default": "any", "enum": [ "any", "full_time", "part_time" ], "type": "string" }, "include_ads": { "default": false, "description": "Keep promoted jobs (marked)", "type": "boolean" }, "keywords": { "description": "Job title or skill, e.g. 'python', 'data scientist', 'warehouse'", "maxLength": 100, "minLength": 2, "type": "string" }, "location": { "description": "UK town, city or postcode area, e.g. 'london', 'manchester', 'leeds'", "maxLength": 60, "minLength": 2, "type": "string" }, "max_salary": { "description": "GBP per year", "minimum": 0, "type": "integer" }, "min_salary": { "description": "GBP per year", "minimum": 0, "type": "integer" }, "page": { "default": 1, "maximum": 20, "minimum": 1, "type": "integer" } }, "required": [ "keywords" ], "type": "object" }, "provenance": { "method": "browser-inspect", "notes": "The search form leads to /jobs/<keywords>-jobs-in-<location> (or /jobs/<keywords>-jobs) with filters as URL parameters (proximity, salaryFrom, salaryTo, perm/contract/temp, fullTime/partTime, pageno), which the page's criteria echo. __NEXT_DATA__ props.pageProps.searchResults: count, jobs[] (25 per page) with jobDetail {jobTitle, ouName, displayLocationName, jobType 1 permanent / 2 contract / 4 temporary, isFullTime, isPartTime, workingOption, salaryFrom, salaryTo, salaryType 5 per year / 2 per day / 1 per hour (checked against the snippets: '650–750 per day', '£14.70 per hour'), displayDate, expiryDate, isEasyApply, isPromoted}, url. A separate promotedJobs list is not read; promoted jobs inside the list are dropped unless include_ads.", "recorded_at": "2026-11-07T22:30:00+01:00", "recorded_by": "C4" }, "requires_login": false, "schema": "https://wield.run/schema/recipe/v1.json", "site": { "country": "GB", "id": "reed.co.uk", "language": "en", "name": "Reed", "origin": "https://www.reed.co.uk", "origins": [ "https://www.reed.co.uk" ] }, "steps": [ { "description": "Reed's search page (/jobs/<keywords>-jobs-in-<location>, the URL its search form produces), a Next.js page whose __NEXT_DATA__ carries the results (searchResults.jobs, count). Filters are the page's own URL parameters.", "expect": { "content_type": "html", "status": [ 200 ] }, "extract": { "embedded_json": { "selector": "script#__NEXT_DATA__", "vars": { "count": "props.pageProps.searchResults.count", "jobs": "props.pageProps.searchResults.jobs[].{title: jobDetail.jobTitle, company: jobDetail.ouName, location: jobDetail.displayLocationName, type: jobDetail.jobType, full: jobDetail.isFullTime, part: jobDetail.isPartTime, working: jobDetail.workingOption, from: jobDetail.salaryFrom, to: jobDetail.salaryTo, per: jobDetail.salaryType, posted: jobDetail.displayDate, expires: jobDetail.expiryDate, easy: jobDetail.isEasyApply, promoted: jobDetail.isPromoted, url: url}" } } }, "foreach": { "as": "f", "in": "let $k = replace(lower(trim(params.keywords)), ' ', '-'), $l = params.location && replace(lower(trim(params.location)), ' ', '-'), $c = params.contract || 'any', $h = params.hours || 'any' in [{path: ($l && join('', [$k, '-jobs-in-', $l])) || join('', [$k, '-jobs']), perm: ($c == 'permanent' && 'true') || `null`, contract: ($c == 'contract' && 'true') || `null`, temp: ($c == 'temporary' && 'true') || `null`, full: ($h == 'full_time' && 'true') || `null`, part: ($h == 'part_time' && 'true') || `null`}]", "max": 1 }, "id": "search", "request": { "headers": { "Accept": "text/html" }, "method": "GET", "query": { "contract": "{{f.contract}}", "fullTime": "{{f.full}}", "pageno": "{{params.page}}", "partTime": "{{f.part}}", "perm": "{{f.perm}}", "proximity": "{{params.distance_miles}}", "salaryFrom": "{{params.min_salary}}", "salaryTo": "{{params.max_salary}}", "temp": "{{f.temp}}" }, "url": "/jobs/{{f.path | urlencode}}" } } ], "task": "Search UK jobs on Reed", "tos": { "notes": "robots.txt allows the search pages; it disallows /api/ and search URLs with sortBy=, so the recipe never sorts. No rules for Claude agents or AI content signals. One request per call; no applications, job alerts or saved jobs.", "reviewed": false }, "verify": { "checks": [ "length(output.jobs) >= `10`", "output.total > `100`", "length(output.jobs[?promoted]) == `0`", "length(output.jobs[?contract == 'permanent']) == length(output.jobs)", "length(output.jobs[?starts_with(url, 'https://www.reed.co.uk/jobs/')]) == length(output.jobs)", "length(output.jobs[?salary_from != `null` && salary_per == 'year']) > `5`" ], "example_params": { "contract": "permanent", "keywords": "python", "location": "london" }, "max_ms": 4000 }, "version": 1 }