# EKR Hungary Scraper — Public Procurement Tenders (`studio-amba/ekr-gov-hu-scraper`) Actor

Search and extract Hungarian public procurement notices from ekr.gov.hu (EKR). Filter by keyword or buyer name. Returns buyer info, deadlines, CPV codes, place of performance, and procedure details. No API key, no login required.

- **URL**: https://apify.com/studio-amba/ekr-gov-hu-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** Business, Lead generation
- **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

## EKR Hungary Scraper — Public Procurement Tenders

Search and extract Hungarian public procurement tender notices from ekr.gov.hu, Hungary's official national e-procurement platform (Elektronikus Közbeszerzési Rendszer), run by the Közbeszerzési Hatóság (Public Procurement Authority). Filter by keyword, buyer name, or CPV code. Returns buyer info, publication and deadline dates, procedure type, and CPV classification where the notice discloses one. No API key, no login required.

### How to scrape EKR Hungary procurement data

This actor reads notices straight from ekr.gov.hu's own JSON API — the same endpoint the site's search page calls in the browser. Every Hungarian contracting authority (ministries, municipalities, hospitals, state agencies, state-owned companies) is legally required to publish its procurement notices here, making it the single most complete source for Hungarian public procurement activity, both above and below the EU notification threshold.

Enter your search keywords, pick optional filters, and run. The actor fetches the search results list, then — when full details are enabled — calls each notice's detail endpoint to pull the procurement category, place of performance, procedure type, and (where the source publishes it) CPV classification codes.

#### Who benefits from this data?

- **Government contractors** — Monitor which tenders are open across Hungarian ministries, municipalities, hospitals, and state agencies, and track submission deadlines.
- **Market researchers** — Analyze Hungarian public spending patterns, tender volumes, and procurement activity by sector and buyer type.
- **B2B sales teams** — Identify which Hungarian public bodies buy what you sell. Build targeted prospect lists across the Hungarian public sector.
- **Consultancies and advisory firms** — Track tender activity by CPV category or buyer to advise clients on Hungarian market entry and bidding strategy.
- **Compliance and legal teams** — Monitor competitor bids, verify buyer details, and check procedural transparency.
- **Journalists and researchers** — Investigate public spending on a topic, ministry, or municipality.

#### Search by keyword

Enter any keyword to find relevant notices. The search matches against the tender subject ("Eljárás tárgya"). Examples: `informatika` (IT), `takarítás` (cleaning), `útépítés` (road construction), `eszközbeszerzés` (equipment supply).

#### Filter by buyer

Use `organizationName` to filter by the contracting authority's name ("Ajánlatkérő szervezet neve"). Example: `Budapest Főváros`.

#### Filter by CPV code

Use `cpvCode` to filter by a CPV (Common Procurement Vocabulary) classification code. Example: `30200000-1` for computer equipment.

#### Filter by date

`publicationDateFrom` and `submissionDeadlineFrom` narrow results to notices published, or with a submission deadline, on or after a given date (format `YYYY-MM-DD`).

#### Fetch full details

`fetchFullDetails` (default `true`) makes one extra request per result to pull the procurement category, place of performance, procedure type, and CPV codes. Disable it for a faster run that only returns the basic search-list fields (title, buyer, dates, notice type).

### Input

| Field | Type | Description | Default |
|---|---|---|---|
| `searchQuery` | String | Keyword matched against the tender subject | `informatika` |
| `organizationName` | String | Filter by contracting authority name | — |
| `cpvCode` | String | Filter by CPV classification code | — |
| `publicationDateFrom` | String | Only notices published on/after this date (`YYYY-MM-DD`) | — |
| `submissionDeadlineFrom` | String | Only notices with a deadline on/after this date (`YYYY-MM-DD`) | — |
| `fetchFullDetails` | Boolean | Fetch CPV codes, category, place of performance per result | `true` |
| `maxResults` | Integer | Maximum number of notices to return | `50` |
| `proxyConfiguration` | Object | Apify proxy settings (automatic proxy is sufficient) | `{"useApifyProxy": true}` |

### Output

| Field | Type | Description |
|---|---|---|
| `itemTitle` | String | Tender subject ("Eljárás tárgya") |
| `referenceNumber` | String | Registry number ("Iktatószám") |
| `organization` | String | Contracting authority name |
| `status` | String | `Open`, `Closed`, or `Unknown`, derived from the submission deadline |
| `publicationDate` | String | ISO 8601 publication date |
| `deadline` | String | ISO 8601 submission deadline |
| `estimatedValue` | String | Always empty — not disclosed on the public record (see Limitations) |
| `currency` | String | Always empty — see Limitations |
| `category` | String | Procurement category ("Árubeszerzés" / goods, "Építési beruházás" / works, "Szolgáltatás megrendelés" / services) |
| `cpvCodes` | Array | CPV classification codes, when the source publishes them |
| `region` | String | Place of performance (NUTS code + region name), when disclosed |
| `itemDescription` | String | Always empty — EKR does not expose a free-text description on the public API |
| `contactInfo` | Object | Reserved for future use — EKR's public API does not expose buyer contact details |
| `url` | String | Notice detail page on ekr.gov.hu |
| `scrapedAt` | String | ISO 8601 timestamp of the scrape |
| `ekrAzonosito` | String | EKR notice identifier (e.g. `EKR000728542026/H002`) |
| `noticeType` | String | Notice type + regime, e.g. `Uniós, Ajánlati / részvételi felhívás` (EU-regime, invitation to tender) |
| `procedureType` | String | Legal basis / procedure type, when full details are enabled |
| `winningBidder` | String | Winning bidder name, populated only on award notices where disclosed |
| `isEuNotice` | Boolean | `true` when the notice was published under the EU (Uniós) regime, also visible on TED |
| `tedNumber` | String | TED (Tenders Electronic Daily) reference number, when the notice was also published EU-wide |

