15% off your first purchase with code WELCOME15, up to 25 GB.

See pricing

Real estate & jobs · Job postings

Job posting scraping for labour-market data

Job posting scraping turns public vacancy pages into a near-real-time read of labour demand: which roles, where, at what advertised pay and with which skills. Collect from each market's own exits, deduplicate across boards, and know what the data cannot tell you.

Pay per GB · No subscription · Prices in EUR, excl. VAT

Illustration. The URLs and values are fictional; the connection string is the real grammar.
€0.75
per GB on ARC Basic, excl. VAT
−21%
at 1 TB (€0.59 / GB)
185+
countries, city targeting
Never
expires — no subscription

Written for

  • Labour economists
  • HR tech product teams
  • Workforce analytics vendors
  • Compensation benchmarking analysts

The short answer

  • Postings measure advertised demand, not hires or filled vacancies. The same job is often on several boards; deduplication decides whether your series is a count of jobs or a count of adverts.
  • Pay transparency rules make salary ranges a collectable field: New York State requires compensation ranges in covered job adverts, and the EU Pay Transparency Directive (2023/970) gives applicants a right to pay information, for example in the vacancy notice.
  • Many employer career sites run on applicant tracking systems with public job board APIs. Where one exists, use it before you parse HTML.
  • Job boards localise results and salary display by visitor region. Collect each market from an exit in it, using geo-targeting by country and, where it matters, city.

The problem

What goes wrong without the right IPs

One job, five adverts

Employers post on their own site, two boards and an aggregator that copies all three. Count adverts and you overstate demand; deduplicate too aggressively and you merge two genuinely different openings. Eurostat flags exactly this risk for its own web-scraped vacancy statistics.

Online postings are not the whole labour market

Some occupations are advertised online far more than others. Eurostat notes that IT positions are posted online more often than jobs in small shops or in the public sector, which can leave some occupations under-covered. A raw count is a biased sample unless you reweight it.

Salary shown depends on where you look from

Boards adjust whether a range is shown, its currency and its period (hourly, monthly, annual) by the visitor's market. Collect a New York posting from Frankfurt and you may get a converted or missing range.

Postings close without telling you

A filled vacancy is removed, not marked filled. To measure how long roles stay open you have to re-check live postings on a schedule, and a missed check moves the close date.

Search pagination is stateful and capped

Result lists carry a search token between pages and stop after a fixed number of pages. Rotate the exit mid-search and the token breaks; search too broadly and the cap hides most of the results.

What to collect

What you can collect

Job title (raw) and normalised occupation
Keep the raw string for audit and map it to a standard such as ISCO or SOC for analysis. Most of the analytical value is in the mapping.
Advertised pay range and period
Minimum, maximum, currency and whether it is hourly, monthly or annual. Pay transparency rules are making this field far more complete than it was.
Location and remote / hybrid flag
A city plus a remote flag. Remote postings listed in every city are a common source of double counting.
Employer and industry
Separates direct employers from staffing agencies, which advertise the same role for several clients.
Skills and requirements
Extracted from the description against a taxonomy such as ESCO. This is what most workforce analytics products actually sell.
First seen / last seen
Your own observation window. Time-to-close is derived from it, and only at the resolution of your re-check cadence.
Source and canonical URL
Which board or career site, and the employer's own URL where the board links to it. Needed for deduplication and for honest coverage reporting.
Contract type and seniority
Permanent, fixed-term, part-time, internship. Mixing them flattens wage and demand trends.

How it runs

