Okuma API'si

Okuma yolu yazma yolundan tamamen ayrıdır: ayrı hız sınırı havuzu, ayrı önbellek ve bağımsız ölçeklenebilirlik. Ingest trafiğinin panelinizi yavaşlatmaması bu ayrımın doğrudan sonucudur.

Kimlik doğrulama

Okuma uçları iki kimlik biçimini birden kabul eder:

Biçim Nerede kullanılır
Authorization: Bearer <access-token> Panelde oturum açmış kullanıcı
X-API-KEY: ebrd_pub_… Tarayıcıdan, gömülü bileşenlerden

Publishable anahtar yalnızca izinli alan adı listesindeki origin'lerden kabul edilir. Liste dışından gelen istek 403 alır; anahtarın kendisi sızsa bile başka bir sitede kullanılamaz.

Uçlar

Uç Döndürdüğü
GET /api/v1/projects/{id}/summary Ön hesaplanmış özet (olay sayıları, açık Issue, monitör durumu)
GET /api/v1/projects/{id}/issues Issue listesi (cursor sayfalama)
GET /api/v1/projects/{id}/issues/counts Duruma göre sayaçlar
GET /api/v1/issues/{id} Issue ayrıntısı
GET /api/v1/issues/{id}/events Issue'ya bağlı ham olaylar
GET /api/v1/issues/{id}/breakdown Sürüm/ortam/sunucu dağılımı
GET /api/v1/projects/{id}/events Log arama (tam metin + filtre)
GET /api/v1/projects/{id}/events/histogram Zaman serisi (time_bucket)
GET /api/v1/projects/{id}/usage Kota kullanımı
GET /api/v1/monitors/{id}/uptime Uptime yüzdesi ve günlük döküm
GET /api/v1/monitors/{id}/ssl-status Sertifika durumu ve kalan gün
GET /api/v1/monitors/{id}/domain-status Alan adı bitiş tarihi ve registrar
GET /api/v1/projects/{id}/stream Canlı olay akışı (SSE)
GET /status/{slug} Herkese açık durum sayfası (kimlik gerekmez)

Cursor sayfalama

Liste uçlarında offset yoktur. Sayfalama, son satırın (timestamp, id) çiftinin base64url kodlanmış hâliyle yapılır:

curl "https://api.errorbird.com/api/v1/projects/<id>/issues?limit=50" -H "X-API-KEY: ebrd_pub_…"
# { "items": [...], "nextCursor": "MjAyNi0wOC0xOVQyMTowMDowMFo…" }

curl "https://api.errorbird.com/api/v1/projects/<id>/issues?limit=50&cursor=MjAyNi0w…"

nextCursor null olduğunda liste bitmiştir. Offset'in olmama sebebi performans değil doğruluktur: siz 2. sayfayı okurken yeni bir olay geldiğinde offset tabanlı sayfalama bir kaydı atlar veya iki kez gösterir.

Canlı akış (SSE)

const source = new EventSource(
  'https://api.errorbird.com/api/v1/projects/<id>/stream?apiKey=ebrd_pub_…',
)

source.addEventListener('event', (message) => {
  console.log(JSON.parse(message.data))
})

EventSource özel başlık gönderemediği için anahtar sorgu dizesinden alınır. Bu yol yalnızca publishable anahtarları kabul eder — secret anahtar sorgu dizesinde kabul edilseydi, sunucu loglarına ve tarayıcı geçmişine yazma yetkisi olan bir anahtar düşerdi.

Önbellek ve gecikme

/summary, /uptime ve /ssl-status Redis'te önbelleklenir ve arkalarında TimescaleDB sürekli toplamları (continuous aggregate) vardır. Ölçülen değerler: önbellekten p99 18 ms, önbellek boşken p99 189 ms (120.503 olaylı proje).

Önbellek boşken aynı anahtar için gelen eşzamanlı istekler tek bir hesaplamayı paylaşır (single flight); N istek N ayrı sorgu tetiklemez.

Hız sınırı

Okuma havuzu dakikada 600 istektir (anahtar + origin başına). Aşıldığında 429 döner. Bu sayaç yazma havuzundan bağımsızdır.

Herkese açık uçlar (durum sayfası, plan kataloğu, SSO keşfi) IP başına dakikada 120 istekle sınırlıdır.

Çok kiracılı izolasyon

Başka bir organizasyonun/workspace'in kaynağına yapılan istek 403 değil 404 döner. 403, kaynağın var olduğunu doğrular; bu da tek başına bir bilgi sızıntısıdır.