API Platformu

Alan Adı Araştırması API

Herhangi bir alan adının hangi anahtar kelimelerde sıralandığını, organik rakiplerini, en çok trafik alan sayfalarını ve arama görünürlüğünün tek çağrılık özetini alın.

Herhangi bir alan adının hangi anahtar kelimelerde sıralandığını, organik rakiplerini, en çok trafik alan sayfalarını ve arama görünürlüğünün tek çağrılık özetini alın. Tek bir endpoint, type parametresiyle seçilen dört rapor sunar. Türkiye verisi 61 milyondan fazla anahtar kelimeyi kapsar.

Kimlik Doğrulama

Tüm istekler header tabanlı kimlik doğrulama gerektirir. Her istekte API kimlik bilgilerinizi ekleyin.

HeaderTipAçıklama
SEMUST-API-USERstringAPI kullanıcınızın kullanıcı adı
SEMUST-API-PASSWORDstringAPI kullanıcınızın şifresi
Accept-Languagestringİ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: kullanici_adiniz
SEMUST-API-PASSWORD: sifreniz
Content-Type: application/json
Accept-Language: tr

Rapor Tipleri

typeDöndürdüğüÜcretlendirilen satır
overviewTek bir özet: kelime sayısı, tahmini trafik ve değeri, ilk 3 / 10 / 20 / 100'deki kelime sayıları, yeni ve kaybedilen kelimeler1
keywordsAlan adının sıralandığı kelimeler: hacim, CPC, zorluk, niyet, pozisyon, sıralanan URL ve tahmini trafikdönen satır
competitorsAynı kelimeler için yarışan alan adları, ortak kelime sayısına göre. Alan adının kendisi listede yer almazdönen satır
top_pagesAlan adının sayfaları, getirdikleri organik trafiğe göredönen satır

Varsayılan overview'dur. Tek satır döndürdüğü için type gönderilmeyen bir istek en düşük ücreti öder.

{
  "type": "keywords",
  "domain": "ornek.com.tr",
  "limit": 100
}

İstek Parametreleri

application/json gövdesi gönderin. 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. Böylece bir yazım hatası, istediğinizden farklı bir sonucu sessizce döndüremez. JSON null değeri "gönderilmedi" sayılır.

Gövde

domainstringrequired

Araştırılacak alan adı. https://, www., port, yol (path) ve Search Console'un sc-domain: öneki otomatik temizlenir. Uluslararası alan adları (örnek.com.tr) kabul edilir.

typestringdefault: overview

overview, keywords, competitors veya top_pages.

countrystringdefault: TR

Arama pazarının iki harfli ülke kodu. Aşağıdaki Pazarlar bölümüne bakın.

languagestring

Pazarın dili. Varsayılan, pazarın ana dilidir (TR için tr).

limitintegerdefault: 100

Döndürülecek satır sayısı, 1–1000. overview ile kullanılamaz.

pageintegerdefault: 1

Sayfa numarası. page × limit en fazla 10.000 olabilir. overview ile kullanılamaz.

sortstring

keywords: traffic (varsayılan), volume, position, difficulty, cpc. competitors: common_keywords (varsayılan), avg_position. top_pages: traffic.

directionstring

desc veya asc. position ve avg_position için varsayılan asc'dir (en iyisi önce), diğerleri için desc.

min_volumeinteger

Yalnızca keywords. Aylık arama hacmi en az bu kadar olan kelimeleri tutar.

max_positioninteger

Yalnızca keywords. Alan adının bu pozisyonda veya daha iyisinde sıralandığı kelimeleri tutar, 1–100.

intentstring

Yalnızca keywords. informational, navigational, commercial veya transactional.

containsstring

Yalnızca keywords. Bu metni içeren kelimeleri tutar, 1–80 karakter, büyük/küçük harf duyarsız (Türkçe İ/ı doğru işlenir).

idempotency_keystring

İsteğe bağlı, en fazla 128 karakter. Aynı anahtarla 24 saat içinde tekrarlanan istek, kayıtlı yanıtı ücretsiz döndürür; böylece zaman aşımına uğrayan bir istek güvenle tekrar denenebilir.

{
  "type": "keywords",
  "domain": "ornek.com.tr",
  "limit": 50,
  "min_volume": 100,
  "max_position": 10,
  "intent": "commercial",
  "contains": "avukat",
  "sort": "volume"
}

Pazarlar

GET /v1/domain-research/markets desteklenen tüm ülkeleri ve dillerini listeler. Veri sorgusu yapmaz ve ücretsizdir.

{
  "success": true,
  "default_country": "TR",
  "markets": [
    { "country": "TR", "name": "Turkiye", "languages": ["tr"] },
    { "country": "US", "name": "United States", "languages": ["en", "es"] }
  ]
}

Kod Örnekleri

Bir alan adının en çok trafik getiren kelimelerini almak.

