# Teknosa API scraper — search teknosa.com (Turkish electronics + marketplace) and read full product records: TRY price with struck price and TeknoClub member price kept apart, buy-box seller and every other seller's offer, rating histogram, specifications, EAN barcode, images and reviews. No account, no browser.

> Search teknosa.com by keyword or browse a category, one row per listing: product code, title, brand, image, public price in TRY with struck price and discount, the TeknoClub members-only price as its own field, seller (Teknosa or marketplace shop), rating and review count, EAN barcode, category path and whether the row is a sponsored ad. Filter by seller, brand and price range, sort the way the site does, page through results. The response lists the sellers, brands, price bands and sub-categories available.
> ReefAPI engine `teknosa` · 4 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/teknosa/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, `Authorization: Bearer <key>`) and your assistant can call these actions directly.

## Endpoints

### POST /teknosa/v1/search — 1 credit
Search teknosa.com by keyword or browse a category, one row per listing: product code, title, brand, image, public price in TRY with struck price and discount, the TeknoClub members-only price as its own field, seller (Teknosa or marketplace shop), rating and review count, EAN barcode, category path and whether the row is a sponsored ad. Filter by seller, brand and price range, sort the way the site does, page through results. The response lists the sellers, brands, price bands and sub-categories available.

**Parameters:**
- `query` (string, optional) — What to look for on teknosa.com — a Turkish keyword ('kulaklık', 'robot süpürge'), a brand or a model. Optional when `category` is given.
- `category` (string, optional) — Browse a category instead of (or as well as) searching: a teknosa.com category URL or path (…/cep-telefonu-c-100001) or its numeric code (100001).
- `page` (integer, optional, default 1) — Result page, 1-based. Teknosa pages hold about 20 products.
- `sort` (enum, optional, default "relevance") — Result order — only the orderings teknosa.com itself offers. [one of: relevance, newest, best_selling, most_favorited, price_asc, price_desc]
- `seller` (string, optional) — Only listings from this seller: the `value` returned in `filters.sellers` ('teknosa' = sold by Teknosa itself).
- `brand` (string, optional) — Only this brand: the numeric `code` returned in `filters.brands` (2299 = JBL).
- `min_price` (number, optional) — Lowest price in TRY (inclusive).
- `max_price` (number, optional) — Highest price in TRY (inclusive).
- `include_fallback_results` (boolean, optional, default false) — teknosa.com fills a keyword with no real match with unrelated products. Default false: when no product on the page contains a query word, results is empty and fallback_results_dropped counts what was dropped. true: those products are returned apart, in fallback_results.
- `max_rotations` (integer, optional, default 4) — Advanced: how many times to retry a difficult request (1-8, default 4 — leave unchanged for typical use).

**Returns:** results[]{position, product_id, title, brand, url, image, sponsored (Teknosa ad row), price (TRY — the public price), currency, was_price (struck-through price, null when none), discount_percent, discount_amount, member_price (TeknoClub members-only price, null when none), member_price_label, installment{months, monthly_amount, same_as_cash_price}, seller{name, shop_id, is_teknosa}, rating (1-5, null when unrated), review_count, rating_scale, in_stock (true only on Teknosa's own in-stock flag, else null), stock_label, free_shipping, category, category_path[], barcode (GTIN-validated EAN), mpn, badges[]}, count, sponsored_count, page, total_results (Teknosa's own count; 0 when the page was fallback), total_pages, page_notice, sort, query, category, keyword_matches_on_page (products on the page containing a query word; null for a category browse), fallback_results_dropped, fallback_total (Teknosa's count for the dropped fallback, when dropped), fallback_results[] (only with include_fallback_results=true), filters{sellers[]{name, value, count}, brands[]{name, code, count}, price_bands[]{label, min, max, count}, categories[]{name, code, count}}

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

### POST /teknosa/v1/product/detail — 1 credit
The full Teknosa product record by product code or URL: title, brand, public price in TRY with struck price and discount, TeknoClub member price, instalment offer, product campaigns, the buy-box seller with badges and every other seller's offer and price, dispatch time, availability, rating with per-star breakdown, all images, breadcrumb, specifications table, description and bullet points, EAN barcode and MPN.

**Parameters:**
- `product_id` (string, required) — Teknosa product code as returned in `product_id` by `search` (100000060317), or a full teknosa.com product URL.
- `seller_id` (string, optional) — Render the product for one seller's offer: `seller_id_param` from `other_offers[]` ('teknosa' or a numeric shop id). Default = the buy-box seller Teknosa shows first.
- `max_rotations` (integer, optional, default 4) — Advanced: how many times to retry a difficult request (1-8, default 4 — leave unchanged for typical use).

**Returns:** product{product_id, product_codes[], title, brand, brand_url, url, price, currency, was_price, discount_percent, discount_amount, member_price, member_price_label, schema_org_price, campaigns_count, campaigns[] (basket-level offers — NOT applied to price), seller{name, shop_id, store_url, is_teknosa, badges[]}, offer_id, other_offers[]{seller{…}, price, was_price, currency, dispatch, url, seller_id_param}, dispatch{min_business_days, max_business_days, text}, availability, teknosa_stock_label, rating, review_count, rating_scale, rating_breakdown{'1'..'5'}, images[], breadcrumb[]{name, url}, category_path[], barcode, mpn, favorites_count, specifications[]{name, value, unit}, description, bullet_points[], variants (null — not published server-side)}

**Example request body:**
```json
{
  "product_id": "100000060317"
}
```

### POST /teknosa/v1/product/reviews — 1 credit
Customer reviews of one Teknosa product, 5 per page as on the site: star rating, title, text, date, which seller the reviewer bought from and whether they are a verified buyer, plus the product's rating and per-star breakdown. Sort newest, oldest, or by stars.

**Parameters:**
- `product_id` (string, required) — Teknosa product code as returned in `product_id` by `search` (100000060317), or a full teknosa.com product URL.
- `page` (integer, optional, default 1) — Review page, 1-based (5 reviews per page, as on teknosa.com).
- `sort` (enum, optional, default "newest") — Review order. [one of: newest, oldest, rating_desc, rating_asc, site_default]
- `max_rotations` (integer, optional, default 4) — Advanced: how many times to retry a difficult request (1-8, default 4 — leave unchanged for typical use).

**Returns:** reviews[]{rating, title, text, date (YYYY-MM-DD), purchased_from_seller, verified_buyer}, count, page, page_size (5), has_more, sort, product{product_id, title, rating, review_count, rating_breakdown}

**Example request body:**
```json
{
  "product_id": "120412509"
}
```

### POST /teknosa/v1/search/suggest — 1 credit
Teknosa's own search-box suggestions for a partial keyword: suggested terms, top products with sale price and list price, related brands, categories and marketplace sellers.

**Parameters:**
- `query` (string, required) — What the shopper has typed so far (at least 2 characters).
- `max_rotations` (integer, optional, default 4) — Advanced: how many times to retry a difficult request (1-8, default 4 — leave unchanged for typical use).

**Returns:** suggestions[], products[]{product_id, title, brand, price, list_price, currency, category, seller_name, url, image}, brands[]{name, url}, categories[]{name, url}, sellers[]{name, url}, products_total, redirect_url

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

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