
Global Sources Supplier Scraper
scrape.ly/store/cornerledger/globalsources-scraperLead generationE-commerce
2 monthly users

Scrape Polish job offers from pracuj.pl: title, employer, salary per contract type, work mode, seniority, locations, technologies, full description, benefits and apply link. Search by keyword or URL with filters.
Scrape job offers from pracuj.pl, Poland's largest job board: title, employer, salary for every contract type, work mode, seniority, locations, technologies, the full offer text, benefits and apply links. Search by keyword or paste any pracuj.pl search URL, add filters, and export clean JSON, CSV or Excel. No login, no browser, and full offer details are included at the same low price.
locations.python developer, księgowa, magazynier) or paste pracuj.pl URLs.| Field | What it does |
|---|---|
searchQueries | Keywords, each run as its own search. Empty = all offers matching the filters. |
startUrls | pracuj.pl / it.pracuj.pl search URLs, offer URLs (...,oferta,123) or employer pages (pracodawcy.pracuj.pl/company/123). |
maxResults | Maximum jobs in total (0 = no limit, up to 100,000). |
location, radiusKm | City and distance (0, 10, 20, 30, 50, 100 km). |
regions, categories | Voivodeships (or abroad) and job categories. |
contractTypes, workModes, positionLevels, workSchedules | The site's own filters. |
postedWithinDays, minSalary, withSalaryOnly | Freshness and salary filters. |
superOffersOnly, oneClickApplyOnly, ukrainianFriendly | Offer flags. |
includeDetails | Read each offer page for the full description (default on, same price). |
{
"searchQueries": ["python developer"],
"location": "Kraków",
"radiusKm": 30,
"contractTypes": ["b2b", "employment"],
"workModes": ["remote", "hybrid"],
"postedWithinDays": "7",
"maxResults": 100,
"includeDetails": true
}
One row per job. Main fields:
| Field | Description |
|---|---|
title, company, companyUrl, companyLogo | Job and employer |
location, allLocations, locations, region | Workplaces (with offer link and coordinates per location) |
workplaceType, workModes, isRemote | remote / hybrid / onsite / mobile |
contractTypes, positionLevels, workSchedules | Contract, seniority, schedule |
salaryText, salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryType, salaries | Salary, overall and per contract type |
postedAt, firstPublishedAt, expiresAt | Dates (ISO 8601) |
jobUrl, applyUrl, externalApplyUrl | Links |
responsibilities, requirements, niceToHave, offered, benefits, technologies | Offer sections (with details) |
descriptionText, lists, aboutCompany, aboutProject | Full text and every section as title + items |
categories, leadingCategory, specializations, requiredLanguages, jobDetails | Classification and extra attributes |
isSuperOffer, isOneClickApply, isDirectlyFromEmployer, highlights, aiSummary, contactPhone | Flags, badges, AI summary, phone |
Example (shortened, sample values):
{
"id": "1005000001",
"groupId": "58080000-56be-0050-8902-000000000001",
"title": "Senior Python Developer",
"company": "Example Software Sp. z o.o.",
"companyUrl": "https://pracodawcy.pracuj.pl/company/1070000001",
"location": "Warszawa, Mokotów",
"allLocations": ["Warszawa, Mokotów"],
"country": "PL",
"region": "mazowieckie",
"workplaceType": "hybrid",
"isRemote": false,
"workModes": ["Praca hybrydowa"],
"level": "Starszy specjalista / Starsza specjalistka (senior)",
"contractTypes": ["Umowa o pracę", "Kontrakt B2B"],
"salaryText": "17 000–25 000 zł / mies. (zal. od umowy)",
"salaryMin": 17000,
"salaryMax": 25000,
"salaryCurrency": "PLN",
"salaryPeriod": "month",
"salaryType": "depends on contract",
"salaries": [
{"contractType": "Umowa o pracę", "min": 20000, "max": 25000, "currency": "PLN", "period": "month", "type": "gross"},
{"contractType": "Kontrakt B2B", "min": 17000, "max": 22000, "currency": "PLN", "period": "month", "type": "net + VAT"}
],
"postedAt": "2026-10-14T15:00:00Z",
"expiresAt": "2026-11-10T22:59:59Z",
"jobUrl": "https://www.pracuj.pl/praca/senior-python-developer-warszawa,oferta,1005000001",
"applyUrl": "https://www.pracuj.pl/aplikuj/senior-python-developer-warszawa,oferta,1005000001",
"requirements": ["Minimum 5 lat doświadczenia w backendzie", "Bardzo dobra znajomość Pythona i Django"],
"technologies": ["Python", "Django", "PostgreSQL", "Docker"],
"benefits": ["prywatna opieka medyczna", "karta sportowa"],
"leadingCategory": "IT - Rozwój oprogramowania > Programowanie",
"isSuperOffer": true,
"isDirectlyFromEmployer": true,
"detailFetched": true,
"source": "pracuj.pl"
}
You pay $0.50 per 1,000 jobs ($0.0005 per saved job), with the full offer details included. A run that saves 1,000 jobs costs about $0.50 in job fees plus a small amount of platform usage (compute and proxy traffic), which is billed separately at the platform's normal rates. Offers that are not saved are never charged, and the run stops cleanly when your maximum total charge is reached.
Is it legal to scrape pracuj.pl? The scraper only reads publicly visible job offers, the same pages anyone can open without an account. Make sure your use of the data (especially contact phones) follows GDPR and pracuj.pl's terms.
Do I need a login or my own proxy? No. No account is needed, and the built-in proxy is preselected. If the site starts challenging datacenter IPs, the scraper switches to Polish residential IPs by itself.
How many results can I get? As many as pracuj.pl lists for your search; all of Poland is usually around 50,000 jobs. Use maxResults to cap the run.
Why are some fields empty? pracuj.pl employers fill different sections. Salary is only present when the employer published it, and offer sections (requirements, benefits, technologies ...) need Include full offer details.
Why are names in Polish? Contract types, work modes, levels and categories are kept exactly as pracuj.pl shows them; normalized fields such as workplaceType, salaryPeriod and salaryType are in English.
Can I schedule it or use the API? Yes. Schedule daily runs with "Posted within: last 24 hours" for alerts, and read results through the API or integrations.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
searchQueriesarrayOptionalSearch keywords
Job titles, skills or company names, as you would type them into the pracuj.pl search box (for example python developer, księgowa, magazynier). Each keyword runs as its own search; offers found by several searches are saved once. Leave empty to list all offers that match the filters.
startUrlsarrayOptionalpracuj.pl URLs
Paste search result pages with filters already set (https://www.pracuj.pl/praca/python;kw/warszawa;wp?rd=30), it.pracuj.pl searches, single offer pages (…,oferta,1005159068) or employer pages (https://pracodawcy.pracuj.pl/company/1074230078). Filters inside a search URL are used as they are.
maxResultsintegerOptionaldefault 20Max results
Maximum number of jobs to save in total. Use 0 for no limit (up to 100,000).
maxResultsPerSearchintegerOptionalMax results per search
Optional cap for each keyword or URL. 0 or empty means no per-search cap.
All filters are optional and combine with AND; within one filter any value matches. They apply to keyword searches, not to search URLs (which carry their own filters).
locationstringOptionalCity
A Polish city or town, for example Warszawa, Kraków or Gdańsk.
radiusKmintegerOptionalRadius around the city (km)
Distance around the city: 0, 10, 20, 30, 50 or 100 km (other values are rounded to the nearest option). The site uses 30 km when empty.
regionsarrayOptionalRegions (voivodeships)
Keep offers in these voivodeships, or abroad.
categoriesarrayOptionalCategories
Job categories (pracuj.pl branches). For a subcategory, paste a filtered search URL instead.
contractTypesarrayOptionalContract types
Keep only offers with these contract types.
workModesarrayOptionalWork modes
Keep only remote, hybrid, on-site or mobile offers.
positionLevelsarrayOptionalPosition levels
Seniority levels to keep.
workSchedulesarrayOptionalWork schedules
Full-time, part-time or temporary work.
postedWithinDaysenumOptionalPosted within
Only offers published (or refreshed) in this period.
minSalaryintegerOptionalMinimum salary (PLN per month)
Keep offers whose published salary reaches this monthly amount. Offers without a published salary are left out.
withSalaryOnlybooleanOptionalOnly offers with a published salary
Skip offers that do not show a salary.
superOffersOnlybooleanOptionalOnly promoted offers (SuperOferta)
Keep only SuperOffer listings.
oneClickApplyOnlybooleanOptionalOnly one-click apply offers
Keep only offers you can apply to with one click on pracuj.pl.
ukrainianFriendlybooleanOptionalOnly offers open to Ukrainian candidates
Keep only offers marked as welcoming candidates from Ukraine.
includeDetailsbooleanOptionaldefault trueInclude full offer details
Open each offer page for the full description: responsibilities, requirements, nice-to-haves, benefits, technologies, categories, salary per contract type, apply links and contact phone. Turn off for faster listing-only results (same price).
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies work for most runs; the scraper moves to Polish residential proxies by itself if the site starts blocking them.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| id | string | null | Offer id (partition id of the first location) |
| groupId | string | null | pracuj.pl offer group id (one group = one job, several locations) |
| title | string | null | Job title |
| company | string | null | Employer name |
| companyId | string | null | Employer id |
| companyUrl | string | null | Employer profile on pracodawcy.pracuj.pl |
| companyLogo | string | null | Employer logo URL |
| location | string | null | Primary workplace |
| allLocations | array | Every workplace of the offer |
| locations | array | Workplaces with their own offer id, URL, coordinates, isWholePoland and isWholePolandRemote (published for all of Poland on a job that allows remote work) |
| isWholePoland | boolean | null | Offer is published for the whole of Poland |
| country | string | null | Country (PL for Poland) |
| region | string | null | Voivodeship of the first workplace (with details) |
| workplaceType | string | null | remote, hybrid, onsite or mobile |
| isRemote | boolean | null | Remote work is possible |
| workModes | array | Work modes as shown on pracuj.pl |
| level | string | null | First position level |
| positionLevels | array | Position levels |
| commitment | string | null | First work schedule |
| workSchedules | array | Work schedules (full-time, part-time ...) |
| contractTypes | array | Contract types |
| salaryText | string | null | Salary as displayed |
| salaryMin | number | null | Lowest published salary |
| salaryMax | number | null | Highest published salary |
| salaryCurrency | string | null | ISO currency code |
| salaryPeriod | string | null | month or hour |
| salaryType | string | null | gross, net, net + VAT or depends on contract |
| salaries | array | Salary per contract type (with details) |
| postedAt | string | null | Last published (ISO 8601) |
| firstPublishedAt | string | null | First published (ISO 8601) |
| expiresAt | string | null | Expiry date (ISO 8601) |
| jobUrl | string | null | Offer page |
| applyUrl | string | null | Apply page on pracuj.pl (with details) |
| externalApplyUrl | string | null | Employer's own application form (with details) |
| isSuperOffer | boolean | null | Promoted SuperOffer |
| isOneClickApply | boolean | null | One-click apply |
| isOptionalCv | boolean | null | CV is optional |
| isFranchise | boolean | null | Franchise offer |
| isDirectlyFromEmployer | boolean | null | Posted by the employer itself, not an agency (with details) |
| highlights | array | Badges such as Praca od zaraz |
| vacancies | number | null | Number of open positions when given |
| teaser | string | null | Short description from the listing |
| aiSummary | string | null | pracuj.pl AI summary of the offer |
| detailFetched | boolean | null | The full offer page was read |
| descriptionText | string | null | Full offer text (with details) |
| responsibilities | array | Responsibilities |
| requirements | array | Requirements |
| niceToHave | array | Nice-to-have requirements |
| offered | array | What the employer offers |
| benefits | array | Benefits |
| technologies | array | Required / highlighted technologies |
| technologiesNiceToHave | array | Optional technologies |
| aboutProject | string | null | About the project |
| aboutCompany | string | null | About the company |
| recruitmentStages | array | Recruitment stages |
| lists | array | Every offer section as title + items |
| categories | array | Categories (parent > subcategory) |
| leadingCategory | string | null | Main category |
| specializations | array | IT / engineering specializations |
| requiredLanguages | array | Required languages |
| jobDetails | array | Other offer attributes (work hours, shifts, pay period ...) |
| contactPhone | string | null | Recruiter contact phone when published |
| searchQuery | string | null | Keyword that found the offer |
| source | string | null | pracuj.pl |
| scrapedAt | string | null | Scrape time (ISO 8601) |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Job | One saved pracuj.pl job offer, including the full offer details when enabled. | $0.0005 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('openrole/pracuj-scraper').call({
"searchQueries": [
"python developer"
],
"startUrls": [],
"maxResults": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run openrole/pracuj-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=openrole/pracuj-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Employment contracts within 30 km of Krakow.
Remote contract jobs that list a salary, with full details.
Jobs from a pasted Pracuj.pl search URL.
Recent jobs filtered by region.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.