A101 API & Scraper
The A101 API turns a101.com.tr, the online shop of Turkey's A101 discount grocery chain, into clean JSON in four actions.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
search runs A101's own product search in one of its two online shops: kapida for groceries and household products at the delivery store's prices, or ekstra for electronics, home and fashion, 60 products a page, with Ekstra's price, newest, discount and best-seller sort orders. Each row carries the product id, title, brand, URL, image, the shelf price, the struck price and discount, the campaign badges with their start and end dates, and for Kapıda the in-basket price of a "10 TL ve üzeri" offer and the multi-buy price of a "Çok Al Az Öde" offer, both kept apart from the shelf price. product/detail returns one product by id or URL: for Kapıda every barcode A101 lists, net and gross weight, storage condition, country of origin, shelf life and the description; for Ekstra the stock count, specifications, variants, interest-free instalment offers and the description. When the same product is sold in both shops at different prices, both prices come back. campaigns lists the products of Aldın Aldın, Haftanın Yıldızları, Aylık Fırsat, 10 TL ve üzeri sepette and Çok Al Az Öde, and suggest returns A101's autocomplete. In a live check on 2026-09-15, 44 of 44 searches and 24 of 24 product calls succeeded, and on 12 products compared against A101's own figures the price, title and availability matched on 12 of 12. Prices are TRY. No A101 account, no browser, one ReefAPI key and the standard { ok, data, meta, error } envelope.
A101 prints several prices per product, and the API keeps them apart
An A101 product can show a shelf price, a struck-through was-price, a lower price that only applies inside a qualifying basket, and a different price in its other online shop. The API returns each under its own name, so the price you store is always the price a shopper pays for one item.
| Product (2026-09-15) | price | What else A101 shows | API fields |
|---|---|---|---|
| Torku Tam Yağlı Tost Peyniri 1 Kg (Kapıda) | 599.00 TRY | 409 TRY inside a basket of 10 TRY or more | basket_offer.price 409, basket_offer.condition |
| Tahsildaroğlu Klasik İnek Beyaz Peyniri 500 G (Kapıda) | 199.00 TRY | struck 389.00 TRY, Aylık Fırsat badge | price_before_discount 389, discount_percent 49, campaigns[0].label |
| Piranha 2220 Bluetooth headphones (Ekstra) | 599.00 TRY | struck 649.00 TRY; 649.00 TRY in Kapıda | price_before_discount 649, other_channel_offer.price 649 |
Campaign texts can carry a number that is not the price: the cheese above had a campaign line ending in "229 tl" while its shelf price was 199 TRY. That text is returned as text in campaign_conditions and never turned into a price.
Real request and response JSON
Captured from the indexed primary action, search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/a101/v1/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "peynir",
"channel": "kapida"
}
}{
"ok": true,
"meta": {
"api": "a101",
"endpoint": "search",
"mode": "live",
"latency_ms": 1545,
"record_count": 60,
"bytes": 127043,
"cache_hit": false,
"pagination": {
"page": 1,
"page_size": 60,
"total": 256,
"has_more": true
}
},
"data": {
"channel": "kapida",
"results": [
{
"position": 1,
"product_id": "12002661",
"channel": "kapida",
"title": "Peynes Süzme Tam Yağlı Taze Beyaz Peynir 500 G",
"brand": "PEYNES",
"url": "https://www.a101.com.tr/kapida/sut-urunleri-kahvaltilik/peynes-suzme-tam-yagli-taze-beyaz-peynir-500-g_p-12002661",
"image": "https://cdn2.a101.com.tr/dbmk89vnr/CALL/Image/get/ffxRpPQxI9_1024x1024.png",
"price": 119,
"price_before_discount": null,
"discount_percent": null,
"currency": "TRY",
"in_stock": true,
"sold_at_store": true,
"store_code": "VS032",
"campaigns": [],
"campaign_conditions": null,
"basket_offer": null,
"multi_buy": null,
"unit_price": null,
"sales_unit": "piece",
"base_unit": "piece",
"max_order_quantity": 10,
"category": "Beyaz Peynir",
"category_id": "C0501",
"category_path": [
"Süt Ürünleri, Kahvaltılık",
"Beyaz Peynir"
]
},
{
"position": 2,
"product_id": "12002138",
"channel": "kapida",
"title": "Ahir Tam Yağlı Taze Beyaz Peynir 750 G",
"brand": "AHİR",
"url": "https://www.a101.com.tr/kapida/sut-urunleri-kahvaltilik/ahir-tam-yagli-taze-beyaz-peynir-750-g_p-12002138",
"image": "https://cdn2.a101.com.tr/dbmk89vnr/CALL/Image/get/SL5KQFV0cu_1024x1024.png",
"price": 205,
"price_before_discount": null,
"discount_percent": null,
"currency": "TRY",
"in_stock": true,
"sold_at_store": true,
"store_code": "VS032",
"campaigns": [],
"campaign_conditions": null,
"basket_offer": null,
"multi_buy": null,
"unit_price": null,
"sales_unit": "piece",
"base_unit": "piece",
"max_order_quantity": 10,
"category": "Beyaz Peynir",
"category_id": "C0501",
"category_path": [
"Süt Ürünleri, Kahvaltılık",
"Beyaz Peynir"
]
},
{
"position": 3,
"product_id": "12003722",
"channel": "kapida",
"title": "Tahsildaroğlu Klasik İnek Beyaz Peyniri 500 G",
"brand": "TAHSİLDAROĞLU",
"url": "https://www.a101.com.tr/kapida/sut-urunleri-kahvaltilik/tahsildaroglu-klasik-inek-beyaz-peyniri-500-g_p-12003722",
"image": "https://cdn2.a101.com.tr/dbmk89vnr/CALL/Image/get/x344AOs7zi_1024x1024.png",
"price": 199,
"price_before_discount": 389,
"discount_percent": 49,
"currency": "TRY",
"in_stock": true,
"sold_at_store": true,
"store_code": "VS032",
"campaigns": [
{
"code": "[trimmed-depth]",
"label": "[trimmed-depth]",
"site_name": "[trimmed-depth]",
"starts_on": "[trimmed-depth]",
"ends_on": "[trimmed-depth]"
}
],
"campaign_conditions": [
"10 tl ve üzeri alışverişlerde BEYAZ PEYNİR KLASİK 500 G TAHSİLDAROĞLU 229 tl (12003722)"
],
"basket_offer": null,
"multi_buy": null,
"unit_price": null,
"sales_unit": "piece",
"base_unit": "piece",
"max_order_quantity": 5,
"category": "Beyaz Peynir",
"category_id": "C0501",
"category_path": [
"Süt Ürünleri, Kahvaltılık",
"Beyaz Peynir"
]
}
],
"count": 60,
"total_results": 256,
"total_pages": 5,
"page": 1,
"page_size": 60,
"has_more": true,
"keyword_matches_on_page": 60,
"fallback_results_dropped": 0,
"store_code": "VS032",
"query": "peynir",
"sort": "relevance"
}
}What the A101 API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| search | Search A101's online shops by keyword: `kapida` (groceries and household at the delivery store's prices) or `ekstra` (electronics, home, fashion) — 60 products a page, Ekstra's sort orders. Each row: product id, title, brand, URL, image, shelf price, struck price and discount, campaign badges (Aldın Aldın, Haftanın Yıldızları …) with dates, and for Kapıda the conditional in-basket price, multi-buy price and unit price kept apart. | Pricing teams call search to search A101's online shops by keyword. | query, channel, page, sort, include_fallback_results, ... |
| product/detail | One A101 product by id or URL, from Kapıda or Ekstra: shelf price, struck price and discount, campaign badges with dates, in-basket and multi-buy prices, unit price, barcodes, net and gross weight, storage condition, country of origin, shelf life, stock count (Ekstra), instalment offers (Ekstra), images, breadcrumb, description and specifications. | Marketplace operators call product/detail to get one A101 product by id or URL, from Kapıda or Ekstra. | product_id, url, channel, max_rotations |
| campaigns | The products of an A101 campaign page — Aldın Aldın, Haftanın Yıldızları, Aldın Aldın X, Aylık Fırsat, 10 TL ve üzeri sepette and Çok Al Az Öde on Kapıda; Aldın Aldın and Aldın Aldın Ekstra on Ekstra — 60 per page, with the same row fields as search. | Catalog enrichment teams call campaigns to get the products of an A101 campaign page. | campaign, channel, page, max_rotations |
| suggest | A101's own search autocomplete for a partial keyword in Kapıda or Ekstra: the top matching products with price and the category / brand suggestions the site shows. | Retail analysts call suggest to get a101's own search autocomplete for a partial keyword in Kapıda or Ekstra. | query, channel, max_rotations |
Call search from your stack
curl -X POST https://api.reefapi.com/a101/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"peynir","channel":"kapida"}'import requests
r = requests.post(
"https://api.reefapi.com/a101/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "peynir",
"channel": "kapida"
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/a101/v1/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "peynir",
"channel": "kapida"
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.a101.search with {"query":"peynir","channel":"kapida"}.Who uses this API and why
- Grocery price monitoring on one of Turkey's largest discount chains, with shelf, struck, in-basket and multi-buy prices kept apart.
- Weekly Aldın Aldın and Haftanın Yıldızları tracking: every campaign product with its price and badge dates.
- Retail analysts compare A101 Kapıda and A101 Ekstra prices for the same product.
- Product catalogues with barcodes, net weight, storage condition, origin and shelf life for FMCG items.
Questions developers ask before integrating
What is the difference between kapida and ekstra?
They are A101's two online shops. kapida is A101 Kapıda: groceries, drinks, cleaning and personal care, delivered from a store, priced at that store. ekstra is A101 Ekstra: electronics, home, furniture, fashion and toys, shipped. A cheese search in ekstra returns nothing, a TV search in kapida returns nothing useful, so pick the shop for the product type. product/detail with channel auto finds an id in either shop.
Which price is the one I pay?
price, the shelf price of one item. price_before_discount is the struck price when A101 shows one. basket_offer is a lower price that applies only inside a qualifying basket (for example "10 TL ve Üzeri Sepette": 599 TRY on the shelf, 409 TRY in a basket of 10 TRY or more). multi_buy is the per-item price when you buy at least min_quantity. None of these are ever written into price.
Does the same product cost the same in Kapıda and Ekstra?
Not always. On 2026-09-15 Piranha 2220 headphones were 599 TRY (struck 649) in Ekstra and 649 TRY in Kapıda under the same product id. product/detail with channel auto returns the Ekstra record and the Kapıda price in other_channel_offer; with channel kapida or ekstra it returns that shop only.
Which store are Kapıda prices for?
A101's default online store, returned as store_code. We checked whether prices differ between stores: on 60 cheese products carried in up to 275 stores, none had more than one price. Prices for a specific delivery address are not part of this API.
What do the campaigns contain?
campaigns lists every product carrying the campaign badge, 60 a page. On 2026-09-15: Aldın Aldın 191 Kapıda products and 80 Ekstra products, Haftanın Yıldızları 53, Aldın Aldın X 737, Aylık Fırsat 832, 10 TL ve üzeri sepette 203 (each with its basket price), Çok Al Az Öde 9 (each with its multi-buy price) and Aldın Aldın Ekstra 184. Each product's campaigns[] carries the badge's start and end date. Products A101 sells only in its physical stores are not in the online shops and not in these lists.
What does a search for a made-up word return?
An empty results list. A101 fills a no-match search with unrelated products; those are dropped and counted in fallback_results_dropped, and include_fallback_results true returns them separately. Typos still work: "samsng" returns Samsung products and "peynr" returns cheese. On the live check, 16 of 16 made-up words came back empty and none of 44 real searches did.
What does A101 not publish?
Ratings and reviews (neither shop has them), a stock count for Kapıda products (in stock or not only; Ekstra publishes a count), a structured nutrition table (only inside the Kapıda description text), and a unit price for most products. Kapıda search has no sort order that A101 applies, so only relevance is accepted there. A101 publishes some goods under the brand "BOŞ" (empty); brand is null for those.
What is the A101 API?
A101 API is a ReefAPI endpoint group for turkish discount grocery: kapıda and ekstra prices, aldın aldın campaigns, basket and multi-buy offers. It returns live JSON through POST requests under /a101/v1.
Is the A101 API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. A101 calls use the same shared credit balance as every other ReefAPI engine.
Do I need an A101 login or account?
No login to A101 is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the A101 data?
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the A101 API use?
A101 actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call A101 from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call a101 actions with the same key, credit pool and JSON envelope used by normal REST requests.
Is the A101 API an A101 scraper?
It is the managed alternative to a DIY A101 scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same turkish discount grocery: kapıda and ekstra prices, aldın aldın campaigns, basket and multi-buy offers back as clean JSON.