API Platformu
Business Data API
Google işletme kayıtları — kategoriye, ada ve konuma göre işletme bulun, bir işletmenin tam profilini okuyun, puan, tarih ve işletme yanıtlarıyla yorumlarını çekin.
Yalnızca Türkiye'de milyonlarca kayıt içeren Google işletme listelerinde kategoriye, ada ve uzaklığa göre arama yapın. Bir işletmenin tam profilini okuyun: puan dağılımı, çalışma saatleri, açıklama ve özellikler. Yorumlarını puan, tarih, yazar ve işletme yanıtlarıyla birlikte çekin. Tek bir endpoint, type parametresiyle seçilen üç rapor sunar.
Yorumlar her zaman task olarak çalışır
Bu endpoint her isteği task olarak çalıştırır. search ve profile genellikle varsayılan 60 saniyelik bekleme içinde normal bir 200 ile döner. reviews ise yorumların toplanması bir ile üç dakika sürdüğü için neredeyse her zaman task_id içeren bir 202 döndürür. Sonuç hazır olana kadar GET /v1/tasks/{task_id} ile sorgulayın; örnek döngü aşağıda. Her response task id'yi X-Task-Id header'ında taşır. Idempotency-Key header'ıyla güvenle tekrar deneyebilirsiniz. 202 dönmüş bir isteği asla yeniden göndermeyin: ikinci istek ikinci kez ücretlendirilir.
Kimlik Doğrulama
| Header | Tip | Açıklama |
|---|---|---|
SEMUST-API-USER | string | API kullanıcınızın kullanıcı adı |
SEMUST-API-PASSWORD | string | API kullanıcınızın şifresi |
Accept-Language | string | İsteğe bağlı. Hata mesajlarını Türkçe almak için tr gönderin |
API kimlik bilgilerinizi API Erişimi sayfasından oluşturun.
SEMUST-API-USER: your_username
SEMUST-API-PASSWORD: your_password
Content-Type: application/jsonRapor Tipleri
type | Döndürdüğü | Ücret |
|---|---|---|
search (varsayılan) | Kategorilere, bir ada ve/veya haritada bir daireye uyan işletmeler; puan, yorum sayısı, iletişim bilgileri ve adresle birlikte | $0.0132 + dönen işletme başına $0.000396 |
profile | Bir işletmenin tam profili: search'ün döndürdüğü her şey, ayrıca açıklama, çalışma saatleri, özellikler ve ilgili işletmeler | $0.00594 |
reviews | Bir işletmenin yorumları: metin, puan, tarih, yazar ve işletme yanıtı | İstenen her 10 yorum için $0.000825 |
search her işletme için place_id ve cid döndürür. Bunlardan birini profile veya reviews'a göndererek tam olarak o işletmeyi sorgularsınız. name gönderilirse arama yapılır ve en iyi eşleşme kullanılır.
{
"type": "search",
"categories": ["cafe"],
"latitude": 40.9906,
"longitude": 29.0270,
"radius_km": 1,
"limit": 20
}{
"type": "profile",
"place_id": "ChIJQ3x3p-e5yhQRCzOLzD3Pdkw"
}{
"type": "reviews",
"cid": "5509819058466009867",
"sort": "newest",
"limit": 50
}İstek Parametreleri
Seçilen type için geçerli olmayan bir parametre yok sayılmaz, reddedilir; yanlış yazılmış bir parametre ise hatada adıyla ve bir öneriyle bildirilir. JSON null değeri "gönderilmedi" sayılır.
Body: search
categoriesstring[]cafe, dentist veya car_repair gibi 1–10 kategori kimliği. Bilinmeyen bir kimlik öneriyle reddedilir (cafee → cafe). 5.316 kimliği GET /v1/business-data/categories?q=… ile arayabilirsiniz.
namestringAdında bu metin geçen işletmeler; büyük/küçük harf duyarsız, en fazla 200 karakter. Türkçe I ve ı iki okunuşla da eşleşir; KADIKÖY aynı zamanda Kadıköy'ü de bulur.
latitude, longitude, radius_kmnumber, number, integerHaritada bir daire: merkez derece olarak, yarıçap tam kilometre olarak, 1–500. Üçünü birlikte gönderin ya da hiçbirini göndermeyin.
countrystringdefault: TRİki harfli ülke kodu. Konum yoksa varsayılan TR'dir. Konum varsa siz göndermedikçe ülke filtresi uygulanmaz.
min_ratingnumberYalnızca puanı en az bu değer olan işletmeler, 1–5.
min_reviewsintegerYalnızca en az bu kadar yorumu olan işletmeler.
claimedbooleantrue: yalnızca sahibi tarafından sahiplenilmiş kayıtlar. false: yalnızca sahiplenilmemiş olanlar.
sortstringdefault: reviewsreviews (yorum sayısı) veya rating.
directionstringdefault: descdesc veya asc.
limitintegerdefault: 100Sayfa başına işletme, 1–1000.
pageintegerdefault: 1Sayfa numarası. page × limit en fazla 20.000 olabilir.
categories, name veya konumdan en az birini gönderin. Yalnızca filtrelerle arama yapılamaz.
Body: profile ve reviews
place_idstringsearch sonucundaki işletmenin place id değeri (ChIJQ3x3p-e5yhQRCzOLzD3Pdkw).
cidstringsearch sonucundaki işletmenin sayısal kimliği, metin olarak ("5509819058466009867").
namestringİşletmenin adı; arama yapılır. Şehri eklemek sonucu iyileştirir ("Galata Kulesi İstanbul").
countrystringdefault: TRİki harfli ülke kodu: name'in arandığı ülke.
languagestringKategori adlarının dili ve yorumların çevrildiği dil. TR için varsayılan tr, diğer ülkelerde en.
sortstringdefault: relevantYalnızca reviews: relevant, newest, highest_rating veya lowest_rating.
limitintegerdefault: 10Yalnızca reviews. Çekilecek yorum sayısı, 1–1000; 10'un katına yukarı yuvarlanır (25, 30 olur). Yuvarlanmış sayı kadar ücretlendirilirsiniz ve en fazla o kadar yorum alırsınız.
place_id, cid ve name alanlarından tam olarak birini gönderin.
Body: tüm tipler
typestringdefault: searchsearch, profile veya reviews.
idempotency_keystringİsteğe bağlı, en fazla 128 karakter. Aynı anahtarla tekrarlanan istek aynı task'ı döndürür: task çalışırken 202'sini, bittiğinde saklanan sonucunu. Task bir kez ücretlendirilir. Anahtar, task bittikten sonra 72 saat boyunca ayrılmış kalır. Idempotency-Key header'ıyla aynı işi görür; ikisi birden gönderilirse bu alan geçerli olur.
Query
waitintegerdefault: 60Sonucun bekleneceği saniye, 0–80. İstek bu sürenin sonunda hâlâ çalışıyorsa response bir task_id ile 202 olur. 0 hemen 202 döndürür.
Headers
Idempotency-Keystringİsteğe bağlı. Yukarıdaki idempotency_key gibi çalışır; ikisi birden gönderilirse body alanı geçerli olur.
İki ücretsiz sorgu:
GET /v1/business-data/categories?q=…,search'ün kabul ettiği kategori kimliklerini en büyükten küçüğe listeler; büyük/küçük harf duyarsız bir alt dizeyle filtrelenir. Boşluklar alt çizgiyle eşleşir.GET /v1/business-data/markets, desteklenen tüm ülkeleri ve dilleri listeler.
curl -X POST https://data.semust.com/v1/business-data \
-H "SEMUST-API-USER: your_username" \
-H "SEMUST-API-PASSWORD: your_password" \
-H "Content-Type: application/json" \
-d '{"type": "search", "categories": ["cafe"], "latitude": 40.9906, "longitude": 29.0270, "radius_km": 1, "limit": 20}'import time
import requests
HEADERS = {
"SEMUST-API-USER": "your_username",
"SEMUST-API-PASSWORD": "your_password",
}
response = requests.post(
"https://data.semust.com/v1/business-data",
headers=HEADERS,
json={"type": "reviews", "cid": "5509819058466009867", "sort": "newest", "limit": 50},
timeout=90, # ?wait= süresinden uzun (varsayılan 60 saniye)
)
data = response.json()
# Yorumlar bir ile üç dakika sürer: 202 bekleyin ve sorgulayın.
# Beklerken asla yeniden POST etmeyin; ikinci kez ücretlendirilir.
while response.status_code == 202:
time.sleep(int(response.headers.get("Retry-After", data.get("retry_after", 5))))
response = requests.get(data["poll_url"], headers=HEADERS, timeout=30)
data = response.json()
if response.status_code != 200:
raise SystemExit(f"{data['code']}: {data['error']} {data.get('hint', '')}")
print(data["business"]["name"], data["business"]["rating"])
for review in data["items"]:
print(review["published_at"], review["rating"], (review["text"] or "")[:80])Response
search ve reviews satırları items içinde döndürür; profile tek bir data nesnesi döndürür. reviews ayrıca bir business başlığı döndürür: yorumların ait olduğu işletme, genel puanı ve yorum sayısıyla.
Belgelenen her anahtar her satırda bulunur; kayıtta olmayan değer null'dır. Adres parçaları Google'ın kendi seviyelerini izler. Türkiye'de city ilçe (Kadıköy), region il (İstanbul), neighborhood ise mahalledir.
Hiçbir işletmeyle eşleşmeyen bir arama geçerli bir yanıttır: items boş döner ve istek ücreti faturalanır. Var olmayan bir işletme ise geçerli bir yanıt değildir: profile ve reviews 404 BUSINESS_NOT_FOUND döndürür ve ücret alınmaz.
Aşağıdaki örnekler kısaltılmış gerçek yanıtlardır. Yorum yazarlarının adları değiştirilmiştir.
{
"success": true,
"type": "search",
"country": "TR",
"total": 450,
"count": 20,
"page": 1,
"limit": 20,
"sort": "reviews",
"direction": "desc",
"items": [
{
"name": "Asuman Moda",
"category": "Chocolate shop",
"categories": ["chocolate_shop", "cafe"],
"place_id": "ChIJX5XeCGG4yhQRH7cWWfY90-Q",
"cid": "16488590788999427871",
"address": "Caferağa, Şair Nefi Sk. No:9/a, 34710 Kadıköy/İstanbul",
"neighborhood": "Caferağa",
"city": "Kadıköy",
"region": "İstanbul",
"postal_code": "34710",
"country": "TR",
"phone": "+902163450526",
"website": "http://www.asuman.com/",
"domain": "www.asuman.com",
"latitude": 40.9837234,
"longitude": 29.026517,
"rating": 4.1,
"reviews": 8907,
"rating_distribution": { "1": 879, "2": 402, "3": 753, "4": 1511, "5": 5362 },
"price_level": null,
"claimed": true,
"photos": 4219,
"maps_url": "https://www.google.com/maps?cid=16488590788999427871&hl=en&gl=TR",
"updated_at": "2026-09-21T08:36:30Z"
}
],
"cost": 0.02112,
"cached": false,
"request_id": "0b7e6f1a-3c2d-4e5f-9a8b-1c2d3e4f5a6b"
}{
"success": true,
"type": "profile",
"country": "TR",
"language": "tr",
"data": {
"name": "Galata Kulesi",
"category": "Tarihi Yer",
"categories": ["Tarihi Yer", "Turistik Yer"],
"place_id": "ChIJQ3x3p-e5yhQRCzOLzD3Pdkw",
"cid": "5509819058466009867",
"address": "Bereketzade, 34421 Beyoğlu/İstanbul",
"neighborhood": "Bereketzade",
"city": "Beyoğlu",
"region": "İstanbul",
"postal_code": "34421",
"country": "TR",
"phone": "+902122490344",
"website": "https://galatakulesi.gov.tr/",
"domain": "galatakulesi.gov.tr",
"latitude": 41.025569,
"longitude": 28.9741286,
"rating": 4.6,
"reviews": 219004,
"rating_distribution": { "1": 3922, "2": 2572, "3": 11185, "4": 31764, "5": 169561 },
"price_level": null,
"claimed": true,
"photos": 399916,
"maps_url": "https://www.google.com/maps?cid=5509819058466009867",
"updated_at": null,
"description": "En üst katındaki restoranıyla boğaza tepeden bakan, restore edilmiş 14. yüzyıl kulesi ve eski zindan.",
"open_now": "closed",
"hours": {
"monday": [{ "open": "08:30", "close": "22:00" }],
"tuesday": [{ "open": "08:30", "close": "22:00" }]
},
"attributes": {
"available": [],
"unavailable": ["has_wheelchair_accessible_entrance"]
},
"topics": [],
"people_also_search": []
},
"cost": 0.00594,
"cached": false,
"request_id": "5d4c3b2a-1f0e-4d9c-8b7a-6f5e4d3c2b1a"
}{
"success": true,
"type": "reviews",
"country": "TR",
"language": "tr",
"count": 50,
"limit": 50,
"sort": "newest",
"business": {
"name": "Galata Kulesi",
"place_id": "ChIJQ3x3p-e5yhQRCzOLzD3Pdkw",
"cid": "5509819058466009867",
"rating": 4.6,
"reviews": 219004
},
"items": [
{
"review_id": "Ci9DQUlRQUNvZENodHljRjlvT2xkSFJXRkJRVTAyVDNweVRIQXhkM0oxUm1oVGNYYxAB",
"rating": 5,
"text": "Müzekart ile ücretsiz giriş mevcut. İçeride asansör de var, en üst kata çıkabiliyorsunuz.",
"original_text": null,
"original_language": "tr",
"published_at": "2026-10-20T17:29:15Z",
"url": "https://www.google.com/maps/reviews/data=!4m8!14m7…",
"images": 7,
"author": {
"name": "Ayşe Y.",
"url": "https://www.google.com/maps/contrib/…/reviews",
"reviews": 88,
"photos": 113,
"local_guide": true
},
"owner_answer": null
}
],
"cost": 0.004125,
"cached": false,
"request_id": "9a8b7c6d-5e4f-4a3b-2c1d-0e9f8a7b6c5d"
}Yanıt Alanları Referansı
Zarf
| Alan | Tip | Açıklama |
|---|---|---|
country | string | Aranan ülke. Yalnızca konumla sınırlanmış bir search'te yoktur |
language | string | profile ve reviews: kullanılan dil |
total | integer | search: eşleşen işletme sayısı. Sayfalamayla yalnızca ilk 20.000'ine erişilebilir |
count | integer | items içindeki satır sayısı; search'te ücretlendirilen işletme sayısı |
limit, page, sort, direction | Uygulanan sayfalama ve sıralama. reviews'ta limit, ücretlendirilen yuvarlanmış sayıdır | |
business | object | Yalnızca reviews: name, place_id, cid, rating ve reviews (toplam yorum sayısı) |
İşletme (search satırı, profile → data)
| Alan | Tip | Açıklama |
|---|---|---|
name | string | İşletme adı |
category, categories | string | null, string[] | Ana kategori. search'te categories, tekrar categories parametresine gönderebileceğiniz kategori kimliklerini içerir. profile'da ise kategori adlarını language dilinde içerir |
place_id, cid | string | null | profile ve reviews için kimlikler |
address, neighborhood, city, region, postal_code, country | string | null | Tam adres ve parçaları |
phone, website, domain | string | null | Kayıttaki iletişim bilgileri |
latitude, longitude | number | null | Konum |
rating, reviews | number | null, integer | null | Ortalama puan (1–5) ve yorum sayısı |
rating_distribution | object | null | Yıldız başına yorum sayısı, "1"–"5" |
price_level | string | null | ör. inexpensive, moderate, expensive |
claimed | boolean | null | Kaydın sahibi tarafından sahiplenilip sahiplenilmediği |
photos | integer | null | Fotoğraf sayısı |
maps_url | string | null | İşletmenin Google Haritalar bağlantısı |
updated_at | string | null | search: kaydın son güncellendiği zaman, ISO 8601 UTC. Canlı okunan profile'da null |
Yalnızca profile
| Alan | Tip | Açıklama |
|---|---|---|
description | string | null | İşletmenin kendi açıklaması |
open_now | string | null | İstek anındaki durum: open, closed ya da temporarily_closed gibi başka bir durum |
hours | object | null | Gün (monday…sunday) → {open, close} listesi, yerel saatle HH:MM. close değeri 00:00 gece yarısıdır |
attributes | object | available ve unavailable olanak kimlikleri, ör. has_wheelchair_accessible_entrance |
topics | {topic, mentions}[] | Yorumlarda en çok geçen konular |
people_also_search | {name, place_id, cid, rating, reviews}[] | Kullanıcıların ayrıca baktığı işletmeler |
reviews satırı
| Alan | Tip | Açıklama |
|---|---|---|
review_id | string | null | Değişmeyen yorum kimliği |
rating | number | null | Yıldız, 1–5 |
text | string | null | Yorum metni. Yorum language diline çevrildiyse orijinali original_text içindedir; çevrilmediyse original_text null'dır |
original_language | string | null | Yorumun yazıldığı dil |
published_at | string | null | ISO 8601 UTC |
url | string | null | Yorumun bağlantısı |
images | integer | Ekli fotoğraf sayısı |
author | object | name, url, reviews ve photos (yazarın toplamları) ile local_guide |
owner_answer | object | null | İşletme sahibinin yanıtı: text, published_at |
Hatalar
Her hata sabit bir code, okunabilir bir error ve retryable içerir; faydalı olduğunda ayrıca field, hint ve allowed. Türkçe mesajlar için Accept-Language: tr gönderin. Bir hata için asla ücret alınmaz. Diğer API'lerle ortak tam liste Hata Kodları sayfasındadır. Bu endpoint'e özgü olanlar:
| Durum | Kod | Anlamı | Ne yapmalı |
|---|---|---|---|
| 202 | — | Hata değil: istek wait saniye sonunda hâlâ çalışıyor (reviews için olağan) | GET /v1/tasks/{task_id} ile sorgulayın; bkz. Task'lar |
| 400 | SEARCH_CRITERIA_REQUIRED | categories, name veya konum içermeyen bir search | En az birini gönderin |
| 400 | UNKNOWN_CATEGORY | Var olmayan bir kategori kimliği; hint en yakınını önerir | GET /v1/business-data/categories?q=… |
| 400 | BUSINESS_REQUIRED | place_id, cid veya name içermeyen bir profile ya da reviews | Birini gönderin |
| 400 | PAGE_OUT_OF_RANGE | page × limit 20.000'i aşıyor | Aramayı daraltın |
| 400 | INVALID_PARAMETER | ör. üç alanından biri eksik bir konum, 1–500 arasında tam sayı olmayan bir yarıçap, aynı anda iki kimlik ya da sayı olarak gönderilmiş bir cid; field hangisi olduğunu söyler | Alanı düzeltin |
| 400 | UNSUPPORTED_MARKET | Bilinmeyen ülke ya da dil | GET /v1/business-data/markets |
| 404 | BUSINESS_NOT_FOUND | place_id, cid veya name ile eşleşen işletme yok (ücret alınmaz) | Kontrol edin, ada şehri ekleyin ya da search sonucundaki bir kimliği kullanın |
{
"error": "'cafee' bir işletme kategorisi değil",
"code": "UNKNOWN_CATEGORY",
"field": "categories",
"hint": "'cafe' mı demek istediniz? GET /v1/business-data/categories?q=… ile tüm kategori kimliklerini arayabilirsiniz",
"retryable": false
}{
"error": "İşletme bulunamadı",
"code": "BUSINESS_NOT_FOUND",
"hint": "Adı kontrol edin, şehri ekleyin ya da type=search sonucundaki place_id veya cid değerini kullanın. Ücret alınmadı",
"retryable": false,
"request_id": "1e2d3c4b-5a6f-4e7d-8c9b-0a1f2e3d4c5b"
}Krediler ve Sınırlar
| İstek | Ücret |
|---|---|
search | $0.0132 + dönen işletme başına $0.000396 (100 işletme için $0.0528) |
profile | $0.00594 |
reviews | İstenen her 10 yorum için $0.000825 (100 yorum için $0.00825) |
search, döndürdüğü işletme sayısı üzerinden ücretlendirilir. 100 işletme isteyip 3 bulan bir arama $0.0132 + 3 × $0.000396 tutar. Hiçbir şey bulamayan arama yine $0.0132 istek ücretini öder.
reviews, işletmenin daha az yorumu olsa bile istediğiniz limit üzerinden, 10'un katına yukarı yuvarlanarak ücretlendirilir. Yorum sayısı, yorumlar toplanana kadar bilinmez. limit değerini search ve profile yanıtlarındaki reviews sayısına göre belirleyin: 4 yorumu olan bir işletme için 100 yorum istemek 100 yorumun ücretini öder.
Sonuçlar önbellekte tutulur: search ve profile için 24 saat, reviews için 6 saat. Önbellekten dönen yanıt "cached": true ile işaretlenir ve canlı yanıtla aynı ücreti öder.
Dakikalık ve günlük sınırlar hesabınızda tanımlıdır (429 RATE_LIMIT_EXCEEDED). API kullanıcısı başına aynı anda en fazla 5 istek çalışır; fazlası Retry-After ile 429 TOO_MANY_CONCURRENT_REQUESTS alır. 202 dönmüş bir istek, task'ı bitene kadar yerini korur. API kullanıcısı başına aynı anda en fazla 100 task bitmemiş durumda olabilir (429 TOO_MANY_PENDING_TASKS). Sorgulamanın kendi limiti vardır ve bunların hiçbirine sayılmaz; bkz. Task'lar.
