Hays Jobs Scraper: 11 Countries, Salary, Descriptions
Pricing
from $3.00 / 1,000 serp job results
Hays Jobs Scraper: 11 Countries, Salary, Descriptions
Scrape Hays jobs from 11 country sites (UK, US, CA, IE, NL, ES, PT, AE, plus Switzerland, Germany and Austria). Returns title, location, salary where the advert states one, full description, work arrangement, employment type and industry. Search by keyword, URL or job link.
Pricing
from $3.00 / 1,000 serp job results
Rating
0.0
(0)
Developer
NanoScrape
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 days ago
Last modified
Categories
Share
Hays Scraper - 11 Countries: UK, US, CA, IE, NL, ES, PT, AE, CH, DE, AT
Pull live job listings from Hays, one of the largest specialist recruitment agencies, by keyword, search URL or direct job URL. Each row has the title, canonical job URL, location, structured salary (min, max, currency, period), employment and contract type, industry, publish and expiry dates, and the full description as text, HTML and Markdown. No API key, no login.
Supported Hays sites (11): United Kingdom (hays.co.uk), United States (hays.com), Canada (hays.ca), Ireland (hays.ie), Netherlands (hays.nl), Spain (hays.es), Portugal (hays.pt), United Arab Emirates (hays.ae), Switzerland (hays.ch), Germany (hays.de) and Austria (hays.at). Each was tested against the live site.
The first eight run the Hays job portal. Switzerland, Germany and Austria run a separate German-language Hays portal, with the same output fields. Differences are listed under "Switzerland, Germany and Austria" below.
Sample output
{"id": "4831598","title": "Management Accountant","job_url": "https://www.hays.co.uk/job-detail/management-accountant-warrington_4831598","company_name": "Hays","location": "Warrington","city": "Warrington","region": "North West","country": "GB","employment_type": "Full-time","contract_type": "permanent","industry": "Manufacturing & Production","category": "Part Qualified Accountant","salary_text": "£30,000 - £35,000","salary_min": 30000,"salary_max": 35000,"salary_currency": "GBP","salary_period": "year","salary_source": "text","work_arrangement": "hybrid","remote_option": "hybrid","description_snippet": "Management Accountant Location: Warrington (Hybrid Working) ...","description_md": "Management Accountant\nLocation: Warrington (Hybrid Working)\n...","posted_at_datetime": "2026-09-29T00:00:00Z","posted_at_text": "2026-09-29","expires_at": "2026-12-27","headline": "Manufacturing Accountant | Warrington | £35K + Study Support | Hybrid","contact_name": "Lauren Taylor","contact_office": "Liverpool, Part 2nd Floor, 5 St Paul’s Square","job_status": "online","source_platform": "hays","search_query": "accountant"}
Pricing
| Event | Price |
|---|---|
| Actor start | $0.001 per run start |
| Search result (every job returned) | $0.003 per job returned (about $3 per 1,000) |
| Detail result (added when the description was parsed) | +$0.005 per job enriched with full details (about $8 per 1,000 jobs with details) |
Every returned job is billed the search result. A job whose description was parsed is billed the detail result on top of it. Jobs dropped by the strict keyword match are not billed.
New to Apify? Every account gets a $5 free monthly platform credit, enough for hundreds of results before you commit to paying anything. Test with a small maxResults first.
Input
| Field | Type | Description | Example |
|---|---|---|---|
searchQueries | array | Job title or skill keywords. Each runs as its own search and rows are tagged with search_query. | ["accountant", "site manager"] |
searchUrls | array | Hays search URLs from any of the 11 sites. The keyword (q=) and location are read from the URL, the country from the domain (hays.ch, hays.de and hays.at also read the country filter in the URL). | ["https://www.hays.co.uk/job-search?q=accountant", "https://www.hays.ch/jobsuche/stellenangebote-jobs?q=Laborant"] |
directUrls | array | Hays job-detail URLs (any of the 11 sites) for still-alive checks or specific vacancies. Removed vacancies come back as offline rows and are not billed. | ["https://www.hays.co.uk/job-detail/management-accountant-warrington_4831598"] |
country | string | Site for keyword searches: uk, us, ca, ie, nl, es, pt, ae, ch, de, at. Default uk. | "ch" |
location | string | City or region, for example Manchester. Empty searches the whole country. | "Manchester" |
jobType | string | any (default), permanent, contract or temporary. Applied by the Hays search. | "permanent" |
workingPattern | string | any (default), flexible, fullTime or partTime. Applied by the Hays search. | "flexible" |
industry | string | Client industry exactly as the site labels it, for example Accountancy Firms. Labels differ per country site. | "Accountancy Firms" |
sortBy | string | newest (default, publish date descending), relevance or title. | "newest" |
postedWithinDays | number | Only jobs published in the last N days. Empty means no limit. | 7 |
maxResults | integer | Total cap across everything. Default 10, 0 means no cap. | 100 |
maxResultsPerQuery | integer | Cap per keyword or URL. Default 50, 0 means no cap. | 50 |
scrapeDetails | boolean | Include the full description in four formats. Default true. | true |
strictKeywordMatch | boolean | Title-first relevance filter: keep only jobs where every keyword word (stemmed) appears in the title. Single-word keywords also match the category. Description-only matches are dropped. Default true. | true |
maxPages | integer | Safety limit on result pages per keyword (10 jobs per page, 20 on hays.ch, hays.de and hays.at). Default 50. | 50 |
maxConcurrency | integer | Keywords or URLs processed in parallel, each with its own session. Default 3. | 3 |
An empty input ({}) browses the newest 10 jobs on the UK site.
Example
{"searchQueries": ["accountant", "nurse"],"country": "uk","sortBy": "newest","postedWithinDays": 14,"maxResults": 100,"maxResultsPerQuery": 50}
Output fields
Core
id,job_ref: Hays job reference number, unique per posting.title: Job title.headline: Advert headline shown above the description, for example "Manufacturing Accountant | Warrington | £35K + Study Support | Hybrid".job_url: Canonical Hays job page URL.source_urlcarries the same value.apply_url: Apply link on the Hays site.company_name: Always "Hays". Hays advertises on behalf of its clients and normally does not name the hiring company.companyis a deprecated duplicate.source_platform: Always "hays".search_query: Keyword that produced the row. Null for browse runs and direct URLs.job_status:online, orofflinefor direct URLs that no longer exist.scraped_at: ISO timestamp.
Location
location,city,region(duplicates removed;stateis a duplicate),country(ISO alpha-2),latitude,longitude.
Role
employment_type: Full-time, Part-time, Temporary or Contract.contract_type:permanent,contractortemporary.flexible_working: True when Hays marks the job as flexible.industry: Client industry from Hays.work_arrangementandremote_option(same value):remote,hybridoronsite, detected from the headline, the flexible working flag and the description. Null when nothing is stated.category: Hays specialism, for example "Senior Finance Qualified".
Salary
salary_text: Salary text as displayed on the site.salary_min,salary_max: Numeric bounds parsed fromsalary_text(handlesk, ranges, "up to", per hour, day or year), insalary_periodunits. "Up to" adverts have only a max. Text without numbers ("Competitive", "To £££") gives null.salary_source:textwhen the numbers come fromsalary_text,bandwhen the advert has no salary text and the Hays internal band is used.salary_currency: ISO 4217 code such as GBP, USD, EUR.salary_period:hour,day,week,monthoryear. Taken from the salary text ("per hour", "per day", "per annum", "p/h"), otherwise inferred from the amount scale.
Description (when scrapeDetails is true)
description_full: Full plain text.description_snippet: First 300 characters, including the trailing ellipsis.description_html: Full description as HTML.description_md: Full description as Markdown.
Dates and contact
posted_at_datetime,posted_at_text: Publish date.posted_atis a duplicate of the text form. The site publishes a date, so the time part is always midnight UTC.expires_at: Posting expiry date.contact_name,contact_email,contact_phone,contact_office: The Hays consultant named on the job page and their office (city and address), when shown.
Switzerland, Germany and Austria
hays.ch, hays.de and hays.at share one German-language job database. The country is a filter, so the actor sends the country filter of the chosen country on every page and checks the country of each job again before it is returned and billed. A Switzerland search never returns German jobs.
What works the same: keywords (searchQueries, q= in search URLs), maxResults, maxResultsPerQuery, maxPages, strictKeywordMatch, scrapeDetails, search URLs, direct job URLs (offline rows when a vacancy is gone), all output fields below.
What is different:
- Sorting is done by the actor, not by Hays. The Hays DACH portal has no working date sort (its "Neueste" option is ignored).
sortBy: "newest"(and"title") therefore loads the job pages of a candidate pool (5 times your result limit, at least 100 and at most 500 results of the search) and sorts them by publish date. For searches with fewer matches than the pool, which is almost every keyword search, this is exact. For very broad searches (empty keyword on hays.de has over 5,000 jobs) it is the newest jobs among the first results Hays ranks highest, not the newest jobs of the whole site.sortBy: "relevance"streams results in the Hays ranking. postedWithinDaysis applied after the search, per job (Hays has no date filter).locationis matched against the job location after the search (accent-insensitive, partial match, for example "Zurich" matches "Zürich"). Hays has no free-text location filter, so use it with a broad keyword.jobType:permanentis Festanstellung.contractandtemporaryboth map to Contracting/Arbeitnehmerüberlassung.workingPattern: onlypartTimeis applied.flexibleandfullTimeare ignored.industryis not supported on these sites and is ignored.- No salary and no consultant contact. Hays DACH adverts do not show a salary or a named consultant, so
salary_*,contact_*,headline,flexible_workingandexpires_atare empty. The posting expiry shown by the site is a fixed placeholder two years after publication, so it is not returned. description_*is the German advert (tasks, profile, benefits) with bullet lists kept.work_arrangementis detected from German wording (Homeoffice, hybrid, remote).company_nameis "Hays": the employer is anonymised in the adverts. Hays' own internal career ads (hayscareer.net) are not returned.idis the Hays reference number without the version suffix,job_refkeeps it (for example897211and897211/1).employment_typecan combine values, for example "Full-time, Contracting".regionis the canton or state as Hays writes it.- Volume: Hays lists around 240 jobs on hays.ch, 5,400 on hays.de and 70 to 110 on hays.at. A narrow keyword such as "Laborant" has about 2 jobs on hays.ch and 35 on hays.de.
Deprecation notes
company, state, source_url and posted_at are legacy aliases kept for one year (until 2027-09-29). Migrate to company_name, region, job_url and posted_at_text. Both forms are emitted in every row during the window.
Use with AI Agents (MCP)
Connect this actor to any MCP-compatible AI client: Claude Desktop, Claude.ai, Cursor, VS Code, LangChain, LlamaIndex, or custom agents.
Configure the MCP server with the Hays Scraper preconfigured at mcp.apify.com?tools=santamaria-automations/hays-scraper.
{"mcpServers": {"apify": {"command": "npx","args": ["mcp-remote","https://mcp.apify.com/?tools=santamaria-automations/hays-scraper","--header","Authorization: Bearer <YOUR_API_TOKEN>"]}}}
For per-tool schemas and copy-paste snippets for MCP clients, see the MCP tab.
See the auto-generated API tab for language-specific examples (cURL, JS, Python, .NET, Ruby, PHP).
Why this actor
- Reads the data the Hays job pages use, so descriptions are complete and, on the job portal sites, salary bands are structured rather than parsed from text.
- Eleven Hays country sites (including Switzerland, Germany and Austria) behind one input, with sort by newest and a posted-within-days cutoff for scheduled runs.
- Strict keyword match is title-first: it removes the jobs the Hays search adds only because the words appear in the description, and you are not billed for them.
- Consultant contact name, email and phone on every row where Hays shows them.
Common use cases
- Refresh a daily list of new finance, tax or technology vacancies in a UK region and push them to a CRM.
- Track day-rate and hourly contract pay for a skill across Hays UK, IE and NL.
- Monitor Swiss, German or Austrian vacancies (for example lab, chemistry or engineering roles) on hays.ch, hays.de and hays.at.
- Feed job descriptions into an LLM pipeline for skills extraction.
- Check whether saved Hays vacancies are still online with direct URLs.
Notes and limits
- Hays search returns loosely related jobs for some keywords. With
strictKeywordMatchon (default) only jobs whose title contains every keyword word are kept (stemmed, so "accountant" matches "accounting"; single-word keywords also match the category), so rare keywords can return fewer rows thanmaxResults. A nonsense keyword returns nothing. - Jobs are advertised by Hays. The end client is normally not named, so
company_nameis always "Hays". - Salary numbers are read from the salary text shown on the advert, because the Hays internal band often contradicts it. The band is used only when an advert has no salary text.
- Hays sites outside the 11 listed (France, Australia, Belgium and others) are not supported. Search URLs from those sites are skipped with a warning.
- Offline direct URLs are returned with
job_status: "offline", the id taken from the URL, and are not billed. - Filters the Hays site shows but this actor does not offer: minimum and maximum pay (
minPay,maxPay) and the pay-type facet are not applied by the Hays search backend (the result count does not change), so they are not supported.sortTypeand the other filter parameters in a pasted search URL are ignored too: use thesortBy,jobType,workingPatternandindustryinputs instead.
Related actors
- Website Job Extractor: extract jobs from any company careers page.
- Indeed Jobs Scraper: jobs from Indeed across many countries.
- Glassdoor Scraper: jobs, salaries and company ratings.
- Reed UK Scraper: UK job board listings.
- Totaljobs Scraper: UK jobs and salaries.
Support
- Questions or issues? Email contact@nanoscrape.com, we typically reply within 6 hours. You can also open a ticket in the Issues tab on the actor page.
- Feature request for this actor? Open a ticket in the Issues tab or email contact@nanoscrape.com with the field you need and, if possible, a URL that shows the data live.
- Need a scraper for a job board we don't cover yet? Email contact@nanoscrape.com with the target site and your rough usage volume. We ship new boards regularly.