# okidoki.ee Scraper - Estonia Classifieds & Marketplace (`studio-amba/okidoki-ee-scraper`) Actor

Scrape classified listings from okidoki.ee, Estonia's largest general marketplace. Extract cars, real estate, electronics, fashion, jobs and more. Search by keyword or category. No login or cookies required.

- **URL**: https://apify.com/studio-amba/okidoki-ee-scraper.md
- **Developed by:** [Studio Amba](https://apify.com/studio-amba) (community)
- **Categories:** E-commerce
- **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

## okidoki.ee Scraper

Scrape classified listings from okidoki.ee, Estonia's largest general classifieds marketplace. Extract cars, real estate, electronics, fashion, jobs, and more across every category. No login or cookies required.

### Why use this actor?

okidoki.ee is Estonia's biggest general classifieds site, with tens of thousands of live listings spanning vehicles, real estate, electronics, fashion, jobs, and home goods. This actor searches by keyword or category, follows pagination automatically, and pulls full listing detail (description, condition, seller, location, photos) from each item's own page.

**Use cases:**

- **Price intelligence** — track asking prices for electronics, furniture, and vehicles in the Estonian market
- **Car market analysis** — monitor used car listings and pricing across Estonia
- **Real estate monitoring** — track apartment and house listings by city and county
- **Lead generation** — find active private and business sellers on Estonia's largest marketplace
- **Market research** — measure listing volume and pricing trends across categories
- **Cross-border sourcing** — spot deals on goods listed in Estonia

No cookies, no login, no session management — set a keyword or category and get back structured JSON.

### Input

| Field | Type | Required | Description |
|-------|------|----------|--------------|
| `searchQuery` | String | No | Keyword to search for (e.g. "iphone", "sohva", "auto"). Leave empty to browse the newest listings across all categories. |
| `category` | String | No | okidoki.ee numeric category ID to browse instead of / alongside the keyword, e.g. `26` (Electronics), `30` (Fashion & beauty), `1601` (Cars), `1505` (Apartments). |
| `maxResults` | Integer | No | Maximum number of listings to return (default: 100, max: 5,000). |
| `scrapeDetails` | Boolean | No | Visit each listing's detail page for full description, condition, seller info, location, category breadcrumb, and all photos (default: true). Uses one extra request per listing. |
| `brightDataApiKey` | String | No | Your own Bright Data Web Unlocker API key, if you want to use your own account instead of the actor's built-in access. |
| `proxyConfiguration` | Object | No | Kept for compatibility — requests are routed through Bright Data Web Unlocker, so Apify proxies are not used. |

### Output

Each result contains:

| Field | Type | Example |
|-------|------|---------|
| `id` | String | `"13704777"` |
| `title` | String | `"iPhone 12 Pro 256GB - A+++ Seisukord"` |
| `price` | Number | `230` (0 for free/"Tasuta" listings) |
| `currency` | String | `"EUR"` |
| `condition` | String | `"Kasutatud"` (detail page only) |
| `city` | String | `"Tallinn"` (detail page only) |
| `county` | String | `"Harjumaa"` (detail page only, not every listing has one) |
| `sellerName` | String | `"enricos"` (detail page only) |
| `sellerVerified` | Boolean | `false` (detail page only) |
| `imageUrl` | String | Primary thumbnail from the search result card |
| `imageUrls` | Array | Full-size photos (detail page only) |
| `listingDate` | String | ISO 8601 date/time the listing was posted |
| `category` | String | `"Elektroonika"` (detail page only) |
| `categoryPath` | Array | `["Elektroonika", "Telefonid", "Mobiiltelefonid"]` (detail page only) |
| `description` | String | Full listing description text (detail page only) |
| `url` | String | Full listing URL |
| `scrapedAt` | String | ISO 8601 timestamp |

### Example output

```json
{
    "id": "13704777",
    "title": "iPhone 12 Pro 256GB - A+++ Seisukord - Battery Health 86%",
    "price": 230,
    "currency": "EUR",
    "imageUrl": "https://images.okidoki.st/13704777/39275664_10.jpg",
    "listingDate": "2026-07-29",
    "url": "https://www.okidoki.ee/item/iphone-12-pro-256gb-a-seisukord-battery-health-86/13704777/",
    "scrapedAt": "2026-08-20T17:03:03.766Z",
    "categoryPath": ["Elektroonika", "Telefonid", "Mobiiltelefonid"],
    "category": "Elektroonika",
    "city": "Tallinn",
    "description": "Müüa väga heas korras ilma iluvigadeta iPhone 12 Pro 256GB Battery Health 86%...",
    "condition": "Kasutatud",
    "sellerName": "enricos",
    "sellerVerified": false,
    "imageUrls": [
        "https://images.okidoki.st/13704777/39275664_2.jpg",
        "https://images.okidoki.st/13704777/39275667_2.jpg"
    ]
}
```

### Tips for best results

**Browse without a keyword:** Leave `searchQuery` empty to get the newest listings across all categories — okidoki.ee sorts them by recency by default.

**Narrow with a category ID:** Combine `category` with `searchQuery` to search within one vertical only, e.g. category `26` (Electronics) + query "iphone".

**Disable detail scraping for speed:** Set `scrapeDetails` to false to only extract list-page fields (title, price, image, date). Faster, but you lose description, condition, seller, location, and full photo set.

**Deep categories:** Only the top-level category IDs are documented above, but okidoki.ee has hundreds of subcategory IDs. Browse the site, copy the numeric ID from the URL, and pass it directly.

### Categories available

| ID | Category (Estonian) | English |
|----|----------------------|---------|
| `361267` | Töö | Jobs |
| `30` | Mood, stiil ja ilu | Fashion & beauty |
| `19` | Lastetarbed | Kids |
| `20` | Kodu ja aed | Home & garden |
| `26` | Elektroonika | Electronics |
| `23` | Meelelahutus ja hobid | Entertainment & hobbies |
| `31` | Sporditarbed | Sports |
| `35` | Teenused | Services |
| `3611` | Loomad | Animals |
| `17` | Kõik äri jaoks | Business |
| `1505` | Korterid | Apartments (real estate) |
| `1601` | Sõiduautod | Cars (transport) |

### Cost estimate

This actor uses Bright Data Web Unlocker to bypass okidoki.ee's Cloudflare protection. With `scrapeDetails` enabled (default), expect roughly one extra request per listing on top of the shared list-page requests — a typical 100-result run costs a small fraction of a cent per result in underlying proxy usage. A run's usage cost only settles after it reports SUCCEEDED — reading the dataset mid-run will show a cost lower than the final total.

### Limitations

- Listing content is in Estonian. Category names, conditions, and descriptions are not translated.
- `county` is only populated when okidoki.ee's own address field includes one — some cities (e.g. Tallinn) are shown without a county.
- Data is scraped from the public website and may change without notice.
- Respect the website's terms of service and use responsibly.

### How to scrape okidoki.ee data

1. Go to this actor's page on the [Apify Store](https://apify.com/store).
2. Click **Try for free** to open it in Apify Console.
3. Enter a search keyword, a category ID, or leave both empty to browse the newest listings.
4. Set the maximum number of results and toggle detail-page scraping if needed.
5. Click **Start** and wait for the run to finish.
6. Download your data in JSON, CSV, Excel, or connect it to your workflow via API.

You can also schedule regular runs, set up webhooks for real-time notifications, or integrate the results directly into your application using the [Apify API](https://docs.apify.com/api).

### 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`):

Keyword to search for (e.g. 'iphone', 'sohva', 'auto'). Leave empty to browse the newest listings across all categories instead.

## `category` (type: `string`):

Optional okidoki.ee numeric category ID to browse instead of / in addition to the keyword, e.g. '26' (Electronics), '30' (Fashion & beauty), '1601' (Cars), '1505' (Apartments). Leave empty to search all categories.

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

Maximum number of listings to return.

## `scrapeDetails` (type: `boolean`):

Visit each listing's detail page to extract full description, condition, seller info, location (city/county), category breadcrumb, and all photos. Slower and uses one extra request per listing, but far more complete data.

## `brightDataApiKey` (type: `string`):

Your Bright Data API key for the Web Unlocker zone. Required to bypass okidoki.ee's Cloudflare protection. Get one at https://brightdata.com

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

Kept for compatibility — requests are routed through Bright Data Web Unlocker, so Apify proxies are not used.

## Actor input object example

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

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

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

```

## MCP server setup

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