Kimlik doğrulama
Panelde bir anahtar oluştur (Ayarlar → API anahtarları) ve Bearer token olarak gönder. Anahtarlar bir kez gösterilir ve özetleri saklanır. Üç türü var:
Tam erişim — okuma ve yazma.
Salt okunur — tüm GET uç noktaları.
Tek monitör — sadece bir monitörü okur; herkese açık widget'lar için güvenli.
Authorization: Bearer pl_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Yanıt formatı
snake_case anahtarlı JSON. Zamanlar UTC ve ISO 8601; kimlikler herkese açık ULID'lerdir. Tekil kaynaklar ve listeler data içinde; sayfalama için meta ve links bulunur.
{
"data": {
"id": "01J8Z3ABCD1234EXAMPLE01",
"type": "http",
"name": "Production Website",
"url": "https://example.com",
"status": "up",
"interval_seconds": 60,
"created_at": "2026-09-28T10:00:00+00:00"
},
"meta": {
"next_cursor": "eyJpZCI6IjAxSjha..."
},
"links": {
"next": "https://panel.pingolab.net/api/v1/monitors?cursor=eyJpZCI6IjAxSjha..."
}
}
Hatalar
Hatalar her zaman aynı yapıdadır. code sabittir ve dokümante edilmiştir; message Accept-Language başlığına göre (tr veya en) gelir.
{
"error": {
"code": "validation_failed",
"message": "The given data was invalid.",
"details": {
"url": [
"The url field must be a valid URL."
]
}
}
}
| Hata Kodu | HTTP |
|---|---|
| unauthenticated | 401 |
| forbidden | 403 |
| not_found | 404 |
| method_not_allowed | 405 |
| idempotency_in_progress | 409 |
| validation_failed | 422 |
| idempotency_mismatch | 422 |
| rate_limited | 429 |
| server_error | 500 |
Sayfalama
Listeler cursor tabanlı sayfalama kullanır: ?limit= gönder (en fazla 100, varsayılan 25) ve links.next'i ya da meta.next_cursor'ı ?cursor= ile takip et.
İstek sınırları
Varsayılan olarak anahtar başına dakikada 60 istek. Her yanıtta X-RateLimit-Limit, X-RateLimit-Remaining ve X-RateLimit-Reset bulunur; sınır aşılınca Retry-After ile 429 döner.
Idempotency
POST isteklerinde güvenle tekrar denemek için Idempotency-Key başlığı gönder: ilk yanıt 24 saat saklanır ve tekrar oynatılır (Idempotent-Replayed: true). Aynı anahtar farklı gövdeyle kullanılırsa idempotency_mismatch döner.
Kod örnekleri
Popüler programlama dilleriyle REST API istekleri gönderin. Tüm çağrılarda Authorization başlığı gereklidir.
# 1. Monitörleri Listele (GET)
curl https://panel.pingolab.net/api/v1/monitors \
-H "Authorization: Bearer pl_your_key" \
-H "Accept: application/json"
# 2. Yeni HTTP Monitör Oluştur (POST)
curl -X POST https://panel.pingolab.net/api/v1/monitors \
-H "Authorization: Bearer pl_your_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 5f1c98a2-d4b3-4f9e-8c67-1234567890ab" \
-d '{
"type": "http",
"name": "Canlı Web Sitesi",
"url": "https://example.com",
"interval_seconds": 60
}'
Webhook'lar
Webhook bildirim kanalları her olay için bir JSON POST alır. Her istek, kanalın imza anahtarıyla "timestamp.body" üzerinden HMAC-SHA256 ile imzalanır. Geri çekilmeli olarak en fazla 3 kez yeniden deneriz.
X-Pingolab-Event: down
X-Pingolab-Timestamp: 1790335924
X-Pingolab-Signature: sha256=a1b2c3d4e5f67890123456789abcdef0123456789abcdef0123456789abcdef0
{
"event": "down",
"occurred_at": "2026-09-28T12:00:00+00:00",
"monitor": {
"id": "01J8Z3ABCD1234EXAMPLE01",
"name": "Production Website",
"type": "http",
"url": "https://example.com",
"status": "down"
},
"incident": {
"id": "01J8Z4XYZ9876INCIDENT01",
"started_at": "2026-09-28T11:59:00+00:00",
"resolved_at": null,
"duration_seconds": null,
"error_type": "timeout",
"error_message": "Connection timed out after 10000ms"
},
"details": {},
"links": {
"monitor": "https://panel.pingolab.net/monitors/01J8Z3ABCD1234EXAMPLE01"
}
}
İmzayı doğrulama (sabit zamanlı)
Gelen isteklerin Pingolab tarafından gönderildiğini ve gövdenin değiştirilmediğini doğrulamak için imza kontrolü yapın. Sabit zamanlı (constant-time) karşılaştırma kullanmanız önerilir.
// PHP (HMAC-SHA256 Sabit Zamanlı İmza Doğrulama)
$payload = file_get_contents('php://input');
$timestamp = $_SERVER['HTTP_X_PINGOLAB_TIMESTAMP'] ?? '';
$signature = $_SERVER['HTTP_X_PINGOLAB_SIGNATURE'] ?? '';
$expected = 'sha256=' . hash_hmac('sha256', $timestamp . '.' . $payload, $secret);
// Yeniden oynatma saldırı koruması (5 dakika tolerans)
if (abs(time() - (int) $timestamp) > 300 || ! hash_equals($expected, $signature)) {
http_response_code(401);
exit('Geçersiz webhook imzası');
}
// Olayı güvenle işle
$event = json_decode($payload, true);