# okidoki.ee — Estonia classifieds

> Search okidoki.ee adverts by text, category, seller, price, condition, seller type and location. One page of advert cards with price, photo, seller type and the date the site shows, plus the site's own total.
> ReefAPI engine `okidoki` · 5 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/okidoki/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/okidoki/v1/search — 3 credits
Search okidoki.ee adverts by text, category, seller, price, condition, seller type and location. One page of advert cards with price, photo, seller type and the date the site shows, plus the site's own total.

**Parameters:**
- `query` (string, optional) — Free-text search, as typed into okidoki's search box (Estonian or Russian). One of query / category / seller_id is required.
- `category` (integer, optional) — One numeric category_id from the `categories` action (e.g. 1403 = mobile phones, 1601 = cars, 1505 = flats). Combines with query.
- `seller_id` (string, optional) — A seller's id (`seller.id` from `listing`): lists that seller's adverts. Combine with seller_type=company to check whether the seller is a business.
- `page` (integer, optional, default 1) — Page number. The site stops at page 100 and at a total of 5 000; a page past the end returns 0 rows with page_clamped=true.
- `per_page` (enum, optional, default "50") — Rows per page — only the sizes the site offers. [one of: 25, 50, 100, 200]
- `sort` (enum, optional, default "newest") — Ordering. Default newest (by the date the site shows). [one of: newest, oldest, price_asc, price_desc]
- `condition` (enum, optional) — Item condition as the seller declared it. Adverts with no declared condition are excluded by either value. [one of: new, used]
- `seller_type` (enum, optional, default "all") — Private persons or businesses. [one of: all, private, company]
- `min_price` (number, optional) — Lowest price in EUR (the site's own price filter).
- `max_price` (number, optional) — Highest price in EUR (the site's own price filter).
- `location` (string, optional) — One location token from the `locations` action: r<id> county, m<id> municipality, p<id> place (r1 = Harjumaa, m1 = Tallinn, p532 = Pärnu). One level only.
- `negotiable` (boolean, optional) — Only adverts where the seller accepts price offers.
- `with_video` (boolean, optional) — Only adverts with a video.
- `urgent` (boolean, optional) — Only adverts marked urgent.
- `deposit` (boolean, optional) — Only adverts that can be bought through okidoki's deposit (escrow) checkout.

**Returns:** {total, total_capped, page, per_page, last_page, has_more, page_clamped, applied, rows:[{id, url, title, price, price_min, price_max, price_type, price_period, is_free, currency, price_text, price_per_m2, image, photo_count, seller_type, company_name, identity_verified, data_verified, labels, shown_date, shown_date_text}]}

**Example request body:**
```json
{
  "query": "iphone",
  "category": 1403
}
```

### POST https://api.reefapi.com/okidoki/v1/listing — 2 credits
One okidoki advert in full: title, category path, price (fixed / from / up to / range, period), condition, all attributes (car, flat and job parameters included), location, description, every photo, view counts, the date the site shows, and the seller block.

**Parameters:**
- `id` (integer, required) — The advert id (`id` in search rows, the number at the end of an okidoki /item/ URL).

**Returns:** {listing:{id, url, title, category_path, category_id, price…, itemprop_price, price_mismatch, price_per_m2, negotiable, deposit_purchase, condition, location, address, description, featured, attributes:[{section,name,value}], shown_date, views_total, views_today, photos, seller:{id, name, avatar, identity_verified, data_verified, member_since, feedback_score_pct, listing_count, listings_url}}}

**Example request body:**
```json
{
  "id": 14143313
}
```

### POST https://api.reefapi.com/okidoki/v1/categories — 2 credits
okidoki's full category tree (about 660 nodes) with the site's live advert count per category. Use category_id in search.

**Parameters:**
- `parent` (integer, optional) — Only this category and everything under it (category_id). Omit for the whole tree.

**Returns:** {count, categories:[{category_id, node_id, name, path, parent_category_id, depth, listing_count, url, has_children}]}

**Example request body:**
```json
{
  "parent": 16
}
```

### POST https://api.reefapi.com/okidoki/v1/locations — 1 credit
Resolve an Estonian place name to okidoki location tokens (county / municipality / place) for search's `location` filter.

**Parameters:**
- `query` (string, required) — At least 2 letters of a place name.

**Returns:** {locations:[{location, level, name, parents}]}

**Example request body:**
```json
{
  "query": "tartu"
}
```

### POST https://api.reefapi.com/okidoki/v1/suggest — 1 credit
okidoki's own search autocomplete: popular queries for what was typed, some scoped to a category.

**Parameters:**
- `query` (string, required) — At least 2 characters.

**Returns:** {suggestions:[{query, category_name, category_id, is_category}]}

**Example request body:**
```json
{
  "query": "iphone"
}
```

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=okidoki
- Human docs page: https://reefapi.com/docs/okidoki
- Overview page: https://reefapi.com/okidoki-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
