Deux surfaces machine, hors du préfixe /v1 : les battements et les pages de statut. Ce sont les seules d'INOWATCH ouvertes à l'extérieur ; les autres n'ont qu'un appelant légitime, interne à INOVERTIX, et ne sont pas documentées ici.
/v1
Base : https://messagerie.inovertix.com
https://messagerie.inovertix.com
POST /api/inowatch/beat/{slug}
Enregistre un battement pour la tâche identifiée par {slug}.
{slug}
Trois emplacements acceptés, dans cet ordre :
X-Beat-Key: INOWTC_HB_…
Authorization: Bearer INOWTC_HB_…
?k=INOWTC_HB_…
La clé n'autorise qu'une chose : dire « j'ai tourné ». C'est ce qui rend le troisième emplacement acceptable — une clé qui donnerait accès à des données, elle, est refusée dans une URL.
failed
duration_ms
{ "ok": true, "slug": "sauvegarde-fiavia", "next_expected_before": "2026-08-16T02:05:00+00:00" }
next_expected_before est l'instant au-delà duquel le silence deviendra un retard (intervalle + grâce). Utile pour un tableau de bord tiers.
next_expected_before
Forme commune à tous les modules de CONTROL : { statusCode, name, message }.
{ statusCode, name, message }
name
missing_api_key
malformed_api_key
INOWTC_HB_…
wrong_module_key
invalid_api_key
site_inactive
rate_limit_exceeded
invalid_api_key couvre volontairement deux cas : une clé inventée, et une tâche inexistante. Les distinguer ferait de l'endpoint un annuaire — à partir d'une clé quelconque, on énumérerait les tâches surveillées de CONTROL, donc celles qui ne le sont pas.
60 requêtes par minute et par tâche — pas par IP. Une machine qui héberge dix tâches n'en fait donc pas taire neuf : la limite protège chaque heartbeat séparément.
GET /api/inowatch/status/{slug}
État public d'une page de statut. Aucune authentification : ce sont nos pages, identifiées par un slug, et destinées à être partagées.
{ "page": { "client_name": "Sora Parfume", "slug": "sora-parfume", "logo_url": "https://…/logo.png", "intro": "État de nos services en temps réel." }, "overall": { "state": "up", "uptime_month": 99.94, "services_count": 3 }, "services": [ { "ref": "a1b2c3d4e5f6", "name": "Boutique", "state": "up", "uptime_90d": 99.87, "uptime_month": 99.94, "latency_ms": null, "days": [ { "date": "2026-05-18", "uptime": 100.0, "down_minutes": 0, "avg_latency_ms": 210 } ] } ], "incidents": [ { "service": "Boutique", "opened_at": "2026-08-11T14:02:00+00:00", "resolved_at": "2026-08-11T14:47:00+00:00", "duration_minutes": 45, "ongoing": false } ], "updated_at": "2026-08-15T09:31:00+00:00" }
ref
la latence, sauf si le moniteur l'autorise explicitement (latency_ms vaut null sinon).
latency_ms
null
Un uptime à null sur une journée signifie « aucune mesure ce jour-là », pas « 100 % ». Les deux ne doivent pas être confondus à l'affichage.
uptime
60 secondes côté serveur. Une page de statut est relayée précisément le jour d'une panne, c'est-à-dire le jour où le serveur a autre chose à faire.
# Battement simple curl -fsS -X POST 'https://messagerie.inovertix.com/api/inowatch/beat/sauvegarde' \ -H 'X-Beat-Key: INOWTC_HB_…' # Battement d'échec, avec durée curl -fsS -X POST 'https://messagerie.inovertix.com/api/inowatch/beat/sauvegarde?failed=1&duration_ms=8200' \ -H 'X-Beat-Key: INOWTC_HB_…' # État public curl -sS 'https://messagerie.inovertix.com/api/inowatch/status/sora-parfume' | jq '.overall'