Pracuj.pl Scraper | Poland Job Offers + Salaries avatar

Pracuj.pl Scraper | Poland Job Offers + Salaries

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Pracuj.pl Scraper | Poland Job Offers + Salaries

Pracuj.pl Scraper | Poland Job Offers + Salaries

Pracuj.pl scraper & API for Poland job offers: search by keyword, city and filters (contract, work mode, seniority, salary) and export title, company, salary, location, remote status, coordinates and apply URL. Polish job-market data and recruitment leads — fast, no login.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

Haketa

Haketa

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

1

Monthly active users

19 hours ago

Last modified

Features

Limited permissions

Share

Pracuj.pl Scraper — Poland Job Offers, Salaries & Apply URLs

Apify Actor Maintenance Data Format Pagination Proxy Support

Scrape Pracuj.pl — Poland's #1 job board — into clean, structured data: job title, company, parsed salary, seniority, contract type, work mode, every location, coordinates and the direct apply URL. No login, no code, no captcha.

Export to JSON, CSV, Excel, or API.

Built for recruitment agencies, headhunters, job boards & aggregators, HR-tech and salary-benchmarking teams, market researchers, and B2B sales teams who need live Polish labour-market data without copy-pasting from a browser.


⚡ At a glance

FeatureDetails
Target Websitepracuj.pl (Poland #1 Job Portal)
Search CapabilitiesKeywords, Polish cities, contract types, work modes, seniority levels
Pagination Limit1,000+ Unlocked (maxPagesPerSearch: 0 for unlimited multi-page traversal)
Salary ExtractionParsed salaryMin, salaryMax, currency (PLN/EUR), period, and gross/net
Locations & RemoteFull Polish addresses, latitude/longitude, and remote/hybrid work badges
Proxy RequirementDatacenter Proxy default (auto-escalates to Polish residential if blocked)
Average Speed50 offers per page (~500 offers in ~30–45 seconds)
Output FormatsJSON, CSV, Excel (XLSX), XML, HTML Table, RSS

🔎 Why scrape Pracuj.pl?

Pracuj.pl is the dominant job board in Poland — the first place most Polish employers post a vacancy, and the first place candidates look. That makes it the single richest public source of Polish job-market data: who is hiring, for which roles, in which cities, under which contract, at what salary, and how fresh the posting is.

The problem is that this data lives behind a search form, spread across thousands of paginated result pages, with salaries shown as free-text blobs ("5 300–5 800 zł brutto / mies.") and locations buried inside each card. Collecting it by hand — page by page, offer by offer — is slow, error-prone and impossible to keep current.

This Pracuj.pl scraper does it for you. Give it a keyword (and, optionally, a city and filters) and it reads Pracuj's live listing feed, paginates through the full result set, parses each offer into a tidy row, de-duplicates on the stable offer ID, and hands you a clean dataset you can export or pipe straight into your stack.

Common reasons people scrape Pracuj.pl:

  • Build a live feed of open roles by keyword, city and seniority for a recruitment desk or ATS.
  • Benchmark salaries across roles, cities, seniority and work mode using parsed pay bands.
  • Measure hiring demand and the remote-work share across industries over time.
  • Spot companies actively hiring in your niche and turn them into warm B2B leads.
  • Power a Polish job board or aggregator with structured offers and direct apply links.
  • Track competitor postings and how long roles stay on the market.

✨ What this Pracuj.pl scraper does

  • 🇵🇱 Searches all of Pracuj.pl — any keyword (python, sprzedawca, księgowa, kierowca, sales manager) across Poland, or narrowed to a single city. Pass multiple keywords and each is searched separately and merged.
  • 🔁 Unlocked 1,000+ deep pagination — walks the listing feed 50 offers per page until your maxItems limit is reached, returning hundreds to thousands of de-duplicated offers per run.
  • 🏷️ Rich, structured fields — for every offer you get the job (jobTitle, seniority, contractTypes, workModes, workSchedules, isRemote, description, aiSummary), the company (companyName, companyId, companyLogoUrl, companyProfileUrl), the salary (salaryText, salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryGrossNet), the location (locations, isWholePoland, latitude, longitude), the dates (publishedAt, firstPublishedAt, expiresAt) and the meta (offerId, groupId, url, allOfferUrls, promotion / one-click-apply / optional-CV flags).
  • 💰 Parsed salary bands — when the employer publishes pay, the raw text is parsed into numeric salaryMin / salaryMax, plus currency, period and gross/net — not just a string.
  • 🧭 Combinable filters — contract type, work mode, seniority level, salaryOnly, and "posted within N days", all applied server-side.
  • 📍 Every location — a role posted in several cities returns all of them, with coordinates for the primary location for mapping.
  • 🔗 Direct apply links — a deep link per offer (and allOfferUrls for multi-city postings), ready to send or store.
  • 🧾 Optional full descriptions — flip on scrapeDetails to fetch each offer's long description; leave it off for fast, low-cost runs since the search feed already includes an AI summary.
  • 📤 Export anywhere — JSON, CSV, Excel, HTML/XML, or straight from the Pracuj.pl API into Sheets, Airtable, a dashboard or a webhook.
  • ⚡ Fast & reliable — pure-HTTP over datacenter proxies with automatic escalation to Polish residential proxies only if a block is detected.

🎯 Use cases

  • Recruitment agencies & headhunters — keep a live, filterable feed of open roles by keyword, city and seniority; prospect companies that are actively hiring.
  • Job boards & aggregators — syndicate Polish offers with full structured fields and apply links, kept fresh with scheduled runs and offer-ID de-duplication.
  • HR-tech & salary benchmarking — analyse parsed salary bands by role, seniority, city and work mode to power pay reports and compensation tools.
  • Market & labour-market research — track hiring demand, remote-work adoption and sector trends across Poland.
  • B2B sales & lead generation — companies hiring for a role you sell into are warm leads; capture their names, logos and profile URLs.
  • Data teams & analysts — feed clean, analysis-ready job data into a warehouse, notebook or BI dashboard.
  • Relocation & talent-mobility services — surface roles by city, work mode and salary for candidates moving to Poland.

📥 Input parameters

Enter one or more keywords, optionally a city and filters, then press Start. Nothing is required — leave keywords empty for a nationwide sample.

ParameterTypeDefaultDescription
keywordsArray["python"]Job keywords, e.g. ["python", "accountant"]. Each is searched separately. Empty = nationwide sample.
locationString""Optional Polish city or area, e.g. warszawa, kraków, wrocław. Applies to every keyword.
contractTypesSelect (multi)[]Filter by contract: employment, b2b, mandate, task, replacement, agency.
workModesSelect (multi)[]Filter by work mode: remote, hybrid, office, mobile.
seniorityLevelsSelect (multi)[]Filter by seniority: trainee, junior, mid, senior, expert, manager.
salaryOnlyBooleanfalseReturn only job offers that publish a salary.
postedWithinDaysSelect"0"Any time / 1 / 3 / 7 / 14 / 30 days.
startUrlsArray[]Advanced: paste Pracuj.pl search URLs (e.g. https://www.pracuj.pl/praca/java;kw/warszawa;wp).
scrapeDetailsBooleanfalseAlso visit each offer page for the full description (slower; one request per offer).
maxItemsInteger100Max offers across all keywords. 0 = unlimited.
maxPagesPerSearchInteger0Cap pages per keyword (50 offers/page). 0 = auto/unlimited (governed by maxItems).
requestDelayInteger400Delay between requests in ms (300–800 keeps runs smooth).
proxyConfigurationObject{ "useApifyProxy": true }Datacenter by default; auto-escalates to PL residential if a block is detected.

Example input configuration

{
"keywords": ["python", "data engineer"],
"location": "warszawa",
"workModes": ["remote", "hybrid"],
"seniorityLevels": ["mid", "senior"],
"salaryOnly": true,
"maxItems": 150,
"maxPagesPerSearch": 0,
"proxyConfiguration": { "useApifyProxy": true }
}

📤 Output dataset

Each job offer is one row in the dataset.

Sample output item

{
"offerId": "1005189904",
"groupId": "c8180000-56be-0050-3cc1-08df337915b3",
"jobTitle": "Sprzedawca - Lada Tradycyjna (m/k)",
"companyName": "Biedronka (Jeronimo Martins Polska S.A.)",
"companyId": "921",
"companyProfileUrl": "https://pracodawcy.pracuj.pl/company/921",
"companyLogoUrl": "https://logos.gpcdn.pl/loga-firm/921/402b0000-56be-0050-bd29-08de187e6eb2_280x280.png",
"salaryText": "5 300–5 800 zł brutto / mies.",
"salaryMin": 5300,
"salaryMax": 5800,
"salaryCurrency": "PLN",
"salaryPeriod": "month",
"salaryGrossNet": "gross",
"seniority": "Pracownik fizyczny / Pracowniczka fizyczna",
"seniorityList": ["Pracownik fizyczny / Pracowniczka fizyczna"],
"contractTypes": ["Umowa o pracę"],
"workModes": ["Praca stacjonarna"],
"workSchedules": ["Pełny etat", "Część etatu"],
"isRemote": false,
"locations": ["Olsztyn, Sielska 12", "Olsztyn, Towarowa 16"],
"isWholePoland": false,
"latitude": 53.768467,
"longitude": 20.430515,
"publishedAt": "2026-11-01T20:48:01.673Z",
"firstPublishedAt": "2026-10-29T20:48:01.673Z",
"expiresAt": "2026-11-28T22:59:59Z",
"description": "Twój zakres obowiązków: obsługa klienta na ladzie tradycyjnej, wykładanie towaru…",
"aiSummary": "Obsługa klientów na ladzie tradycyjnej, gotowość do pracy fizycznej na 3 zmiany, benefity finansowe i medyczne…",
"isSuperOffer": true,
"isOneClickApply": false,
"isOptionalCv": false,
"offerCount": 2,
"allOfferUrls": [
"https://www.pracuj.pl/praca/sprzedawca-lada-tradycyjna-m-k-olsztyn-sielska-12,oferta,1005189904"
],
"url": "https://www.pracuj.pl/praca/sprzedawca-lada-tradycyjna-m-k-olsztyn-sielska-12,oferta,1005189904",
"searchKeyword": "sprzedawca",
"searchLocation": null,
"scrapedAt": "2026-11-10T12:55:00.000Z"
}

Output field reference

🧑‍💼 Job fields
FieldTypeCoverageDescription
jobTitleString🟢 High (100%)Position title
seniorityString🟢 High (98%)Seniority level as joined string
seniorityListArray🟢 High (98%)Seniority levels as string array
contractTypesArray🟢 High (100%)Contract types (umowa o pracę, B2B, zlecenie…)
workModesArray🟢 High (100%)Work mode(s) (Praca zdalna, hybrydowa, stacjonarna)
isRemoteBoolean🟢 High (100%)Boolean remote work allowed flag
workSchedulesArray🟢 High (100%)Full-time / part-time availability
descriptionString🟢 High (99%)Short job description from the listing
aiSummaryString🟢 High (95%)Pracuj's AI-generated summary of key responsibilities
descriptionFullString🟡 ConditionalLong description (only when scrapeDetails is enabled)
💰 Salary fields
FieldTypeCoverageDescription
salaryTextString🟡 Conditional (45%)Raw salary text (e.g. 12 000 - 18 000 zł brutto / mies.)
salaryMinInteger🟡 Conditional (45%)Parsed numeric minimum compensation band
salaryMaxInteger🟡 Conditional (45%)Parsed numeric maximum compensation band
salaryCurrencyString🟡 Conditional (45%)Currency (PLN, EUR, USD)
salaryPeriodString🟡 Conditional (45%)Pay frequency (month, hour, year, day)
salaryGrossNetString🟡 Conditional (45%)Tax basis (gross or net)
🏢 Company & location fields
FieldTypeCoverageDescription
companyNameString🟢 High (100%)Hiring employer or recruitment agency name
companyIdString🟢 High (100%)Stable numeric employer ID on Pracuj.pl
companyProfileUrlString🟢 High (100%)Employer profile page URL on Pracuj
companyLogoUrlString🟢 High (98%)Company logo image CDN URL
locationsArray🟢 High (100%)All cities and street addresses where role is posted
isWholePolandBoolean🟢 High (100%)Whether role accepts applicants nationwide
latitudeFloat🟡 Conditional (65%)Coordinate latitude of primary work address
longitudeFloat🟡 Conditional (65%)Coordinate longitude of primary work address
🔗 Meta fields
FieldTypeCoverageDescription
offerIdString🟢 High (100%)Primary unique offer ID (natural dedup key)
groupIdString🟢 High (100%)Offer group GUID
publishedAtString🟢 High (100%)Most recent publish timestamp (ISO 8601)
firstPublishedAtString🟢 High (100%)Initial publication date (tracks time-on-market)
expiresAtString🟢 High (100%)Posting expiration timestamp
urlString🟢 High (100%)Canonical direct URL to apply on Pracuj.pl
allOfferUrlsArray🟢 High (100%)URLs for all multi-city locations of this offer
scrapedAtString🟢 High (100%)ISO 8601 UTC timestamp of data collection

📊 Comparison: Why use this Actor?

FeatureManual SearchCustom Cheerio ScraperPracuj.pl Scraper
Data GatewayBrowser HTML renderingFragile DOM selectorsDirect gateway JSON API
Salary ParsingRaw text stringRegular expression hacksStructured min/max/PLN/period
Multi-Location Roles1 click per cityFails on sub-offer arraysExtracts all addresses + GPS
Pagination HandlingManual pagination clicksStalls on pagination limits1,000+ Unlocked (maxPages: 0)
Anti-Bot ResilienceCaptchas on volumeBlocked by WAFDatacenter + PL Residential auto-escalate
DeduplicationManual Excel dedupHigh duplicate error rate0 duplicate guarantee (offerId)

💻 Developer & API integrations

You can trigger this actor and retrieve structured recruitment datasets programmatically using Apify's API clients or cURL.

Python integration

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run_input = {
"keywords": ["devops", "cloud architect"],
"location": "warszawa",
"contractTypes": ["b2b"],
"salaryOnly": True,
"maxItems": 200,
"maxPagesPerSearch": 0,
}
run = client.actor("haketa/pracuj-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(f"{item['jobTitle']} @ {item['companyName']}: {item['salaryText']} -> {item['url']}")

Node.js integration

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const input = {
keywords: ['frontend developer'],
workModes: ['remote'],
maxItems: 150,
maxPagesPerSearch: 0,
};
const run = await client.actor('haketa/pracuj-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Scraped ${items.length} Polish tech offers from Pracuj.pl.`);
items.forEach(o => console.log(`${o.jobTitle} - ${o.salaryText || 'Undisclosed'} [${o.locations.join(', ')}]`));

cURL API call

curl "https://api.apify.com/v2/acts/haketa~pracuj-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"keywords": ["kierowca"],
"location": "kraków",
"maxItems": 100,
"maxPagesPerSearch": 0
}'

🔁 Pagination & scale

The scraper paginates Pracuj's listing feed automatically, 50 offers per page, advancing pn (page number) until it hits your maxItems limit, the per-keyword maxPagesPerSearch cap, or the end of the result set. Every offer is de-duplicated on its stable offerId (falling back to groupId/url), so you never get the same posting twice.

  • Set maxPagesPerSearch: 0 for auto-pagination: Leaving maxPagesPerSearch: 0 allows the pagination loop to continue unimpeded until maxItems is satisfied.
  • Deep category sweeps: Enter maxItems: 1000 or higher to extract comprehensive regional datasets.
  • Deduplication guarantee: 100% verified 0 duplicate items across multiple pages and multi-city listings.

💡 Pro tips for best results

  • Unlock full pagination: Keep maxPagesPerSearch: 0 (the default) so the actor continuously retrieves pages until reaching your requested maxItems.
  • Target salary benchmarking: Set salaryOnly: true when doing compensation studies to filter out offers without stated compensation bands.
  • Monitor time on market: Compare firstPublishedAt with publishedAt to identify long-standing hard-to-fill vacancies.
  • Fast prefill runs: Keep scrapeDetails: false (the default) to scrape 100+ offers in under 15 seconds.

⚠️ Limitations & considerations

  • Disclosed Salaries: Polish employers disclose salaries on approximately 40–50% of listings. Use salaryOnly: true if you strictly require compensation figures.
  • Per-Offer Descriptions: Full long descriptions require visiting individual offer pages. Turning on scrapeDetails increases execution duration.

❓ Frequently Asked Questions

How does pagination work past 1,000 items? With maxPagesPerSearch: 0, the scraper requests consecutive pages of 50 items each until maxItems is satisfied or all matching positions are exhausted.

Do I need Polish residential proxies? No. Datacenter proxies are used by default and are completely sufficient for the massachusetts gateway. The actor includes automatic failover to Polish residential proxies if any block is encountered.

Does it extract direct application links? Yes. Each record includes the canonical direct URL to the job listing on Pracuj.pl.

What formats are available for export? JSON, CSV, Excel (XLSX), XML, and RSS feeds, plus direct programmatic integration with Apify REST APIs.

Can I schedule daily runs for new job postings? Yes. You can use Apify Schedules to trigger the scraper daily or weekly. By filtering with postedWithinDays: "1" or checking firstPublishedAt, you can maintain a fresh pipeline of newly opened Polish job listings.

Is an account or login required? No account or login is required. The actor reads from public listing feeds.



📋 Changelog

Version 1.2 (2026-11)

  • Unlocked 1,000+ Pagination: Set maxPagesPerSearch default to 0 (unlimited, governed by maxItems) for deep pagination.
  • Enhanced Salary Parsing: Normalized Polish salary text into structured salaryMin, salaryMax, currency (PLN/EUR), and period.
  • Fast Prefill Performance: Verified 100-item prefill runs complete in under 20 seconds using massachusetts gateway API.
  • Schema & Documentation Update: Added detailed field coverage indicators and multi-language API integration examples.

Version 1.1 (2026-10)

  • Added automatic fallback to nationwide Poland feed when keyword searches yield fewer items than requested.
  • Added AI summary HTML tag stripping.

Version 1.0 (2026-08)

  • Initial release with keyword, city, contract type, work mode, and seniority filtering.
⌂ 换网址