Hata Kodları ve Yanıt Formatı
Standart Yanıt Zarfı
Tüm API yanıtları tutarlı bir JSON yapısı kullanır.
Başarılı Yanıt
{
"success": true,
"data": { ... },
"meta": {
"requestId": "req_01HZGK9P3QABCD",
"timestamp": "2025-06-10T12:00:00.000Z",
"version": "1",
"sandbox": false
}
}Sayfalandırmalı Yanıt
{
"success": true,
"data": [ ... ],
"meta": {
"requestId": "req_01HZGK9P3QABCD",
"timestamp": "2025-06-10T12:00:00.000Z",
"version": "1"
},
"pagination": {
"page": 1,
"perPage": 20,
"total": 142,
"totalPages": 8,
"hasNextPage": true,
"hasPrevPage": false
}
}Hata Yanıtı
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Geçersiz istek verisi.",
"details": {
"platforms": ["En az bir platform seçilmelidir."],
"accountIds": ["En az bir hesap ID'si gereklidir."]
},
"docsUrl": "https://docs.sosyalkopru.com/giris/hata-kodlari"
}
}HTTP Durum Kodları
| Kod | Anlam | Ne zaman? |
|---|---|---|
200 | OK | Başarılı GET/PATCH/DELETE |
201 | Created | Kaynak başarıyla oluşturuldu |
400 | Bad Request | Geçersiz JSON veya parametre |
401 | Unauthorized | Geçersiz veya eksik API anahtarı |
402 | Payment Required | Yetersiz kredi |
403 | Forbidden | Kapsam yetkisi veya IP kısıtı |
404 | Not Found | Kaynak bulunamadı |
405 | Method Not Allowed | Desteklenmeyen HTTP metodu |
409 | Conflict | Çakışma — tekil kaynak zaten mevcut veya bağımlılık var |
422 | Unprocessable Entity | İş kuralı ihlali |
429 | Too Many Requests | Hız limiti aşıldı |
500 | Internal Server Error | Sunucu hatası |
503 | Service Unavailable | Geçici servis kesintisi |
Hata Kodu Referansı
| Hata Kodu | HTTP | Açıklama | Çözüm |
|---|---|---|---|
UNAUTHORIZED | 401 | Authorization başlığı eksik | Başlığı ekleyin |
INVALID_API_KEY | 401 | API anahtarı tanınmıyor | Anahtarı kontrol edin |
REVOKED_API_KEY | 401 | Anahtar iptal edilmiş | Yeni anahtar oluşturun |
EXPIRED_API_KEY | 401 | Anahtarın süresi dolmuş | Yeni anahtar oluşturun |
RATE_LIMIT_EXCEEDED | 429 | İstek limiti doldu | Retry-After süresini bekleyin |
INSUFFICIENT_CREDITS | 402 | Kredi yetersiz | Kredi yükleyin |
FORBIDDEN_SCOPE | 403 | Kapsam yetkisi yok | Anahtara kapsam ekleyin |
IP_NOT_WHITELISTED | 403 | IP izin listesinde değil | IP’yi panele ekleyin |
VALIDATION_ERROR | 400 | İstek doğrulama hatası | details alanını inceleyin |
NOT_FOUND | 404 | Kaynak bulunamadı | ID’yi doğrulayın |
CONFLICT | 409 | Kaynak zaten mevcut veya bağımlılık çakışması | Mevcut kaynağı güncelleyin |
METHOD_NOT_ALLOWED | 405 | Desteklenmeyen HTTP metodu | İzin verilen metodları kontrol edin |
PLATFORM_ERROR | 422 | Platform API hatası | /posts/{id}/status inceleyin |
SERVICE_UNAVAILABLE | 503 | Geçici servis kesintisi | Birkaç saniye sonra tekrar deneyin |
INTERNAL_ERROR | 500 | Sunucu iç hatası | requestId ile destek ekibiyle iletişime geçin |
Hata İşleme
Exponential Backoff ile Yeniden Deneme
429 ve 5xx yanıtları için yeniden deneme stratejisi uygulayın:
retry.js
async function apiCall(url, options, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
const response = await fetch(url, options)
if (response.ok) return response.json()
const body = await response.json()
// Hız limiti — Retry-After başlığını bekle
if (response.status === 429) {
const wait = parseInt(response.headers.get('Retry-After') ?? '60') * 1000
await new Promise(r => setTimeout(r, wait))
continue
}
// Servis kesintisi
if (response.status === 503) {
await new Promise(r => setTimeout(r, 5000))
continue
}
// Sunucu hatası — exponential backoff
if (response.status >= 500 && attempt < maxRetries - 1) {
await new Promise(r => setTimeout(r, 2 ** attempt * 1000))
continue
}
// Kurtarılamaz hata (4xx)
throw Object.assign(new Error(body.error?.message ?? 'API hatası'), {
code: body.error?.code,
status: response.status,
})
}
throw new Error('Maksimum yeniden deneme sayısına ulaşıldı')
}Çakışma (409) Hataları
CONFLICT kodu iki durumda döner:
- Tekil kaynak: Aynı URL veya benzersiz alan için kaynak zaten mevcut (örn. webhook limit, kuyrukta tekrarlı gönderi)
- Bağımlılık: Silmek istediğiniz kaynak başka kaynaklarca kullanılıyor (örn. aktif gönderilerde kullanılan medya)
const response = await fetch('/v1/media/media_01XYZ', { method: 'DELETE', headers })
if (response.status === 409) {
const { error } = await response.json()
// error.message: "Bu medya 3 aktif gönderide kullanılıyor."
console.error('Çakışma:', error.message)
}Platform Hataları
PLATFORM_ERROR kodu, hedef platformun API’sinden dönen hataları belirtir. Bu durumda gönderi FAILED statüsüne geçer.
const { data } = await fetch(
`https://api.sosyalkopru.com/v1/posts/${postId}/status`,
{ headers }
).then(r => r.json())
for (const platform of data.platforms) {
if (platform.status === 'FAILED') {
console.error(`${platform.platform}: ${platform.errorMessage}`)
// Örnek: "Erişim tokenı süresi doldu — hesabı yeniden bağlayın"
}
}Her yanıttaki meta.requestId değerini saklayın. Sorun bildirirken bu ID destek ekibinin sorunu hızlıca bulmasını sağlar.
Last updated on