Aller au contenu

API Monitors

URL de base : https://api.okstatus.eu/api/v1/monitors — chaque requête nécessite un header Authorization: Bearer oks_live_..., voir Authentification.

GET /api/v1/monitors?page=1&per_page=50

Retourne une liste paginée limitée à votre organisation (per_page jusqu’à 100).

Réponse

{
"monitors": [
{
"id": "...",
"name": "...",
"url": "...",
"type": "http",
"interval": 60,
"status": "active",
"tags": ["prod"]
}
],
"total": 12,
"page": 1,
"perPage": 50,
"pages": 1
}
POST /api/v1/monitors
Content-Type: application/json
ChampTypeRequisDescription
namestring✅Nom du monitor (1 à 100 caractères)
urlstring✅La cible : une URL http(s):// pour http et llm, un hôte pour ping, tcp et dns (example.com), une URL de connexion pour les bases — voir chaque type de monitor
typeenumhttp, tcp, ping, dns, grpc, llm, push, group, postgres, mysql, mongodb, smtp, imap ou redis — http par défaut
intervalnumberSecondes entre les vérifications, min 30 — 60 par défaut. Le plancher de votre plan s’applique (300 s en Free, 60 s en Pro)
regionsstring[]Codes de région, de 1 à 5 — ["fr-dc3"] par défaut. Voir Régions
acceptedStatusCodesstring[]http : codes ou plages comptés comme disponibles, ex. ["200-299", "301"] — ["200-299"] par défaut
tagsstring[]Jusqu’à 5 tags de 30 caractères. Enregistrés en minuscules si votre organisation l’a choisi dans Paramètres → Tags
keywordstringhttp : texte que le corps de la réponse doit contenir
followRedirectsbooleanhttp : suivre les redirections 3xx — true par défaut. Avec false, c’est la réponse de redirection elle-même qui est jugée
httpMethodenumhttp : GET, POST, PUT, PATCH, DELETE, HEAD ou OPTIONS
httpHeadersobjecthttp : en-têtes de la requête. Jamais renvoyés : relire le monitor donne "***"
httpBodystringhttp : corps de la requête, avec httpBodyEncoding = json, form, xml ou text
ignoreTlsbooleanhttp : accepter un certificat invalide ou auto-signé
portnumbertcp : port de connexion
dnsRecordTypeenumdns : A, AAAA, CNAME, MX, NS, TXT, SOA, CAA ou SRV
dnsExpectedValuestringdns : valeur que la réponse doit contenir
dnsServerstringdns : résolveur à interroger à la place de celui par défaut
retriesnumberVérifications en échec consécutives tolérées avant que le monitor soit indisponible (0 à 5) — 1 par défaut
severity3xxenumhttp : une redirection non acceptée compte comme degraded (par défaut) ou down
latencyThresholdMsintegerTemps de réponse (50–60000 ms) au-delà duquel le monitor passe degraded et alerte, après max(2, retries + 1) checks lents d’affilée ; null le désactive. Voir Alertes de temps de réponse
latencyPublicbooleanfalse garde la lenteur hors des pages de statut publiques (true par défaut)
latencyAnomalybooleanAlerte quand le temps de réponse sort de sa plage habituelle apprise (Max et Enterprise, 7 jours d’apprentissage ; refusé en 403 sous Max). Voir Alertes de temps de réponse
sloTargetnumberObjectif SLO en pourcentage sur 30 jours glissants (50 à 99,999, par ex. 99.9) ; null le retire. Max et Enterprise, refusé en 403 en dessous. Voir SLO et budget d’erreur
keywordInvertbooleanhttp : le monitor est indisponible quand keyword est trouvé
jsonPath, jsonOperator, jsonExpectedValuehttp : assertion sur une réponse JSON (==, !=, >, <, >=, <=, contains). Non combinable avec keyword
basicAuthUser / basicAuthPassstringBasic auth, et le couple d’identifiants des monitors base de données, SMTP, IMAP et Redis. Stockés chiffrés
authConfigobjectAuthentification autre que Basic — voir ci-dessous
dbQuerystringpostgres, mysql, mongodb : requête exécutée à chaque vérification
gracePeriodnumberpush : secondes sans ping avant que le monitor soit indisponible. La réponse porte le pushUrl à appeler
childMonitorIdsstring[]group : les monitors qu’il agrège
llmProvider, llmApiKey, llmConfigllm : voir la référence interactive

Retourne 201 avec { "data": Monitor }.

Un monitor est toujours créé actif et avec ses alertes : pour le mettre en pause ou en sourdine, utilisez un PATCH.

authConfig porte une méthode, discriminée par type (référence complète : Authentification) :

{ "type": "bearer", "token": "…" }
{ "type": "apikey", "in": "header", "name": "X-API-Key", "value": "…" }
{ "type": "apikey", "in": "query", "name": "api_key", "value": "…" }
{ "type": "cookie", "cookie": "session=…; csrf=…" }
{ "type": "oauth2", "tokenUrl": "https://login.example.com/token", "clientId": "…", "clientSecret": "…", "scope": "…", "audience": "…", "authStyle": "basic" }
{ "type": "mtls", "cert": "-----BEGIN CERTIFICATE-----…", "key": "-----BEGIN PRIVATE KEY-----…", "ca": "…" }