### Example output

```json
{
    "itemTitle": "ENVIRAS c. projekt informatikai eszközbeszerzése",
    "referenceNumber": "14060/2026",
    "organization": "Észak-magyarországi Vízügyi Igazgatóság",
    "status": "Closed",
    "publicationDate": "2026-08-12T22:00:00.000+0000",
    "deadline": "2026-08-28T08:00:00.000+0000",
    "estimatedValue": "",
    "currency": "",
    "category": "Árubeszerzés",
    "cpvCodes": [],
    "region": "HU311 Borsod-Abaúj-Zemplén",
    "itemDescription": "",
    "contactInfo": {},
    "url": "https://ekr.gov.hu/portal/kozbeszerzes/hirdetmenyek/8805659112795/reszletek",
    "scrapedAt": "2026-09-02T09:47:14.085Z",
    "ekrAzonosito": "EKR001537822026/H001",
    "noticeType": "Nemzeti, Ajánlati / részvételi felhívás",
    "procedureType": "Kbt. 112. § (1) bekezdés b) pont Nyílt eljárás (hirdetménnyel induló)",
    "winningBidder": "",
    "isEuNotice": false,
    "tedNumber": ""
}
```

### Cost estimate

Priced per result plus a flat per-run start fee (Pay Per Event). At the STANDARD tier this is roughly $0.002 per notice plus $0.005 per run — a 50-result run costs about $0.005 (start fee) + $0.10 (50 × $0.002) ≈ **$0.105**, or roughly **500 notices per $1** of Apify usage. `fetchFullDetails: false` runs faster and cheaper for search-list-only data, but tiers apply per result regardless — the difference is runtime, not per-item price. A run's usage cost only settles after the run reports SUCCEEDED; a mid-run dataset read will show a cost far below the final total.

### Limitations

- **No estimated or awarded contract value.** EKR's public notice API does not expose the estimated or awarded value on either the search or detail endpoint — this matches the same limitation documented for Poland's ezamowienia.gov.pl. If you need contract values, cross-reference the winning bidder and reference number against TED (for EU-regime notices, via `tedNumber`) or the buyer's own published contract register.
- **CPV codes are frequently empty**, especially on national-regime (sub-EU-threshold) notices — sampled recon runs found CPV populated mainly on EU-regime ("Uniós") notices. Don't rely on `cpvCodes` being populated for every result.
- **No free-text description or buyer contact details.** EKR's public API returns structured fields only — no notice body text, no buyer phone/email/address. For the full legal notice text, use the `url` field to open the notice on ekr.gov.hu directly.
- **Hungarian-language fields.** `organization`, `category`, `noticeType`, and `procedureType` are returned in Hungarian, as published by the source — they are not translated.
- **Page size.** The search API silently clamps to 100 results per page regardless of the requested page size — the actor already accounts for this internally, you don't need to configure it.

### Related Scrapers

Part of Studio AMBA's European public procurement cluster — same record shape across every national e-procurement platform we cover:

- [e-Zamówienia Poland Scraper](https://apify.com/studioamba/ezamowienia-scraper) — Polish public procurement notices
- [Ausschreibung.at Scraper](https://apify.com/studioamba/ausschreibung-at-scraper) — Austrian public procurement notices
- [NEN/NIPEZ Czechia Scraper](https://apify.com/studioamba/nen-nipez-cz-scraper) — Czech public procurement notices
- [evergabe.de Scraper](https://apify.com/studioamba/evergabe-scraper) — German public procurement notices
- [Acquisti in Rete PA Scraper](https://apify.com/studioamba/acquistinretepa-scraper) — Italian public procurement notices

# Actor input Schema

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

Search notices by procedure subject (tender title). Matched against the tender subject field. Examples: 'informatika' (IT), 'takarítás' (cleaning), 'útépítés' (road construction), 'eszközbeszerzés' (equipment supply).

## `organizationName` (type: `string`):

Filter by the contracting authority's name (Ajánlatkérő szervezet neve). Examples: 'Budapest Főváros', 'Magyar Állam'.

## `cpvCode` (type: `string`):

Filter by CPV (Common Procurement Vocabulary) classification code. Example: '30200000-1' for computer equipment.

## `publicationDateFrom` (type: `string`):

Only notices published on or after this date. Format: YYYY-MM-DD.

## `submissionDeadlineFrom` (type: `string`):

Only notices with a bid submission deadline on or after this date. Format: YYYY-MM-DD.

## `fetchFullDetails` (type: `boolean`):

When enabled (default), fetches the full notice detail for each result to extract CPV codes, procurement category, place of performance, and procedure type — one extra request per result. Disable for a faster run that only returns the basic search fields.

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

Maximum number of notices to return.

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

Apify proxy configuration. Automatic proxy is sufficient — ekr.gov.hu has no anti-bot protection or geo-lock (verified 2026-09-02, see docs/site-recon/ekr-gov-hu.md).

## Actor input object example

```json
{
  "searchQuery": "informatika",
  "fetchFullDetails": true,
  "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": "informatika",
    "maxResults": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

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

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

```

## MCP server setup

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