curl -X POST https://data.semust.com/v1/domain-research \
  -H "SEMUST-API-USER: kullanici_adiniz" \
  -H "SEMUST-API-PASSWORD: sifreniz" \
  -H "Content-Type: application/json" \
  -H "Accept-Language: tr" \
  -d '{
    "type": "keywords",
    "domain": "ornek.com.tr",
    "limit": 100
  }'

Yanıt

Liste raporları satırları items içinde döndürür; overview bunun yerine tek bir data nesnesi döndürür. total sorgu için var olan satır sayısı, count bu yanıttaki satır sayısıdır.

overview içindeki pozisyon sayıları kümülatiftir: top10, top3'ü de kapsar. Trafik, aylık organik ziyaretin tahminidir. Elimizde olmayan bir değer 0 değil null döner: "cpc": null "CPC verisi yok" demektir, "CPC sıfır" değil.

Aşağıdaki örnekler semust.com için Türkiye pazarından alınmış gerçek yanıtlardır.

{
  "success": true,
  "type": "overview",
  "domain": "semust.com",
  "country": "TR",
  "language": "tr",
  "data": {
    "organic": {
      "keywords": 136,
      "traffic": 1233,
      "traffic_value_usd": 1541.15,
      "top3": 6,
      "top10": 36,
      "top20": 89,
      "top100": 136,
      "new": 86,
      "lost": 29,
      "improved": 25,
      "declined": 23
    },
    "paid": { "keywords": 0, "traffic": 0, "traffic_value_usd": 0 }
  },
  "cost": 0.013332,
  "cached": false,
  "request_id": "3f1c2a9e-5b7d-4c1e-9a2f-8d6e4b0c7a11"
}

Yanıt Alanları Referansı

Zarf

AlanTipAçıklama
successbooleanİstek başarılıysa true
type, domain, country, languagestringNormalizasyon ve varsayılanlardan sonra gerçekte sorgulanan değerler
totalintegerSorgu için var olan satır sayısı (liste raporları)
countintegerBu yanıttaki satır sayısı (liste raporları)
page, limit, sort, directionUygulanan sayfalama ve sıralama (liste raporları)
itemsarraySatırlar (liste raporları)
dataobjectÖzet (overview)
costnumberBu isteğin ücreti, USD
cachedbooleanÖnbellekten sunulduysa true
request_idstringİsteği izlemek için destek ekibine iletin

overview → data.organic

AlanTipAçıklama
keywordsintegerAlan adının ilk 100'de sıralandığı kelime sayısı
trafficintegerTahmini aylık organik ziyaret
traffic_value_usdnumberBu trafiğin ücretli aramada maliyeti, USD
top3, top10, top20, top100integerO pozisyonda veya daha iyisinde sıralanan kelime sayısı (kümülatif)
new, lostintegerÖnceki güncellemeden bu yana sıralamaya giren veya çıkan kelimeler
improved, declinedintegerPozisyonu yükselen veya düşen kelimeler

data.paid, ücretli arama için keywords, traffic ve traffic_value_usd içerir.

keywords satırı

AlanTipAçıklama
keywordstringArama sorgusu
volumeinteger | nullAylık ortalama arama
cpcnumber | nullOrtalama tıklama başı maliyet, USD
difficultyinteger | nullSıralama zorluğu, 0–100
intentstring | nullinformational, navigational, commercial veya transactional
positioninteger | nullAlan adının pozisyonu
urlstring | nullSıralanan sayfa
trafficinteger | nullBu kelimeden gelen tahmini aylık ziyaret

competitors satırı

AlanTipAçıklama
domainstringRakip alan adı
common_keywordsintegerİki alan adının da sıralandığı kelime sayısı
avg_positionnumber | nullRakibin bu ortak kelimelerdeki ortalama pozisyonu
keywordsinteger | nullRakibin sıralandığı toplam kelime sayısı
trafficinteger | nullRakibin toplam tahmini aylık trafiği

top_pages satırı

AlanTipAçıklama
urlstringSayfa
keywordsintegerSayfanın sıralandığı kelime sayısı
trafficintegerSayfaya tahmini aylık ziyaret
top3, top10integerBu kelimelerden ilk 3 / ilk 10'da olanların sayısı

Hatalar

Her hata aynı biçimdedir: kodunuzda kullanacağınız sabit bir code, okunabilir bir error mesajı ve aynı isteği tekrar göndermenin işe yarayıp yaramayacağını söyleyen retryable. Faydalı olduğunda hata ayrıca sorunlu field alanını, nasıl düzeltileceğine dair bir hint ipucunu ve geçerli değerleri (allowed) içerir. Accept-Language: tr gönderirseniz error ve hint Türkçe gelir; code her iki dilde aynıdır.

4xx hataları hiçbir ücret alınmadan önce tespit edilir, bu yüzden ücretsizdir. Bu noktadan sonraki bir hata tamamen iade edilir. Bir hata için asla ücret alınmaz.