Relire un monitor renvoie la méthode et ses réglages non sensibles, chaque secret étant remplacé par "***". Renvoyer ce masque dans un PATCH conserve la valeur enregistrée — c’est ce qui permet de faire un aller-retour GET puis PATCH sans effacer les identifiants. "authConfig": null supprime l’authentification.

GET /api/v1/monitors/:id
PATCH /api/v1/monitors/:id
DELETE /api/v1/monitors/:id

PATCH accepte les champs de la création sauf type (tous optionnels — seuls les champs envoyés changent), plus :

ChampTypeDescription
statusenum"paused" arrête les vérifications, "active" les relance
isMutedbooleantrue coupe les alertes pendant que les vérifications continuent

Pour retirer une valeur, envoyez null : "keyword": null, "dnsExpectedValue": null, "port": null, "authConfig": null, "basicAuthUser": null. "tags": [] retire tous les tags.

Fenêtre de terminal
curl -X PATCH https://api.okstatus.eu/api/v1/monitors/$ID \
-H "Authorization: Bearer $OKSTATUS_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "status": "paused", "tags": ["prod", "paiement"], "keyword": null }'

DELETE retourne { "data": { "deleted": true } }.

GET /api/v1/monitors/:id/alert-channels
PUT /api/v1/monitors/:id/alert-channels

GET retourne les identifiants des canaux rattachés au monitor :

{ "data": { "channelIds": ["3f6e2b1a-...", "9c1d4e7f-..."] } }

PUT remplace cet ensemble — une liste vide détache tous les canaux :

{ "channelIds": ["3f6e2b1a-..."] }

Les identifiants sont ceux de GET /api/v1/alert-channels. Un identifiant qui n’est pas un canal de votre organisation est refusé avec 404 NOT_FOUND, et rien n’est modifié. Un canal qui reste rattaché garde ses réglages propres au monitor (les types d’alerte qu’il reçoit).

regions accepte les codes des régions publiques (voir Régions et intervalles) et, sur les plans qui incluent les agents privés :

  • "private" — n’importe lequel de vos agents privés exécute la vérification ;
  • "private:<id de l'agent>" — cet agent seulement.
GET /api/v1/private-agents

liste vos agents, chacun avec la valeur region à utiliser :

{
"data": [
{
"id": "5a0c…",
"name": "dc-paris",
"site": "Paris",
"region": "private:5a0c…",
"status": "up",
"suspended": false,
"version": "1.0.0",
"hostname": "probe-1",
"platform": "linux/amd64",
"lastHeartbeatAt": "2026-10-10T07:00:00.000Z"
}
],
"meta": { "eligible": true, "limit": 5, "latestVersion": "1.0.0" }
}

La liste est en lecture seule : un agent s’enrôle depuis le tableau de bord, parce que l’enrôlement remet un identifiant secret. Les jetons d’enrôlement ne sont jamais renvoyés.

GET /api/v1/monitors/:id/checks?page=1&per_page=50
GET /api/v1/monitors/:id/uptime?range=24h
GET /api/v1/slos?status=at_risk
GET /api/v1/monitors/:id/slo?target=99.9

GET /slos liste tous les SLO de l’organisation, monitors et groupes, le pire en premier : kind (monitor ou group), id, name, target, budgetMinutes, consumedMinutes, remainingMinutes, remainingPercent, availability30d, incidents (pannes dans la fenêtre), status (ok, at_risk, exhausted) et exhaustsAt (date d’épuisement au rythme des 7 derniers jours, ou null). status filtre la liste.

GET /monitors/:id/slo renvoie les mêmes chiffres pour un monitor, plus series (le budget restant sur les 30 derniers jours). target prévisualise un objectif sur un monitor qui n’en a pas. Les deux répondent 403 sous Max. Voir SLO et budget d’erreur.

404 NOT_FOUND si le monitor n’existe pas dans votre organisation. Quand une création ou une modification est refusée, l’erreur en donne la raison — par exemple :

CodeSignification
VALIDATION_ERRORUn champ est invalide ; message le nomme
PLAN_LIMIT_REACHEDLe nombre de monitors de votre plan est atteint
PLAN_INTERVAL_TOO_LOWL’intervalle est sous le minimum de votre plan
PLAN_REGION_NOT_ALLOWEDUne région n’est pas incluse dans votre plan
PLAN_REGIONS_PER_MONITORTrop de régions pour un monitor sur votre plan
INVALID_URLLa cible est une adresse privée ou réservée
UPSTREAM_ERRORLe moteur de monitoring a échoué sans donner de raison

Voir Authentification pour le format d’erreur commun et les limites de débit.

PlanMonitors maxIntervalle minRégions par monitor
Free5300s2
Pro2060s3
Max8030s5
Enterprise500 (plus sur demande)30s5

Les limites s’appliquent à la création : une organisation déjà au-dessus d’une limite abaissée garde ce qu’elle a, elle ne peut simplement plus en ajouter.