Migros Sanalmarket API

Turkish grocery prices as JSON, with the Money-card price kept separate

The Migros API turns Migros Sanalmarket, the online grocery of Turkey's largest supermarket chain, into clean JSON in seven actions: search, product/detail, product/barcode, deals, category, categories and suggest.

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a Migros Sanalmarket endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
M
/migros/v1

7 active endpoints. Every call is 1 credit.

  • POST/migros/v1/search
  • POST/migros/v1/product/detail
  • POST/migros/v1/product/barcode
  • POST/migros/v1/deals
  • POST/migros/v1/category
  • POST/migros/v1/categories
  • POST/migros/v1/suggest

What Migros Sanalmarket endpoints does ReefAPI ship?

7 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

7 endpoints

search

1 cr

Search migros.com.tr by keyword.

required
query
optional
page, sort, brand_ids, category_ids, discount, lifestyle_ids, include_sponsored, max_rotations

product/detail

1 cr

The full Migros product record by product_id (or product URL).

required
product_id
optional
max_rotations

product/barcode

1 cr

Look a product up by the EAN/GTIN barcode on its pack and get the same full record as product…

required
barcode
optional
max_rotations

deals

1 cr

Migros's own discount pages.

required
optional
type, page, sort, brand_ids, category_ids, include_sponsored, max_rotations

category

1 cr

Every product in one Migros category, paged, with the same rows, sorting and filters as search.

required
category
optional
page, sort, brand_ids, discount, lifestyle_ids, include_sponsored, max_rotations

categories

1 cr

Migros Sanalmarket's top-level shelf.

required
optional
max_rotations

suggest

1 cr

Autocomplete as a Migros shopper types.

required
query
optional
max_rotations

Every parameter, every allowed value →

Migros Sanalmarket API

3 of 7 endpoints, ready to run

View docs ↗

Migros products for a keyword: the non-member price, the Money-card member price when a promotion runs, the per-kg or per-litre unit price, availability, multi-buy and basket-discount flags, brand and category path.