Kontroller sabit bir sırayla yapılır ve ilk sorun bildirilir: JSON → bilinmeyen parametreler → type → tipin almadığı parametreler → domain → pazar → değerler.

DurumKodAnlamıNe yapmalı
400INVALID_JSONGövde bir JSON nesnesi değilJSON nesnesi gönderin
400UNKNOWN_PARAMETERTanımadığımız bir parametre; hint en yakın doğru adı önerirYazımı düzeltin
400INVALID_TYPEBilinmeyen type; allowed geçerli olanları listelerallowed içinden bir değer kullanın
400TYPE_UNAVAILABLEDuyurulmuş ama henüz açılmamış bir raporallowed içinden bir değer kullanın
400PARAMETER_NOT_ALLOWEDParametre var ama bu type için değil; hint onu kabul eden tipleri söylerKaldırın ya da type'ı değiştirin
400DOMAIN_REQUIREDdomain eksikBir alan adı gönderin
400INVALID_DOMAINAlan adı değil (IP, localhost, uzantısız…)Kayıtlı bir alan adı gönderin
400UNSUPPORTED_MARKETÜlke desteklenmiyor ya da dil o ülkede yok; allowed o ülkenin dillerini listelerPazarlar bölümüne bakın
400INVALID_PARAMETERBir değer aralık dışında veya yanlış tipte; field hangisi olduğunu söylerParametrenin kurallarına bakın
400PAGE_OUT_OF_RANGEpage × limit 10.000'i aşıyorSorguyu filtrelerle daraltın
401INVALID_CREDENTIALSKullanıcı adı veya şifre yanlışKimlik bilgilerinizi kontrol edin
402INSUFFICIENT_CREDITSBakiye isteği karşılamıyor; required ve balance farkı gösterirlimit'i düşürün ya da bakiye yükleyin
403SERVICE_NOT_ENABLEDAlan Adı Araştırması bu API kullanıcısı için etkin değilHesabınızda etkinleştirin
403IP_NOT_WHITELISTEDIP adresiniz izin listesinde değilAPI Erişimi sayfasından ekleyin
409REQUEST_IN_PROGRESSAynı idempotency_key hâlâ çalışıyorBitince tekrar deneyin
413REQUEST_TOO_LARGEGövde 16 KB'tan büyükDaha küçük bir gövde gönderin
429RATE_LIMIT_EXCEEDEDDakikalık veya günlük sınırınıza ulaştınızYavaşlayın
429TOO_MANY_CONCURRENT_REQUESTSAynı anda 5'ten fazla istek çalışıyorBirinin bitmesini bekleyin (Retry-After)
502REQUEST_FAILEDVeri alınamadı; retryable tekrar denemenin işe yarayıp yaramayacağını söylerretryable true ise tekrar deneyin
503SERVICE_BUSYGeçici yoğunlukRetry-After saniye sonra tekrar deneyin
503SERVICE_UNAVAILABLEGeçici olarak kullanılamıyorRetry-After saniye sonra tekrar deneyin
504TIMEOUTİstek çok uzun sürdüTekrar deneyin; güvenlidir
500INTERNAL_ERRORBizim tarafımızda bir sorun oluştuTekrar deneyin ya da request_id ile destek ekibine yazın

Verisi olmayan bir alan adı hata değildir: yanıt 200, "total": 0 ve boş bir items listesidir (overview'da sıfırlar) ve taban ücretle ücretlendirilir.

{
  "error": "Bilinmeyen parametre: 'limt'",
  "code": "UNKNOWN_PARAMETER",
  "field": "limt",
  "hint": "'limit' mı demek istediniz?",
  "retryable": false
}

Krediler ve Sınırlar

Krediler

İstek başına bir taban ücret artı dönen her satır için bir ücret:

ücret = $0.0132 + (satır / 1000) x $0.132
İstekÜcret
overview (her zaman 1 satır)$0.013332
Veri yok (0 satır)$0.013200
10 satır$0.014520
100 satır$0.026400
1000 satır (en fazla)$0.145200

Bakiyeden limit satırın ücreti bloke edilir; dönmeyen satırların ücreti hemen iade edilir. Daha az satır istemek daha ucuzdur; limit'i ihtiyacınız kadar ayarlayın.

Önbellek

Sonuçlar 7 gün önbellekte tutulur; alttaki veri aylık güncellenir. Önbellekten dönen yanıt "cached": true ile işaretlenir ve canlı yanıtla aynı ücretle ücretlendirilir.

Sınırlar

Dakikalık ve günlük sınırlar hesabınızda tanımlıdır (429 RATE_LIMIT_EXCEEDED, bkz. Krediler ve Rate Limit). Bundan bağımsız olarak API kullanıcısı başına aynı anda en fazla 5 istek çalışır; altıncısı Retry-After header'ı ile 429 TOO_MANY_CONCURRENT_REQUESTS alır. Önbellekten dönen yanıtlar bu sınıra sayılmaz.

Son güncelleme: 2026-11-05