API

ŞOK Market API: sokmarket.com.tr'de ürün ve fiyat sorgulama

Bu uçlar sokmarket.com.tr'nin oturum açmadan görünen vitrinini okur: market rafı (yiyecek-içecek, deterjan, kozmetik) ile elektronik, ev ve giyimin satıldığı ŞOK Ekstra iki ayrı kanal olarak gelir. Her üründe TL fiyat, varsa ŞOK'un üstünü çizdiği eski fiyat ve indirim oranı, ŞOK'un kendi markası olup olmadığı ve fiyatın hangi mağazaya ait olduğu yer alır. Haftalık indirim sayfası Haftanın Fırsatları da tek uçtan liste olarak alınabiliyor. Bu, ŞOK'a ürün veren tedarikçilerin kullandığı bir bağlantı değildir: buradan sipariş alınmaz, ürün ya da stok kaydı gönderilmez; yalnız sitenin herkese açık rafı okunur.

Uçlar

endpointNe döndürürZorunlu
searchKelimeyle arama, `channel` ile `market` ya da `ekstra` seçilir. Her satırda ürün numarası, başlık, marka, TL fiyat, varsa üstü çizili fiyat ve indirim yüzdesi, ŞOK'un kendi markası olup olmadığı (`private_label`), tam kategori yolu, kampanya rozetleri ve `store_id`. Kategori, marka, fiyat aralığı ve 'Kampanyalı Ürünler' filtresi; sitenin dört sıralaması. Sayfa numarası 0'dan başlar.query
category/products`category_id` ile tek kategori: o kategorideki her ürün sayfa sayfa, aramadaki alanlarla ve marka, fiyat, kampanya filtreleriyle. Kategori numarası `categories` ucundan ya da kategori adresinin sonundaki sayıdan (…-c-960 → 960) gelir.category_id
categoriesSeçilen kanalın bütün kategori ağacı (id, ad, seviye, üst kategori, adres) ve ŞOK'un ana sayfadan verdiği kısayollar.hepsi opsiyonel
product/detailÜrün numarası (`product_id`) ya da adresiyle tek bir ürün: fiyatlar, açıklama, menşei, net miktar, içindekiler, alerjen uyarısı, saklama koşulu, kullanım talimatı, besin değerleri tablosu, paket ölçüleri, KDV oranı ve gıda işletmecisi bilgisi.hepsi opsiyonel
campaignsKampanya listeleri: `weekly_deals` Haftanın Fırsatları (üstü çizili fiyatı olan her ürün, iki fiyatıyla), `badge_campaigns` rozetli ürünler (1 Alana 1 Bedava gibi), `campaign` tek bir kampanyanın ürünleri ve koşul metni, ayrıca ŞOK'un ürün ve promosyon grupları.hepsi opsiyonel
campaigns/listŞu an yayında olan kampanyaların listesi: id, başlık, koşullar, adres, görsel ve kampanya grupları. Buradaki `campaign_id` `campaigns` ucuna verilir.hepsi opsiyonel
suggestKullanıcı ilk harfleri yazdığında ŞOK'un çıkardığı arama ifadeleri ve kategoriler (en az 2 harf).query

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

Çalışan örnek

Beş satırın üçü ŞOK'un kendi markası Deren (`private_label: true`). `unit_price` her satırda null, çünkü ŞOK kilo ya da litre fiyatı yayımlamıyor: 1000 g Deren Rize'nin 289 TL'sini 500 g Çaykur Filiz'in 260 TL'siyle kıyaslayacaksanız gramajı başlıktan ya da `product/detail` içindeki `net_quantity` alanından kendiniz alın. Bir ayrıntı daha: 'cay' yazınca da aynı 86 ürün geldi, yani Türkçe karakter eksikliği aramayı bozmuyor. Harf hatası ise bozuyor; ŞOK yanlış yazılmış kelimeyi düzeltmeden 0 sonuç döndürüyor.

İstek
curl -X POST https://api.reefapi.com/sok/v1/search \
  -H "x-api-key: ANAHTARINIZ" \
  -H "content-type: application/json" \
  -d '{"query": "çay", "page_size": 5}'
