Watsons Türkiye API: ürünler, fiyatlar ve stok JSON olarak
Watsons Türkiye sitesinde müşterinin ürün kartında gördüğü bilgiler burada JSON olarak dönüyor: ürün adı, marka, TL fiyatı, kaç adet stokta olduğu, puanı ve paketin üzerindeki barkodlar. Ürün sayfasına inince açıklamanın içinden ayıklanmış içindekiler listesi ve kullanım bilgisi de geliyor. Saç bakımından makyaja, bir rafın fiyat listesini çıkarmak için kategori koduyla sayfa sayfa gezmek yeterli. Watsons'a mal veren markalar ve tedarikçiler için kurulmuş bir entegrasyon değil: ne ürün kaydı açar ne siparişlere erişir, yalnızca rafta duranı alışveriş yapan birinin gördüğü hâliyle okur.
Uçlar
| endpoint | Ne döndürür | Zorunlu |
|---|---|---|
| search | Kelimeyle ('şampuan', 'ruj', 'elseve') ya da kategori koduyla (sac-bakim/sampuanlar/c/212 → 212) ürün listesi. Her satırda ürün kodu, marka, TL fiyat, stok durumu ve adedi, ortalama puan ve kaç kişinin puan verdiği, kategori yolu ve barkodlar. Marka, fiyat aralığı ve yalnız stoktakiler filtresi, sitenin kendi sıralamaları; yanıtta o arama için geçerli markalar, kategoriler ve fiyat bantları da listelenir. | hepsi opsiyonel |
| product/detail | Ürün sayfasındaki bilgilerin tamamı: görsellerin hepsi, kategori kırılımı, yıldız dağılımı, açıklama bölüm bölüm, açıklamada varsa içindekiler ve kullanım şekli, barkodlar, tedarikçi, paket ölçüleri, renk/boy seçenekleri, mağazadan teslim ve sipariş üst sınırı. Ürün `BP_` kodu, yalnızca numarası ya da watsons.com.tr linkiyle istenebilir. | product_id |
| product/reviews | Ürünün altına yazılan yorumlar, en yenisi önce: verilen yıldız, yorumun başlığı, metni ve tarihi; tek çağrıda en fazla 200 yorum. Yorumcuların adları yanıtta yer almaz. | product_id |
| search/suggest | Yarım bir kelime için Watsons'ın kendi öneri listesi: tamamlanmış arama ifadeleri ve sitenin o harflerle öne çıkardığı birkaç ürün, fiyatlarıyla (en az 2 harf). | query |
Her çağrı kredi ile ücretlendirilir. Başarısız ve engellenen çağrılar ücretsizdir.
Çalışan örnek
Watsons markayı kendi yazımıyla tutuyor: Elidor sitede Türkçe büyük İ ile ELİDOR, Nivea ise Latin I ile NIVEA. Sitenin marka filtresi yazımı harfi harfine karşılaştırdığı için "elidor" diye doğrudan siteye giden bir istek boş döner (ölçtük). Bu API markayı aynı anda birkaç yazımla gönderir (yazdığınız gibi, baş harfi büyük, tamamı büyük; hem Türkçe İ hem Latin I ile); aşağıdaki aramanın 13 sonucunun hepsi ELİDOR markalı. Bir ayrıntı daha: 'şampuan' araması saç kremlerini de getiriyor (listede Elidor 7/24 bakım kremleri var). Yalnız şampuan rafını istiyorsanız `category: "212"` verin.
curl -X POST https://api.reefapi.com/watsons-tr/v1/search \
-H "x-api-key: ANAHTARINIZ" \
-H "content-type: application/json" \
-d '{"query": "şampuan", "brand": "elidor", "max_price": 300, "in_stock": true, "page_size": 10}'{
"ok": true,
"data": {
"results": [
{
"position": 1,
"product_id": "BP_1283457",
"title": "Elidor Şampuan Güçlü ve Parlak 325 ml",
"brand": "ELİDOR",
"price": 224.9,
"price_display": "224,90 ₺",
"currency": "TRY",
"was_price": null,
"member_price": null,
"stock_status": "inStock",
"stock_level": 2847,
"rating": 4.5,
"review_count": 28,
"category_path": ["Saç Bakım", "Şampuanlar", "Şampuan"],
"barcodes": ["8683130108673", "8690637979729"],
"promotion": null
},
{
"position": 3,
"product_id": "BP_1481347",
"title": "Elidor Şampuan İpek Terapisi 400 ml",
"brand": "ELİDOR",
"price": 199,
"price_display": "199,00 ₺",
"stock_level": 165,
"rating": null,
"review_count": 0,
"barcodes": ["8683130108741"]
},
...
],
"count": 10,
"total_results": 13,
"total_pages": 2,
"sort": "most-relevant",
"filters": {
"brands": [..., { "name": "ELİDOR", "count": 13, "value": "ELİDOR" }, ...],
"categories": [{ "name": "Şampuanlar", "count": 6, "code": "212" }, ...]
}
},
"meta": { "record_count": 10, "pagination": { "page": 1, "page_size": 10, "has_more": true, "total": 13 }, "cache_hit": false, "mode": "live" }
}watsons.com.tr'yi kendi kodunuzla çekmek: üç ölçülmüş tuzak
Sitenin HTML sayfaları bulut sunucularından gelen isteği reddediyor: ölçtüğümüzde arama sayfası bir sunucudan 403 'Access Denied' döndü, oysa aynı sayfa Türkiye'den sıradan bir ev internetiyle açılıyordu. Yani kendi bilgisayarınızda geliştirirken her şey yolunda görünür; sorun, işi bir sunucuda zamanlanmış göreve çevirdiğiniz gün başlar. Bu motor HTML sayfasını ayrıştırmaz, sitenin kendi uygulamasının kullandığı ürün verisini okur.
İkinci tuzak daha sinsi. Watsons'ın arka planında iki site tanımı var ve eskisi hâlâ HTTP 200 veriyor, ama her kelimeye 0 ürün döndürüyor. Onu seçen bir script hiç hata görmeden boş liste toplamaya devam eder. Fiyatta da benzer bir durum var: arama satırında '0,00 ₺' yazan bir ürünün ürün sayfasında fiyatı hiç yok. Burada o fiyat 0 değil null olarak döner.
Üçüncüsü yukarıdaki marka yazımı. İlk sürümümüz her markayı Türkçe kurala göre büyük harfe çevirdiği için 'krem' + 'nivea' sorgusu 0 ürün getirdi. Hata vermeyen, sadece eksik sonuç veren bir kusur olduğu için fark edilmesi zordu.
Bir rafın bugünkü fiyatlarına bir kez bakmak için tarayıcı yeter. Fiyatları düzenli kaydeden bir iş kurduğunuzda ise zamanın çoğu, bu üç durumdan birinin sessizce geri gelip gelmediğini kontrol etmeye harcanır.
Sınırlar ve dürüst notlar
- Watsons'ın resmi API'si değil: Watsons bu erişimi sunmuyor ya da onaylamıyor, aramızda bir sözleşme veya iş birliği de bulunmuyor.
- Watsons Club fiyatı (`member_price`), eski fiyat (`was_price`) ve son 30 gün fiyatı (`prior_price`) için alanlar var, ama şu ana kadar hiçbir üründe dolu görmedik: motor kurulurken taranan yaklaşık 1.400 üründe de, 24 Ekim 2026'daki üç aramanın 60 satırında da null'dı. Kampanya döneminde dolacaklarını bugünden söyleyemeyiz.
- `review_count` verilen yıldızları sayar; `product/reviews` ise yalnız yazılı yorumları döndürür. Arada fark büyük olabilir: bir üründe 282 değerlendirmeye karşı 3 yazılı yorum ölçtük.
- '2500 TL ve Üzeri Alışverişine 500 TL Kazanç' gibi sepet kampanyaları ürün kaydında `promotion_message` metni olarak gelir; fiyattan düşülmez.
- İçindekiler, Watsons açıklamaya bu bölümü yazmışsa gelir. Kurulumdaki 25 üründen 13'ünde vardı (cilt bakımda 5/5, makyajda 1/6); yoksa alan null olur, metin `description` içinde kalır.
- Renk tonları (fondöten, ruj) Watsons'ta ayrı ürün kodlarıdır; her ton ayrı bir satır olarak gelir.
- Yanıttaki `meta.fetched_at`, fiyat ve stoğun Watsons'tan okunduğu anı gösterir; kayıtlarınızda bu zamanı da tutun.