Pracuj.pl Scraper · Poland Job Listings & Salaries
Pricing
from $0.99 / 1,000 job results
Pracuj.pl Scraper · Poland Job Listings & Salaries
Scrape Pracuj.pl — Poland's #1 job board. Any search URL returns job title, company, salary, contract, work mode, location and an AI summary. Optional detail mode adds the full description, responsibilities, skills, tech stack and apply link. JSON or CSV.
Pricing
from $0.99 / 1,000 job results
Rating
0.0
(0)
Developer
Muhamed Didovic
Maintained by CommunityActor stats
0
Bookmarked
24
Total users
4
Monthly active users
8 hours ago
Last modified
Share
Pracuj.pl Scraper — Search, Monitor & Alert
Scrape Pracuj.pl — Poland's #1 job board — by keyword, city and filters, or by pasting any search URL. One clean row per job with structured salary (salaryMin/salaryMax, not just a string), contract type, work mode, seniority, AI summary and more. Run it on a schedule with incremental mode and it becomes a job monitor: only NEW and UPDATED offers are emitted (and billed), with optional Telegram / Slack / Discord / webhook alerts. Pure HTTP, no browser — at $0.99 per 1,000 jobs, this is the cheapest way to watch the Polish job market.

Why use this scraper
- Search built in — keyword, city + radius, voivodeship, seniority, contract type, work mode, schedule, posting age. No URL crafting needed (but pasted URLs work too).
- Filters no other Pracuj actor has — minimum salary in PLN (not just "has salary"), one-click-apply only, direct-employers-only (skip recruitment agencies), Ukrainian-friendly offers, SuperOffers.
- Structured salary —
salaryMin,salaryMax,salaryCurrency,salaryPeriod,salaryGrossparsed from every disclosed range. Feed dashboards without string-wrangling. - Incremental monitoring — recurring runs emit only what changed (
changeStatus: NEW / UPDATED / REPOST). Unchanged offers are skipped before they cost anything — typically 80–95% cheaper for daily watches. - Alerts out of the box — Telegram, Slack, Discord or any webhook get a summary with job links at the end of each run. Monitor + alert = a no-code "new Pracuj jobs" bot.
- Free contact extraction —
extractedEmails[]andextractedPhones[]regex-pulled from listing text at no charge; optional deep employer-email enrichment when you need more. - Everything from one fetch — title, company, salary, AI requirements summary, per-city locations with coordinates; optional
fetchDetailsadds the full JD, skills, technologies, apply URL and phone. - Pure HTTP, no browser — fast, cheap, resilient (residential proxy with auto-rotation on blocks, built in at no extra cost).
What it does
Describe a search (or paste Pracuj.pl URLs). The actor reads the live results, paginates automatically, and emits one dataset row per job. In incremental mode it compares every offer against your private baseline from previous runs and emits only the diff.
Supported inputs
| Input style | Example |
|---|---|
| Keyword search | query: "python developer" |
| City + radius | location: "Warszawa", radiusKm: 30 |
| Region | region: "7" (mazowieckie) — or "17" for abroad |
| Any filter combo | seniority, contract, work mode, schedule, posted-within, min salary… |
| Pasted URL | any pracuj.pl/praca/... search URL from your browser |
Use cases
- Job monitoring & alerts — schedule a daily run with
incrementalMode+ Telegram and get new matching offers with links, for cents a day. - Labour-market & salary research — structured salary across Polish cities, roles and stacks; benchmark without parsing "12 000–18 000 zł".
- Recruitment & sourcing — track who's hiring for which roles; filter agencies out with
directEmployersOnly. - Lead generation — company names + profiles, free extracted emails/phones, optional deep employer-email enrichment.
- Aggregation & job boards — pull fresh Polish postings into your product;
compactmode pipes straight into an ATS or LLM.
How it works
- Set a search (keywords, city, filters) — or paste search URLs. Both can run together.
- The actor reads each results page's embedded job data and paginates until your cap.
- Each job becomes one flat row (optionally enriched from its detail page). In incremental mode, unchanged offers are dropped before any cost is incurred.
- Optional: end-of-run alert to your Telegram / Slack / Discord / webhook with the new jobs.
Daily monitor recipe: set query + location, turn on incrementalMode, add your telegramToken + telegramChatId, and schedule the actor daily. First run builds the baseline; every run after that pings you only when something new appears.
Input configuration
| Field | Type | Description |
|---|---|---|
query | string | Search keywords, e.g. python developer, księgowa. |
location | string | City, e.g. Warszawa. Pair with radiusKm (0 = city only; site default 30). |
region | string | Voivodeship 1–16, 17 = abroad. |
positionLevels | array | Seniority: 1 trainee, 3 assistant, 17 junior, 4 mid, 18 senior, 19 expert, 5 manager/coordinator, 20 manager, 6 director, 21 president. |
contractTypes | array | 0 employment, 1 specific-task, 2 commission, 3 B2B, 4 replacement, 5 agency, 6 temporary, 7 internship. |
workModes | array | full-office, hybrid, home-office, mobile. |
workSchedules | array | 0 full-time, 1 part-time, 2 additional/temporary. |
postedWithinDays | string | 1, 3, 7, 14, 30. |
minSalaryPln | integer | Only offers paying at least this (PLN). |
withSalaryOnly | boolean | Only offers that disclose salary. |
directEmployersOnly | boolean | Skip recruitment-agency offers (source-side filter). |
oneClickApplyOnly / superOffersOnly / ukrainianFriendly | boolean | More source-side toggles. |
startUrls | array | Pasted Pracuj.pl search URLs (run alongside the search above). |
incrementalMode | boolean | Emit only NEW / UPDATED / REPOST rows vs your previous runs. |
stateKey | string | One baseline per saved search — name them per schedule. |
skipReposts | boolean | Drop re-published offers (same company + title + workplace as an expired one). |
telegramToken + telegramChatId | string | Your bot posts the run summary with job links. |
slackWebhookUrl / discordWebhookUrl / webhookUrl (+webhookHeaders) | string | More alert channels; the generic webhook gets a JSON payload. |
notificationLimit / notifyOnlyChanges | int / bool | Jobs per message (default 10); stay silent when nothing changed (default on). |
compact | boolean | Core-fields-only output for AI agents / MCP / ATS. |
flatten | boolean | CSV-friendly flattening (default on). |
fetchDetails | boolean | Full description, responsibilities, required & optional skills, technologies, categories, apply URL, contact phone. +1 request/job, billed as additional-data. |
enrichEmails | boolean | Employer contact-email discovery (billed per email found; misses are free). |
maxItems / maxConcurrency / proxy | — | Run limits; proxy is built-in residential by default. |
Input examples
Basic search
{ "query": "python developer", "location": "Warszawa", "maxItems": 100 }
Senior remote B2B roles paying 20k+ with salary shown, direct employers only
{"query": "java","positionLevels": ["18", "19"],"contractTypes": ["3"],"workModes": ["home-office"],"minSalaryPln": 20000,"directEmployersOnly": true}
Daily monitor with Telegram alerts (schedule this daily)
{"query": "devops","location": "Kraków","postedWithinDays": "3","incrementalMode": true,"stateKey": "devops-krakow","skipReposts": true,"telegramToken": "123456:ABC…","telegramChatId": "123456789"}
Paste mode
{ "startUrls": ["https://www.pracuj.pl/praca/python;kw/warszawa;wp?et=4%2C18&wm=home-office"] }
How much does it cost?
Pay-per-event: $0.009 per run start + $0.00099 per job. Optional detail/email enrichment bills a separate additional-data event ($0.0008).
- 1,000 jobs ≈ $1.00 — roughly half the going rate for comparable Pracuj.pl scrapers.
- Daily monitoring example: a watch that scans ~600 offers and finds 15 new ones costs $0.009 + 15 × $0.00099 ≈ $0.024/run with incremental mode — vs ~$0.60 re-scraping everything. That's ~96% less, about $0.72/month for a daily alert.
Output sample
{"portal": "pracuj","offerId": "1005006098","url": "https://www.pracuj.pl/praca/...,oferta,1005006098","jobTitle": "Senior Python Developer","companyName": "NESS SOLUTION sp. z o.o.","salaryText": "135–150 zł netto (+ VAT) / godz.","salaryMin": 135,"salaryMax": 150,"salaryCurrency": "PLN","salaryPeriod": "hour","salaryGross": false,"typesOfContract": ["Kontrakt B2B"],"workModes": ["Praca zdalna"],"positionLevels": ["Starszy specjalista (senior)"],"isRemoteWorkAllowed": true,"locations": [{ "workplace": "Warszawa", "latitude": 52.23, "longitude": 21.01 }],"aiSummary": "Masz minimum 5 lat doświadczenia…","extractedEmails": ["rekrutacja@ness.pl"],"extractedPhones": ["+48 601 234 567"],"changeStatus": "NEW","publishedDate": "2026-08-04T05:55:21.007Z"}
Key output fields
| Field | Description |
|---|---|
offerId / groupId / url | Pracuj offer id, group id + detail URL |
jobTitle / companyName / companyId / companyProfileUrl / companyLogoUrl | role + employer |
salaryText | displayed salary verbatim (when shown) |
salaryMin / salaryMax / salaryCurrency / salaryPeriod / salaryGross | parsed salary — numbers, currency, per hour/month, gross vs net |
typesOfContract / workSchedules / workModes / positionLevels | employment type, schedule, on-site/hybrid/remote, seniority |
isRemoteWorkAllowed / isOneClickApply | flags |
locations | per-city postings (workplace, offer id, URL, coordinates) |
aiSummary | Pracuj's AI-generated requirements summary |
extractedEmails / extractedPhones | free regex-extracted contacts from listing text |
changeStatus | NEW / UPDATED / REPOST (incremental mode) |
publishedDate / expirationDate | posting dates |
description / responsibilities / requiredSkills / optionalSkills / technologies / aboutProject | full JD sections (with fetchDetails) |
categories / applyUrl / contactPhone | categories, application link, recruiter phone (with fetchDetails) |
contactEmail / contactWebsite | employer email + site (with enrichEmails) |
FAQ
Can I search without building a URL? Yes — query, location and every filter above are actor inputs. Pasted URLs still work and can run in the same crawl.
How do I set up a daily job alert? Turn on incrementalMode, add a stateKey, connect Telegram/Slack/Discord, and schedule the actor daily. You'll only hear about offers that are new or changed since the last run — and only pay for those rows.
Does each schedule need its own stateKey? Yes, one per saved search (e.g. python-warszawa, devops-krakow), so baselines don't mix.
Do I get the salary as numbers? Yes — salaryMin/salaryMax/salaryCurrency/salaryPeriod/salaryGross are parsed from every offer that discloses pay. salaryText keeps the original string. You can also filter at the source with minSalaryPln.
Can I skip recruitment agencies? directEmployersOnly: true applies Pracuj's own employer-type filter server-side — agency listings never reach your dataset.
How do I get the full description and apply link? Turn on fetchDetails (+1 request per job, billed as additional-data).
Can I use it from the Apify API or an MCP server? Yes — standard Apify actor: REST API, scheduler, webhooks, and MCP all work. Use compact: true for small LLM-friendly payloads.
Why residential proxies? Pracuj.pl 403-blocks datacenter IPs. The actor ships with residential rotation built in — you don't configure anything.
Support
Found an issue or want a field added? Open an issue on the actor's Issues tab and we'll take a look — feature requests usually ship within days.
Additional services
Need employer contact emails beyond what's printed in listings? Turn on enrichEmails to append a best-effort contactEmail + contactWebsite per company (billed only when an email is found).
Explore more scrapers
Check the publisher's profile for more job-board and directory scrapers (LinkedIn Jobs, Naukri, SEEK, Jobstreet, Indeed-style boards and more).
🤖 For AI Agents & LLM Apps
compact: truereturns only the core fields (title, company, structured salary, locations, mode, level, contract, dates, URL) — small enough to drop whole result sets into a model context.- Stable JSON schema: absent values are
null/empty arrays, never missing keys — safe to parse without guards. - Works through Apify's MCP server like any actor; pair
incrementalModewith an agent loop to reason only over what changed.
⚠️ Disclaimer
This actor collects only publicly available job-listing data for legitimate research, lead-generation and recruitment use. Respect Pracuj.pl's terms of service and applicable laws (including data-protection rules) in your jurisdiction. You are responsible for how you use the scraped data.
SEO Keywords
pracuj scraper, pracuj.pl scraper, pracuj api, pracuj.pl monitor, poland job scraper, polish jobs data, job listings poland, oferty pracy scraper, praca warszawa scraper, new job alerts poland, pracuj.pl telegram alert, job monitoring poland, salary data poland, pracuj salary scraper, recruitment data poland, IT jobs poland scraper, job board scraper, employer leads poland, pracuj export, pracuj.pl rss alternative