# Getir API scraper — Getir and GetirBüyük (Turkey) quick-commerce grocery: find products, read the full product record with price, struck price, unit price, ingredients, nutrition table and product-safety details, browse categories and discounted products. Prices in TRY. No account, no browser.

> Find Getir products by keyword across the public catalogue (all 17 categories, or one with `category`). Each row has price, struck-through price and discount, unit price, pack size, brand, shelf, images and diet tags. Filter by brand, price range or discounted only; sort by match, price, discount or unit price. Choose the Getir or GetirBüyük catalogue with `service`.
> ReefAPI engine `getir` · 5 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/getir/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 /getir/v1/search — 2 credits
Find Getir products by keyword across the public catalogue (all 17 categories, or one with `category`). Each row has price, struck-through price and discount, unit price, pack size, brand, shelf, images and diet tags. Filter by brand, price range or discounted only; sort by match, price, discount or unit price. Choose the Getir or GetirBüyük catalogue with `service`.

**Parameters:**
- `query` (string, required) — Words to find in product names, brands, pack sizes, diet tags and shelf names. Turkish or ASCII spelling both match ('cay' finds 'Çay'); every word must match.
- `service` (enum, optional, default "getir") — Which Getir grocery catalogue to read. They are separate price lists: the same product usually costs a different amount on each. [one of: getir, buyuk]
- `category` (string, optional) — Limit to one top category: its id or slug (from `categories`), its exact name ('Su & İçecek') or its getir.com URL. One category is one upstream read; without it all 17 are read.
- `brand` (string, optional) — Only this brand: its exact name (case and Turkish letters ignored) or the brand id every row carries.
- `discounted_only` (boolean, optional, default false) — true = only products with a struck-through price.
- `min_price` (number, optional) — Lowest price in TRY (inclusive).
- `max_price` (number, optional) — Highest price in TRY (inclusive).
- `sort` (enum, optional, default "relevance") — Result order. [one of: relevance, site_order, price_asc, price_desc, discount_percent, unit_price_asc]
- `page` (integer, optional, default 1) — Result page, 1-based.
- `page_size` (integer, optional, default 50) — Products per page (1-200, default 50).
- `include_hidden` (boolean, optional, default false) — false (default) returns only products getir.com shows on its own category pages. true also returns the sold-by-weight rows Getir's catalogue carries but does not list without a delivery address: loose fruit and vegetables (no product record exists for them) and weight-sold meat and deli items (product/detail works for these).
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-6, default 3).

**Returns:** results[]{product_id (24-char id, string), title, short_name, brand{id,name}, size (pack size as printed, e.g. '24 x 500 ml'), price (TRY number), currency=TRY, original_price (struck-through price, else null), discount_percent, discount_amount, unit_price, unit_price_unit ('piece' | 'kg' | 'l' | 'g'), sold_by ('piece' | 'weight'), is_bundle, image, images[], badge_images[] (Getir publishes badges as images only), tags[] (e.g. 'Vegan', 'Glutensiz'), category{id,name,slug,url}, subcategory{id,name}, subcategories[] (every shelf the product sits on), url, in_stock (null — stock depends on the delivery warehouse), rating/review_count/rating_scale (null — Getir publishes no ratings)}, count, total_results, page, page_size, page_count, hidden_rows_dropped, service, service_name, match_mode ('catalogue'), query

**Example request body:**
```json
{
  "query": "kuzeyden",
  "category": "551430043427d5010a3a5c5e"
}
```

### POST /getir/v1/product/detail — 1 credit
The full Getir product record by id, slug or getir.com URL: title, brand, pack size, every image, price, struck-through price and discount, unit price, weight options for items sold by weight, bundle contents, description, ingredients, usage, the nutrition table, the product-safety block (origin, manufacturer, registration number) and the category.

**Parameters:**
- `product_id` (string, required) — The 24-character Getir product id every row returns, the product slug ('kuzeyden-su-h8DcoZauDv') or a getir.com product URL (a /buyuk/ URL selects GetirBüyük).
- `service` (enum, optional, default "getir") — Which Getir grocery catalogue to read. They are separate price lists: the same product usually costs a different amount on each. [one of: getir, buyuk]
- `resolve_brand` (boolean, optional, default true) — true (default) also reads the product's category shelf to add the brand name, category name and shelf. Getir's product record carries only the brand id. false = one small read, brand name null.
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-6, default 3).

**Returns:** product{product_id (24-char id, string), title, short_name, brand{id,name}, size (pack size as printed, e.g. '24 x 500 ml'), price (TRY number), currency=TRY, original_price (struck-through price, else null), discount_percent, discount_amount, unit_price, unit_price_unit ('piece' | 'kg' | 'l' | 'g'), sold_by ('piece' | 'weight'), is_bundle, image, images[], badge_images[] (Getir publishes badges as images only), tags[] (e.g. 'Vegan', 'Glutensiz'), category{id,name,slug,url}, subcategory{id,name}, subcategories[] (every shelf the product sits on), url, in_stock (null — stock depends on the delivery warehouse), rating/review_count/rating_scale (null — Getir publishes no ratings), slug, share_link, unit_quantity, price_scope ('domain' = one price across the service), weight_options{initial,initial_text,step,minimum,unit}, bundle_items[]{product_id,title,size,count,image}, info_messages[], description, ingredients, usage, nutrition[]{title,basis,items[]{name,value,value_number,unit}}, origin, manufacturer, product_safety{label: value}, category_ids[], listed, barcode (null — not published), service, service_name}

