# Praca.pl Job Market Stats - Daily Counts by Region and Category (`listingworks/praca-stats`) Actor

Daily counts of Polish job postings on Praca.pl for 16 voivodeships (plus abroad and unmapped) x 13 job categories: live, new and removed postings and the median advertised salary. 18 regional rows a day for $0.90.

- **URL**: https://apify.com/listingworks/praca-stats.md
- **Developed by:** [Yusuke Suda](https://apify.com/listingworks) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $50.00 / 1,000 result items

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

## Praca.pl Job Market Stats — daily counts of Polish job postings by region and category

Daily counts of Polish job postings on Praca.pl for 16 voivodeships x 13 job categories: live, new and removed postings, how many state a salary, and the median advertised monthly salary. Updated every day. The 18 regional rows of one day (16 voivodeships, `abroad` and `unmapped`) cost $0.905 ($0.05 a row, plus $0.005 for the run start); the full region x category table of one day is up to 234 rows (18 x 13; a combination with no posting that day is left out, so 231 rows on 20 October 2026), about $11.70.

Press Start. The default returns the latest day, one row per voivodeship.

### What it is for

- Research: a daily series of hiring activity in Polish regions and occupations, from 2 October 2026 on, for papers and regional indices.
- HR and recruitment reports: how many jobs are live, opened and closed in a region or category this week, and what pay employers advertise.
- Location comparisons: which voivodeship is hiring drivers, nurses or IT staff, and at what advertised salary, before you open an office or plan a campaign.

### Free sample

A free October 2026 extract (all days, region level) is available on request: open an issue on this Actor and we send it.

### How it works

Every morning listingworks reads Praca.pl's public list pages in full, keeps a first-seen ledger of every posting, and counts the day's snapshot by voivodeship and job category. The counts go into an Apify key-value store that this Actor reads; the series runs from 2 October 2026, with 3 and 4 October missing (see "Days held"). Aggregates only: no postings, no titles, no URLs, no employer or person names.

Looking for the postings themselves (title, employer, town, contract, pay)? See the
[Praca.pl Scraper](https://apify.com/listingworks/praca-scraper), which returns one row per posting.

### Input

| Field | What it does |
|---|---|
| `date` | The snapshot day (Warsaw), e.g. `2026-10-08`. Empty: the latest day. |
| `granularity` | `region`: one row per voivodeship. `region_category`: one row per voivodeship x job category. |
| `days` | How many days to return, ending on `date` (1–31). |

### Output

```json
{
  "date": "2026-10-08",
  "voivodeship": "mazowieckie",
  "category": "all",
  "live_postings": 3428,
  "new_postings": 145,
  "removed_postings": 114,
  "with_salary": 890,
  "median_salary_pln_month": 6000,
  "source": "praca.pl"
}
```

| Field | Meaning |
|---|---|
| `date` | Snapshot day (Warsaw). The site is read in full once a day, about 06:00 Warsaw time. |
| `voivodeship` | One of the 16 voivodeships, or `abroad` (postings located outside Poland), or `unmapped` (place not matched to a voivodeship). |
| `category` | Job category, or `all` with `region`. Assigned by keywords in the Polish job title, first match wins; `other` when nothing matches (about 1 posting in 10). Approximate. |
| `live_postings` | Postings on the site's list pages in that day's full snapshot. |
| `new_postings` | Postings seen for the first time that day (a first-seen ledger kept since 2 October 2026). |
| `removed_postings` | Postings in the previous full snapshot and not in this one. |
| `with_salary` | Live postings that show a salary. |
| `median_salary_pln_month` | Median of the lower bound of the stated monthly salary in PLN (gross or net as advertised). Empty unless the cell has at least 5 live postings and 5 such salaries. |

### Days held

From 2 October 2026, one day per full read of the site. 3 and 4 October 2026 have no data (the site was not read in
full on those days); they are skipped, never estimated. 5 October's `removed_postings` covers three days (3–5 October).
Daily figures are comparable from 6 October 2026.

### FAQ

**Where do the numbers come from?** From listingworks' own daily full read of Praca.pl's public list pages. Only
list-page fields are used; individual postings are not opened, and no name, contact or photo is collected.

**How fresh is it?** Each day is added about 06:15 Warsaw time (05:15 from 25 October), after that morning's read.

**Can categories change?** The keyword list may be refined; a change is announced here and not applied to days
already published.

### For AI agents & LLM apps

Give an AI agent this Actor as a tool through Apify's MCP server: add
`https://mcp.apify.com?tools=listingworks/praca-stats` to any MCP client. The agent calls it with, for example,
`{"granularity": "region", "days": 7}` and gets the rows as JSON: a week of regional counts it can chart or compare.

### Legal notice

The counts are derived from public list pages of Praca.pl, read once a day at a polite pace; Praca.pl was told about
listingworks' collection in writing (29 September and 6 October 2026). The output holds no personal data. Published
figures should credit "Source: listingworks, from public Praca.pl listings".

### Pricing

$0.05 per row returned (`result-item`), plus $0.005 when a run starts. One day by region is 18 rows ($0.90); one day by region x category is up to 234 rows ($11.70; 231 rows, $11.55, on 20 October 2026).

### Support

Open an issue on this Actor with the run ID and your input. We answer within one business day.

# Actor input Schema

## `date` (type: `string`):

The snapshot day (Warsaw), e.g. 2026-10-08. Leave empty for the latest day held.

## `granularity` (type: `string`):

region: one row per voivodeship and day. region_category: one row per voivodeship x job category and day.

## `days` (type: `integer`):

How many days to return, ending on the day above (1-31). Days without a full read of the site have no file and are skipped.

## Actor input object example

```json
{
  "date": "",
  "granularity": "region",
  "days": 1
}
```

# Actor output Schema

## `overview` (type: `string`):

One row per day and voivodeship (or voivodeship x job category): date, voivodeship, category, live_postings, new_postings, removed_postings, with_salary, median_salary_pln_month.

# 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 = {
    "granularity": "region",
    "days": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("listingworks/praca-stats").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 = {
    "granularity": "region",
    "days": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("listingworks/praca-stats").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 '{
  "granularity": "region",
  "days": 1
}' |
apify call listingworks/praca-stats --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,listingworks/praca-stats"
        }
    }
}
```

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/SEU8GZezuHW0tCtMm/builds/p35T6QFmMVgPzQBSd/openapi.json