Yanıt (kısaltılmış)
{
  "ok": true,
  "data": {
    "results": [
      {
        "product_id": "8786",
        "title": "Deren Harman Çay 1000 g",
        "brand": "DEREN",
        "price": 279,
        "price_before_discount": null,
        "discount_percent": null,
        "currency": "TRY",
        "unit_price": null,
        "in_stock": true,
        "private_label": true,
        "category": "Çay",
        "category_id": 960,
        "store_id": "13412",
        "store_sku_code": "..."
      },
      {
        "product_id": "5924",
        "title": "Deren Rize Çay 1000 g",
        "brand": "DEREN",
        "price": 289,
        "private_label": true,
        "...": "..."
      },
      {
        "product_id": "4576",
        "title": "Çaykur Filiz Çay 500 g",
        "brand": "ÇAYKUR",
        "price": 260,
        "private_label": false,
        "...": "..."
      }
    ],
    "count": 5,
    "total_results": 86,
    "total_pages": 18,
    "page": 0,
    "has_more": true,
    "channel": "market",
    "store_id": "13412"
  },
  "meta": { "record_count": 5, "charged_credits": 1, "cache_hit": false, "mode": "live" }
}

sokmarket.com.tr için kendi scraper'ınızı yazarsanız

ŞOK'un sitesi ürünleri kendi JSON servisinden çekiyor ve o servis yanlış adlandırılmış bir parametreyi reddetmiyor, sessizce yok sayıyor. Motoru kurarken ölçtük: kategori filtresini `categoryId=470` diye gönderince mağazanın bütün kataloğu, 2 722 ürün döndü; aynı kategori sitenin kendi kullandığı `cat=470` ile 25 ürün. Filtrenin çalışmadığını haber veren tek bir hata yok, yalnızca tuhaf derecede kalabalık bir liste var.

Eski fiyat alanı da ilk bakışta yanıltıcı. ŞOK, indirim olmayan üründe aynı fiyatı 'orijinal fiyat' alanına bir kez daha yazıyor; ölçtüğümüzde 2 722 teklifin 2 494'ünde iki alan eşitti, gerçek indirim yalnız 228 üründe vardı. Bu alanı olduğu gibi kaydeden bir script, kataloğun neredeyse tamamına %0 indirim yazar. Burada eşit fiyat indirim sayılmaz: `price_before_discount` ve `discount_percent` null gelir.

Son sayfadan sonrası ise 'ürün yok' cevabıyla aynı görünüyor: 68 sonucu olan 'kahve' aramasının bir sonraki sayfası `totalElements: 0` döndü. Sayfa sayfa ilerleyen bir döngü bunu 'ürün kalmadı' diye de 'bu kelimede ürün yok' diye de okuyabilir; motor ikisini sayfa numarasına bakarak ayırır ve yanıta not düşer.

Kendi kodunuzla haftalık bir fiyat kaydı tutacaksanız, her çalıştırmada üç şeyi sınamanız gerekir: dönen ürün sayısı o kategori için makul mü, eski fiyat yeni fiyattan gerçekten yüksek mi, boş gelen sayfa son sayfadan sonra mı geliyor. ŞOK bu üç davranıştan birini değiştirirse script hata vermeden çalışmaya devam eder, yalnız yanlış veri yazmaya başlar.

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

  • ŞOK Marketler bu servisin arkasında değil: resmi bir ŞOK arayüzü değildir, şirketle bir sözleşmemiz ya da ortaklığımız da yok.
  • Fiyatlar bir mağazaya aittir; varsayılan online mağaza `13412` (Ekstra'da `18149`) ve numarası her satırda yazar. Motor kurulurken başka 5 ŞOK mağazasıyla ortak 489 üründe fiyat yalnız 2'sinde farklıydı, ama mağazaların ürün çeşidi çok farklıydı: 500 üründen yalnız 70-141'i ortaktı. Mağaza numarasını biliyorsanız `store_id` ile verebilirsiniz; ŞOK'un tüm mağaza listesi oturum açmadan alınamıyor.
  • Kilo ya da litre başına fiyat ve kampanya başlangıç-bitiş tarihi ŞOK'ta yayımlanmıyor; `unit_price`, `starts_on` ve `ends_on` her zaman null. Kampanya tarihi varsa yalnız `campaigns` ucunun `terms` metninde, ŞOK'un yazdığı cümle olarak geçer.
  • `in_stock` pratikte her zaman true: ŞOK listede yalnız stokta olanı gösteriyor (motor kurulurken 2 722/2 722). Bir ürünün o mağazada olup olmadığını listede görünüp görünmemesinden anlarsınız.
  • `weekly_deals` Haftanın Fırsatları'nı birebir çıkarmak için mağazanın bütün kataloğunu okur: 25 Ekim'de 449 ürün, tek çağrıda yaklaşık 4,5 MB, 2 kredi. Listede gıda dışı ürünler de var; ilk üç satır bir şortlu takım, bir saç fırçası ve bir şorttu.
  • `store_sku_code` ŞOK'un iç ürün kodudur, paketteki barkod değildir; barkod yayımlanmıyor. Ürün puanı ve yorum verisi de sitede yok.
  • Yanıt önbellekten gelmez; çağrı anında ŞOK'tan okunan fiyatı ve kampanyayı görürsünüz.