1 credit1 required · 3 optional
POST/migros/v1/search
ok1245 ms · 30 records · sample
{
  "ok": true,
  "meta": {
    "api": "migros",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 1244.6,
    "record_count": 30,
    "cache_hit": false
  },
  "data": {
    "results": [
      {
        "product_id": "10406815",
        "store_product_id": "20000010406815",
        "title": "Bahçıvan Çeçil Peyniri 200 G",
        "brand": {
          "id": 729,
          "name": "Bahçıvan",
          "url": "https://www.migros.com.tr/bahcivan-b-2d9"
        },
        "category": {
          "id": 10046,
          "name": "Yöresel Peynir",
          "url": "https://www.migros.com.tr/yoresel-peynir-c-273e"
        },
        "breadcrumb": [
          {
            "id": 4,
            "name": "Süt, Kahvaltılık",
            "url": "https://www.migros.com.tr/sut-kahvaltilik-c-4"
          },
          {
            "id": 109,
            "name": "Peynir",
            "url": "https://www.migros.com.tr/peynir-c-6d"
          },
          {
            "id": 10046,
            "name": "Yöresel Peynir",
            "url": "https://www.migros.com.tr/yoresel-peynir-c-273e"
          }
        ],
        "url": "https://www.migros.com.tr/bahcivan-cecil-peyniri-200-g-p-9ecb9f",
        "image": "https://images.migrosone.com/sanalmarket/product/10406815/10406815_1-701de7-1650x1650.jpg",
        "price": 229.95,
        "price_display": "229,95 TL",
        "currency": "TRY",
        "original_price": null,
        "original_price_display": null,
        "discount_percent": null,
        "member_price": 149.9,
        "member_price_display": "149,90 TL",
        "member_discount_percent": 35,
        "member_program": "Money",
        "unit_price": 1149.75,
        "unit_price_unit": "Kg",
        "member_unit_price": 749.5,
        "sold_by": "piece",
        "price_per": "piece",
        "availability": "in_stock",
        "in_stock": true,
        "max_order_quantity": 8,
        "max_order_grams": null,
        "order_step_grams": null,
        "min_order_grams": null,
        "badges": [
          {
            "type": "price_promoted",
            "text": "229,95 TL"
          },
          {
            "type": "migroskop",
            "text": "MİGROSKOP"
          }
        ],
        "multi_buy_offer": null,
        "clearance": false,
        "basket_discounts": [],
        "best_seller": {
          "rank": 1,
          "category": "Yöresel Peynir",
          "text": "Yöresel Peynir kategorisinin en çok satan 1. ürünüdür"
        },
        "rating": null,
        "review_count": null,
        "rating_scale": null,
        "sponsored": false
      },
      {
        "product_id": "10100027",
        "store_product_id": "20000010100027",
        "title": "Tahsildaroğlu Taze Tam Yağlı Dil Peyniri 200 G",
        "brand": {
          "id": 728,
          "name": "Tahsildaroğlu",
          "url": "https://www.migros.com.tr/tahsildaroglu-b-2d8"
        },
        "category": {
          "id": 10046,
          "name": "Yöresel Peynir",
          "url": "https://www.migros.com.tr/yoresel-peynir-c-273e"
        },
        "breadcrumb": [
          {
            "id": 4,
            "name": "Süt, Kahvaltılık",
            "url": "https://www.migros.com.tr/sut-kahvaltilik-c-4"
          },
          {
            "id": 109,
            "name": "Peynir",
            "url": "https://www.migros.com.tr/peynir-c-6d"
          },
          {
            "id": 10046,
            "name": "Yöresel Peynir",
            "url": "https://www.migros.com.tr/yoresel-peynir-c-273e"
          }
        ],
        "url": "https://www.migros.com.tr/tahsildaroglu-taze-tam-yagli-dil-peyniri-200-g-p-9a1d3b",
        "image": "https://images.migrosone.com/sanalmarket/product/10100027/10100027-794c6a-1650x1650.jpg",
        "price": 199.9,
        "price_display": "199,90 TL",
        "currency": "TRY",
        "original_price": null,
        "original_price_display": null,
        "discount_percent": null,
        "member_price": null,
        "member_price_display": null,
        "member_discount_percent": null,
        "member_program": null,
        "unit_price": 999.5,
        "unit_price_unit": "Kg",
        "member_unit_price": null,
        "sold_by": "piece",
        "price_per": "piece",
        "availability": "in_stock",
        "in_stock": true,
        "max_order_quantity": 8,
        "max_order_grams": null,
        "order_step_grams": null,
        "min_order_grams": null,
        "badges": [],
        "multi_buy_offer": null,
        "clearance": false,
        "basket_discounts": [
          "Sepette %20 İndirim"
        ],
        "best_seller": {
          "rank": 2,
          "category": "Yöresel Peynir",
          "text": "Yöresel Peynir kategorisinin en çok satan 2. ürünüdür"
        },
        "rating": null,
        "review_count": null,
        "rating_scale": null,
        "sponsored": false
      },
      {
        "product_id": "10409164",
        "store_product_id": "20000010409164",
        "title": "Bahçıvan Hellim Peyniri 225 G",
        "brand": {
          "id": 729,
          "name": "Bahçıvan",
          "url": "https://www.migros.com.tr/bahcivan-b-2d9"
        },
        "category": {
          "id": 10046,
          "name": "Yöresel Peynir",
          "url": "https://www.migros.com.tr/yoresel-peynir-c-273e"
        },
        "breadcrumb": [
          {
            "id": 4,
            "name": "Süt, Kahvaltılık",
            "url": "https://www.migros.com.tr/sut-kahvaltilik-c-4"
          },
          {
            "id": 109,
            "name": "Peynir",
            "url": "https://www.migros.com.tr/peynir-c-6d"
          },
          {
            "id": 10046,
            "name": "Yöresel Peynir",
            "url": "https://www.migros.com.tr/yoresel-peynir-c-273e"
          }
        ],
        "url": "https://www.migros.com.tr/bahcivan-hellim-peyniri-225-g-p-9ed4cc",
        "image": "https://images.migrosone.com/sanalmarket/product/10409164/10409164-c6d9cc-1650x1650.jpg",
        "price": 259.9,
        "price_display": "259,90 TL",
        "currency": "TRY",
        "original_price": null,
        "original_price_display": null,
        "discount_percent": null,
        "member_price": 149.9,
        "member_price_display": "149,90 TL",
        "member_discount_percent": 42,
        "member_program": "Money",
        "unit_price": 1155.11,
        "unit_price_unit": "Kg",
        "member_unit_price": 666.22,
        "sold_by": "piece",
        "price_per": "piece",
        "availability": "in_stock",
        "in_stock": true,
        "max_order_quantity": 8,
        "max_order_grams": null,
        "order_step_grams": null,
        "min_order_grams": null,
        "badges": [
          {
            "type": "price_promoted",
            "text": "259,90 TL"
          },
          {
            "type": "migroskop",
            "text": "MİGROSKOP"
          }
        ],
        "multi_buy_offer": null,
        "clearance": false,
        "basket_discounts": [],
        "best_seller": null,
        "rating": null,
        "review_count": null,
        "rating_scale": null,
        "sponsored": false
      }
    ],
    "count": 30,
    "total_results": 454,
    "page": 1,
    "page_count": 16,
    "sponsored_dropped": 6,
    "sort_applied": "relevance",
    "filters_available": {
      "categories": [
        {
          "id": 4,
          "name": "Süt, Kahvaltılık",
          "count": 392
        },
        {
          "id": 70651,
          "name": "Atıştırmalık",
          "count": 36
        },
        {
          "id": 74872,
          "name": "Maç Özel",
          "count": 16
        }
      ],
      "discounts": [
        {
          "id": "money",
          "name": "Money İndirimli Market Ürünleri",
          "count": 74
        },
        {
          "id": "multi_buy",
          "name": "Çoklu İndirim Kampanyaları ve Hediyeli Ürünler",
          "count": 6
        }
      ],
      "brands": [
        {
          "id": 728,
          "name": "Tahsildaroğlu",
          "count": 29
        },
        {
          "id": 729,
          "name": "Bahçıvan",
          "count": 25
        },
        {
          "id": 149,
          "name": "Ariste",
          "count": 20
        }
      ],
      "lifestyle": [
        {
          "id": 113,
          "name": "Glutensiz",
          "count": 5
        },
        {
          "id": 116,
          "name": "Laktozsuz",
          "count": 10
        },
        {
          "id": 102,
          "name": "Organik",
          "count": 6
        }
      ]
    },
    "title": "Arama",
    "breadcrumb": [
      {
        "name": "Arama",
        "url": null
      }
    ],
    "query": "peynir"
  }
}
Real response, fetched from the live endpoint with the parameters on the left — trimmed to the first few rows, with seller names left out. Press Try it for the untrimmed response.

