API

MediaMarkt Türkiye API: mediamarkt.com.tr ürünleri ve fiyatları JSON olarak

Bu API mediamarkt.com.tr'de alışveriş yapan birinin ekranındakini okur: ürün adı, TL fiyatı, varsa üstü çizili fiyat, taksit, ürünü kimin sattığı, kargonun hangi tarih aralığında geleceği ve mağazadan teslim alınıp alınamayacağı. Ürün kodu, ürün adresinin sonundaki sayıdır (…-1228167.html → 1228167); tam kayıt bu kodla ya da adresin kendisiyle istenir. MediaMarkt pazaryerinde mağaza açan satıcıların sipariş ve stok yönettiği panelle ilgisi yoktur: bununla ürün listelenmez, sipariş takip edilmez; dönen veri, vitrinde o an görünenle sınırlıdır. Motor birkaç ülkenin MediaMarkt sitesini okuyor; Türkiye sitesi için `"country": "tr"` parametresini her istekte gönderin.

Uçlar

endpointNe döndürürZorunlu
searchAnahtar kelimeyle arama; her sayfada 12 ürün: ürün kodu, başlık, marka, EAN, TL fiyat, üstü çizili fiyat ve türü, taksit, satıcı (MediaMarkt ya da pazaryeri mağazası), puan, kategori yolu, online durum ve teslimat aralığı, öne çıkan özellikler. Fiyata, puana, çok satana ve yeniliğe göre sıralama; tek marka ve en düşük puan filtresi.query
categoryBir kategori sayfasındaki ürünler (sitenin menüsündeki ya da bir ürünün kategori yolundaki adres), aramayla aynı alanlar, sıralama ve filtrelerle. Ülkeyi adresin alan adı belirler.category
product/detailÜrün koduyla ya da adresiyle tam kayıt: fiyatlar, KDV oranı, taksit, satıcı, kargo ve mağazadan teslim durumu, bütün görseller, sitedeki gibi gruplanmış teknik özellikler, açıklama, renk ve kapasite varyantları, aynı ürünü satan pazaryeri mağazalarının teklifleri, yıldız dağılımı ve yorumların ilk sayfası (yorumcunun sitede görünen takma adıyla).product_id

Her çağrı kredi ile ücretlendirilir. Başarısız ve engellenen çağrılar ücretsizdir.

Çalışan örnek

Philips HD9285/96'yı MediaMarkt 7 999 TL'ye satıyor; `marketplace_offers` içinde aynı ürünü 10 999 TL'ye listeleyen bir pazaryeri mağazası da var. Ürünün kendi `price` ve `seller` alanları MediaMarkt'ın teklifini gösterir, diğer satıcılar ayrı listede durur. Arama sonucunda bu ayrım daha da önemli: 26 Ekim'de 'airfryer' aramasının ilk sayfasındaki 12 ürünün 10'u pazaryeri mağazalarındandı (`seller.type: "marketplace"`, `online_status: "mp_offer"`). Yalnız MediaMarkt'ın kendi fiyatlarını listeleyecekseniz satırları `seller.type` ile ayırın.

İstek
curl -X POST https://api.reefapi.com/mediamarkt/v1/product/detail \
  -H "x-api-key: ANAHTARINIZ" \
  -H "content-type: application/json" \
  -d '{"product_id": "1228167", "country": "tr"}'
Yanıt (kısaltılmış)
{
  "ok": true,
  "data": {
    "product": {
      "product_id": "1228167",
      "title": "PHILIPS HD9285/96 Airfryer 5000 Serisi XXL Connected Fritöz Siyah",
      "brand": "PHILIPS",
      "ean": "8720389035791",
      "currency": "TRY",
      "price": 7999,
      "was_price": null,
      "was_price_type": null,
      "installment": { "months": 3, "monthly_amount": 2666.33, "total_amount": 7999, "interest_effective_percent": null },
      "vat_rate": 0.2,
      "seller": { "type": "retailer", "id": null, "name": "MediaMarkt", "rating": null, "rating_scale": null },
      "rating": 4.43,
      "review_count": 7,
      "breadcrumb": ["Ev Aletleri & Yaşam", "Mutfak", "Pişirme", "Airfryer", "Philips Airfryer"],
      "availability": {
        "online_status": "available",
        "delivery_earliest": "2026-10-27T05:00:00.000Z",
        "delivery_latest": "2026-10-30T15:00:00.000Z",
        "shipping_cost": 0,
        "pickup_status": "partially_available",
        ...
      },
      "marketplace_offers": [
        {
          "offer_id": "1747739088",
          "seller": { "type": "marketplace", "id": "11628", "name": "...", "rating": 2.6, "rating_scale": 5, "review_count": 5 },
          "price": 10999,
          "currency": "TRY",
          "condition": "new",
          "shipping_cost": 0,
          "delivery_earliest": "2026-10-30T19:59:59.999Z",
          "delivery_latest": "2026-11-03T19:59:59.999Z"
        }
      ],
      "rating_distribution": { "1": 1, "2": 0, "3": 0, "4": 0, "5": 6 },
      ...
    },
    "country": "tr",
    "store": "mediamarkt",
    "language": "tr"
  }
}

