Pracuj.pl Scraper · Poland Job Listings & Salaries avatar

Pracuj.pl Scraper · Poland Job Listings & Salaries

Pricing

from $0.99 / 1,000 job results

Go to Apify Store
Pracuj.pl Scraper · Poland Job Listings & Salaries

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

Muhamed Didovic

Maintained by Community

Actor stats

0

Bookmarked

24

Total users

4

Monthly active users

8 hours ago

Last modified

Categories

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.

How it works

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 salarysalaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryGross parsed 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 extractionextractedEmails[] and extractedPhones[] 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 fetchDetails adds 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 styleExample
Keyword searchquery: "python developer"
City + radiuslocation: "Warszawa", radiusKm: 30
Regionregion: "7" (mazowieckie) — or "17" for abroad
Any filter comboseniority, contract, work mode, schedule, posted-within, min salary…
Pasted URLany 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; compact mode pipes straight into an ATS or LLM.

How it works

  1. Set a search (keywords, city, filters) — or paste search URLs. Both can run together.
  2. The actor reads each results page's embedded job data and paginates until your cap.
  3. Each job becomes one flat row (optionally enriched from its detail page). In incremental mode, unchanged offers are dropped before any cost is incurred.
  4. 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

FieldTypeDescription
querystringSearch keywords, e.g. python developer, księgowa.
locationstringCity, e.g. Warszawa. Pair with radiusKm (0 = city only; site default 30).
regionstringVoivodeship 116, 17 = abroad.
positionLevelsarraySeniority: 1 trainee, 3 assistant, 17 junior, 4 mid, 18 senior, 19 expert, 5 manager/coordinator, 20 manager, 6 director, 21 president.
contractTypesarray0 employment, 1 specific-task, 2 commission, 3 B2B, 4 replacement, 5 agency, 6 temporary, 7 internship.
workModesarrayfull-office, hybrid, home-office, mobile.
workSchedulesarray0 full-time, 1 part-time, 2 additional/temporary.
postedWithinDaysstring1, 3, 7, 14, 30.
minSalaryPlnintegerOnly offers paying at least this (PLN).
withSalaryOnlybooleanOnly offers that disclose salary.
directEmployersOnlybooleanSkip recruitment-agency offers (source-side filter).
oneClickApplyOnly / superOffersOnly / ukrainianFriendlybooleanMore source-side toggles.
startUrlsarrayPasted Pracuj.pl search URLs (run alongside the search above).
incrementalModebooleanEmit only NEW / UPDATED / REPOST rows vs your previous runs.
stateKeystringOne baseline per saved search — name them per schedule.
skipRepostsbooleanDrop re-published offers (same company + title + workplace as an expired one).
telegramToken + telegramChatIdstringYour bot posts the run summary with job links.
slackWebhookUrl / discordWebhookUrl / webhookUrl (+webhookHeaders)stringMore alert channels; the generic webhook gets a JSON payload.
notificationLimit / notifyOnlyChangesint / boolJobs per message (default 10); stay silent when nothing changed (default on).
compactbooleanCore-fields-only output for AI agents / MCP / ATS.
flattenbooleanCSV-friendly flattening (default on).
fetchDetailsbooleanFull description, responsibilities, required & optional skills, technologies, categories, apply URL, contact phone. +1 request/job, billed as additional-data.
enrichEmailsbooleanEmployer contact-email discovery (billed per email found; misses are free).
maxItems / maxConcurrency / proxyRun 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

FieldDescription
offerId / groupId / urlPracuj offer id, group id + detail URL
jobTitle / companyName / companyId / companyProfileUrl / companyLogoUrlrole + employer
salaryTextdisplayed salary verbatim (when shown)
salaryMin / salaryMax / salaryCurrency / salaryPeriod / salaryGrossparsed salary — numbers, currency, per hour/month, gross vs net
typesOfContract / workSchedules / workModes / positionLevelsemployment type, schedule, on-site/hybrid/remote, seniority
isRemoteWorkAllowed / isOneClickApplyflags
locationsper-city postings (workplace, offer id, URL, coordinates)
aiSummaryPracuj's AI-generated requirements summary
extractedEmails / extractedPhonesfree regex-extracted contacts from listing text
changeStatusNEW / UPDATED / REPOST (incremental mode)
publishedDate / expirationDateposting dates
description / responsibilities / requiredSkills / optionalSkills / technologies / aboutProjectfull JD sections (with fetchDetails)
categories / applyUrl / contactPhonecategories, application link, recruiter phone (with fetchDetails)
contactEmail / contactWebsiteemployer 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: true returns 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 incrementalMode with 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