# ESS Slovenia Scraper - ZRSZ Public Job Listings (`studio-amba/ess-gov-si-scraper`) Actor

Scrape job listings from ess.gov.si (ZRSZ), Slovenia's national Public Employment Service. Extract job titles, employers, wages, deadlines and contact details from the official government vacancy register. No login or cookies required.

- **URL**: https://apify.com/studio-amba/ess-gov-si-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 result scrapeds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

### What does ESS Slovenia Scraper do?

**ESS Slovenia Scraper** extracts job listings from [ess.gov.si](https://www.ess.gov.si) — the Zavod Republike Slovenije za zaposlovanje (ZRSZ), Slovenia's national Public Employment Service. Every employer that reports a vacancy to ZRSZ (mandatory for public-sector and majority state-owned employers) is published in this official register. No login or cookies required — the actor talks directly to ZRSZ's own public JSON API and returns structured data.

### Why use ESS Slovenia Scraper?

- **Public-sector coverage** — ZRSZ is the mandatory channel for Slovenian public-sector and state-owned-enterprise vacancies, plus thousands of private-sector employers who publish for free.
- **Richer than a commercial job board** — every listing includes the employer's address, a named contact person, phone, email, application method, and (when disclosed) an indicative wage.
- **Labour-market signal** — each listing carries ZRSZ's own occupation barometer (shortage / balance / surplus) so you can track which occupations are understaffed nationally.
- **Employer reputation flags** — listings surface ZRSZ's positive and negative employer reference badges, useful for due diligence before applying.
- **Market research** — track hiring demand by occupation, region, or employer across the Slovenian labour market.

### How to scrape ESS Slovenia job data

1. Go to the ESS Slovenia Scraper [input page](https://console.apify.com/actors/ess-gov-si-scraper/input).
2. Enter a Slovenian search keyword (e.g. "kuhar" for cook), or leave it empty to browse the entire public vacancy register.
3. Optionally set a location (city or municipality) to limit results to a region.
4. Click **Start** and wait for the run to finish.
5. Download your data as JSON, CSV, Excel, or connect via API.

### Input

| Field | Type | Required | Description |
|-------|------|----------|--------------|
| `searchQuery` | String | No | Slovenian search keyword matched against job title, company, or occupation (e.g. "kuhar" = cook, "voznik" = driver, "inženir" = engineer). Leave empty to browse all public listings. |
| `location` | String | No | Slovenian city or municipality to filter by (e.g. "Ljubljana", "Maribor", "Koper"). |
| `maxResults` | Integer | No | Maximum number of job listings to return (default: 100). |
| `proxyConfiguration` | Object | No | Proxy settings. The default Apify proxy is sufficient — no anti-bot protection was found on ZRSZ's API. |

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `jobTitle` | String | `"KUHAR/KUHARICA - M/Ž"` |
| `occupation` | String | `"Kuhar"` |
| `company` | String | `"Univerzitetni rehabilitacijski inštitut Republike Slovenije Soča, LJUBLJANA"` |
| `companyAddress` | String | `"Linhartova cesta 51 , 1000 LJUBLJANA"` |
| `location` | String | `"LJUBLJANA"` |
| `employmentType` | String | `"nedoločen čas"` (permanent) |
| `workingHours` | String | `"40 ur/teden"` |
| `educationLevel` | String | `"srednja poklicna; Gostinstvo in turizem..."` |
| `wage` | String or null | `"2.500,00 EUR bruto mesečno"` (only when disclosed) |
| `description` | String | Full job description (HTML stripped) |
| `otherConditions` | String or null | Extra conditions or benefits |
| `experienceRequired` | String or null | `"ni zahtevano"` (not required) |
| `languageRequirements` | String or null | Required language skills |
| `drivingLicense` | String or null | Required driving license category |
| `computerSkills` | String or null | Required computer skills |
| `applicationMethod` | String or null | How to apply |
| `contactPerson` | String or null | Named contact for the vacancy |
| `contactPhone` | String or null | Contact phone number |
| `contactEmail` | String or null | Contact email |
| `contactAddress` | String or null | Contact postal address |
| `postedDate` | String or null | ISO 8601 |
| `applicationDeadline` | String or null | ISO 8601, null if not disclosed |
| `registrationNumber` | String | ZRSZ registration number for the vacancy notice |
| `numberOfPositions` | Integer or null | Number of open positions |
| `views` | Integer or null | View count on ess.gov.si |
| `employerReference` | Boolean | ZRSZ positive employer reference flag |
| `negativeReference` | Boolean | ZRSZ negative employer reference flag |
| `referralOffered` | Boolean | Whether ZRSZ actively refers matching jobseekers |
| `occupationOutlook` | String or null | `"primanjkljaj"` (shortage) / `"ravnovesje"` (balance) / `"presezek"` (surplus) |
| `sourceSystem` | String | Always `"ZRSZ"` |
| `jobId` | String | ZRSZ internal vacancy identifier |
| `url` | String | Direct link to the listing |
| `scrapedAt` | String | ISO 8601 timestamp |

### Example output

```json
{
    "jobTitle": "KUHAR/KUHARICA - M/Ž",
    "occupation": "Kuhar",
    "company": "Univerzitetni rehabilitacijski inštitut Republike Slovenije Soča, LJUBLJANA",
    "companyAddress": "Linhartova cesta 51 , 1000 LJUBLJANA",
    "location": "LJUBLJANA",
    "employmentType": "nedoločen čas",
    "workingHours": "40 ur/teden",
    "educationLevel": "srednja poklicna; Gostinstvo in turizem, šport, osebne storitve, drugo",
    "wage": null,
    "description": "IZBRANI/A KANDIDAT/KA BO DELO NA DELOVNEM MESTU »KUHAR/KUHARICA«...",
    "otherConditions": "Poznavanje pravil HACCP sistema...",
    "experienceRequired": "ni zahtevano",
    "languageRequirements": "slovenski jezik: razumevanje tekoče, govorjenje tekoče, pisanje tekoče",
    "drivingLicense": null,
    "computerSkills": null,
    "applicationMethod": "kandidati naj pošljejo vlogo po pošti;kandidati naj pošljejo vlogo po e-pošti",
    "contactPerson": "IVANA GAJIĆ TJAŠA OBREZA",
    "contactPhone": "01 47 58 106",
    "contactEmail": "kadri@ir-rs.si",
    "contactAddress": "Linhartova cesta 51 , 1000 LJUBLJANA",
    "postedDate": "2026-08-24T22:00:00.000Z",
    "applicationDeadline": "2026-09-24T00:00:00.000Z",
    "registrationNumber": "RE64930",
    "numberOfPositions": 1,
    "views": 242,
    "employerReference": true,
    "negativeReference": false,
    "referralOffered": false,
    "occupationOutlook": "primanjkljaj",
    "sourceSystem": "ZRSZ",
    "jobId": "3467416",
    "url": "https://www.ess.gov.si/iskalci-zaposlitve/iskanje-zaposlitve/iskanje-dela/?idp=3467416/#/pdm/3467416",
    "scrapedAt": "2026-09-12T14:14:45.947Z"
}
```

### How much does it cost to scrape ess.gov.si?

This actor calls ZRSZ's own JSON search API directly (no browser rendering needed), which keeps compute usage low:

- This actor charges $0.02 per run (start fee) plus $0.002 per result — a 100-job run costs about $0.22.
- Note: usage cost only settles once a run reports **SUCCEEDED** — reading the dataset mid-run will undercount what the run actually costs.

### Tips

- Leave `searchQuery` empty to pull from the full public vacancy register (thousands of live listings at any time).
- Use `location` to limit results to a specific Slovenian city or municipality.
- `wage` is only populated when the employer discloses an indicative salary — most listings leave it blank, so treat it as optional, not missing data.
- `occupationOutlook` reflects ZRSZ's national labour-market barometer for that occupation, not this specific vacancy.
- Use `maxResults` to control costs during testing.

### FAQ and support

- **Is it legal?** This actor scrapes publicly available data from ess.gov.si, Slovenia's official public employment service. Always respect the website's terms of service and use data responsibly.
- **Do I need a login?** No — ZRSZ's job search is fully public. No account required to read listings.
- **Found a bug?** Open an issue in the [Issues tab](https://console.apify.com/actors/ess-gov-si-scraper/issues) and we will fix it quickly.
- **Need a custom solution?** Contact us for tailored scraping solutions.

### Support and maintenance

This Actor is actively maintained by [Studio Amba](https://apify.com/studio-amba). We monitor health daily and fix breaking changes within 24 hours.

- **Found a bug?** Open an issue on the [Issues tab](https://console.apify.com/actors) — we reply within one business day.
- **Need a schema change?** Request it in the issues tab; most field additions ship within a week.
- **Need a custom integration?** Reach out via [studioamba.dev](https://studioamba.dev) for tailored scraping solutions.

### About Studio Amba

We build reliable, production-grade scrapers for European websites. Our actors share a common core:

- **No cookies, no login** — public data only, no account management headaches
- **Fast APIs over headless browsers** where possible — lower cost, higher throughput
- **Proactive health monitoring** — we watch every actor 24/7 and ship fixes before you notice

### Related Scrapers

- [Jobnet Scraper](https://apify.com/studio-amba/jobnet-scraper) — Denmark's official public employment service job board
- [AMS Scraper](https://apify.com/studio-amba/ams-scraper) — Austria's public employment service
- [KRZ Scraper](https://apify.com/studio-amba/krz-scraper) — Poland's national debtor and restructuring register
- [Pracuj Scraper](https://apify.com/studio-amba/pracuj-scraper) — Poland's #1 commercial job board
- [Infojobs Scraper](https://apify.com/studio-amba/infojobs-scraper) — Spain's leading job board
- [EU Vacancy Feed](https://apify.com/studio-amba/eu-vacancy-feed) — runs this board alongside up to 49 other European job boards (general boards, public employment services, and sector boards), merges everything into one deduplicated feed, and flags vacancies posted on more than one board at once.

### Changelog

See commit history in the [GitHub repo](https://github.com/studio-amba/actors) for a full changelog of bug fixes and schema changes.

# Actor input Schema

## `searchQuery` (type: `string`):

Slovenian search keyword matched against job title, company, or occupation (e.g. 'kuhar' = cook, 'voznik' = driver, 'inženir' = engineer). Leave empty to browse the full public vacancy register (thousands of live listings).

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

Optional Slovenian city or municipality to filter by (e.g. 'Ljubljana', 'Maribor', 'Koper'). Leave empty to search all of Slovenia.

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

Maximum number of job listings to scrape.

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

Proxy settings. ess.gov.si's own JSON API works reliably without residential proxies -- Apify's automatic proxy is enough for normal use.

## Actor input object example

```json
{
  "searchQuery": "kuhar",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "searchQuery": "kuhar",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("studio-amba/ess-gov-si-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 = {
    "searchQuery": "kuhar",
    "maxResults": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("studio-amba/ess-gov-si-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 '{
  "searchQuery": "kuhar",
  "maxResults": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call studio-amba/ess-gov-si-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,studio-amba/ess-gov-si-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/j7VAkCjIFgPyFF8Iv/builds/gYTWYcRQpibgJDQWz/openapi.json