How the Migros Sanalmarket API works

Migros Sanalmarket is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 252 engines.

02
Call
POST /migros/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 credit per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

Track a Turkish grocery basket with both prices, like for like

The number Migros displays is the Money-card price whenever a Money promotion runs, so a tracker that stores one number mixes two prices. Two calls keep them apart.

01search
POST/migros/v1/search
{"query": "peynir", "sort": "price_asc"}

About 30 products per page with product_id, price, member_price, unit_price and sold_by. Sponsored placements are removed unless you ask for them, so the order is really by price.

02detail
POST/migros/v1/product/detail
{"product_id": "10406815"}

The full record: 229.95 TRY without a Money card, 149.90 TRY with one, per-kg prices for both, the label sheet and the supplier. One flat credit.

03barcode
POST/migros/v1/product/barcode
{"barcode": "5449000000439"}

Match your own EAN to a Migros product in one call - this one is Coca-Cola 1.5 L, Migros product 08010903.

A basket where every product carries the price a normal shopper pays and, separately, the Money-card price - with unit prices on the same basis - for one credit per call.

request
curl -X POST https://api.reefapi.com/migros/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"peynir"}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "migros",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

The price Migros displays is the Money-card price whenever a Money promotion runs

This is the one thing to know before you build a Turkish grocery price tracker on Migros. When a Money promotion is active, the price shown on the shelf is the loyalty-card price; a shopper without the card pays more. The API returns both, and never merges them. Measured on 2026-09-15.

