# Aranyoldalak Scraper: Hungarian Business Leads & Emails (`steadyscrape/aranyoldalak-scraper`) Actor

Scrape Aranyoldalak (aranyoldalak.hu), Hungary Yellow Pages business directory: Hungarian companies by category or keyword and town with name, address, coordinates, phone, email, website, tags; optionally each company page (all phones, service area, hours). Export to JSON, CSV or Excel, or via API.

- **URL**: https://apify.com/steadyscrape/aranyoldalak-scraper.md
- **Developed by:** [Steady Scrape](https://apify.com/steadyscrape) (community)
- **Categories:** Lead generation, Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 businesses

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

## Aranyoldalak Scraper — Hungarian business leads from aranyoldalak.hu

This **Aranyoldalak scraper** reads **Aranyoldalak** (aranyoldalak.hu, Hungary's Yellow Pages / Arany Oldalak
cégkereső) by business type or keyword and town: every business as one clean row with **name, description, postal
code, town, street, coordinates, phone (also in E.164), email, website and tags**, plus whether its card is a paid
Toprank or highlighted placement. One optional step reads each company's own page:

- **Company page** (`includeDetails`): every phone number and website, every email, the service area (Működési
  terület), the full introduction (Bemutatkozás), the services it lists, opening hours per day and its videos.

Search `autószerviz` in `Budapest`, `fogorvos` in `Debrecen`, `ügyvéd` in `Szeged` or `könyvelő` in all of Hungary —
or paste results lists and company links straight from the site. You pay per business delivered; searches without
results and links that give nothing are free rows that say why.

### Who the Aranyoldalak scraper is for

- **B2B sales and lead generation in Hungary**: companies by category and town with phone, email and website, the
  address split into postal code, town and street for a CRM or a mail merge.
- **Local SEO and marketing agencies** prospecting Hungarian small businesses: who has a website of its own and who
  only has the directory's business card (`businessCardUrl`), and who pays Aranyoldalak for a highlighted listing.
- **Market research**: count and map the dentists, garages or lawyers of a town (the site's own count is in every
  search row; coordinates come with almost every row).

### How the Aranyoldalak data is read

1. **Searches** go through the site's own search form (`/search/?keyword=autószerviz&area=Budapest`), which opens the
   results list it has for them (`/autok-es-koezlekedes/autoszerviz/budapest/`), 20 businesses a page, and follow the
   page's own next link until your maximum. Without a town the site searches all of Hungary.
2. **Paid cards come first**: Aranyoldalak lists its Toprank and highlighted ("Kiemelt") advertisers on top, some of
   them from nearby towns that serve the town you searched; `listingType` says which a row is and `city` says where the
   business is. A Toprank card shown again further down is delivered once.
3. **One advertiser can have several profiles** (one per product or service, each with its own phone and text): each
   profile is its own row with its own `id`, as the site lists them.
4. **Company pages** (optional) add the details below. **Links**: a results link is walked like a search from that
   page; a company link is read on its own page.

The Actor reads only pages the site's robots.txt leaves open to any crawler, one request every 3 seconds as robots.txt
asks, without a login. Aranyoldalak answers only visitors in Hungary, so the Actor reads it through Hungarian
residential IPs (included in the price).

### Input example

```json
{
    "searchTerms": ["autószerviz", "fogorvos"],
    "locations": ["Budapest", "Debrecen"],
    "maxResultsPerSearch": 100,
    "includeDetails": true
}
```

Links: `"startUrls": ["https://aranyoldalak.hu/autok-es-koezlekedes/autoszervizek/budapest/", "https://aranyoldalak.hu/reflex-kft8.htm"]`.

### Output example

```json
{
    "rowType": "business",
    "id": "9179518",
    "url": "https://aranyoldalak.hu/reflex-kft8.htm",
    "name": "Reflex Kft.",
    "description": "Tehergépkocsik és pótkocsik javítása, személygépkocsik javítása, műszaki vizsgára történő felkészítés, műszaki vizsgáztatás.",
    "categories": ["Autójavítás", "Teherautó javítás", "Műszaki vizsga esztergom", "Mezőgazdasági gépjármű szerviz esztergom", "Daf szerviz"],
    "address": "2510 Dorog, Esztergomi út 27.",
    "postalCode": "2510",
    "city": "Dorog",
    "street": "Esztergomi út 27.",
    "latitude": 47.728398741834,
    "longitude": 18.725378012576,
    "phone": "+36 (33) 521210",
    "phoneInternational": "+3633521210",
    "email": "km@reflexkft.hu",
    "website": "http://www.reflexkft.hu",
    "businessCardUrl": "https://reflex-kft.uzleti.hu",
    "listingType": "highlighted",
    "searchTerm": "autószerviz",
    "location": "Budapest",
    "searchUrl": "https://aranyoldalak.hu/search/?keyword=aut%C3%B3szerviz&area=Budapest",
    "position": 9,
    "details": {
        "mainCategories": ["Autójavítás"],
        "introduction": "Tehergépkocsik és pótkocsik javítása, személygépkocsik javítása, műszaki vizsgára történő felkészítés, műszaki vizsgáztatás. Vállaljuk minden típusú s…",
        "phones": [
            { "number": "+36 (33) 521210", "international": "+3633521210" },
            { "number": "+36 (30) 3822399", "international": "+36303822399" }
        ],
        "emails": ["km@reflexkft.hu"],
        "websites": ["http://www.reflexkft.hu"],
        "businessCardUrl": "https://reflex-kft.uzleti.hu",
        "serviceArea": ["Tatabánya", "Budapest", "Esztergom"],
        "services": ["Autószerviz esztergom", "Renault haszongépjármű szerviz", "Autóalkatrész esztergom", "Ford transit szerviz"],
        "serviceTowns": ["Esztergom", "Tatabánya", "Dorog", "Budapest"],
        "openingHours": [
            { "day": "Monday", "opens": "06:00", "closes": "15:00" },
            { "day": "Tuesday", "opens": "06:00", "closes": "15:00" }
        ],
        "hoursNote": null,
        "videos": ["https://www.youtube.com/embed/Yjt9hB-mQ9E?si=DJZU0JiHu2N8DF91"]
    },
    "scrapedAt": "2026-11-01T12:00:00.000Z"
}
```

### Aranyoldalak fields

| field | what it is |
|---|---|
| `id` | the site's profile id (`data-stat-name`); one advertiser can have several |
| `url` | the company page on aranyoldalak.hu |
| `name`, `description` | as the card shows them (the card shortens long descriptions with "...") |
| `categories` | the category and keyword tags on the card, as the advertiser chose them |
| `address`, `postalCode`, `city`, `street` | the address in Hungarian order, also split |
| `latitude`, `longitude` | where the site pins the business |
| `phone`, `phoneInternational` | the card's phone as written, and in E.164 (`+3633521210`) |
| `email` | the card's email; with details the page's first one when the card has none |
| `website` | the company's own website or social page; never an `uzleti.hu` business card |
| `businessCardUrl` | the company's `*.uzleti.hu` one-page business card that Aranyoldalak hosts, when it has one |
| `listingType` | `toprank`, `highlighted` (paid placements) or `standard`; `null` for a company link |
| `searchTerm`, `location`, `searchUrl`, `position` | which search found it and where it was listed |
| `details` | the company page (with `includeDetails` or a company link), else `null` |

Free rows say what happened to each search and link:

- `rowType: search` — one per term and town, or results link: `status` `ok`, `no_results` (the site has no company
  for it, or does not know the town), `not_a_list`, `disallowed`, `blocked`, `not_searched` (spending limit) or
  `unreadable`, with the site's own count (`totalListed`), the list it answered with and how it named the search.
- `rowType: link` — a company link that gave no business: `invalid`, `not_found` (the page was removed),
  `already_delivered` (a search of the run delivered it), `blocked`, `not_read` or `unreadable`, with the reason.

### Pricing

Pay per event, no subscription:

| event | price | when |
|---|---|---|
| `business` | US$0.001 | a business from a results page |
| `business-with-details` | US$0.002 | a business with its company page read (instead of `business`), and every company link |

1,000 Hungarian businesses cost US$1, or US$2 with their company pages. Search rows, link rows, Toprank cards repeated
on a page and businesses already delivered by an earlier search of the run are free. The run stops at your spending
limit before reading any page it could not pay for.

### Limits

- **Speed**: robots.txt asks for 3 seconds between requests, and the Actor keeps to it: about 400 businesses a minute
  from results lists (20 a page), about 20 a minute with company pages.
- Paid placements from nearby towns come first in every list, as on the site; filter on `city` if you need only the
  town itself.
- The tags (`categories`, `details.services`) are the advertiser's own keywords and can name other towns or brands.
- Town index pages (`/telepulesek/`) and `.php` pages are closed to automated readers by robots.txt and are free
  `invalid` rows; the Actor reads the site's default order.
- If the site refuses the connection or shows a bot check, the run stops asking, ends successfully and says so in free
  `blocked` rows; nothing is charged for them.

### Is the Aranyoldalak scraper legal?

The Actor reads public business listings that Aranyoldalak publishes for anyone, without a login, only on paths its
robots.txt allows, at the pace robots.txt asks, and never solves or bypasses a challenge. The data is about businesses,
but a listing can name a person (sole traders, egyéni vállalkozók): if you process it in a way the GDPR covers, you
are responsible for having a lawful basis, and Hungarian and EU rules on unsolicited marketing apply to how you contact
them. Check the site's terms for your use case.

This Actor is **unofficial** and is **not affiliated with, endorsed or sponsored by MTT Media Kft. or Aranyoldalak**.
Aranyoldalak is a trademark of its owner, named here only to say which site the Actor reads.

### Feedback

Something missing or a page the Actor cannot read? Open an issue on the Actor's Issues tab; answers come within days.

# Actor input Schema

## `searchTerms` (type: `array`):

What to search, one per line, in Hungarian as you would type it on the site: <code>autószerviz</code>, <code>fogorvos</code>, <code>ügyvéd</code>, <code>könyvelő</code>, <code>villanyszerelő</code>, <code>étterem</code>, or a company name. Each term is searched in every town. Up to 50.

## `locations` (type: `array`):

Where to search, one per line: a Hungarian town as the site writes it (<code>Budapest</code>, <code>Debrecen</code>, <code>Szeged</code>, <code>Győr</code>, <code>Pécs</code>). Leave empty to search all of Hungary. Up to 200.

## `startUrls` (type: `array`):

Links copied from aranyoldalak.hu, one per line: a results list (<code>https://aranyoldalak.hu/autok-es-koezlekedes/autoszervizek/budapest/</code>, or a later page such as <code>…/budapest/3-oldal/</code>) is walked from that page on; a company page (<code>https://aranyoldalak.hu/reflex-kft8.htm</code>) is read on its own and charged as a business with details. Town index pages are closed to automated readers by the site's robots.txt and are free rows. Up to 5,000.

## `maxResultsPerSearch` (type: `integer`):

Stop each term in each town (and each results link) after this many businesses. Budapest lists about 330 car repair shops, 20 a page. The run's spending limit is respected too.

## `includeDetails` (type: `boolean`):

Also read every business's own Aranyoldalak page: every phone number and website, every email, the service area (Működési terület), the full introduction, the services it lists, opening hours per day and its videos. Charged as <code>business-with-details</code> instead of <code>business</code>.

## Actor input object example

```json
{
  "searchTerms": [
    "autószerviz"
  ],
  "locations": [
    "Budapest"
  ],
  "maxResultsPerSearch": 10,
  "includeDetails": true
}
```

# Actor output Schema

## `rows` (type: `string`):

No description

## `summary` (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 = {
    "searchTerms": [
        "autószerviz"
    ],
    "locations": [
        "Budapest"
    ],
    "maxResultsPerSearch": 10,
    "includeDetails": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/aranyoldalak-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 = {
    "searchTerms": ["autószerviz"],
    "locations": ["Budapest"],
    "maxResultsPerSearch": 10,
    "includeDetails": True,
}

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/aranyoldalak-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 '{
  "searchTerms": [
    "autószerviz"
  ],
  "locations": [
    "Budapest"
  ],
  "maxResultsPerSearch": 10,
  "includeDetails": true
}' |
apify call steadyscrape/aranyoldalak-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadyscrape/aranyoldalak-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/uMC8ezTzyMV3wHddT/builds/DqxEoklVUbWdF2ucV/openapi.json
