İçeriğe geç
ReinoAds

OperasyonEntegrasyon Önizlemesi

Hata Yönetimi

Hata yanıtlarının yapısı, hata kodları ve güvenli yeniden deneme stratejileri.

Önizleme

Hata kodları ve yanıt yapısı örnek amaçlıdır. Rate limit değerleri bu dokümanda taahhüt edilmez; hesabınıza özel limitler entegrasyon dokümanında paylaşılır.

ReinoAds, standart HTTP durum kodlarını kullanır ve her hata yanıtında makine tarafından okunabilir bir code alanı döndürür. Bir reklam kararının blocked_by_policy veya no_fill olması bir hata değildir; bunlar 200 yanıtı içinde outcome olarak döner.

{
  "error": {
    "code": "invalid_placement",
    "message": "Placement 'rewarded_v2' was not found in this environment.",
    "param": "placement",
    "request_id": "req_01HZXD8W2K"
  }
}
codeHTTPAnlamı
invalid_request400İstek gövdesi geçersiz veya zorunlu alan eksik.
missing_consent400consent nesnesi gönderilmedi.
authentication_failed401API anahtarı eksik, geçersiz veya iptal edilmiş.
permission_denied403Anahtar bu işlem için yetkili değil; örn. publishable key ile yönetim endpoint'i çağrıldı.
environment_mismatch403Sandbox anahtarıyla live kaynağına erişilmeye çalışıldı veya tersi.
invalid_placement404Yerleşim bu ortamda bulunamadı.
conflict409Aynı adla kaynak zaten var veya eşzamanlı güncelleme çakıştı.
rate_limited429Kısa sürede çok fazla istek gönderildi.
internal_error500ReinoAds tarafında beklenmeyen hata.
service_unavailable503Servis geçici olarak kullanılamıyor.

Yeniden deneme

  • 4xx hatalarını (429 hariç) yeniden denemeyin; isteği düzeltin.
  • 429, 500 ve 503 için üstel geri çekilme ve rastgele gecikme (jitter) ile yeniden deneyin; Retry-After başlığı varsa ona uyun.
  • Yönetim endpoint'lerine yapılan POST isteklerinde Idempotency-Key başlığı kullanarak çift kayıt oluşmasını önleyin.
  • Karar isteklerinde zaman aşımı veya hata durumunda reklam alanını boş bırakın; kullanıcı deneyimini reklam yanıtına bağımlı kılmayın.
async function requestWithRetry(body: unknown, attempts = 3) {
  for (let i = 0; i < attempts; i++) {
    const res = await fetch("https://api.reinoads.com/v1/decisions", {
      method: "POST",
      headers: {
        Authorization: "Bearer " + process.env.REINOADS_SECRET_KEY,
        "Content-Type": "application/json"
      },
      body: JSON.stringify(body)
    });

    if (res.ok) return res.json();
    if (![429, 500, 503].includes(res.status)) throw await res.json();

    const retryAfter = Number(res.headers.get("Retry-After"));
    const delay = retryAfter > 0
      ? retryAfter * 1000
      : 2 ** i * 250 + Math.random() * 100;
    await new Promise((r) => setTimeout(r, delay));
  }
  return { outcome: "no_fill" };
}

Destek talepleri

Destek ekibine başvururken hata yanıtındaki request_id değerini ve varsa karar kimliğini (dec_...) paylaşın. Bu değerler kişisel veri içermez.