Pingolab
API v1
GELİŞTİRİCİ API v1

Pingolab REST API

Panelde yapabildiğin her şeyi API ile de yapabilirsin — monitörleri yönet, uptime ve yanıt sürelerini oku, olayları ve durum sayfalarını yönet. İleride mobil uygulamamız da bu API'yi kullanacak; yani kalıcı.

Temel URL https://panel.pingolab.net/api/v1
Uç Noktaları İncele
Bearer Token Auth JSON UTF-8 & ULID Idempotent POST HMAC-SHA256 Webhooks

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:

Full Read / Write

Tam erişim — okuma ve yazma.

Read-Only GET Only

Salt okunur — tüm GET uç noktaları.

Monitor Widget Safe

Tek monitör — sadece bir monitörü okur; herkese açık widget'lar için güvenli.

HTTP Header
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.

Envelope JSON
{
    "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 Payload
{
    "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.

?limit=25&cursor=…

İ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.

X-RateLimit-Limit: 60

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.

Idempotency-Key: <uuid>

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.

Olaylar:
down up ssl_expiring ssl_expired heartbeat_missed reminder flapping_summary test
Sample Webhook Delivery
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);

Uç nokta referansı

Tüm uç noktaları keşfedin, şemaları inceleyin ve doğrudan tarayıcınızdan canlı istek gönderin.