Migros productprice (no Money card)member_price (Money card)Unit price, no card / with card
Bahçıvan Çeçil Peyniri 200 G229.95 TRY149.90 TRY1,149.75 / 749.50 TRY per kg
Kahve Dünyası Tambol %85 Kakao Bitter Çikolata 77 G99.90 TRY69.90 TRYper-kg price re-based the same way
Torku Bitter Çikolata 60 G69.95 TRY59.90 TRYper-kg price re-based the same way
Torku Tam Yağlı Taze Kaşar Peyniri 600 G479.90 TRYnull - no Money promotion799.83 TRY per kg
Akpınar Taze Beyaz Peynir Kg429.00 TRY per kg (sold by weight)nullnull - the price is already per kg

member_discount_percent is computed from the two prices and equalled Migros's own discount figure (35 percent on the first row). The unit price Migros prints is calculated on the member price; unit_price is re-based on the non-member price and the printed figure is returned as member_unit_price. A basket discount such as "Sepette %20 İndirim" is applied only in the basket, so it is returned in basket_discounts and never subtracted from price.

Which store, which price, which id, and what Migros does not publish

migros.com.tr only - one country, one currency, a product id that is an 8-digit number. Measured on 2026-09-15 across 30 products in 12 Migros categories, 20 searches, 37 controlled cases and an independent source comparison on 7 products. Four of these lines go against us.

One market: Turkey, prices in TRY

This engine reads Migros Sanalmarket at migros.com.tr. Every price is TRY, with a Turkish display string next to the number ("229,95 TL"). There is no country parameter because there is no other storefront behind it.

Two prices, never merged

price is what a shopper without a Money card pays; member_price is the Money-card price, null when no promotion runs. For the keyword peynir, the 73 products carrying a member price were exactly the 73 on Migros's own Money discount list. On 7 of 7 products compared against an independent read of the source, title, price, member price and availability all matched.

Unit prices on the same basis

Migros prints its per-kg or per-litre price from the member price. unit_price is re-based on the non-member price (1,149.75 TRY per kg for a 229.95 TRY, 200 g cheese) and member_unit_price returns the printed 749.50. Weight-sold products say sold_by weight and are priced per kg, with order limits in grams.

The id is an 8-digit string - keep the leading zeros

Product ids look like 10406815 or 05080201. Every search row returns product_id as a string, and product/detail also accepts a migros.com.tr product URL. A dead id returns NOT_FOUND, never another product. product/barcode resolves an EAN to the same id.

Filters bite, and Migros confirms the sort

peynir: 451 results unfiltered, 55 with two brand ids, 73 with the Money filter, 35 with one category, 10 with a lactose-free facet. sort_applied is Migros's own confirmation of the order used. Sponsored products that Migros places on the first page regardless of filters are removed by default and counted.

Search rows agree with product records

The prices on a search row were checked against the full product record for 30 products, 12 of them discounted: price, member price and unit price agreed on 30 of 30.

Against us: prices are for Migros's default online store

Migros says price and stock follow the store that delivers. The API returns the prices a visitor with no delivery address sees, and names that store in store.store_id. Prices for a specific delivery address are not offered.

Against us: no ratings, no reviews, no stock count

Migros publishes no product ratings or reviews, so rating, review_count and rating_scale are null rather than invented. Availability is in_stock, out_of_stock or delisted; max_order_quantity is an order cap (8 on most products), not stock.

Against us: label sheets are missing in some categories

Ingredients, allergen warning, origin and the other label lines come back on food products. On 30 sampled products description was filled on 22 and ingredients on 17; baby, produce, paper and some cosmetics and cleaning products had no label sheet. No structured nutrition table was published on any sampled product.

Against us: pages can repeat a product

Migros's own paging occasionally shows a product on two consecutive pages - 3 rows out of 451 across 16 pages of peynir. De-duplicate on product_id when sweeping a whole category. A page past the last one returns an empty list with total_results null.

What people build with Migros Sanalmarket

The jobs this data is most often used for.

7

endpoints

1

credit per call

01

Turkish grocery price trackers record price and member_price separately, because the displayed shelf price is the Money-card price whenever a promotion runs.

02

FMCG brands monitor their products' Money discounts, multi-buy offers and clearance flags across Migros categories with deals and category.

03

Retail analysts compare per-kg and per-litre unit prices on a like-for-like non-member basis using unit_price.

04

