# 1182.ee Scraper: Estonian Business Leads, Emails & Phones (`steadyscrape/1182-ee-scraper`) Actor

Scrape 1182.ee, Estonia's business directory: company name, address, town, county and coordinates by keyword and place; optionally each company card with email, every phone, website, registry code (registrikood), opening hours and socials. No login. Export data to JSON, CSV or Excel, or via API.

- **URL**: https://apify.com/steadyscrape/1182-ee-scraper.md
- **Developed by:** [Steady Scrape](https://apify.com/steadyscrape) (community)
- **Categories:** Lead generation, Business
- **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

## 1182.ee Scraper — Estonian business leads with emails, phones and registry codes

Scrape **1182.ee**, Estonia's business directory (the 1182 information service), by keyword and place: every company
as one clean row with **name, address split into street, postcode, town, district and county, coordinates and its
1182.ee profile link**. Turn on the company cards and each row also carries the **email, every phone (also in +372
format), website, registry code (registrikood) and legal name**, plus opening hours per day, Facebook and other
social links, description, slogan and photos.

Search `ehitus` in `Tallinn`, `autoremont` in `Tartu`, `raamatupidamine` across Estonia — or paste company pages and
searches straight from 1182.ee. You pay per business delivered; searches without results and links that give nothing
are free rows that say why. Export to JSON, CSV or Excel, or read it via the Apify API.

### Who uses 1182.ee data

- **B2B sales and lead generation in Estonia**: a list of construction firms in Tallinn or car repairs in Tartu with
  an email and a phone for each, ready for a CRM.
- **Market research**: how many businesses of a kind there are per town and county, with coordinates for a map.
- **Data enrichment**: the registry code (registrikood) joins each row to the Estonian business register
  (e-äriregister) and to your own customer data.
- **Agencies and directories** checking which companies list a website or social profile.

### How the 1182.ee Scraper works

1. **Search** (`searchTerms`, optional `locations`): the Actor asks 1182.ee's own search, the same one its results
   page uses, 20 results per request, page after page until your maximum. The site matches **business names**, so the
   Estonian word works best (`ehitus` construction, `autoremont` car repair, `hambaravi` dentistry, `raamatupidamine`
   accounting, `ilusalong` beauty salon, `kohvik` café). A place narrows the search to addresses that name it, with the
   site's own address filter; without places the whole of Estonia is searched.
2. **Company card** (`includeDetails`): for every business the Actor reads the card its profile page shows, with the
   email, phones, website, registry code, legal name, opening hours and social links.
3. **Links** (`startUrls`): a company page (`https://www.1182.ee/nordauto`) is read from its card; a search link
   (`https://www.1182.ee/otsing/autoremont`) is run like a search term.

A business that two searches find (a town and the whole country) is delivered and charged once per run. Measured on
2026-11-01: 84 of 84 company cards sampled had an email, 67 a phone, every one a registry code; 22 listed a website.

### 1182.ee Scraper input example

```json
{
    "searchTerms": ["ehitus", "autoremont"],
    "locations": ["Tallinn", "Tartu"],
    "maxResultsPerSearch": 100,
    "includeDetails": true
}
```

Every term is searched in every place: this input runs four searches. Leave `locations` empty to search all of
Estonia.

### 1182.ee data output example

A business read with its company card (`business-with-details`):

```json
{
    "rowType": "business",
    "id": 651089,
    "companyId": 643712,
    "url": "https://www.1182.ee/nordauto",
    "name": "Nordauto",
    "address": "Kadaka tee 72A, 12618 Tallinn",
    "street": "Kadaka tee 72A",
    "postalCode": "12618",
    "city": "Tallinn",
    "district": null,
    "municipality": null,
    "county": null,
    "latitude": 59.406203982078,
    "longitude": 24.655297734677,
    "category": null,
    "logoUrl": "https://www.1182.ee/api/portal/scoro-images/1215",
    "email": "info@nordauto.ee",
    "phone": "6003659",
    "phoneInternational": "+3726003659",
    "website": "https://www.nordauto.ee",
    "registryCode": "11985111",
    "legalName": "OÜ Nordauto Grupp",
    "searchTerm": null,
    "location": null,
    "position": null,
    "details": {
        "otherPhones": [],
        "socials": {
            "facebook": "https://www.facebook.com/NordautoGrupp",
            "instagram": null,
            "linkedin": null,
            "tiktok": null,
            "x": null,
            "xing": null
        },
        "openingHours": [
            {
                "day": "Monday",
                "hours": "09:00–18:00"
            },
            {
                "day": "Tuesday",
                "hours": "09:00–18:00"
            },
            {
                "day": "Wednesday",
                "hours": "09:00–18:00"
            },
            {
                "day": "Thursday",
                "hours": "09:00–18:00"
            },
            {
                "day": "Friday",
                "hours": "09:00–18:00"
            },
            {
                "day": "Saturday",
                "hours": "10:00–15:00"
            }
        ],
        "rating": null,
        "reviewCount": null,
        "description": "Teenindus E-R 8-18\n\nNordauto Grupp OÜ on tegelenud autode müügiga enam kui 5 aastat ja on üks suurimaid siseruumides teg…",
        "slogan": "Sinu usaldusväärseim autopartner Eestis",
        "claimed": false,
        "listingPackage": "maxi",
        "photoUrls": []
    },
    "scrapedAt": "2026-11-01T12:00:00.000Z"
}
```

Without the card (`business`), `email`, `phone`, `phoneInternational`, `website`, `registryCode` and `legalName` are
`null` and `details` is `null`; the address, coordinates and profile link are there.

#### Business fields (`rowType: business`, charged)

| field | what it is |
|---|---|
| `id`, `companyId` | 1182.ee's location id and company id (a company with several branches has one `companyId`) |
| `url` | the business's page on 1182.ee |
| `name` | the name the business is listed under |
| `address` | street, postcode and place on one line |
| `street`, `postalCode`, `city`, `district`, `municipality`, `county` | the address split: `city` is the town or village (`Keila`, `Pinska küla`), `district` a city district (`Lasnamäe linnaosa`), `municipality` a rural municipality (`Viljandi vald`), `county` the maakond when the address names it |
| `latitude`, `longitude` | coordinates, `null` when the site has none |
| `category` | the category 1182.ee shows, when it shows one |
| `logoUrl` | the business's logo |
| `email`, `phone`, `phoneInternational`, `website` | contacts from the company card: the main phone as written and in +372 format; a website without `https://` gets it |
| `registryCode`, `legalName` | the registry code (registrikood) and the legal name of the company behind the listing |
| `searchTerm`, `location`, `position` | the search that found it and its place in the results (`null` for a pasted link) |
| `details.otherPhones` | every other phone, each with its type (`mobile`, `landline`) and +372 form |
| `details.openingHours` | one entry per day the card names: `09:00–18:00`, split shifts joined, `closed`, `open 24 hours` |
| `details.socials` | Facebook, Instagram, LinkedIn, TikTok, X and XING when listed |
| `details.rating`, `details.reviewCount` | the rating 1182.ee shows, when it shows one |
| `details.description`, `details.slogan`, `details.photoUrls` | what the business wrote about itself and its photos |
| `details.claimed`, `details.listingPackage` | whether the company claimed its listing, and its 1182.ee package (`free`, `mini`, `midi`, `maxi`) |
| `scrapedAt` | when it was read (UTC) |

#### Free rows

- `rowType: search` — one per search: `status` (`ok`, `no_results`, `blocked`, `not_searched` when the spending limit
  was reached first, `unreadable`), how many businesses 1182.ee lists for it, how many were delivered, duplicates
  skipped, and the reason when it is not `ok`.
- `rowType: link` — a pasted link that gave no business: `invalid` (not a 1182.ee company page or search),
  `not_found` (the site has no business there), `blocked`, `not_read` (spending limit), `unreadable`.

The run's `SUMMARY` record counts everything.

### 1182.ee Scraper pricing

| event | price | when |
|---|---|---|
| `business` | US$0.001 | a business as the search lists it |
| `business-with-details` | US$0.002 | instead of `business`, when its company card was read (`includeDetails`, and every pasted company page) |

1,000 businesses cost US$1; with their company cards (email, phones, registry code) US$2. Free rows cost nothing, and
a card that cannot be read leaves the row at the `business` price. Set a spending limit on the run and the Actor stops
before reading anything it would not pay for.

### Limits of 1182.ee data

- 1182.ee's search matches business names, not trades: `restoran` finds 24 businesses named so, not every restaurant.
  Run several words (`restoran`, `kohvik`, `pizza`, `söögikoht`) to cover a trade.
- A place filters by what the address says. Many addresses name only the town, so `Tallinn` finds more than
  `Harju maakond`.
- One request every 0.3 s: about 20 seconds for 1,000 businesses from the search, about 5 minutes with their cards.
- If 1182.ee refuses (a firewall answer or a bot check), the Actor retries twice from another IP, never solves a
  challenge, and then stops asking: the rest are free `blocked` rows and the run still ends successfully.
- Reviews: no company card sampled on 2026-11-01 carried a rating or a review, so `rating` and `reviewCount` are
  usually `null`.
- The data is what each business publishes on 1182.ee. It can be outdated; check the Estonian business register
  before relying on it for a contract.

### Is it legal to scrape 1182.ee?

This Actor reads only public data — 1182.ee's search and the company cards its profile pages show, which the site
lists in its own sitemaps and its robots.txt leaves open to every crawler — at a visitor's pace, never signs in and
never bypasses any protection. It reads only the public routes the site's own pages call. **Using the data is your
responsibility.** In particular:

- **Cold email and calls**: EU rules on unsolicited electronic marketing (the ePrivacy Directive, as Estonia
  applies it) and Estonian consumer and advertising law can require consent or an opt-out; check them before you
  contact anyone.
- **GDPR**: names, emails and phones of sole traders (FIE) and of people named in a listing are personal data. You need
  a legal basis (for example legitimate interest, with a balancing test), must inform the people you contact, honour
  objections, and keep the data only as long as needed.

This Actor is unofficial: it is **not affiliated with, endorsed or sponsored by 1182.ee, Nobel Digital or Nobel
Software**. Read more in Apify's blog post on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Feedback

A search that gives a wrong row, or a field you need? Open an issue with the search or the link: every fix is tested
against the real site.

# Actor input Schema

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

What to search, one per line, the way you would type it on 1182.ee. The site matches business names, so Estonian words work best: <code>ehitus</code> (construction), <code>autoremont</code> (car repair), <code>hambaravi</code> (dentistry), <code>raamatupidamine</code> (accounting), <code>ilusalong</code> (beauty salon), <code>kohvik</code> (café), or a company name. Each term is searched in every place. Up to 100.

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

Narrow each search to businesses whose address names the place, with the site's own address filter, one per line: a town (<code>Tallinn</code>, <code>Tartu</code>, <code>Pärnu</code>, <code>Narva</code>), a district (<code>Lasnamäe linnaosa</code>) or a county (<code>Harju maakond</code>; many addresses do not name their county, so a town finds more). Leave empty to search all of Estonia. Up to 100.

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

Links copied from 1182.ee, one per line: a company page (<code>https://www.1182.ee/nordauto</code> or <code>https://www.1182.ee/portal/location/651089</code>) is read from its company card and charged as a business with details; a search (<code>https://www.1182.ee/otsing/autoremont</code>) is run across Estonia like a search term. Up to 5,000.

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

Stop each search term in each place (and each pasted search) after this many businesses. "ehitus" lists 131 businesses in Tallinn and 330 across Estonia; the site answers 20 per request. The run's spending limit is respected too.

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

Also read every business's company card: email (84 of 84 cards sampled had one), every phone with its type and in +372 format, website, registry code (registrikood) and legal name, opening hours per day, Facebook and other social links, description, slogan, photos and listing package. Charged as <code>business-with-details</code> instead of <code>business</code>.

## Actor input object example

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

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

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

```

## MCP server setup

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