# Pracuj.pl Scraper - Poland Jobs and Salaries (`benthepythondev/pracuj-scraper`) Actor

Scrape Pracuj.pl jobs with employers, locations, salaries, contracts, technologies, requirements, benefits and application URLs.

- **URL**: https://apify.com/benthepythondev/pracuj-scraper.md
- **Developed by:** [Ben](https://apify.com/benthepythondev) (community)
- **Categories:** Jobs, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## Pracuj.pl Scraper - Poland Jobs and Salaries

Collect structured job listings from **Pracuj.pl**, one of Poland's largest employment platforms. Search by keyword and location or paste complete Pracuj.pl result URLs with the filters you already use. The Actor returns hiring companies, locations, salaries, contracts, work modes, technologies, requirements, benefits, application links, and publication dates in a clean dataset.

This Actor is designed for recruiting research, job alerts, salary analysis, employer monitoring, and Polish labor-market intelligence. Detail enrichment is enabled by default, so a result can include much more than the short search card. Data is ready for JSON, CSV, Excel, API, webhook, Make, Zapier, and n8n workflows.

### What can you use it for?

- Monitor new vacancies for selected roles, technologies, or cities.
- Build daily job alerts without manually checking the same searches.
- Compare disclosed salary ranges across companies and locations.
- Track which employers are hiring for Python, Java, SAP, sales, finance, logistics, healthcare, or other skills.
- Research remote, hybrid, and on-site hiring patterns in Poland.
- Create employer prospect lists from public hiring activity.
- Analyze contract types, seniority levels, schedules, and job categories.
- Feed a recruiting dashboard, talent-intelligence database, CRM, spreadsheet, or internal search tool.
- Preserve requirements and benefits before a vacancy expires or changes.

Pracuj.pl often exposes several locations for one vacancy group. The Actor expands those offers into distinct listing records and deduplicates them by their stable offer identifier, so multi-location searches remain useful without billing duplicate rows.

### Input options

You can start with simple fields or complete search URLs.

#### Keyword and location

Set `keyword` to a title, role, skill, or employer-related phrase such as `python`, `data engineer`, `księgowy`, `sprzedaż`, or `project manager`. Add an optional Polish `location`, such as `Warszawa`, `Kraków`, `Wrocław`, `Gdańsk`, or `Poznań`.

Example:

```json
{
  "keyword": "python",
  "location": "Warszawa",
  "includeDetails": true,
  "maxResults": 25
}
````

#### Pracuj.pl search URLs

For complex filters, configure the search on Pracuj.pl and paste the resulting URL into `searchUrls`. This preserves filters such as salary, contract, work mode, experience level, category, and publication age. You can provide several URLs in one run; duplicate offers are saved only once.

```json
{
  "searchUrls": [
    "https://www.pracuj.pl/praca/python;kw/warszawa;wp"
  ],
  "includeDetails": true,
  "maxResults": 50
}
```

`maxResults` is a global cap across the run. The default is deliberately small so first runs and scheduled health checks finish quickly. Increase it when you need a larger export.

### Detail enrichment

Keep `includeDetails` enabled when you need recruiting, salary, or market-intelligence data. For each result, the Actor fetches the public detail payload and can add:

- responsibilities and expected requirements;
- optional requirements and technology stacks;
- benefits and employer-provided offering details;
- company description and AI-generated listing summary when present;
- structured employment types, schedules, levels, and work modes;
- direct application, one-click application, and external ATS form links;
- initial publication, latest publication, and expiration timestamps;
- normalized salary values where the listing discloses them.

Disable detail enrichment for the fastest possible search-card export. A failed individual detail request does not discard the job: the Actor logs the problem and returns the available search summary.

### Output fields

Each dataset row represents one unique Pracuj.pl offer location. Common fields include:

| Field | Description |
| --- | --- |
| `id`, `group_id` | Stable offer and grouped-vacancy identifiers |
| `title` | Job title |
| `company`, `company_id` | Hiring company name and public identifier |
| `company_profile_url`, `company_logo` | Public employer profile and logo |
| `location`, `region`, `country` | Display location and structured geography |
| `latitude`, `longitude` | Coordinates when supplied on the result |
| `summary`, `ai_summary` | Search description and optional generated summary |
| `responsibilities` | Employer-provided responsibilities |
| `requirements`, `optional_requirements` | Required and optional candidate criteria |
| `technologies` | Expected and optional technologies |
| `benefits`, `offered` | Benefits and employer offering details |
| `salary` | Original salary text shown by Pracuj.pl |
| `salary_min`, `salary_max` | Parsed numeric range when disclosed |
| `salary_currency`, `salary_period` | Currency and month, hour, or year period |
| `salary_details` | Contract-specific structured salary objects |
| `contract_types` | Employment contract types |
| `position_levels` | Seniority or position levels |
| `work_schedules`, `work_modes` | Schedule and remote/hybrid/on-site modes |
| `remote_work_allowed`, `entirely_remote` | Remote-work indicators |
| `categories`, `primary_category` | Job categories supplied by the source |
| `application_url`, `ats_form_url` | Direct application and external ATS links |
| `one_click_apply`, `remote_recruitment` | Application-process indicators |
| `first_published_at`, `published_at`, `expires_at` | Vacancy lifecycle timestamps |
| `lead_score` | Completeness score for employer research |
| `url` | Direct Pracuj.pl vacancy page |
| `search`, `scraped_at` | Source search and UTC collection time |

Fields remain present with `null`, `false`, or empty values when an employer does not disclose the information. A vacancy without a salary or ATS link is still a valid result.

### Pricing

The Actor uses transparent pay-per-event pricing:

- a small Actor-start event covers run initialization;
- each unique row written to the default dataset is one `result` event at **$0.0012**;
- duplicate offers are not charged twice within the same run;
- detail enrichment has no separate event fee.

At the current result price, 1,000 unique jobs cost $1.20 plus the small start event. The Apify Console displays the complete pricing configuration before each run.

### Scheduling and automation

Save a Task for each role or location you monitor, then run it daily or weekly. Apify can trigger a webhook when a run finishes, while the dataset API can deliver results to your own service.

A practical monitoring workflow is:

1. Run a saved Task for one focused search.
2. Read the default dataset through the API.
3. Compare `id` values with the previous run.
4. Keep only newly published jobs.
5. Send the new records to Slack, email, Telegram, a CRM, or a spreadsheet.

Use the stable `id` field for change detection. Titles, descriptions, and publication timestamps can change while a listing remains active.

### Reliability and responsible use

The Actor reads public search and vacancy data made available by Pracuj.pl at runtime. It does not log in, submit applications, collect private candidate profiles, or bypass account permissions. It is not affiliated with or endorsed by Pracuj.pl.

Requests use a browser-compatible HTTP client through one sticky Polish residential session, with conservative concurrency, retry handling, pagination bounds, and stable-ID deduplication. If the source returns no matching records, the run fails explicitly instead of producing a misleading successful empty dataset.

Users are responsible for complying with applicable terms, database rights, privacy rules, and employment regulations. Keep schedules proportionate to your actual workflow. Do not republish full descriptions as a competing job board, and use employer data for legitimate recruiting, hiring, or market research rather than unsolicited bulk messaging.

### FAQ

#### Does it need a Pracuj.pl account or API key?

No. It reads public job-search and public vacancy-detail data.

#### Can it preserve filters from the website?

Yes. Apply the filters on Pracuj.pl, copy the result URL, and pass it in `searchUrls`.

#### Can it collect several locations for one vacancy?

Yes. Pracuj.pl groups some vacancies with several offer locations. The Actor expands them into distinct stable offers and deduplicates repeated identifiers.

#### Why are some salary fields empty?

Not every employer publishes compensation. The original text remains in `salary`; normalized values are populated only when a numeric range can be parsed reliably.

#### Does it return requirements and benefits?

Yes, when `includeDetails` is enabled and the employer provides those sections.

#### What happens if one detail page fails?

The Actor logs a warning and returns the search-level fields for that job. It does not bill an extra enrichment event.

#### How can I request support?

Open an issue on the Actor page with the run ID, the input that reproduced the problem, and the expected behavior. Do not include credentials or private data. If the Actor is useful, a Store review helps other teams assess its reliability.

### Related Actors

- [No Fluff Jobs Scraper](https://apify.com/benthepythondev/nofluffjobs-scraper) for technology roles and salary-transparent listings in Poland.
- [StepStone Scraper](https://apify.com/benthepythondev/stepstone-scraper) for European job-board monitoring.
- [EURES Jobs Scraper](https://apify.com/benthepythondev/eures-jobs-scraper) for cross-border European vacancies.
- [Welcome to the Jungle Jobs Scraper](https://apify.com/benthepythondev/welcome-to-the-jungle-jobs-scraper) for company-profile and startup hiring research.
- [Remote Jobs Aggregator](https://apify.com/benthepythondev/remote-jobs-aggregator) for normalized remote vacancies across multiple sources.

Keywords: Pracuj.pl scraper, Pracuj scraper, Poland jobs API, Polish job data, Warsaw jobs, salary data Poland, employer hiring signals, recruitment intelligence, job-market research, Pracuj.pl export, Poland job alerts, ATS links, Polish vacancies.

# Actor input Schema

## `searchUrls` (type: `array`):

Optional search-result URLs copied from Pracuj.pl. Use these for contract, work-mode, salary, experience and category filters. When supplied, keyword and location are ignored.

## `keyword` (type: `string`):

Job title, role or skill, for example python, data engineer, księgowy or sprzedaż.

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

Optional Polish city or location, for example Warszawa, Kraków, Wrocław or Gdańsk.

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

Fetch technologies, responsibilities, requirements, benefits, employer information and application details for every job.

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

Maximum unique job locations returned across all searches.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.pracuj.pl/praca/python;kw/warszawa;wp"
  ],
  "keyword": "python",
  "location": "Warszawa",
  "includeDetails": true,
  "maxResults": 5
}
```

# Actor output Schema

## `results` (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 = {
    "searchUrls": [
        "https://www.pracuj.pl/praca/python;kw/warszawa;wp"
    ],
    "keyword": "python",
    "location": "Warszawa",
    "includeDetails": true,
    "maxResults": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/pracuj-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 = {
    "searchUrls": ["https://www.pracuj.pl/praca/python;kw/warszawa;wp"],
    "keyword": "python",
    "location": "Warszawa",
    "includeDetails": True,
    "maxResults": 5,
}

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

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

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

```

## CLI example

```bash
echo '{
  "searchUrls": [
    "https://www.pracuj.pl/praca/python;kw/warszawa;wp"
  ],
  "keyword": "python",
  "location": "Warszawa",
  "includeDetails": true,
  "maxResults": 5
}' |
apify call benthepythondev/pracuj-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=benthepythondev/pracuj-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Pracuj.pl Scraper - Poland Jobs and Salaries",
        "description": "Scrape Pracuj.pl jobs with employers, locations, salaries, contracts, technologies, requirements, benefits and application URLs.",
        "version": "1.0",
        "x-build-id": "pXgMY3mvsdvrQUrTU"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/benthepythondev~pracuj-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-benthepythondev-pracuj-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/benthepythondev~pracuj-scraper/runs": {
            "post": {
                "operationId": "runs-sync-benthepythondev-pracuj-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/benthepythondev~pracuj-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-benthepythondev-pracuj-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "searchUrls": {
                        "title": "Pracuj.pl search URLs",
                        "type": "array",
                        "description": "Optional search-result URLs copied from Pracuj.pl. Use these for contract, work-mode, salary, experience and category filters. When supplied, keyword and location are ignored.",
                        "default": [],
                        "items": {
                            "type": "string"
                        }
                    },
                    "keyword": {
                        "title": "Keyword",
                        "type": "string",
                        "description": "Job title, role or skill, for example python, data engineer, księgowy or sprzedaż.",
                        "default": "python"
                    },
                    "location": {
                        "title": "Location",
                        "type": "string",
                        "description": "Optional Polish city or location, for example Warszawa, Kraków, Wrocław or Gdańsk.",
                        "default": ""
                    },
                    "includeDetails": {
                        "title": "Enrich job details",
                        "type": "boolean",
                        "description": "Fetch technologies, responsibilities, requirements, benefits, employer information and application details for every job.",
                        "default": true
                    },
                    "maxResults": {
                        "title": "Maximum results",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Maximum unique job locations returned across all searches.",
                        "default": 10
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