How a collection run works

  1. 01

    Prefer structured sources first

    Many career sites are hosted by applicant tracking systems that publish job boards as JSON. Greenhouse, for example, documents its Job Board API GET endpoints as public with no authentication. Use those, and keep HTML parsing for the boards that have no such feed.

  2. 02

    Sweep board searches per market

    Partition searches by occupation and region until each returns fewer results than the board's page cap. Run each partition on one sticky exit in the market, so the search token survives pagination.

    One sticky session per search partition
    import uuidimport httpxPROXY_HOST, PROXY_PORT, PASSWORD = "proxy.arcproxies.io", 8000, "PASSWORD"def sticky_proxy(country: str, minutes: int = 10) -> str:    session = uuid.uuid4().hex[:8]  # new handle per partition    user = f"USERNAME_pool-arcfast_country-{country}_session-{session}_sesstime-{minutes}"    return f"http://{user}:{PASSWORD}@{PROXY_HOST}:{PROXY_PORT}"def run_partition(search_url: str, country: str, max_pages: int = 25):    with httpx.Client(proxy=sticky_proxy(country), timeout=30) as client:        for page in range(1, max_pages + 1):            r = client.get(search_url, params={"page": page})            if r.status_code != 200:                return  # retry the whole partition later on a new handle            yield r.text
  3. 03

    Fetch each new posting once, then check liveness cheaply

    Fetch the full description when a posting first appears. After that, a lightweight request on a schedule tells you whether it is still live; that is what gives you a close date.

  4. 04

    Deduplicate across sources

    Match on employer, normalised title, location and a description similarity score, and merge adverts into one job record. Keep every source URL on the merged record so coverage can be audited.

  5. 05

    Normalise pay and occupations, then reweight

    Convert pay to one period and currency, map titles to an occupation code, and reweight counts against an official employment benchmark before you call anything a trend.

Setup

Recommended setup

Search flows are stateful, so the sticky session matters more here than on most collection jobs.

PlanRoleSessionTargetingPrice
ARC Basic
Rotating ISP
Default for career sites and liveness checks
Employer career pages and re-checks are small and frequent. Our lowest price per GB carries the constant background load.
RotatingCountry
€0.75 / GB
€0.59 at 1 TB (−21%)
ARC Fast
Rotating residential
For job board searches
Residential exits in the market, held for one partition so the search token and result ordering stay consistent across pages.
Sticky, 10 minutes per search partitionCountry + city
€2.00 / GB
€1.12 at 1 TB (−44%)

Prices are list prices in EUR, excl. VAT. Volume discounts apply automatically at checkout — full ladder on the pricing page.

Connect

One connection string per market

The country, city and sticky session are tokens in the username. Change the token, change the market; keep the session handle, keep the IP.

sticky · Germany · 10 min
http://USERNAME_pool-arcfast_country-de_session-k3f9a1x2_sesstime-10:PASSWORD@proxy.arcproxies.io:8000

Swap _country-de for any market you quote. The full grammar is on the residential proxies page.

Illustration

What a five-country postings panel costs

An illustration with round numbers — your pages, payloads and retry rate will differ. The arithmetic is the real price ladder.

Assumptions

New postings fetched per day
20,000 at 90 KB
Search result pages per day
3,000 at 120 KB
Liveness checks per day
100,000 at 5 KB
Markets
5 (e.g. US, GB, DE, FR, NL)
Cadence
daily, 30 days
Bandwidth per month
≈ 80 GB

On ARC Basic

€56.00per month, excl. VAT

80 GB bought in one purchase at €0.70 / GB (−7% volume rung, applied automatically).

The same 80 GB on ARC Fast: €118.40 at €1.48 / GB. Route only the jobs that need it through the pricier pool.

Liveness checks are the largest number of requests and the smallest share of the bill, which is the case for per-gigabyte pricing in one line. If a board's searches need ARC Fast, move only those partitions.

Bandwidth never expires, so a bigger single purchase is only ever cheaper per GB. See the ladder.

In depth

Job postings, in depth

What job posting data measures, and what it does not

Online job adverts are now an official statistical source in Europe. Eurostat and Cedefop run a Web Intelligence Hub that collects online job advertisements from selected portals, flags duplicates by description, location and metadata, and merges adverts for the same job posted on several portals. From it, Eurostat publishes an experimental online job advertisement rate: the number of adverts per occupation divided by the number of employees from the Labour Force Survey.

Eurostat's own caveats are a good checklist for any private postings dataset:

  • Coverage depends on which portals you select, and that selection affects comparability over time and across countries.
  • Bias: some positions are advertised online much more than others.
  • Duplicates: the same advert may be counted several times if it is posted on several portals.
  • Classification: occupation, skill, location and industry coding can all be wrong, and depend on keyword choice and translation quality.

None of these is a reason not to use postings. They are the reason to publish your source list, your deduplication rule and your occupation mapping alongside the numbers.

Salary ranges in job adverts: what the rules require

Pay transparency rules have turned advertised salary from an occasional field into a mostly complete one in several markets, which is why compensation benchmarking from postings has become practical.

