# Boyner API scraper — search & product detail on Boyner (boyner.com.tr), Turkey's department-store marketplace (fashion, shoes, sneakers); prices in TRY, seller + coupons + sizes. No account, no browser.

> Search Boyner by keyword (`query`), paginated (`page`, 24/page). Every card carries product_id, title, brand, price (current + original + discount%), seller (merchantName — filter 'BOYNER' for Boyner-sold), campaigns/coupons (Hopi, 'Sepette %N İndirim'), image, url, category, rating, stock.
> ReefAPI engine `boyner` · 2 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/boyner/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 or blocked calls are free.
- **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 /boyner/v1/search — 1 credit
Search Boyner by keyword (`query`), paginated (`page`, 24/page). Every card carries product_id, title, brand, price (current + original + discount%), seller (merchantName — filter 'BOYNER' for Boyner-sold), campaigns/coupons (Hopi, 'Sepette %N İndirim'), image, url, category, rating, stock.

**Parameters:**
- `query` (string, required) — Search keyword (Turkish keywords work best, e.g. 'erkek spor ayakkabı', 'nike sneaker', a brand name).
- `page` (integer, optional, default 1) — Result page — 1-based (1, 2, 3…), 24 products per page.
- `max_rotations` (integer, optional, default 6) — Advanced: datacenter IP-rotation attempts before falling back to residential (1-12, default 6).

**Returns:** products[]{product_id, title, brand, url, category, category_id, price, original_price, discount_rate, campaign, currency=TRY, seller, merchant_id, campaigns[], badges[], special_badges[], rating, review_count, stock, in_stock, color, gender, variant_id, barcodes[], image, images[], is_free_cargo}; count, total, total_pages, page. HONEST LIMIT: Boyner REMOVED the seller NAME from listing cards on 2026-08-22 — `seller` is null on search and `merchant_id` carries the seller ('1' = Boyner's own stock); the name is on product/detail. A query the source itself counts as 0 returns NOT_FOUND, never an empty 200, and a non-zero source total with no parsable card returns PARSE_ERROR rather than a silent empty list.

**Example request body:**
```json
{
  "query": "erkek spor ayakkabı"
}
```

### POST /boyner/v1/product/detail — 1 credit
Full Boyner product by `url` OR `product_id`: title, brand, price (current + original + discount%), campaign headline + coupons (Hopi etc.), seller/merchantName + other offers, SIZES (Beden — EU sizes with per-size stock + barcode), all images, rating, review_count, stock, gtin/barcode, category, breadcrumbs, attributes, description and sample reviews. Parsed from Boyner's own getProductDetail JSON.

**Parameters:**
- `url` (string, optional) — Full Boyner product URL (…-p-<id>). Provide url OR product_id.
- `product_id` (string, optional) — Boyner product id — the digits after '-p-' in the product URL. Provide product_id OR url.
- `max_rotations` (integer, optional, default 6) — Advanced: datacenter IP-rotation attempts before falling back to residential (1-12, default 6).

**Returns:** product{product_id, title, brand, brand_id, url, category, category_id, breadcrumbs[], price, original_price, discount_rate, currency=TRY, campaign (str|null, e.g. '500 TL İndirim'), campaign_type, campaigns[]{id, title, content, url, start, end}, coupons[], seller, merchant_id, merchant_rating, is_boyner_product, other_merchants[]{merchant_id, name, rating, price, original_price, shipping_cost, has_free_cargo, url, delivery}, in_stock, stock, stock_variants_total, stock_text, size_title, sizes[]{value, variant_id, barcode, in_stock, quantity, is_selected}, rating, review_count, favorite_count, gtin, images[], attributes[]{name, value}, description, badges[], delivery}. HONEST LIMITS (measured 2026-08-22): Boyner's product SSR payload no longer carries review bodies (they are fetched client-side), so `sample_reviews` is null — the source does not publish them on this route. It also publishes no product-level stock total, so `stock` is null and the arithmetic sum of the per-size counts is published separately as `stock_variants_total`. `product_type`, `is_hopi_usable` and `is_outlet` are likewise no longer published.

**Example request body:**
```json
{
  "url": "https://www.boyner.com.tr/tommy-hilfiger-lacivert-erkek-sneaker-th-hi-vulc-core-low-lth-ii-ess-p-15593795"
}
```

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