DEVekspertiz.app

06 · Hata Kodları

Tüm hata yanıtları tek tipte:

{
  "error": {
    "code": "invalid_signature",
    "message": "Request signature could not be verified.",
    "request_id": "req_01HM..."
  }
}

request_id her yanıtta X-Request-Id header'ında da gelir; sorun açarken bu ID'yi paylaşın.

Tam liste

HTTPcodeAnlam
400invalid_requestQuery/body malformed, bilinmeyen param, limit dışı
401missing_signature_headers4 zorunlu header'dan biri eksik
401invalid_keyKey bilinmiyor / REVOKED / EXPIRED / partner SUSPENDED
401invalid_signatureHMAC eşleşmiyor (secret yanlış / canonical yanlış)
401expired_timestamp|now - timestamp| > 5dk
401replay_detectedNonce daha önce kullanıldı (10dk pencerede)
403ip_not_allowedKaynak IP key'in allowlist'inde değil
403scope_requiredEndpoint için key'in scope'u yetersiz
403tls_requiredHTTP üzerinden istek geldi (sadece HTTPS)
404not_foundKaynak yok veya partner'a açık değil (ID enumeration koruması)
429rate_limitedRate limit aşıldı. Retry-After header'ı bekleme süresini verir
500internal_errorBeklenmedik sunucu hatası. request_id ile destek talebi açın
501not_implementedReserved endpoint (örn. webhooks/test)

404 vs 403 farkı

Bazı API'larda kaynağa erişim yoksa 403, kaynak yoksa 404 döner. Biz her iki durumda da 404 dönüyoruz — bu kasıtlı bir güvenlik kararı. 403 dönmek "burada bir şey var ama izniniz yok" demektir; saldırgan ID enumeration ile gerçek ID'leri keşfedebilir. 404 ile partner A, partner B'nin raporlarının var olduğunu bile öğrenemez.

Saat senkronu sorunları

expired_timestamp aldıysanız:

# Sunucunuzun saatini ekspertiz.app ile kıyaslayın
curl -sI https://api.ekspertiz.app/api/v1/partner/health | grep -i date
date -u

Fark 5 dk'dan fazlaysa NTP'yi düzeltin.

Retry stratejisi

HataRetry?Nasıl
429 rate_limitedRetry-After'a uy
500 internal_errorExponential backoff (1s, 2s, 4s, max 30s)
502/503/504Exponential backoff
4xx (yukarıdakiler hariç)Düzeltmeden retry etmeyin
replay_detected✅ (yeni nonce ile)Aynı nonce'u tekrar göndermeyin

Sonraki: 07 · Sandbox vs Production.