Pracuj.pl Jobs Scraper & Monitoring
Pricing
from $2.00 / 1,000 job offers
Pracuj.pl Jobs Scraper & Monitoring
Scrape and monitor Pracuj.pl job offers with salaries, company data, full descriptions, and incremental change tracking.
Pricing
from $2.00 / 1,000 job offers
Rating
0.0
(0)
Developer
MrArCode
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Extract structured job listings from Pracuj.pl with salary data, company information, locations, work modes, contract types, technologies, full job descriptions, and incremental change tracking.
This Actor is designed for recruiters, HR analytics teams, job market researchers, data teams, lead generation workflows, and AI agents that need clean job data from the Polish labor market.
What does it do?
This scraper collects job offers from Pracuj.pl search pages and returns structured records ready for analysis, automation, monitoring, or AI workflows.
It can work in two modes:
- Fast listing mode — collects core data directly from search results.
- Full details mode — visits each job offer page and enriches the output with description, requirements, responsibilities, apply URL, ATS URL, employer metadata, technologies, categories, workplaces, and more.
It also supports incremental monitoring, so repeated runs can return only new, updated, reappeared, or expired job offers.
Key features
- Search Pracuj.pl by keyword and location
- Filter by contract type, work mode, position level, region, publication period, and salary availability
- Use a custom
startUrlfrom Pracuj.pl or it.pracuj.pl - Extract salary ranges into structured fields:
salaryMin,salaryMax,salaryCurrency,salaryPeriod - Extract contract types, work modes, work schedules, seniority levels, and remote-work flags
- Group multi-location offers into one structured record
- Optional full detail enrichment
- Extract full description, requirements, responsibilities, apply URL, ATS URL, employer ID, company logo, brand color, categories, workplaces, technologies, and IT specializations
- Incremental mode with
NEW,UPDATED,UNCHANGED,REAPPEARED, andEXPIRED - Repost-aware monitoring with optional repost skipping
- Compact output mode for AI agents, MCP workflows, and lightweight automations
- Optional description truncation to reduce payload size
- Data quality fields such as
detailFetchStatusanddataQualityWarnings - Uses Apify residential proxy for Poland when running on the Apify platform
Use cases
- Monitor new job postings for a specific role
- Track salary ranges for Python, Java, DevOps, Data, AI, or other job categories
- Build HR analytics dashboards
- Analyze demand for skills and technologies
- Track competitor hiring activity
- Feed job data into AI agents or MCP workflows
- Export structured job data to spreadsheets, databases, CRMs, ATS systems, or BI tools
- Detect new, changed, reappeared, and expired offers over time
Input
You can use regular search parameters or provide a direct Pracuj.pl search URL.
Basic search example
{"query": "python developer","location": "Warszawa","maxResults": 25,"includeDetails": false}
Full detail enrichment example
{"query": "python","location": "Warszawa","maxResults": 10,"includeDetails": true}
Start URL example
{"startUrl": "https://it.pracuj.pl/praca?its=devops&itth=33","maxResults": 10,"includeDetails": false}
Incremental monitoring example
{"query": "python","location": "Warszawa","maxResults": 50,"incremental": true,"includeUnchanged": false}
Track expired and reappeared offers
{"query": "python","location": "Warszawa","maxResults": 100,"incremental": true,"trackExpiration": true,"includeUnchanged": false}
Compact AI/MCP output
{"query": "python","location": "Warszawa","maxResults": 25,"compact": true}
Limit long descriptions
{"query": "python","location": "Warszawa","maxResults": 10,"includeDetails": true,"descriptionMaxLength": 1000}
Input fields
| Field | Type | Description |
|---|---|---|
query | string | Search keywords, for example python developer, driver, data analyst. |
location | string | City or area, for example Warszawa, Kraków, Wrocław. |
contractType | string | Contract type filter. Supports Pracuj.pl contract IDs from the input selector. |
workMode | string | Work mode filter. Exact accepted values: full-office, hybrid, home-office, mobile. |
positionLevel | string | Seniority / position level filter. |
region | string | Polish voivodeship / region filter. |
period | string | Publication period: last 24h, 3 days, 7 days, 14 days, or 30 days. |
withSalary | boolean | Return only listings with salary information. |
maxResults | integer | Maximum number of job records to return. Use 0 for unlimited. |
includeDetails | boolean | Visit each job page and enrich the listing with full details. Slower, but returns richer data. |
startUrl | string | Direct Pracuj.pl or it.pracuj.pl search URL. Overrides other search filters. |
incremental | boolean | Enables change tracking between runs. |
stateKey | string | Optional custom state key for separating monitoring contexts. |
includeUnchanged | boolean | Include unchanged offers in incremental output. Unchanged records are useful for snapshots. |
trackExpiration | boolean | Detect expired and reappeared offers. Requires incremental=true. |
skipReposts | boolean | Skip detected reposts. Requires trackExpiration=true. |
compact | boolean | Return only core fields for AI agents and lightweight workflows. |
descriptionMaxLength | integer | Truncate job descriptions to a maximum number of characters. Use 0 for no limit. |
Output example
{"jobId": "51f58cfec0b1c725b757937a4a3a3646f037fa797dc3b70ae377cd0226ecdc8f","offerId": 1004866923,"title": "Python AI Developer","company": "IN4GE sp. z o.o.","companyId": 1074095560,"companyProfileUrl": "https://pracodawcy.pracuj.pl/company/1074095560","location": "Warszawa","locations": [{"city": "Warszawa","url": "https://www.pracuj.pl/praca/python-ai-developer-warszawa,oferta,1004866923","offerId": 1004866923,"coordinates": null}],"salaryText": "130–160 zł netto (+ VAT) / godz.","salaryMin": 130.0,"salaryMax": 160.0,"salaryCurrency": "PLN","salaryPeriod": "hour","salaryRanges": [{"min": 130.0,"max": 160.0,"currency": "PLN","period": "hour","taxMode": "net","contractType": "B2B","rawText": "130–160 zł netto (+ VAT) / godz."}],"contractTypes": ["Kontrakt B2B"],"workModes": ["Praca stacjonarna", "Praca hybrydowa"],"workSchedules": ["Pełny etat"],"positionLevels": ["Specjalista / Specjalistka (mid / Regular)"],"isRemote": false,"technologies": [],"aiSummary": "Short AI-generated summary from Pracuj.pl, when available.","postedDate": "2026-05-31T08:24:25.523000Z","expirationDate": "2026-06-27T21:59:59Z","url": "https://www.pracuj.pl/praca/python-ai-developer-warszawa,oferta,1004866923","source": "pracuj.pl","changeType": "NEW","firstSeenAt": "2026-05-31T10:00:00Z","lastSeenAt": "2026-05-31T10:00:00Z","detailFetchStatus": "skipped","dataQualityWarnings": []}
Fields with default or empty values are omitted here for brevity; real records include all fields listed in 'Output fields overview'.
Full details output
When includeDetails=true, the Actor enriches each offer with additional fields such as:
descriptionrequirementsresponsibilitiesapplyUrlatsUrlemployerIdofferLanguagedateOfInitialPublicationdateOfLastPublicationcompanyLogoUrlbrandColorcategoriesisDirectlyFromEmployerisEntirelyRemoteisRemoteRecruitmentbenefitsitSpecializationsworkplaces
Example detail fields:
{"description": "Full job description...","requirements": "Required skills and experience...","responsibilities": "Daily responsibilities...","applyUrl": "https://www.pracuj.pl/aplikuj/...","atsUrl": "https://external-ats.example.com/apply","companyLogoUrl": "https://logos.gpcdn.pl/...","brandColor": "#0e6ee0","offerLanguage": "en","itSpecializations": ["Backend"],"detailFetchStatus": "success"}
Compact output
Compact mode is designed for AI agents, MCP workflows, automations, and low-payload integrations.
Enable it with:
{"compact": true}
Compact output includes only core fields:
{"jobId": "51f58cfec0b1c725b757937a4a3a3646f037fa797dc3b70ae377cd0226ecdc8f","title": "Python AI Developer","company": "IN4GE sp. z o.o.","location": "Warszawa","url": "https://www.pracuj.pl/praca/python-ai-developer-warszawa,oferta,1004866923","salaryMin": 130.0,"salaryMax": 160.0,"salaryCurrency": "PLN","salaryPeriod": "hour","contractTypes": ["Kontrakt B2B"],"workModes": ["Praca stacjonarna", "Praca hybrydowa"],"technologies": [],"changeType": "NEW"}
Incremental mode
Incremental mode lets you monitor a search over time.
When incremental=true, the Actor stores state between runs and classifies each job offer using changeType.
Supported change types:
| changeType | Meaning |
|---|---|
NEW | The offer was not seen in previous runs for this search context. |
UPDATED | The offer was seen before, but selected fields changed. |
UNCHANGED | The offer was already seen and did not change. |
REAPPEARED | The offer was previously marked as expired and appeared again. |
EXPIRED | The offer was previously active but is no longer present in a completed scan. |
Example: return only new or changed offers
{"query": "devops","location": "Warszawa","incremental": true,"includeUnchanged": false,"maxResults": 100}
Example: include unchanged offers too
{"query": "devops","location": "Warszawa","incremental": true,"includeUnchanged": true,"maxResults": 100}
State key
By default, the Actor automatically creates a state key from the search parameters.
You can also provide a custom stateKey:
{"query": "python","location": "Warszawa","incremental": true,"stateKey": "python-warsaw-monitor"}
Use stateKey when you want full control over separate monitoring contexts.
For example:
python-warsaw-monitordevops-remote-monitorjava-krakow-weeklycompetitor-hiring-watch
Expired and reappeared offers
To track expired and reappeared offers, enable:
{"incremental": true,"trackExpiration": true}
The Actor only detects expired offers after a completed scan. If a scan is interrupted, hits a request error, parser error, budget limit, maxResults, or page safety limit, expired detection is skipped to prevent false positives.
This protects users from fake expiration events.
Repost detection
When trackExpiration=true, the Actor can detect likely reposts using a content fingerprint based on role-identifying fields.
Enable repost skipping with:
{"incremental": true,"trackExpiration": true,"skipReposts": true}
This is useful when employers repost very similar jobs under new offer IDs.
Data quality fields
Each record includes fields that help you understand how complete the data is:
| Field | Meaning |
|---|---|
detailFetchStatus | skipped, success, or failed. |
dataQualityWarnings | List of warnings if enrichment failed or partial data was used. |
Example:
{"detailFetchStatus": "failed","dataQualityWarnings": ["detail page fetch failed after retries; using listing data only"]}
Performance notes
includeDetails=false is faster and uses fewer requests.
includeDetails=true performs one additional request per job offer and may take longer, especially for large result sets.
Recommended settings:
- Use
includeDetails=falsefor broad market monitoring. - Use
includeDetails=truewhen you need full descriptions, requirements, apply URLs, and employer metadata. - Use
compact=truefor AI workflows and lightweight automations. - Use
descriptionMaxLengthto reduce output size when using LLMs.
Limitations
- The Actor extracts publicly available job offer data from Pracuj.pl.
- Full detail enrichment depends on the availability and structure of the individual job offer page.
- Some offers may not include salary information.
- Some offers may not include technologies, benefits, ATS URLs, or company branding data.
EXPIREDdetection requires a completed incremental scan.- Repost detection is heuristic and based on content fingerprints.
includeDetails=trueis slower than listing-only mode.
Responsible usage
Use this Actor responsibly and in accordance with applicable laws, platform terms, and data protection rules.
The Actor is intended for collecting publicly available job listing data. You are responsible for how you use, store, process, and share the extracted data.
Pricing
This is a pay-per-event Actor. You only pay for the job offers successfully scraped, and the per-record price includes all residential proxy and platform usage costs (there is no separate, unexpected proxy bill).
FAQ
Does this Actor support direct Pracuj.pl search URLs?
Yes. Use the startUrl field. It supports Pracuj.pl URLs, including subdomains such as it.pracuj.pl.
Can I monitor only new jobs?
Yes. Use:
{"incremental": true,"includeUnchanged": false}
This returns only new, updated, reappeared, and expired records when applicable.
Can I get full job descriptions?
Yes. Set:
{"includeDetails": true}
Can I reduce output size for AI agents?
Yes. Use:
{"compact": true}
or use:
{"descriptionMaxLength": 1000}
Are unchanged records charged?
In incremental mode, unchanged records are intended for snapshot completeness and are not treated as chargeable change events.
Why did I get zero records in incremental mode?
If incremental=true and includeUnchanged=false, a zero-record run usually means there were no new or changed offers for that search context.
Example monitoring workflow
- Run the Actor once with
incremental=true. - The first run returns offers as
NEW. - Schedule the Actor daily or hourly.
- Later runs return only changes if
includeUnchanged=false. - Use
trackExpiration=trueto detect offers that disappeared from a completed scan. - Use
compact=trueif the output is consumed by an AI agent or automation.
Example input for daily monitoring
{"query": "python developer","location": "Warszawa","maxResults": 100,"incremental": true,"includeUnchanged": false,"trackExpiration": true,"includeDetails": false}
Example input for rich data extraction
{"query": "python developer","location": "Warszawa","maxResults": 25,"includeDetails": true,"descriptionMaxLength": 3000}
Output fields overview
Main fields include:
jobIdofferIdtitlecompanycompanyIdcompanyProfileUrllocationcoordinateslocationsallOfferUrlslocationCountsalaryTextsalaryMinsalaryMaxsalaryCurrencysalaryPeriodsalaryRangescontractTypesworkModesworkSchedulespositionLevelsisRemotetechnologiesisOneClickApplyaiSummarypostedDateexpirationDateurlportalUrlsourcedescriptionrequirementsresponsibilitiesapplyUrlatsUrlemployerIdofferLanguagedateOfInitialPublicationdateOfLastPublicationcompanyLogoUrlbrandColorcategoriesisDirectlyFromEmployerisEntirelyRemoteisRemoteRecruitmentbenefitsitSpecializationsworkplaceschangeTypefirstSeenAtlastSeenAtisRepostrepostOfIdrepostDetectedAtdetailFetchStatusdataQualityWarnings