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

Extract job listings from Pracuj.pl, Poland's leading job portal. Scrape job titles, companies, salaries, locations, descriptions, employment types, requirements, and job URLs. Ideal for Polish job market research, recruitment analytics, salary tracking, and hiring trends.

- **URL**: https://apify.com/shahidirfan/pracuj-pl-jobs-scraper.md
- **Developed by:** [Shahid Irfan](https://apify.com/shahidirfan) (community)
- **Security:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 93.3% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## 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

### What does Pracuj.pl Job Scraper do?

Pracuj.pl Job Scraper collects job offers from Pracuj.pl, a Polish job board. Search by keyword and location, paste a Pracuj.pl search URL, or use a direct offer URL, and receive a structured dataset with job titles, employers, locations, salaries, contract types, work modes, publication dates, and links to the original offers.

The Actor handles pagination for you and leaves out fields that an offer does not publish.

### Why use Pracuj.pl Job Scraper?

- **Polish job market coverage** - Collect offers from Pracuj.pl without manual copy-paste.
- **Flexible search modes** - Use keyword and location filters, a prepared search URL, or a single offer URL.
- **Structured output** - Every record follows the same field names, so the data is ready for spreadsheets, databases, and dashboards.
- **Scheduled runs** - Refresh job data on a schedule, connect webhooks, or pull the dataset through the Apify API.
- **No coding required** - Fill in the form in Apify Console and download the results as JSON, CSV, Excel, or XML.

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

| Field            | Description                                                   |
| ---------------- | ------------------------------------------------------------- |
| `title`          | Job title                                                     |
| `company`        | Employer name                                                 |
| `companyUrl`     | Employer profile on Pracuj.pl                                 |
| `companyLogo`    | Employer logo image URL                                       |
| `location`       | One or more workplace locations                               |
| `salary`         | Salary text shown on the offer                                |
| `isRemote`       | Whether the employer allows remote work                       |
| `contractTypes`  | Contract types such as employment contract or B2B             |
| `workSchedules`  | Full-time, part-time, or other schedules                      |
| `workModes`      | On-site, hybrid, or remote work modes                         |
| `positionLevels` | Seniority levels                                              |
| `datePosted`     | Most recent publication date                                  |
| `expirationDate` | Offer expiration date                                         |
| `description`    | Full job description text                                     |
| `url`            | Direct link to the job offer                                  |
| `offerId`        | Pracuj.pl offer identifier                                    |
| `groupId`        | Grouping identifier for offers published in several locations |

### How to use Pracuj.pl Job Scraper

1. Open the Actor in Apify Console.
2. Choose a search mode: enter a keyword and location, or paste a Pracuj.pl search URL.
3. Set the maximum number of results and, if needed, the page limit.
4. Run the Actor.
5. Open the dataset to preview the offers, then export or connect it to your workflow.

Keyword and location take precedence over the start URL. If you use keyword or location, leave the start URL empty.

### Input Parameters

| Parameter            | Type    | Required | Default                                            | Description                                                                              |
| -------------------- | ------- | -------- | -------------------------------------------------- | ---------------------------------------------------------------------------------------- |
| `startUrl`           | String  | No       | `https://www.pracuj.pl/praca/software-engineer;kw` | Pracuj.pl search URL or direct offer URL. Used only when keyword and location are empty. |
| `keyword`            | String  | No       | -                                                  | Job title or skill, for example `data analyst`.                                          |
| `location`           | String  | No       | -                                                  | Polish city or region, for example `Warszawa` or `Kraków`.                               |
| `results_wanted`     | Integer | No       | `20`                                               | Maximum number of offers to save.                                                        |
| `max_pages`          | Integer | No       | `10`                                               | Maximum number of result pages to request.                                               |
| `proxyConfiguration` | Object  | No       | Apify residential proxy                            | Proxy settings for the run.                                                              |

### Output Data

| Field            | Type    | Description                                  |
| ---------------- | ------- | -------------------------------------------- |
| `title`          | String  | Job title                                    |
| `company`        | String  | Employer name                                |
| `companyUrl`     | String  | Employer profile URL                         |
| `companyLogo`    | String  | Employer logo URL                            |
| `location`       | String  | Workplace locations separated by a semicolon |
| `salary`         | String  | Salary text from the offer                   |
| `isRemote`       | Boolean | Remote work flag                             |
| `contractTypes`  | Array   | Contract types offered                       |
| `workSchedules`  | Array   | Work schedules                               |
| `workModes`      | Array   | Work modes                                   |
| `positionLevels` | Array   | Seniority levels                             |
| `datePosted`     | String  | Publication date in ISO 8601 format          |
| `expirationDate` | String  | Expiration date in ISO 8601 format           |
| `description`    | String  | Full job description text                    |
| `url`            | String  | Direct offer URL                             |
| `offerId`        | String  | Pracuj.pl offer identifier                   |
| `groupId`        | String  | Group identifier for multi-location offers   |

Fields that are empty or missing on the source offer are omitted from the record instead of being saved as null.

### Usage Examples

#### Search by keyword and location

Collect software engineering offers in Warsaw:

```json
{
    "keyword": "software engineer",
    "location": "Warszawa",
    "results_wanted": 50,
    "max_pages": 3
}
```

#### Collect offers from a Pracuj.pl search URL

Use a prepared search or category URL from Pracuj.pl:

```json
{
    "startUrl": "https://www.pracuj.pl/praca/it;cc,5016",
    "results_wanted": 100,
    "max_pages": 5
}
```

#### Collect a single offer

Paste a direct offer URL to save one job posting with its full description:

```json
{
    "startUrl": "https://www.pracuj.pl/praca/pracownik-utrzymania-ruchu-k-m-balice-pow-krakowski,oferta,1005172851",
    "results_wanted": 1
}
```

### Sample Output

```json
{
    "title": "Senior Software Engineer (Java)",
    "company": "Mindbox Sp. z o.o.",
    "companyUrl": "https://pracodawcy.pracuj.pl/company/1074221283",
    "companyLogo": "https://logos.gpcdn.pl/loga-firm/1074221283/60420000-56be-0050-9373-08debd8a5df7_280x280.png",
    "location": "Kraków",
    "isRemote": false,
    "salary": "25 000–28 000 zł netto (+ VAT) / mies.",
    "contractTypes": ["B2B contract"],
    "workSchedules": ["full-time"],
    "workModes": ["hybrid work"],
    "positionLevels": ["senior specialist (Senior)"],
    "datePosted": "2026-10-31T23:00:00Z",
    "expirationDate": "2026-11-30T22:59:59Z",
    "description": "Expected, Spring Boot, Java\n\nOperating system, Windows\n\nAbout the project, You will join a global initiative developing Business Capacity Management applications...",
    "url": "https://www.pracuj.pl/praca/senior-software-engineer-java-krakow,oferta,1005193143",
    "offerId": "1005193143",
    "groupId": "c4090000-56be-0050-dcc6-08df3686b0a7"
}
```

### Tips for Best Results

- Start with a small `results_wanted` value to check the output before running a large collection.
- Use Polish city names in `location`, for example `Warszawa`, `Kraków`, `Wrocław`, or `Gdańsk`.
- Leave `startUrl` empty when you use `keyword` or `location`; the search fields take precedence.
- Increase `max_pages` only when you need more results than one page provides.
- The default proxy uses an Apify residential address because Pracuj.pl applies bot protection.
- A missing `salary`, `companyLogo`, or `description` means the employer did not publish that information in the source data.

### Integrations

- **Google Sheets** - Send results to a spreadsheet for review and sharing.
- **Webhooks** - Trigger your own service after a run finishes.
- **Make or Zapier** - Add job data to no-code workflows.
- **Apify API** - Read datasets programmatically from your applications.
- **CSV, Excel, JSON, XML** - Download the dataset in the format your tools support.

### Frequently Asked Questions

#### Can I export Pracuj.pl job data to CSV or Excel?

Yes. Apify datasets can be downloaded as CSV, Excel, JSON, XML, and other supported formats from the Console or through the API.

#### Can I search by keyword without a URL?

Yes. Enter a keyword and optionally a location. The Actor builds the Pracuj.pl search for you.

#### Can I use a Pracuj.pl search URL instead of a keyword?

Yes. Paste a Pracuj.pl search or category URL into `startUrl`. The Actor reads the search filters from that page and continues through the result pages.

#### Can I collect a single job offer?

Yes. Paste a direct Pracuj.pl offer URL into `startUrl`. The Actor saves that offer with its full description.

#### Why are some fields missing from a record?

The Actor omits fields that are empty or missing on the source offer. Not every employer publishes a salary, logo, or detailed description in the source data.

#### Can I run this Actor on a schedule?

Yes. Create a schedule in Apify Console to refresh job data hourly, daily, or weekly.

#### How many results can I collect in one run?

The `results_wanted` input supports up to 5000 offers. Large runs take longer and may need more pages.

#### Is it legal to collect Pracuj.pl job data?

The Actor collects publicly available job listings. You are responsible for complying with applicable laws, Pracuj.pl terms, and data protection rules in your jurisdiction.

### Support

For issues, feature requests, or custom Actor work, use the Issues tab on the Actor page or contact the developer through Apify.

### Legal Notice

This Actor is designed for legitimate collection of publicly available job data. Users are responsible for using the data responsibly and complying with applicable laws and website terms.

# Actor input Schema

## `startUrl` (type: `string`):

Pracuj.pl search or offer URL. Used only when keyword and location are empty.

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

Job title or skill to search for, for example "data analyst". Takes precedence over the start URL.

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

Polish city or region, for example "Warszawa" or "Kraków". Takes precedence over the start URL.

## `results_wanted` (type: `integer`):

Maximum number of job offers to save.

## `max_pages` (type: `integer`):

Safety cap on the number of result pages to request.

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

Pracuj.pl uses bot protection. Apify residential proxies give the most reliable results.

## Actor input object example

```json
{
  "startUrl": "https://www.pracuj.pl/praca/software-engineer;kw",
  "results_wanted": 20,
  "max_pages": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrl": "https://www.pracuj.pl/praca/software-engineer;kw"
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/pracuj-pl-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 = { "startUrl": "https://www.pracuj.pl/praca/software-engineer;kw" }

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/pracuj-pl-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 '{
  "startUrl": "https://www.pracuj.pl/praca/software-engineer;kw"
}' |
apify call shahidirfan/pracuj-pl-jobs-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,shahidirfan/pracuj-pl-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/dNzL4ObWZeSThOgdu/builds/7GlntIgv8RhhlRLzk/openapi.json
