Dokumentacja
Lista incydentów
GET /api/v1/incidents
Incydenty Twojego zespołu, od najnowszych. Zwracane są tylko potwierdzone incydenty: nieudane sprawdzenie, którego nie potwierdziła druga lokalizacja, to podejrzenie, a nie awaria, i nigdy się tu nie pojawia (zobacz jak wykrywamy awarie).
Parametry
Wszystkie parametry są opcjonalne i trafiają do query stringa.
| Parametr | Znaczenie |
|---|---|
from, to |
Okres. Incydent jest uwzględniany, jeśli nakłada się na okres, więc awaria, która zaczęła się ostatniego wieczoru poprzedniego miesiąca i skończyła po północy, trafia do raportu za bieżący miesiąc. Bez from – tak daleko wstecz, jak pozwala Twój plan; bez to – do teraz. |
monitor |
Tylko incydenty jednego monitora (jego ID z listy monitorów). |
client |
Tylko incydenty na monitorach jednego klienta (jego ID, czyli client.id monitora). |
status |
open lub resolved. |
severity |
critical, warning lub info. |
per_page |
Od 1 do 100, domyślnie 50. |
cursor |
Następna strona: next_cursor z poprzedniej odpowiedzi. |
Przykład
Wszystkie incydenty jednego klienta we wrześniu, w strefie czasowej klienta:
cURL
curl -G http://pulsekeeper.io/api/v1/incidents \
-H "Authorization: Bearer $PULSEKEEPER_TOKEN" \
--data-urlencode "client=c4e0b9a17d2f6385" \
--data-urlencode "from=2026-09-01T00:00:00+02:00" \
--data-urlencode "to=2026-10-01T00:00:00+02:00"
PHP
<?php
// composer require guzzlehttp/guzzle
$client = new GuzzleHttp\Client([
'base_uri' => 'http://pulsekeeper.io/api/v1/',
'headers' => ['Authorization' => 'Bearer '.getenv('PULSEKEEPER_TOKEN')],
]);
$query = [
'client' => 'c4e0b9a17d2f6385',
'from' => '2026-09-01T00:00:00+02:00',
'to' => '2026-10-01T00:00:00+02:00',
];
$incidents = [];
do {
$page = json_decode($client->get('incidents', ['query' => $query])->getBody(), true);
$incidents = array_merge($incidents, $page['data']);
$query['cursor'] = $page['next_cursor'];
} while ($page['next_cursor'] !== null);
JavaScript
const query = new URLSearchParams({
client: 'c4e0b9a17d2f6385',
from: '2026-09-01T00:00:00+02:00',
to: '2026-10-01T00:00:00+02:00',
});
const incidents = [];
do {
const response = await fetch(`http://pulsekeeper.io/api/v1/incidents?${query}`, {
headers: { Authorization: `Bearer ${process.env.PULSEKEEPER_TOKEN}` },
});
const page = await response.json();
incidents.push(...page.data);
query.set('cursor', page.next_cursor ?? '');
} while (query.get('cursor'));
Go
query := url.Values{}
query.Set("client", "c4e0b9a17d2f6385")
query.Set("from", "2026-09-01T00:00:00+02:00")
query.Set("to", "2026-10-01T00:00:00+02:00")
var incidents []map[string]any
for {
req, _ := http.NewRequest("GET", "http://pulsekeeper.io/api/v1/incidents?"+query.Encode(), nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("PULSEKEEPER_TOKEN"))
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
var page struct {
Data []map[string]any `json:"data"`
NextCursor *string `json:"next_cursor"`
}
json.NewDecoder(res.Body).Decode(&page)
res.Body.Close()
incidents = append(incidents, page.Data...)
if page.NextCursor == nil {
break
}
query.Set("cursor", *page.NextCursor)
}
Odpowiedź
{
"data": [
{
"id": "3f9a1c0e7b2d4a58",
"type": "downtime",
"title": "Site unreachable",
"severity": "critical",
"state": "resolved",
"monitor": { "id": "a81c27e05f3d9b64", "type": "http", "name": "HTTP", "target": "shop.example.com" },
"client": { "id": "c4e0b9a17d2f6385", "name": "Example Shop" },
"started_at": "2026-09-30T21:14:05Z",
"confirmed_at": "2026-09-30T21:14:41Z",
"acknowledged_at": null,
"resolved_at": "2026-09-30T21:42:10Z",
"duration_seconds": 1685,
"excluded_from_sla": false,
"affected_locations": ["fra", "lon"],
"error": { "code": "http_5xx", "detail": "HTTP 502" },
"cause": { "text": "Outage at the hosting provider", "in_report": true }
}
],
"next_cursor": "eyJzdGFydGVkX2F0Ijo…"
}
Na ostatniej stronie next_cursor ma wartość null. Pola incydentu są opisane w sekcji Pobieranie incydentu.