# NFSZ Scraper - Hungarian National Employment Service Jobs (`studio-amba/nfsz-scraper`) Actor

Scrape job vacancies from Hungary's National Employment Service Virtual Labour Market Portal (vmp.munka.hu). Search by keyword. Extract job titles, FEOR occupation codes, locations, salaries, education requirements, and application contacts. No login required.

- **URL**: https://apify.com/studio-amba/nfsz-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/platform/actors/running/actors-in-store#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 NFSZ Scraper do?

**NFSZ Scraper** extracts job vacancies from [vmp.munka.hu](https://vmp.munka.hu), the Virtuális Munkaerőpiac Portál (Virtual Labour Market Portal) run by NFSZ (Nemzeti Foglalkoztatási Szolgálat), Hungary's national public employment service. It collects job titles, FEOR occupation codes, work locations, salaries, education requirements, benefits, and application contact details, directly from the site's own server-rendered search results. No login or cookies required.

Use it on the Apify platform to get structured Hungarian labour-market data via API, schedule recurring scrapes, and integrate with tools like Zapier, Make, Google Sheets, and Slack.

### How to scrape NFSZ data

1. Go to the NFSZ Scraper on the Apify Store.
2. Click **Try for free** to open the actor in the Apify Console.
3. Enter a Hungarian-language keyword (e.g. "eladó", "ápoló", "gépkezelő") — the site's own search matches it against job titles, FEOR occupation names, education, and locations.
4. Set the maximum number of results you want.
5. Click **Start** and wait for the run to finish.
6. Download your data as JSON, CSV, Excel, or HTML from the Output tab.

### Why use NFSZ Scraper?

- **Recruitment and hiring** — Monitor vacancies registered with the Hungarian public employment service to understand hiring trends by region, sector, and occupation.
- **Salary research** — Benchmark gross monthly salaries employers report to the labour office, by occupation and location.
- **Labor market analysis** — Track which FEOR occupations and cities have the most open positions, and how education requirements break down.
- **EU-mobility research** — Vacancies flag whether they're explicitly recommended to EU citizens, useful for cross-border labour-mobility research.
- **Academic and public-policy research** — Gather structured Hungarian labour-market data straight from the official employment service registry.

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `searchQuery` | String | No | Hungarian-language keyword (e.g. "eladó", "ápoló", "gépkezelő"). Matched against job titles, FEOR occupation names, education, and locations. Leave empty to fall back to a default keyword — the site requires a keyword and returns an error for a fully unfiltered nationwide browse (1,900+ open vacancies at time of writing). |
| `maxResults` | Integer | No | Maximum number of job vacancies to scrape (default: 100, max: 5000). |
| `proxyConfiguration` | Object | No | Proxy settings. vmp.munka.hu has no anti-bot/fingerprint check, but does rate-limit by IP, so the actor rotates an Apify proxy session per request. The free automatic pool is used by default — no residential proxy needed. |

### Output

Each result contains structured data about a single job vacancy. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

#### Example output

```json
{
    "jobId": "600286",
    "jobTitle": "Kereskedő - Bolti eladó",
    "feorCode": "5111",
    "feorName": "Kereskedő",
    "positionDetail": "Bolti eladó",
    "educationLevel": "szakmunkásképző",
    "city": "Rétság",
    "postalCode": "2651",
    "fullAddress": "2651 Rétság Rákóczi út 33.",
    "numberOfPositions": 2,
    "salaryFrom": 322800,
    "salaryTo": null,
    "currency": "HUF",
    "employmentRelationship": "Munka Törvénykönyve szerinti",
    "staffCategory": "szakmunkás",
    "workSchedule": "munkaidőkeret",
    "fullPartTimeHours": "8 / 0",
    "availableToEuCitizens": false,
    "benefits": "Utazási támogatás.",
    "specialRequirements": null,
    "specialConditions": null,
    "jobDescription": "Vevők kiszolgálása, valamint egyéb, az áruforgalomhoz és bolti munkához kapcsolódó feladatok ellátása.",
    "applicationInfo": "Fényképpel ellátott önéletrajzzal a regionalis@t-online.hu e-mail címen.",
    "applicationEmail": "regionalis@t-online.hu",
    "validFrom": "2026-06-19T00:00:00.000Z",
    "validTo": "2026-08-31T00:00:00.000Z",
    "url": "https://vmp.munka.hu/allas/reszletek/600286",
    "scrapedAt": "2026-08-07T15:10:00.000Z"
}
```

### Data fields

| Field | Type | Description |
|-------|------|-------------|
| `jobId` | String | Internal vmp.munka.hu vacancy ID |
| `jobTitle` | String | Job title, combining the FEOR occupation name and any position detail |
| `feorCode` | String | Official Hungarian FEOR occupation classification code |
| `feorName` | String | Base occupation name from the FEOR classification |
| `positionDetail` | String | Employer-specified refinement of the base occupation |
| `educationLevel` | String | Minimum required education level(s), comma-separated when multiple are accepted |
| `city` | String | City/town where the job is located |
| `postalCode` | String | 4-digit Hungarian postal code of the work location, when parseable |
| `fullAddress` | String | Full work-location address as listed by the employer |
| `numberOfPositions` | Integer | Number of open positions for this vacancy |
| `salaryFrom` | Number | Minimum monthly gross salary in HUF, when disclosed |
| `salaryTo` | Number | Maximum monthly gross salary in HUF, when disclosed |
| `currency` | String | Always "HUF" |
| `employmentRelationship` | String | Type of employment contract |
| `staffCategory` | String | Employer's internal staff category for the role |
| `workSchedule` | String | Work schedule/regime |
| `fullPartTimeHours` | String | Raw "company hours / employee hours" pair as reported |
| `availableToEuCitizens` | Boolean | Whether the vacancy is explicitly marked as recommended to EU citizens |
| `benefits` | String | Benefits tied to the role, when disclosed |
| `specialRequirements` | String | Special requirements for the role, when disclosed |
| `specialConditions` | String | Special working conditions, when disclosed |
| `jobDescription` | String | Free-text job description/notes, when the employer provided one |
| `applicationInfo` | String | Free-text instructions on how to apply |
| `applicationEmail` | String | Email address parsed out of the application info text, when present |
| `validFrom` | String | ISO 8601 date the vacancy listing became valid |
| `validTo` | String | ISO 8601 date the vacancy listing expires |
| `url` | String | Direct URL to the vacancy detail page on vmp.munka.hu |
| `scrapedAt` | String | ISO 8601 timestamp of when the data was collected |

### Cost estimate

This actor calls vmp.munka.hu's server-rendered search and detail pages directly rather than rendering pages in a browser, but Hungary's public employment site doesn't expose a JSON API — every result needs one list-page fetch (10 results per page) plus one detail-page fetch to pick up salary, description, and application-contact fields. Expect roughly **1–2 compute units per 1,000 results**. As with any Apify actor, the run's usage cost only settles once the run reports SUCCEEDED — reading a mid-run/in-progress dataset understates the eventual cost.

### Tips

- Use specific Hungarian keywords (occupation names, town names, education levels) to get relevant results and reduce run time — a fully unfiltered nationwide browse is rejected by the site itself.
- The employer/company name is only shown to logged-in registered users of the portal, so it is not included in the dataset. `applicationInfo` and `applicationEmail` are the closest substitute — most listings include an application email or address.
- Schedule recurring runs to track new vacancies daily or weekly.
- Combine with other Hungarian job board scrapers for full national coverage across both public and private-sector postings.

### Limitations

- Employer/company name is not available to anonymous (non-logged-in) users on vmp.munka.hu and is therefore not included in the output.
- Salary data is not available for all vacancies — some employers do not disclose a figure, or only disclose a minimum.
- `applicationEmail` is only populated when the employer's free-text application instructions contain a parseable email address.
- vmp.munka.hu enforces a per-IP rate limit (confirmed in testing) rather than a fingerprint-based anti-bot wall — the actor spreads requests across Apify proxy sessions to stay under it.
- Data is scraped from the public vmp.munka.hu website and may change without notice.

### Integrations

Connect NFSZ Scraper with your existing tools and workflows:

- **Google Sheets** — Export vacancies directly to a spreadsheet for easy filtering and sharing.
- **Slack** — Get notified when new vacancies matching your criteria appear.
- **Zapier / Make** — Build workflows that react to new job postings in real time.
- **Custom API** — Access all results programmatically via the Apify API in JSON format.

### FAQ and support

**Is it legal to scrape vmp.munka.hu?** Scraping publicly available data is generally permitted under EU law. This actor only accesses public job vacancies that require no login, via the same pages the public search page uses.

**How often is the data updated?** The actor scrapes live data from vmp.munka.hu each time it runs. Schedule it daily or weekly to track changes.

**I found a bug or have a feature request.** Open an issue in the Issues tab on the actor page. You can also request a custom scraping solution.

### Need this data on a schedule, or a custom version?

We run this scraper as a managed service for businesses: scheduled runs,
deduplication, delta detection, and delivery to your inbox, Google Sheets,
or API — maintenance included. We can also build a custom version with your
exact fields and filters, or combine multiple sources into one feed.

See [studioamba.dev/services](https://studioamba.dev/services/) or email
<hello@studioamba.dev> for a free data sample.
We maintain 300+ European web scrapers and answer within one business day.

# Actor input Schema

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

Hungarian-language keyword (e.g. 'eladó', 'ápoló', 'gépkezelő'). Matched against job titles, FEOR occupation names, education, and locations, same as the site's own keyword search. Leave empty to fall back to a default keyword — the site requires a keyword and returns an error for a fully unfiltered nationwide browse (1900+ open vacancies).

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

Maximum number of job vacancies to scrape.

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

Proxy settings. vmp.munka.hu has no anti-bot/WAF fingerprint check, but it does enforce a per-IP rate limit — a burst of requests from one IP gets temporarily blocked. Apify's automatic/free proxy pool is used by default, with a fresh session per request to spread load across IPs. No residential proxy needed. See docs/site-recon/nfsz-munka-hu.md.

## Actor input object example

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

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

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

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

```

## MCP server setup

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