Catalogue teams match their own EANs to Migros products with product/barcode and pull ingredients, allergen warnings and origin from the label sheet.

What Migros Sanalmarket data costs

The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 252 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/migros/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"query":"peynir"}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/migros/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "query": "peynir"
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Migros Sanalmarket.

Get a free key →
Which price should I store - price or member_price?

Store both, and label them. price is what a shopper without a Money card pays; member_price is the Money-card price and is null when no Money promotion runs. On 2026-09-15, 12 of 30 sampled products had a member price, and on the Money discount page 30 of 30 rows did - always below price. member_program reads Money whenever member_price is set.

How do I know a member price is really member-only?

Because it lines up with Migros's own list. For the keyword peynir, the 73 products the API flagged with a member price were exactly the 73 products on Migros's Money discount filter - none missing, none extra. On every one of those products checked in full, the regular and non-member prices were equal and only the member price was lower.

Why is unit_price different from the per-kg price on the Migros page?

Because the page calculates it on the member price. Bahçıvan Çeçil Peyniri 200 G prints 749.50 TRY per kg, which is 149.90 divided by 0.2 kg - the Money price. unit_price returns 1,149.75, the per-kg price at the non-member 229.95, and member_unit_price returns the 749.50 the page prints. Products without a Money promotion have one unit price and member_unit_price is null.

Some products are priced per kg - how do I tell?

sold_by reads weight and price_per reads kg. Akpınar Taze Beyaz Peynir Kg is 429.00 TRY per kg, ordered from 1,000 g in 100 g steps up to 8 kg; the order limits come back in grams. Piece-sold products read sold_by piece, and max_order_quantity is Migros's order cap - 8 on most products - not a stock count.

Do filters and sorting really apply?

Yes, and Migros confirms the sort it used in sort_applied. Measured on 2026-09-15 for peynir: 451 results unfiltered, 55 with two brand ids, 73 with the Money discount filter, 35 with one category id, 10 with the lactose-free lifestyle facet. Price sorts came back in order on page 2. Migros places sponsored products on the first page regardless of your filters and sort, so they are removed by default and counted in sponsored_dropped; include_sponsored=true keeps them, flagged.

Can I look a product up by barcode?

Yes. product/barcode takes the EAN on the pack and returns the same full record as product/detail - the Coca-Cola 1.5 L EAN 5449000000439 resolved to Migros product 08010903 at 80.00 TRY. An unknown barcode returns NOT_FOUND. Migros does not print the barcode inside the product record itself, so product/detail returns barcode as null.

Which campaign pages can I read?

deals reads Migros's own discount pages: all discounted products (3,157 on 2026-09-15), Money-card discounts (2,100), multi-buy and gift campaigns (363, each row carrying its offer text such as 2.si %80), Migroskop (2,467) and Gördüğünüze İnanın, which was empty between campaigns that day and returns an honest empty list. Rows, sorting and filters are the same as search.

What does Migros NOT publish?

Product ratings and reviews - there are none, so rating, review_count and rating_scale are null. No stock count, only availability. No structured nutrition table: in 30 sampled products the label information came as labelled lines, returned in specs. Label sheets are missing on some non-food categories (baby, produce, paper, some cosmetics and cleaning products), so description and specs are null there. Prices are those of Migros's default online store for a visitor with no delivery address; prices for a specific delivery address are not offered.

What is the Migros Sanalmarket API?

Migros Sanalmarket API is a ReefAPI endpoint group for turkish online grocery: shelf prices, money-card member prices and full label sheets. It returns live JSON through POST requests under /migros/v1.

Is the Migros Sanalmarket API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Migros Sanalmarket calls use the same shared credit balance as every other ReefAPI engine.

Do I need a Migros Sanalmarket login or account?

No login to Migros Sanalmarket 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 Migros Sanalmarket 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 Migros Sanalmarket API use?

Migros Sanalmarket 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 Migros Sanalmarket from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call migros actions with the same key, credit pool and JSON envelope used by normal REST requests.

91 E-commerce & Marketplaces APIs on the same key

One key, one credit pool, one response envelope. If you are pulling Migros Sanalmarket, you are one call away from the rest of the category — no second contract, no second integration.

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 251 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-09-15.