# Pagini Aurii Scraper: Romanian Company Leads, CUI & Turnover (`steadyscrape/pagini-aurii-scraper`) Actor

Scrape Pagini Aurii (paginiaurii.ro), the Romania business directory: Romanian companies and leads by keyword and city with name, address, phone, email, website and CUI; optional company data from each page (CAEN, employees, turnover, profit). Export to JSON, CSV or Excel, or via API.

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

## Pricing

from $1.00 / 1,000 companies

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

## Pagini Aurii Scraper: Romanian company leads with CUI, CAEN and turnover

**Pagini Aurii Scraper** extracts Romanian businesses from [Pagini Aurii](https://www.paginiaurii.ro) (paginiaurii.ro), Romania's yellow pages, by keyword or activity (*domeniu de activitate*) and city: company name, address split into street, city, Bucharest sector, county and postal code, phone (also in +40 format), email, website, activity, coordinates, rating and the **fiscal code (CUI)**. Turn on company pages and every row also gets the **trade-register number, legal form, CAEN code, start date, status, number of employees, subscribed capital, turnover and profit** for the latest year, plus every phone and email, contact persons, description, products and services, opening hours, branches and reviews. No login, no browser. Export to JSON, CSV or Excel, or use the Pagini Aurii data via API.

### What the Pagini Aurii Scraper does

- Searches Pagini Aurii the way its own search box does: a keyword (`constructii`, `cabinete stomatologice`, `avocati`, `transport marfa`) in a place (`Cluj-Napoca`, `București, Sector 1`, `judetul Cluj`), or across Romania when no place is given.
- Walks every results page (20 companies a page) up to your maximum.
- Reads links you paste: searches (`/cauta/…`), activity lists (`/firmy/<place>/q_<activity>/1/`) and company pages (`/companii/…/L4473576/…/`).
- Optionally reads each company's own page for the registration and financial data (`company-with-details`).
- Delivers each company once per run, even when several searches find it.

### Use cases

- **B2B lead generation in Romania**: construction firms in Cluj, dental clinics in Bucharest, transport companies in Timiș, with phone, email and website.
- **Company research and prospect scoring**: filter by employees, turnover or profit, by CAEN code or by legal form (SRL, SA) before you call.
- **CRM enrichment**: join your list on the CUI (fiscal code) and add the trade-register number, CAEN activity, address and contacts.
- **Market sizing**: count the companies the site lists for an activity in each city or county.

### Input

| field | what it is |
|---|---|
| `searchTerms` | Keywords or activities, in Romanian, one per line (up to 50). Diacritics are optional. |
| `locations` | Cities, towns, communes, Bucharest sectors or counties (up to 200). Empty = all of Romania. Every keyword is searched in every place. |
| `startUrls` | Pagini Aurii links: searches, activity lists or company pages (up to 5,000). |
| `maxResultsPerSearch` | Companies per keyword and place (1–20,000, default 100). |
| `includeDetails` | Read each company page (charged `company-with-details` instead of `company`). |

```json
{
    "searchTerms": ["constructii", "cabinete stomatologice"],
    "locations": ["Cluj-Napoca", "București, Sector 1"],
    "maxResultsPerSearch": 200,
    "includeDetails": true
}
```

### Output example

One row per company (`rowType: "company"`), plus one free row per search (`rowType: "search"`) that says how many companies the site lists and how many were delivered, and a free row for any link that gave no company (`rowType: "link"`).

```json
{
    "rowType": "company",
    "id": "L6244245",
    "url": "https://www.paginiaurii.ro/companii/CLUJ-NAPOCA/L6244245/AMERICASA+SRL/",
    "name": "AMERICASA SRL",
    "category": "Garduri",
    "address": "STR. OCTAVIAN GOGA, Nr. 29, CLUJ-NAPOCA, Cod Postal 400698, Jud. CLUJ",
    "street": "STR. OCTAVIAN GOGA, Nr. 29",
    "city": "CLUJ-NAPOCA",
    "sector": null,
    "county": "CLUJ",
    "postalCode": "400698",
    "latitude": 46.7713,
    "longitude": 23.571829,
    "phone": "0721-360 669",
    "phoneInternational": "+40721360669",
    "email": "contact@americasa.ro",
    "website": "http://www.americasa.ro",
    "cui": "25468652",
    "rating": 4.9,
    "ratingCount": 12,
    "paidListing": true,
    "searchTerm": "constructii",
    "location": "Cluj-Napoca",
    "position": 1,
    "details": {
        "status": "Activ",
        "statusDate": "2024-12-31",
        "registrationNumber": "J24/463/2009",
        "legalForm": "SRL",
        "caenCode": "4752",
        "caenDescription": "Comert cu amanuntul al articolelor de fierarie, al articolelor din sticla si a celor pentru vopsit, in magazine specializate",
        "startDate": "2009-04-21",
        "employees": 2,
        "subscribedCapitalRon": 200,
        "turnoverRon": 3343073,
        "profitRon": 257025,
        "financialsDate": "2024-12-31",
        "phones": [{ "number": "0721-360 669", "international": "+40721360669", "type": "phone", "note": null }],
        "emails": ["contact@americasa.ro"],
        "activities": ["Garduri"],
        "openingHours": [{ "day": "Luni", "hours": "9:00 - 17:00" }],
        "reviews": [{ "author": "Elena Costea", "text": "Modele de gard frumoase, culori diverse." }]
    }
}
```

### Fields

| field | from | meaning |
|---|---|---|
| `name`, `category`, `url`, `id` | results card | company name, its activity on Pagini Aurii, its page and id |
| `address`, `street`, `city`, `sector`, `county`, `postalCode` | results card | the address as written, and split; `sector` only in Bucharest; postal codes always six digits |
| `latitude`, `longitude` | results card | where the site's map places it (when it does) |
| `phone`, `phoneInternational` | results card | the first phone, and in +40 format |
| `email`, `website` | results card | when the company gave them to the site |
| `cui` | results card | fiscal code (*cod fiscal*) |
| `rating`, `ratingCount` | results card | stars and number of ratings; `null` / 0 when unrated |
| `paidListing` | results card | the company pays Pagini Aurii for its listing |
| `snippet` | results card | the start of the company's description, as paid listings show it on the card |
| `searchTerm`, `location`, `position`, `searchUrl` | the search | which search found it, and where in the list |
| `details.registrationNumber`, `legalForm`, `caenCode`, `caenDescription`, `startDate`, `status`, `statusDate` | company page | trade-register facts, and the day the status is for; registration numbers (`J12/1617/2003` or the new `J2005004355121` form) |
| `details.employees`, `subscribedCapitalRon`, `turnoverRon`, `profitRon`, `financialsDate` | company page | latest year's figures in lei; a loss is a negative profit |
| `details.phones`, `emails`, `websites`, `contactPersons`, `branches` | company page | every number with its type (phone, mobile, fax) and note, every email and website, named contacts |
| `details.description`, `tagline`, `activities`, `productsAndServices`, `keywords`, `brands`, `serviceAreas`, `openingHours`, `paymentMethods`, `logoUrl`, `reviews` | company page | everything else the profile shows |

### Pricing

Pay per result, no subscription:

- **US$0.001 per company** from the results (`company`).
- **US$0.002 per company with its page** (`company-with-details`), instead of the above.

Search rows, companies not found, invalid links, searches the site finds nothing for and searches it cannot take are free. The run stops at your spending limit before reading anything it cannot charge.

### Limits and good to know

- **Pagini Aurii serves each results page in one of two orders** (the same page asked twice can list different companies). The Actor asks pages that came in only one order again until it has seen every company the site counts, up to four more rounds; when it still falls short, the search row says how many of the listed companies were found. With a maximum below the site's count this does not matter.
- Characters the site refuses in a search (`:` `?` `<` `>`) are dropped, as its own search box does; a keyword and place longer than about 245 characters together is a free `invalid` search row (the site refuses longer addresses).
- **The search is the site's own**: a keyword brings related activities too (`stomatologie` in Bucharest also lists veterinary clinics). For one exact activity, paste its activity link (`/firmy/<place>/q_<activity>/1/`).
- The counts are the site's own: `constructii` across Romania counts 157,877 companies, in Cluj-Napoca 4,210.
- Financial figures are the latest year the site shows for that company (2021 to 2025, the year is in `financialsDate`); many small companies show no turnover or employees.
- Reviews have the reviewer's name and text only: the site shows no stars or dates per review. Ratings are the site's own.
- The site's demo listings ("ANUNŢ EXEMPLU PAGINIAURII.RO") are skipped and never charged.
- Pagini Aurii refuses cloud IPs, so the Actor fetches through Apify Proxy (datacenter), at a visitor's pace.

### Is it legal to scrape Pagini Aurii?

The Actor reads only public pages that any visitor sees without an account, at a visitor's pace, and follows paginiaurii.ro's robots.txt (it never requests the paths it closes). The data is business contact information that companies publish to be found. If you process personal data (for example contact persons' names, which some sole traders and small firms list), the GDPR applies to you: have a lawful basis, such as legitimate interest for B2B outreach, and respect objections. This Actor is not affiliated with FCR Media or Pagini Aurii.

# Actor input Schema

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

What to search, one per line, in Romanian as you would type it on paginiaurii.ro: an activity (<code>constructii</code>, <code>cabinete stomatologice</code>, <code>avocati</code>, <code>transport marfa</code>), a product or a company name. Diacritics are optional (<code>construcții</code> and <code>constructii</code> give the same list). Each keyword is searched in every place. Up to 50.

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

Where to search, one per line: a city, town or commune (<code>Cluj-Napoca</code>, <code>Timișoara</code>, <code>Brașov</code>), a Bucharest sector (<code>București, Sector 1</code>) or a county (<code>judetul Cluj</code>). Leave empty to search all of Romania. Up to 200.

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

Links copied from paginiaurii.ro, one per line: a search (<code>https://www.paginiaurii.ro/cauta/constructii/</code>) or an activity list (<code>https://www.paginiaurii.ro/firmy/CLUJ-NAPOCA/q_construc%C5%A3ii/1/</code>) is walked like a search from its first page; a company page (<code>https://www.paginiaurii.ro/companii/…/L4473576/…/</code>) is read on its own and charged as a company with details. Up to 5,000.

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

Stop each keyword in each place (and each results link) after this many companies. Cluj-Napoca lists 4,210 construction companies; the site shows 20 per page. The run's spending limit is respected too.

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

Also read every company's own Pagini Aurii page: trade-register number, legal form, CAEN code, start date, status, number of employees, subscribed capital, turnover and profit for the latest year, every phone (mobile, fax) and email, contact persons, description, products and services, opening hours per day, branches and user reviews. Charged as <code>company-with-details</code> instead of <code>company</code>.

## Actor input object example

```json
{
  "searchTerms": [
    "constructii"
  ],
  "locations": [
    "Cluj-Napoca"
  ],
  "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": [
        "constructii"
    ],
    "locations": [
        "Cluj-Napoca"
    ],
    "maxResultsPerSearch": 10,
    "includeDetails": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/pagini-aurii-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": ["constructii"],
    "locations": ["Cluj-Napoca"],
    "maxResultsPerSearch": 10,
    "includeDetails": True,
}

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/pagini-aurii-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": [
    "constructii"
  ],
  "locations": [
    "Cluj-Napoca"
  ],
  "maxResultsPerSearch": 10,
  "includeDetails": true
}' |
apify call steadyscrape/pagini-aurii-scraper --silent --output-dataset

```

## MCP server setup

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