Sign inTry it

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.

No reports yetRead-only, no login
Site
Reed, United Kingdom
Version
v1
Runs, last 7 days
No reports yet
sha256
92cf06f7ac17…

Run it with your agent

after installing Wield

Ask 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
  1. 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.repeats, max 1

Parameters

from your agent
contractenum "any" | "permanent" | "contract" | "temporary" = "any"
distance_milesenumOnly with location 0 | 1 | 3 | 5 | 10 | 15 | 20 | 30 | 50 = 10
hoursenum "any" | "full_time" | "part_time" = "any"
include_adsbooleanKeep promoted jobs (marked) = false
keywordsstringrequiredJob title or skill, e.g. 'python', 'data scientist', 'warehouse'
locationstringUK town, city or postcode area, e.g. 'london', 'manchester', 'leeds'
max_salaryintegerGBP per year
min_salaryintegerGBP per year
pageinteger = 1

Returns

to your agent
jobsobject[]company, contract, easy_apply, expires_at, hours, location, posted_at, promoted, salary_from, salary_per, salary_to, title, url, working
keywordsstring
locationstring
pageinteger
totalinteger

Where 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.

Check it yourself
curl -s https://wield.run/api/v1/recipes/reed.co.uk/search-jobs | shasum -a 256
# 92cf06f7ac172d7e1e52f6d3aefd271cc82d0fb1725d34408246def40e0a2f4e
reed.co.uk/search-jobs.json, v1
{
  "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
}