5 Adımda Entegrasyon
- GEO API anahtarı oluştur
https://www.spindorai.com/api-keys → GEO Analiz API. Format:
sp_geo_… - POST https://www.spindorai.com/api/public-geo-analysis/analyze —
X-Spindora-Key+ JSON body - task_id ile poll — GET /result/{task_id} her 2–3 sn
- profiles[] skorlarını göster — geo_score, recommendations, vb.
- Attribution — Powered by Spindora linki zorunlu
Genel Bakış
GEO Analiz API, sayfanızı yapay zeka botlarının (GPTBot, PerplexityBot, GoogleOther, ClaudeBot) gözünden tarar. Her istekte tek profil seçilir; profil bazlı GEO skoru, okunabilirlik, schema kalitesi, güven sinyalleri ve iyileştirme önerileri döner. İstekler Celery kuyruğunda işlenir — önce task_id alınır, sonra sonuç poll edilir.
API key zorunlu
Harici istekler
4 AI profili
chatgpt · perplexity · gemini · claude
Attribution
Zorunlu link
AI Profilleri
Her analiz isteğinde profiles dizisine yalnızca bir profil gönderin. Modeller farklı User-Agent, skor ağırlıkları ve değerlendirme odağı kullandığı için aynı URL farklı skor/öneri üretebilir — bu beklenen davranıştır.
| Profil | Simüle edilen bot | Odak |
|---|---|---|
| chatgpt | GPTBot (OpenAI) | Sohbet alıntısı, SSS tarzı net yanıtlar |
| perplexity | PerplexityBot | Kaynak, tarih, doğrulanabilir derinlik |
| gemini | GoogleOther (Google) | Schema, varlık netliği, yapılandırılmış veri |
| claude | ClaudeBot (Anthropic) | Uzun açıklama, bağlam, güven/şeffaflık |
Kimlik Doğrulama
| Header | X-Spindora-Key: sp_geo_… |
| Bearer | Authorization: Bearer sp_geo_… |
Kota & Planlar
- Aylık kota kullanıcı bazlı — tüm GEO anahtarları paylaşır.
- Planlar: Free 50 · Starter 100 · Pro 200 · Pro+ 400 · Enterprise 800 / ay.
- Kalan kota:
GET https://www.spindorai.com/api/api-hub/status - API yanıtında görsel snapshot döndürülmez.
İstek Akışı
POST /analyze
Kuyruğa al
GET /result/{id}
~2.5 sn poll
200 OK
profiles[] hazır
202 = bekliyor · Analiz 30–120 sn sürebilir
İstek Şeması
| Alan | Tip | Zorunlu | Açıklama |
|---|---|---|---|
| url | string (URL) | Evet | Analiz edilecek sayfa |
| profiles | string[] (length 1) | Hayır | Tek profil: chatgpt | perplexity | gemini | claude. Varsayılan: ["chatgpt"] |
| language | "tr" | "en" | Hayır | Öneri/mesaj dili |
| locale | "tr" | "en" | Hayır | Hata mesajı dili |
Uç Noktalar
/analyzeGEO analizini kuyruğa alır.
curl -X POST "https://www.spindorai.com/api/public-geo-analysis/analyze" \
-H "Content-Type: application/json" \
-H "X-Spindora-Key: sp_geo_YOUR_KEY_HERE" \
-d '{
"url": "https://example.com",
"profiles": ["chatgpt"],
"language": "tr",
"locale": "tr"
}'/result/{task_id}Sonuç poll — aynı API key ile.
curl "https://www.spindorai.com/api/public-geo-analysis/result/TASK_ID_HERE" \
-H "X-Spindora-Key: sp_geo_YOUR_KEY_HERE"JSON Yanıt Örnekleri
POST /analyze (200)
{
"task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"message": "GEO analiziniz sıraya alındı. Lütfen bekleyin…",
"mode": "api",
"attribution": {
"text": "Powered by Spindora",
"url": "https://www.spindorai.com",
"required": true,
"html": "<a href=\"https://www.spindorai.com\" target=\"_blank\" rel=\"noopener\">Powered by Spindora</a>"
}
}GET /result (202)
{ "status": "pending" }GET /result (200)
{
"success": true,
"url": "https://example.com",
"average_geo_score": 72,
"average_ai_readability_score": 68,
"average_expertise_score": 61,
"visual_snapshot_data_url": null,
"visual_snapshots_data_urls": [],
"profiles": [
{
"profile": "chatgpt",
"status_code": 200,
"crawlable": true,
"crawlability_reason": "Erişilebilir",
"geo_score": 74,
"ai_readability_score": 70,
"expertise_score": 63,
"schema_score": 55,
"word_count": 842,
"found_schemas": ["WebPage", "Organization"],
"missing_schemas": ["FAQPage"],
"recommendations": [
"FAQ schema ekleyin — AI yanıtlarında alıntılanma şansını artırır."
],
"headline_verdict": "İçerik okunabilir; schema derinliği geliştirilebilir.",
"top_strengths": ["Net H1 yapısı", "Yeterli kelime sayısı"],
"top_gaps": ["FAQ yapısı eksik", "Güven sinyalleri zayıf"],
"quick_wins": ["Meta description güncelleyin", "Yazar bilgisi ekleyin"]
}
],
"attribution": {
"text": "Powered by Spindora",
"url": "https://www.spindorai.com",
"required": true
}
}Attribution (Zorunlu)
<a href="https://www.spindorai.com" target="_blank" rel="noopener noreferrer">
Powered by Spindora
</a>Kod Örnekleri
JavaScript
const API = 'https://www.spindorai.com/api/public-geo-analysis';
const KEY = 'sp_geo_YOUR_KEY_HERE';
async function analyzeGeo(url) {
const start = await fetch(`${API}/analyze`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Spindora-Key': KEY,
},
body: JSON.stringify({
url,
profiles: ['chatgpt'],
language: 'tr',
locale: 'tr',
}),
});
if (!start.ok) throw new Error(await start.text());
const { task_id } = await start.json();
for (let i = 0; i < 90; i++) {
await new Promise((r) => setTimeout(r, 2500));
const res = await fetch(`${API}/result/${task_id}`, {
headers: { 'X-Spindora-Key': KEY },
});
if (res.status === 202) continue;
if (!res.ok) throw new Error(await res.text());
return res.json();
}
throw new Error('Timeout');
}Python
import time
import requests
API = "https://www.spindorai.com/api/public-geo-analysis"
KEY = "sp_geo_YOUR_KEY_HERE"
HEADERS = {"X-Spindora-Key": KEY}
def analyze_geo(url: str) -> dict:
r = requests.post(
f"{API}/analyze",
headers={**HEADERS, "Content-Type": "application/json"},
json={
"url": url,
"profiles": ["chatgpt"],
"language": "tr",
"locale": "tr",
},
timeout=30,
)
r.raise_for_status()
task_id = r.json()["task_id"]
for _ in range(90):
time.sleep(2.5)
poll = requests.get(f"{API}/result/{task_id}", headers=HEADERS, timeout=30)
if poll.status_code == 202:
continue
poll.raise_for_status()
return poll.json()
raise TimeoutError("GEO analysis timed out")Yanıt Alanları
average_geo_score— Profil ortalaması GEO skoru (0–100)profiles[]— Profil bazlı detay: geo_score, recommendations, found_schemas, top_gaps, quick_wins…visual_snapshots_data_urls— API'de her zaman []attribution— Zorunlu gösterim
Hata Kodları
| HTTP | Anlam |
|---|---|
| 401 | Geçersiz API key |
| 403 | Plan süresi dolmuş |
| 429 | Aylık kota doldu |
| 202 | Analiz devam ediyor |
| 500 | Analiz/kuyruk hatası |
Entegrasyon Kontrol Listesi
- ✓sp_geo_ anahtarı oluşturuldu
- ✓POST /analyze sonrası poll döngüsü kuruldu
- ✓202 → bekleyip 200 gelince parse ediliyor
- ✓Snapshot beklenmiyor
- ✓Attribution UI'da görünür
- ✓429 için plan yükseltme mesajı
AI / LLM için özet
# Spindora GEO Analiz API — Entegrasyon Özeti
Base URL: https://www.spindorai.com/api/public-geo-analysis
Dokümantasyon: https://www.spindorai.com/developers/geo-analysis-api
OpenAPI JSON: https://www.spindorai.com/developers/geo-analysis-api.openapi.json
API Key: Kayıt ol → giriş yap → https://www.spindorai.com/api-keys → GEO Analiz API sekmesi (sp_geo_*)
## Kimlik doğrulama
Header: X-Spindora-Key: sp_geo_YOUR_KEY
Alternatif: Authorization: Bearer sp_geo_YOUR_KEY
## Akış (asenkron)
1. POST /analyze → body: {"url":"https://example.com","profiles":["chatgpt"],"language":"tr","locale":"tr"}
2. task_id al
3. GET /result/{task_id} — 2–3 sn aralıkla poll
4. HTTP 202 = devam, HTTP 200 = sonuç
## Profiller (tek seçim)
chatgpt | perplexity | gemini | claude — her biri farklı bot User-Agent ve skorlama odağı ile tarar; aynı sayfada farklı skor/öneri üretebilir
## Kota (aylık, kullanıcı bazlı)
Free 50 | Starter 100 | Pro 200 | Pro+ 400 | Enterprise 800
Kalan: GET https://www.spindorai.com/api/api-hub/status (JWT)
## API kısıtları
- visual_snapshots API'de boş/null
- attribution zorunlu: Powered by Spindora
## Hata kodları
401 key | 403 plan | 429 kota | 202 bekliyor | 500 hataOpenAPI: https://www.spindorai.com/developers/geo-analysis-api.openapi.json