**Example request body:**
```json
{
  "product_id": "603545c9877ea1efbab7dc90"
}
```

### POST /getir/v1/category — 1 credit
Every product on one Getir top category (optionally one shelf inside it), in Getir's own shelf order or sorted by price, discount or unit price, paged. The response lists the category's shelves with how many products each one holds.

**Parameters:**
- `category` (string, required) — A top category: its id or slug (from `categories`), its exact name ('Su & İçecek') or its getir.com category URL.
- `service` (enum, optional, default "getir") — Which Getir grocery catalogue to read. They are separate price lists: the same product usually costs a different amount on each. [one of: getir, buyuk]
- `subcategory` (string, optional) — Only one shelf inside the category: its id or exact name ('Maden Suyu'), from `categories` or the response's `category.subcategories`.
- `brand` (string, optional) — Only this brand: its exact name (case and Turkish letters ignored) or the brand id every row carries.
- `discounted_only` (boolean, optional, default false) — true = only products with a struck-through price.
- `min_price` (number, optional) — Lowest price in TRY (inclusive).
- `max_price` (number, optional) — Highest price in TRY (inclusive).
- `sort` (enum, optional, default "site_order") — Result order. [one of: site_order, price_asc, price_desc, discount_percent, unit_price_asc]
- `page` (integer, optional, default 1) — Result page, 1-based.
- `page_size` (integer, optional, default 50) — Products per page (1-200, default 50).
- `include_hidden` (boolean, optional, default false) — false (default) returns only products getir.com shows on its own category pages. true also returns the sold-by-weight rows Getir's catalogue carries but does not list without a delivery address: loose fruit and vegetables (no product record exists for them) and weight-sold meat and deli items (product/detail works for these).
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-6, default 3).

**Returns:** results[]{product_id (24-char id, string), title, short_name, brand{id,name}, size (pack size as printed, e.g. '24 x 500 ml'), price (TRY number), currency=TRY, original_price (struck-through price, else null), discount_percent, discount_amount, unit_price, unit_price_unit ('piece' | 'kg' | 'l' | 'g'), sold_by ('piece' | 'weight'), is_bundle, image, images[], badge_images[] (Getir publishes badges as images only), tags[] (e.g. 'Vegan', 'Glutensiz'), category{id,name,slug,url}, subcategory{id,name}, subcategories[] (every shelf the product sits on), url, in_stock (null — stock depends on the delivery warehouse), rating/review_count/rating_scale (null — Getir publishes no ratings)}, count, total_results, page, page_size, page_count, hidden_rows_dropped, service, service_name, match_mode ('catalogue'), category{id,name,slug,url,product_count,subcategories[]{id,name,rows}}

**Example request body:**
```json
{
  "category": "551430043427d5010a3a5c5e"
}
```

### POST /getir/v1/categories — 1 credit
Getir's category tree: the 17 top categories with id, slug, URL, image and product count, and every shelf (subcategory) inside each with its product count.

**Parameters:**
- `service` (enum, optional, default "getir") — Which Getir grocery catalogue to read. They are separate price lists: the same product usually costs a different amount on each. [one of: getir, buyuk]
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-6, default 3).

**Returns:** categories[]{id, name, slug, url, image, product_count, subcategories[]{id, name, product_count}}, count, service, service_name

### POST /getir/v1/deals — 2 credits
Discounted Getir products — every product with a struck-through price, across the catalogue or in one category, biggest discount first by default. Filter by brand, price or minimum discount.

**Parameters:**
- `service` (enum, optional, default "getir") — Which Getir grocery catalogue to read. They are separate price lists: the same product usually costs a different amount on each. [one of: getir, buyuk]
- `category` (string, optional) — Limit to one top category: its id or slug (from `categories`), its exact name ('Su & İçecek') or its getir.com URL. One category is one upstream read; without it all 17 are read.
- `brand` (string, optional) — Only this brand: its exact name (case and Turkish letters ignored) or the brand id every row carries.
- `min_discount_percent` (integer, optional, default 1) — Only products discounted at least this much.
- `min_price` (number, optional) — Lowest price in TRY (inclusive).
- `max_price` (number, optional) — Highest price in TRY (inclusive).
- `sort` (enum, optional, default "discount_percent") — Result order. [one of: discount_percent, site_order, price_asc, price_desc, unit_price_asc]
- `page` (integer, optional, default 1) — Result page, 1-based.
- `page_size` (integer, optional, default 50) — Products per page (1-200, default 50).
- `max_rotations` (integer, optional, default 3) — Advanced: how many times to retry a difficult request (1-6, default 3).

**Returns:** results[]{product_id (24-char id, string), title, short_name, brand{id,name}, size (pack size as printed, e.g. '24 x 500 ml'), price (TRY number), currency=TRY, original_price (struck-through price, else null), discount_percent, discount_amount, unit_price, unit_price_unit ('piece' | 'kg' | 'l' | 'g'), sold_by ('piece' | 'weight'), is_bundle, image, images[], badge_images[] (Getir publishes badges as images only), tags[] (e.g. 'Vegan', 'Glutensiz'), category{id,name,slug,url}, subcategory{id,name}, subcategories[] (every shelf the product sits on), url, in_stock (null — stock depends on the delivery warehouse), rating/review_count/rating_scale (null — Getir publishes no ratings)}, count, total_results, page, page_size, page_count, hidden_rows_dropped, service, service_name, match_mode ('catalogue')

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