MediaMarkt scraper'ı yazarken Türkiye sitesinde ölçtüğümüz tuzaklar

Türkiye ürün sayfalarının schema.org bloğunda puan yok. Puan ve yorum sayısı sayfanın içine gömülü uygulama verisinde duruyor: motoru kurarken iPhone 17 Pro Max (1249245) için 4,58 puanı ve 122 yorumu oradan okuduk, aynı değerleri sitenin arama sayfası da yayımlıyordu. Yalnız ld+json okuyan bir script bu ürünleri puansız sanar.

Açıklamalarda Türkiye'ye özgü bir tuhaflık daha var: paragraf işaretleri gerçek etiket olarak değil `<lt/>p<gt/>` biçiminde kodlanmış sözde etiketler olarak geliyor. Sıradan bir HTML temizleyici bunları tanımaz ve metnin içinde bırakır; burada çözülüp düz metne çevriliyor, paragraf araları korunuyor.

Olmayan bir ürün koduna site 404 değil HTTP 200 veriyor: `/tr/product/-9999999.html` isteğine 720 KB'lık bir sayfa geldi ve içinde ürün yoktu. Durum koduna güvenen bir döngü bu sayfaları boş kayıt olarak yazar; motor bu durumu NOT_FOUND olarak döndürür.

Hiçbiri hata mesajı üretmediği için bu üçü genellikle bir rapora bakarken fark edilir: puansız ürünlerin oranı açıklanamayacak kadar yüksek çıkar, ürün açıklamaları ekranda `<lt/>p<gt/>` kalıntılarıyla görünür ya da kataloğunuzdaki ürün sayısı sitede gerçekten satılanları aşar.

Sınırlar ve dürüst notlar

  • MediaMarkt'ın yayımladığı ya da onayladığı bir API değildir; MediaMarkt'la aramızda bir ortaklık yok.
  • `country` gönderilmezse varsayılan `de` kullanılır: istek mediamarkt.de'ye gider, fiyatlar EUR, başlıklar Almanca gelir.
  • Arama ve kategori sayfa başına 12 ürün döndürür ve site 30. sayfada durur; `total_results` ne gösterirse göstersin bir sorgudan en fazla 360 ürün alınır.
  • Üstü çizili fiyatın türü `was_price_type` alanında sitenin koduyla gelir (`RRP`, `LOP`, `XOP`); `LOP` ve `XOP` için sitede bir açıklama yok, biz de yorumlamıyoruz. Bu satırlarda `discount_percent` boş kalabilir: Philips NA555/00'da üstü çizili fiyat 15 199 TL (`LOP`), fiyat 15 099 TL, `discount_amount` 100 iken `discount_percent` null geldi.
  • Fiyat geçmişi yok, çünkü site yayımlamıyor; ürünün eski fiyatlarını görmek için ürün kodlarını belli aralıklarla çağırıp her yanıtı tarihiyle birlikte kendi veri tabanınıza yazmanız gerekir.
  • Stok adedi yayımlanmıyor, yalnız durum geliyor (`available`, `mp_offer`, `release_product`…). Belirli bir mağazadaki stok sorgulanamaz; `pickup_status` yalnız genel durumu söyler (örnekteki üründe `partially_available`).
  • Yorumlar yalnız ilk sayfadır; toplam sayı `review_count` alanındadır. Fiyat aralığı filtresi ve satıcıya göre süzme yok; `brand` tek değer alır ve sitenin yazımıyla büyük harftir (PHILIPS, ARCELIK).
  • Üç uç da çağrı başına 2 kredi; arama ve kategoride bir çağrı 12 ürünlük bir sayfadır.