# Pracuj.pl Jobs Scraper (`parsebird/pracuj-jobs-scraper`) Actor

Scrape Pracuj.pl job offers in Poland: titles, companies, salaries, B2B and other contract types, remote and hybrid work, seniority, requirements, technologies, benefits and apply links. Filter by keyword, city, category and date. Export JSON, CSV, Excel or use the API.

- **URL**: https://apify.com/parsebird/pracuj-jobs-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.79 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### Pracuj.pl Jobs Scraper

**Pracuj.pl Jobs Scraper** extracts job offers from [Pracuj.pl](https://www.pracuj.pl/praca), the Polish job board, and gives you titles, companies, salaries, contract types, work modes, seniority, locations, requirements, technologies, benefits, and apply links as clean JSON, CSV, or Excel.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search Pracuj.pl by keyword, city and radius, category, contract type (including B2B), work mode, seniority, region, and posting date, or paste any pracuj.pl search URL, and get 40 fields per job, or 80+ with full details, with structured salaries and a NEW / UPDATED mode for monitoring.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Apify Actor: parsebird/pracuj-jobs-scraper. Scrapes job offers from Pracuj.pl (www.pracuj.pl), the Polish job board, including it.pracuj.pl and the other sub-portals. Call via ApifyClient: client.actor("parsebird/pracuj-jobs-scraper").call(run_input={"query": "python", "location": "Warszawa", "maxResults": 50, "includeDetails": true}). Inputs: query (string, keyword like the pracuj.pl search box; empty = all offers), location (string, city such as Warszawa, Kraków, Wrocław, Gdańsk, Poznań; Polish letters optional; comma-separate several), radius (integer km around the location), startUrls (array of pracuj.pl search URLs; when set, the other search fields are ignored), categories (array of category ids, e.g. "5016" IT - Software development, "5015" IT - Administration, "5028" Sales, "5022" Manual work), contractTypes (array: "0" employment contract, "3" B2B, "2" mandate contract, "1" contract for specific work, "4" substitution, "5" agency, "6" temporary work, "7" internship), workModes (array: full-office, hybrid, home-office, mobile), positionLevels (array: "1" intern, "3" assistant, "17" junior, "4" mid/regular, "18" senior, "19" expert, "5" team leader, "20" manager, "6" director, "21" CEO, "2" manual worker), workSchedules (array: "0" full-time, "1" part-time, "2" temporary), regions (array of voivodeship ids "1"-"16", "17" abroad), period (string: any, 1, 3, 7, 14, 30 days), postedBy (string: anyone, employer, agency), companyName (string), withSalary, oneClickApply, ukrainianFriendly, noPolishRequired, seniorFriendly, disabilityFriendly (booleans), sortBy (default, relevance, date, salary), maxResults (integer, default 50, 0 = no limit), includeDetails (boolean, default false, adds requirements, responsibilities, technologies, benefits, categories, address, salaries per contract, apply links), compact (boolean), incrementalMode (boolean), stateKey (string), emitUnchanged (boolean), latitude/longitude (map search), excludeLocations (string). Output fields per job: jobId, offerId, title, company, companyId, companyProfileUrl, location, locations, salaryText, salaryMin, salaryMax, salaryCurrency, salaryPeriod, salaryType, contractTypes, workModes, workSchedules, positionLevels, isRemote, isOneClickApply, highlights, description, aiSummary, url, allOfferUrls, offers, postedDate, firstPostedDate, expirationDate; with details also region, country, city, address, categories, leadingCategory, specializations, technologies, responsibilities, requirements, requirementsOptional, offered, benefits, aboutCompany, recruitmentStages, salaries, fullDescription, applyUrl, externalApplyUrl, isDirectEmployer; in incremental mode changeType (NEW, UPDATED, UNCHANGED). Pricing: pay per job saved, plus a details event per job when includeDetails is on. Full API spec: https://apify.com/parsebird/pracuj-jobs-scraper/api. Get your token: https://console.apify.com/settings/integrations.
```

### What is Pracuj.pl Jobs Scraper?

[Pracuj.pl](https://www.pracuj.pl) is a Polish job board run by Grupa Pracuj. When we checked on October 15, 2026, it listed **65,666 job offers** grouped into **50,621 jobs** (an employer hiring in several cities publishes one offer per city). That included **12,182 jobs in Warszawa**, **4,439 in Kraków**, **4,379 in Wrocław**, **4,983 IT jobs**, **10,497 B2B jobs**, and **2,649 fully remote jobs**.

**Pracuj.pl Jobs Scraper** turns those offers into a structured dataset. Type a keyword and a city, click Start, and download the jobs. It works as a **Pracuj.pl API alternative**: you don't need a Pracuj.pl account, an API key, or any code.

### What can Pracuj.pl Jobs Scraper do?

- 🔎 **Keyword, city, and radius search.** Search the way you do on pracuj.pl, with a search radius in kilometres or a map point (latitude and longitude). Big cities also include offers advertised to the whole of Poland, the same as on the website.
- 🔗 **Paste pracuj.pl search URLs.** Set up a search on pracuj.pl, it.pracuj.pl, sprzedaz.pracuj.pl, pracafizyczna.pracuj.pl, or inzynieria.pracuj.pl, and paste the URL. The Actor keeps every filter in it.
- 🗂️ **All of Pracuj.pl's filters.** Category, contract type (umowa o pracę, B2B, umowa zlecenie, and more), work mode (on-site, hybrid, remote), seniority, working time, region, posting date, company name, salary shown, one-click apply, and offers for Ukrainian speakers, candidates 50+, or candidates with disabilities.
- 🏢 **Employer or agency.** Keep only offers posted by the hiring company, or only offers posted by recruitment agencies, using Pracuj.pl's own classification.
- 💰 **Parsed salaries.** The salary label becomes min, max, currency, period (month or hour), and type (gross, net, net + VAT). With details on, you also get the salary for each contract type.
- 📄 **Full job details.** Requirements, responsibilities, technologies, benefits, what the employer offers, recruitment stages, company description, categories, street address, and the employer's own apply link.
- 🔁 **Track new and changed jobs.** Incremental mode remembers jobs between runs and saves only the new or changed ones, each tagged `NEW` or `UPDATED`.
- 🤖 **Compact output for AI agents.** One switch keeps only 15 core fields, which keeps LLM prompts and spreadsheets small.
- 📅 **Scheduling and monitoring.** Run daily or hourly with [Apify Schedules](https://docs.apify.com/platform/schedules).
- 🔌 **API and integrations.** Use the [Apify API](https://docs.apify.com/api/v2), or send jobs to Google Sheets, Zapier, Make, Slack, or webhooks with [Apify integrations](https://docs.apify.com/platform/integrations). Export as JSON, CSV, Excel, XML, or HTML.

### What data can you extract from Pracuj.pl?

| Field | Description |
|-------|-------------|
| `jobId` / `offerId` | Pracuj.pl job group ID and the offer ID of the first city |
| `title` / `company` / `companyId` | Job title, employer name, and employer ID |
| `companyProfileUrl` / `companyLogoUrl` | Employer profile on pracodawcy.pracuj.pl and logo |
| `location` / `locations` / `offers` | First city, every city the job is posted in, and one link per city |
| `salaryText` | Salary as shown on Pracuj.pl, for example `20 000–23 500 zł netto (+ VAT) / mies.` |
| `salaryMin` / `salaryMax` / `salaryCurrency` / `salaryPeriod` / `salaryType` | Parsed salary range, currency, `month` or `hour`, and `gross`, `net` or `net + VAT` |
| `contractTypes` / `workModes` / `workSchedules` / `positionLevels` | Contract types, work modes, working time, and seniority |
| `isRemote` / `isOneClickApply` / `highlights` | Remote flag, one-click apply, and badges such as "Praca od zaraz" |
| `description` / `aiSummary` | Short description and Pracuj.pl's own AI summary of the job |
| `postedDate` / `firstPostedDate` / `expirationDate` | Last publication, first publication, and expiry date (ISO 8601) |
| `url` / `allOfferUrls` | Offer page and every city's offer page |
| `categories` / `leadingCategory` / `specializations` | Pracuj.pl categories (`Parent > Child`), main category, and specializations *(details)* |
| `technologies` / `technologiesOptional` | Required and nice-to-have technologies *(details)* |
| `responsibilities` / `requirements` / `requirementsOptional` | Bullet lists from the offer *(details)* |
| `offered` / `benefits` / `recruitmentStages` / `aboutCompany` | What the employer offers, benefits, hiring steps, and company description *(details)* |
| `region` / `city` / `address` / `street` / `zipCode` | Voivodeship, city, and street address when listed *(details)* |
| `salaries` | Salary per contract type: min, max, currency, period, type *(details)* |
| `applyUrl` / `externalApplyUrl` / `isDirectEmployer` | Pracuj.pl apply link, the employer's own application form, and employer-or-agency flag *(details)* |
| `fullDescription` / `language` | Every section of the offer as text, and the offer's language (`pl` or `en`) *(details)* |

Fields marked *(details)* need **Include full details**. Fields are empty when an offer doesn't have them. In a sample of 3,000 jobs on October 15, 2026, 37% showed a salary, 6% were posted in more than one city, and 6% were remote. In 600 IT job details, 100% had requirements and responsibilities, 78% listed technologies, 71% listed benefits, 65% linked to the employer's own application form, and 54% had a structured salary. About half of the IT offers were written in English.

### How to scrape Pracuj.pl jobs

1. Open [Pracuj.pl Jobs Scraper](https://apify.com/parsebird/pracuj-jobs-scraper) in Apify Console.
2. Type a **Keyword** like `python` or `księgowa`, and a **Location** like `Warszawa`. Or paste a pracuj.pl search URL into **Pracuj.pl search URLs**.
3. Add filters if you need them: category, contract type, work mode, seniority, region, or posting date.
4. Set **Max results** to the number of jobs you want.
5. Turn on **Include full details** if you need requirements, technologies, benefits, and apply links.
6. Click **Start** and wait for the run to finish. A few hundred jobs usually take under a minute.
7. Download the jobs as JSON, CSV, Excel, XML, or HTML from the **Output** tab, or read them through the API.

### How much does it cost to scrape Pracuj.pl?

Pracuj.pl Jobs Scraper uses **pay-per-event** pricing. You pay for each job saved to the dataset, plus a details event for each job when **Include full details** is on. Compute and proxy costs are included in the event price.

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| `job-scraped` (per job) | $0.00099 | $0.00089 | $0.00079 | $0.00079 |
| `job-details-scraped` (per job, details on) | $0.00089 | $0.00079 | $0.00069 | $0.00069 |
| Per 1,000 jobs, listing fields | **$0.99** | **$0.89** | **$0.79** | **$0.79** |
| Per 1,000 jobs, with full details | **$1.88** | **$1.68** | **$1.48** | **$1.48** |

For example, 100 jobs cost about $0.10 on the Free plan, and 1,000 jobs with full details cost $1.88. A job is charged once even when it's posted in several cities. If an offer's details can't be loaded, you're not charged the details event for it. In incremental mode, you pay only for the new or changed jobs that are saved. You can set a maximum cost per run in Apify Console, and the Actor stops when it reaches it.

### Input parameters

See the [Input tab](https://apify.com/parsebird/pracuj-jobs-scraper/input-schema) for the full form.

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `query` | string | No | — | Keyword, like the pracuj.pl search box. Empty = all offers |
| `location` | string | No | — | City, like `Warszawa`, `Kraków`, `Wrocław`. Comma-separate several |
| `radius` | integer | No | — | Kilometres around the location or the map point |
| `startUrls` | array | No | — | pracuj.pl search URLs. When set, the search fields below are ignored |
| `categories` | array | No | — | Pracuj.pl job categories (pick in the form) |
| `contractTypes` | array | No | — | Employment contract, B2B, mandate contract, and more |
| `workModes` | array | No | — | `full-office`, `hybrid`, `home-office`, `mobile` |
| `positionLevels` | array | No | — | Intern to CEO, plus manual worker |
| `workSchedules` | array | No | — | Full-time, part-time, temporary |
| `regions` | array | No | — | Voivodeships, or abroad |
| `period` | string | No | `any` | Posted within `1`, `3`, `7`, `14`, or `30` days |
| `postedBy` | string | No | `anyone` | `employer` or `agency` |
| `companyName` | string | No | — | Only offers from this employer |
| `withSalary` | boolean | No | `false` | Only offers that show a salary |
| `oneClickApply` | boolean | No | `false` | Only one-click apply offers |
| `ukrainianFriendly` / `noPolishRequired` / `seniorFriendly` / `disabilityFriendly` | boolean | No | `false` | Pracuj.pl's inclusion filters |
| `sortBy` | string | No | `default` | `default`, `relevance`, `date` (newest first), `salary` (highest first) |
| `maxResults` | integer | No | `50` | Jobs to save. `0` = no limit |
| `includeDetails` | boolean | No | `false` | Add the full offer details |
| `compact` | boolean | No | `false` | Save only 15 core fields |
| `incrementalMode` / `stateKey` / `emitUnchanged` | boolean / string / boolean | No | `false` / `default` / `false` | Save only jobs that are new or changed since the last run with the same state key |
| `latitude` / `longitude` | string | No | — | Map search centre; replaces the location |
| `excludeLocations` | string | No | — | Cities to leave out |
| `proxyConfiguration` | object | No | Apify Proxy (datacenter) | Keep the default; see the FAQ |

**Python jobs in Warszawa**

```json
{
    "query": "python",
    "location": "Warszawa",
    "maxResults": 50
}
```

**Senior B2B IT jobs with a salary, posted in the last 7 days, with full details**

```json
{
    "categories": ["5016", "5015"],
    "contractTypes": ["3"],
    "positionLevels": ["18"],
    "withSalary": true,
    "period": "7",
    "maxResults": 200,
    "includeDetails": true
}
```

**Warehouse jobs within 30 km of Kraków from employers, not agencies**

```json
{
    "query": "magazynier",
    "location": "Kraków",
    "radius": 30,
    "postedBy": "employer",
    "maxResults": 100
}
```

**Daily feed of new remote jobs (schedule this run)**

```json
{
    "workModes": ["home-office"],
    "sortBy": "date",
    "maxResults": 500,
    "incrementalMode": true,
    "stateKey": "remote-jobs"
}
```

**Scrape a pracuj.pl search URL**

```json
{
    "startUrls": [{ "url": "https://www.pracuj.pl/praca/java;kw/wroclaw;wp?rd=30" }],
    "maxResults": 100
}
```

### Output example

Each job is one item in the dataset. This is a real job from October 15, 2026, with **Include full details** on (long lists shortened):

```json
{
    "jobId": "fc0b0000-56be-0050-37bc-08df2aaa282c",
    "offerId": 1005160537,
    "title": "C/C++ Engineer",
    "company": "Connectis_",
    "companyId": 20007649,
    "companyProfileUrl": "https://pracodawcy.pracuj.pl/company/20007649",
    "location": "Łódź",
    "locations": ["Łódź", "Warszawa"],
    "salaryText": "20 000–23 500 zł netto (+ VAT) / mies.",
    "salaryMin": 20000,
    "salaryMax": 23500,
    "salaryCurrency": "PLN",
    "salaryPeriod": "month",
    "salaryType": "net + VAT",
    "contractTypes": ["Kontrakt B2B"],
    "workModes": ["Praca hybrydowa"],
    "workSchedules": ["Pełny etat"],
    "positionLevels": ["Starszy specjalista / Starsza specjalistka (senior)"],
    "isRemote": false,
    "isOneClickApply": false,
    "url": "https://www.pracuj.pl/praca/c-c%2b%2b-engineer-lodz,oferta,1005160537",
    "allOfferUrls": [
        "https://www.pracuj.pl/praca/c-c%2b%2b-engineer-lodz,oferta,1005160537",
        "https://www.pracuj.pl/praca/c-c%2b%2b-engineer-warszawa,oferta,1005160536"
    ],
    "postedDate": "2026-10-15T11:08:18.093Z",
    "firstPostedDate": "2026-10-15T11:08:18.093Z",
    "expirationDate": "2026-11-14T22:59:59Z",
    "language": "pl",
    "region": "łódzkie",
    "country": "Polska",
    "city": "Łódź",
    "categories": [
        "IT - Rozwój oprogramowania > Analiza biznesowa i systemowa",
        "IT - Rozwój oprogramowania > Programowanie"
    ],
    "leadingCategory": "IT - Rozwój oprogramowania > Programowanie",
    "specializations": ["Backend", "C++", "C", "Visual Studio", "GitHub Copilot", "angielski", "polski"],
    "technologies": ["C", "C++", "Visual Studio", "XML", "GitHub Copilot", "REST API", "SOLID"],
    "requirements": [
        "Ok. 5 letnie doświadczenie komercyjne w roli C/C++ Engineera.",
        "Biegła znajomość języka polskiego i angielskiego."
    ],
    "benefits": ["dofinansowanie zajęć sportowych", "prywatna opieka medyczna", "elastyczny czas pracy"],
    "salaries": [
        { "contractType": "kontrakt B2B", "min": 20000, "max": 23500, "currency": "PLN", "period": "month", "type": "net + VAT" }
    ],
    "applyUrl": "https://www.pracuj.pl/aplikuj/c-c%2b%2b-engineer-lodz,oferta,1005160537",
    "externalApplyUrl": "https://hub.connectis.pl/offer/bccde0c3-2c76-49fb-99e6-f203c9f3bacb",
    "isDirectEmployer": true,
    "scrapedAt": "2026-10-15T11:37:36.479Z",
    "source": "pracuj.pl"
}
```

In incremental mode, each job also has `changeType` (`NEW`, `UPDATED`, or `UNCHANGED`), `firstSeenAt`, and, for jobs seen before, `previousSeenAt`.

### Use cases

- **Job market research.** Count offers by category, city, seniority, or contract type, and follow how demand changes over time.
- **Salary benchmarking.** Compare salary ranges for a role across cities and contract types (umowa o pracę vs B2B, gross vs net).
- **Tech skills tracking.** See which technologies Polish employers ask for in IT offers.
- **Job alerts and aggregators.** Feed new offers into your own job site, Slack channel, or newsletter with incremental mode and a schedule.
- **Recruitment and sales leads.** Find companies that are hiring, and see whether they recruit directly or through agencies.
- **AI agents and LLM apps.** Give an assistant fresh Polish job data through the API or the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp), using compact output.

### How it works

1. The Actor turns your keyword, location, and filters (or each search URL) into a Pracuj.pl search.
2. It reads the search result pages, 100 jobs at a time, in the order you chose.
3. Offers of the same job in several cities are merged into one item, with every city's link kept.
4. With **Include full details**, it opens each job's offer and adds the full sections, address, categories, and salaries.
5. Jobs are saved to the dataset as they're found. The Actor stops at **Max results**, at the end of the results, or at your spending limit.

### Use the Pracuj.pl Scraper API from Python or JavaScript

Get your API token in [Apify Console](https://console.apify.com/settings/integrations), then call the Actor with the [Apify API client](https://docs.apify.com/api/client/python).

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("parsebird/pracuj-jobs-scraper").call(run_input={
    "query": "python",
    "location": "Warszawa",
    "maxResults": 100,
    "includeDetails": True,
})
for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(job["title"], "|", job["company"], "|", job.get("salaryText"))
```

**JavaScript**

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('parsebird/pracuj-jobs-scraper').call({
    query: 'python',
    location: 'Warszawa',
    maxResults: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((job) => console.log(job.title, '|', job.company, '|', job.salaryText));
```

See the [API tab](https://apify.com/parsebird/pracuj-jobs-scraper/api) for the HTTP endpoints and the OpenAPI spec.

### Is it legal to scrape Pracuj.pl?

Pracuj.pl Jobs Scraper collects only job offers that Pracuj.pl shows publicly to every visitor, without logging in. It doesn't access candidate profiles, CVs, or any account data. Job offers can still include personal data, such as a recruiter's name or phone number, which is protected by the GDPR in Poland and the EU. Only collect the data you need, have a legitimate reason to process it, and check Pracuj.pl's terms before you reuse the content. If you're unsure, ask a lawyer. Read more in Apify's blog post on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/).

### Other job scrapers

| Actor | What it scrapes |
|-------|-----------------|
| [JustJoin.it Jobs Scraper](https://apify.com/parsebird/justjoin-jobs-scraper) | IT jobs in Poland from JustJoin.it |
| [EURES Jobs Scraper](https://apify.com/parsebird/eures-jobs-scraper) | Jobs across the EU from the European job mobility portal |
| [LinkedIn Jobs Scraper](https://apify.com/parsebird/linkedin-jobs-scraper) | Job postings from LinkedIn |
| [Indeed Jobs Scraper](https://apify.com/parsebird/indeed-jobs-scraper) | Job postings from Indeed |
| [Xing Jobs Scraper](https://apify.com/parsebird/xing-jobs-scraper) | Jobs in Germany, Austria, and Switzerland from Xing |
| [Djinni Jobs Scraper](https://apify.com/parsebird/djinni-jobs-scraper) | Tech jobs from Djinni |

### FAQ

**Do I need a Pracuj.pl account or API key?**
No. The Actor reads public job offers, the same ones you see on pracuj.pl without logging in.

**Why does a job have several URLs?**
Employers often publish the same job in several cities, and Pracuj.pl creates one offer per city. The Actor saves the job once and lists every city in `locations`, `offers`, and `allOfferUrls`. You're charged once.

**Why do I get more results for Warszawa than "Warszawa" shows on the map?**
For big cities such as Warszawa, Kraków, Wrocław, Gdańsk, or Poznań, Pracuj.pl also shows offers that the employer advertises to the whole of Poland. The Actor does the same, so your results match the website.

**How do I get only new jobs every day?**
Turn on **Only new or changed jobs**, give the search a **State key**, and [schedule](https://docs.apify.com/platform/schedules) the run. The first run saves everything it checks as `NEW`. Later runs save only jobs that are new or whose title, salary, contract, work mode, seniority, cities, or description changed. Use a different state key for each search. Jobs not seen for 90 days are forgotten.

**What does "Newest first" sort by?**
By publication day, the same as on pracuj.pl. Within one day, promoted offers come first, so the times inside a day aren't strictly in order.

**Are salaries gross or net?**
Both appear on Pracuj.pl. `salaryType` tells you which: `gross` (brutto), `net` (netto), `net + VAT` (B2B rates), or `depends on contract` when the employer gives one range for several contract types. With details on, `salaries` lists the range for each contract type.

**Can I scrape it.pracuj.pl or other Pracuj.pl sub-portals?**
Yes. Paste the URL into **Pracuj.pl search URLs**. You can also pick the matching categories: "IT - Software development" plus "IT - Administration" match it.pracuj.pl.

**Are the offers in Polish or English?**
In the language the employer wrote them in. The `language` field (details on) tells you which. Labels such as contract types and work modes are in Polish, as on pracuj.pl.

**Do I need to set up a proxy?**
No. The Actor uses Apify Proxy (datacenter) by default, and if Pracuj.pl refuses those requests, it moves to residential proxies in Poland by itself. Proxy costs are included in the event price.

**Something doesn't work or a field is missing?**
Open an issue on the [Issues tab](https://apify.com/parsebird/pracuj-jobs-scraper/issues).

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/pracuj-jobs-scraper/changelog.md

# Actor input Schema

## `query` (type: `string`):

Job title, skill or company, like "python", "księgowa" or "magazynier". Works like the search box on pracuj.pl. Leave empty to search all offers.

## `location` (type: `string`):

City or town, like "Warszawa", "Kraków" or "Wrocław" (Polish letters optional). Separate several cities with commas. Countries such as "Niemcy" work too. Leave empty for all of Poland.

## `radius` (type: `integer`):

Also include offers within this many kilometres of the Location (or of the latitude/longitude point). Leave empty to match the city only.

## `startUrls` (type: `array`):

Paste search result URLs copied from pracuj.pl (including it.pracuj.pl and the other sub-portals), like https://www.pracuj.pl/praca/python;kw/warszawa;wp?rd=30. Each URL is scraped with all its filters. When you add URLs, the keyword, location and filter fields are ignored.

## `categories` (type: `array`):

Only offers in these Pracuj.pl job categories. "IT - Software development" plus "IT - Administration" match it.pracuj.pl.

## `contractTypes` (type: `array`):

Only offers with one of these contract types.

## `workModes` (type: `array`):

Only offers with one of these work modes.

## `positionLevels` (type: `array`):

Only offers for these position levels.

## `workSchedules` (type: `array`):

Only offers with one of these working-time options.

## `regions` (type: `array`):

Only offers in these Polish regions. "Abroad" is offers outside Poland.

## `period` (type: `string`):

Only offers published (or refreshed) within this period.

## `postedBy` (type: `string`):

Use Pracuj.pl's own classification to keep only offers posted by the hiring company, or only offers posted by registered recruitment agencies for their clients.

## `companyName` (type: `string`):

Only offers from employers whose name matches, like "Allegro" or "PKO".

## `withSalary` (type: `boolean`):

Keep only offers that show a salary range.

## `oneClickApply` (type: `boolean`):

Keep only offers you can apply to with one click on Pracuj.pl.

## `ukrainianFriendly` (type: `boolean`):

Keep only offers the employer marks as open to candidates from Ukraine.

## `noPolishRequired` (type: `boolean`):

Keep only offers that don't require Polish.

## `seniorFriendly` (type: `boolean`):

Keep only offers the employer marks as open to candidates 50+.

## `disabilityFriendly` (type: `boolean`):

Keep only offers the employer marks as open to candidates with disabilities.

## `sortBy` (type: `string`):

Order of results. With a result limit, this decides which jobs you get. Newest first sorts by publication day (within a day, promoted offers come first), the same as on pracuj.pl.

## `maxResults` (type: `integer`):

Maximum number of jobs to save. A job posted in several cities counts once (all its city links are in allOfferUrls). Set 0 for no limit. In incremental mode, this is the number of jobs checked.

## `includeDetails` (type: `boolean`):

Open each offer and add requirements, responsibilities, technologies, benefits, categories, full address, structured salaries per contract type, apply links and the full description. Charged as an extra event per job.

## `compact` (type: `boolean`):

Save only the core fields (title, company, location, salary, contract, work mode, seniority, date, URL). Handy for AI agents and spreadsheets.

## `incrementalMode` (type: `boolean`):

Remember jobs between runs and save only jobs that are new or changed since the last run with the same state key. Each record gets a changeType of NEW, UPDATED or UNCHANGED.

## `stateKey` (type: `string`):

Name for the remembered job list. Use a different key for each search you monitor, like "python-warszawa".

## `emitUnchanged` (type: `boolean`):

In incremental mode, also save jobs that haven't changed (tagged UNCHANGED).

## `latitude` (type: `string`):

Centre of a map search, like "52.2297". Use with Longitude and Search radius. Replaces the Location field.

## `longitude` (type: `string`):

Centre of a map search, like "21.0122". Use with Latitude.

## `excludeLocations` (type: `string`):

Leave out offers in these cities, separated by commas, like "Warszawa, Kraków".

## `proxyConfiguration` (type: `object`):

Apify Proxy (datacenter) by default. If Pracuj.pl refuses requests, the scraper moves to residential proxies on its own.

## Actor input object example

```json
{
  "query": "python",
  "location": "Warszawa",
  "period": "any",
  "postedBy": "anyone",
  "withSalary": false,
  "oneClickApply": false,
  "ukrainianFriendly": false,
  "noPolishRequired": false,
  "seniorFriendly": false,
  "disabilityFriendly": false,
  "sortBy": "default",
  "maxResults": 20,
  "includeDetails": false,
  "compact": false,
  "incrementalMode": false,
  "stateKey": "default",
  "emitUnchanged": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "query": "python",
    "location": "Warszawa",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/pracuj-jobs-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "query": "python",
    "location": "Warszawa",
    "maxResults": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/pracuj-jobs-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "query": "python",
  "location": "Warszawa",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/pracuj-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/pracuj-jobs-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/32TbzYKvLGbRg7DFH/builds/nUjHxqxChoax67BUx/openapi.json