JurisdictionWhat the rule saysWhat it means for collection
New York StateCovered employers with four or more employees must include a compensation range in advertisements for covered job opportunitiesExpect a min–max range on most New York postings; collect from a US exit
European Union (Directive 2023/970, Art. 5)Applicants have a right to information on the initial pay or its range, for example in a published vacancy notice or before the interviewRanges will appear in many EU adverts, but the directive allows disclosure before the interview instead, so absence is not a violation

Collect the range as advertised, with its period and currency, and do not impute a figure where none is shown. This is a description of what the rules say, not legal advice; how each EU country transposed the directive differs.

Board searches, career sites and APIs: how to split the crawl

A postings pipeline has three kinds of source, and each wants a different setup:

  • Applicant tracking system job boards. Structured, often public JSON. Light, stable and cheap to collect on ARC Basic. Respect their documented rate limits.
  • Employer career pages without a feed. Plain HTML, low volume per employer, many employers. ARC Basic, rotating, with country targeting.
  • Job boards and aggregators. Stateful searches, page caps, regional ranking. ARC Fast with a sticky session per search partition, and a polite request rate.

Keep it to public, logged-out pages. Do not collect applicant data or anything behind an account, and check each board's terms before you start. The parent use case covers the shared setup with property data.

Measuring time to fill from postings

A posting that disappears was most likely filled or withdrawn, but you cannot tell which, and you only know it disappeared at the resolution of your re-check cadence. Daily liveness checks give you a close date within a day; weekly checks within a week. Pick the cadence for the precision you need, not by default.

A liveness check does not need the full page. A small request that confirms the posting still resolves, or a structured feed that still lists it, costs a few kilobytes. Spread these across a rotating proxy pool so that a hundred thousand daily checks do not concentrate on one address. If a check is rate limited, retry it later rather than recording the posting as closed.

Works with anything that takes a proxy URL

  • Python requests / httpx
  • Scrapy
  • Playwright
  • Node.js
  • n8n

FAQ

Questions

Something not covered? Write to contact@arcproxies.io.

Is scraping job postings legal?

It depends on the jurisdiction, the source's terms and what you collect, and we cannot give legal advice. Postings are published to be read, and national statistics offices use web-scraped adverts, but you should keep to public, logged-out pages, respect each site's terms and robots.txt, avoid personal data, and check specifics with counsel.

How do I avoid counting the same job twice?

Match adverts on employer, normalised job title, location and a similarity score of the description, then merge them into one job record that keeps every source URL. Eurostat's own job advert statistics flag duplicates on description, location and metadata for the same reason.

Can I collect salary ranges from job adverts?

Yes, where the advert shows them. New York State requires a compensation range in covered job adverts, and the EU Pay Transparency Directive gives applicants a right to pay information, for example in the vacancy notice. Store the range with its currency and period, and do not impute missing ones.

Do job boards show different results by country?

Usually. Boards rank results, show salary in local currency and period, and sometimes hide ranges based on the visitor's region. Collecting each market from an exit inside it, by country and where needed by city, keeps the data comparable to what local job seekers see.

Which plan should a job postings crawler use?

ARC Basic for career sites, structured job board feeds and liveness checks, which are light and frequent. ARC Fast with a 10-minute sticky session per search partition for job boards whose searches are stateful or treat hosting ranges differently.

How much bandwidth does job posting collection use?

A posting page is typically around 50 to 150 KB without images. A panel fetching 20,000 new postings, 3,000 search pages and 100,000 liveness checks a day comes to roughly 80 GB a month. Billing is per GB and unused bandwidth never expires.

Sources & review

Last reviewed by the ARC Proxies team. Prices are read from the live catalog at build time.

  1. [1]Eurostat: Experimental statistics: Online job advertisement rate
  2. [2]Eurostat, CROS: Web Intelligence Hub – OJA data
  3. [3]EUR-Lex: Directive (EU) 2023/970 on pay transparency
  4. [4]European Commission: New EU rules on pay transparency explained
  5. [5]New York State Department of Labor: Pay Transparency
  6. [6]Greenhouse: Job Board API

Get started

Buy a gigabyte and try it on your own targets.

No subscription, no sales call. Code WELCOME15 takes 15% off your first purchase, and whatever you do not use is still there next quarter.