API de la page de statut
La page de statut a sa propre API, séparée de celle de votre compte. Elle tourne sur son propre domaine et sa propre base, pour continuer à répondre quand le reste de la plateforme ne répond plus.
| L'API de statut | Détail |
|---|---|
| URL de base | https://status-api.freshperf.fr/api/v1 |
| Authentification | aucune. Pas de clé, pas d'en-tête |
| Méthodes | GET uniquement |
| Portée | l'état public de la plateforme, jamais vos services ni votre compte |
| Documentation détaillée | status.freshperf.fr/fr-fr/api, avec une console d'essai |
Les permissions, l'enveloppe {"data": ...}, les curseurs et les marqueurs d'erreur de l'API du compte ne s'appliquent pas ici. Cette API a ses propres conventions, plus courtes.
Conventions
- Champs traduits : toujours les deux langues,
{"en": "...", "fr": "..."}. Aucun paramètre de langue. - Horodatages : millisecondes epoch, en UTC.
- Erreurs : un marqueur seul,
{"error": "NOT_FOUND"}ou{"error": "VALIDATION_FAILED", "field": "range"}. Statuts400et404. - Pas d'enveloppe : la réponse est l'objet lui-même, sans
dataautour. - Cache : la synthèse est calculée au plus toutes les 30 secondes côté serveur. Interroger plus souvent renvoie le même contenu.
- CORS : seules les origines de la page de statut sont autorisées. Depuis un serveur, le CORS ne s'applique pas.
Une limite de débit protège contre les rafales d'appels en échec ; un client qui obtient des réponses 200 ne la rencontre pas. Une interrogation toutes les 30 à 60 secondes suffit.
GET /status
Le résumé le plus court. C'est ce qu'il faut pour un badge ou une sonde.
curl https://status-api.freshperf.fr/api/v1/status
{ "overall": "operational", "updatedAt": 1787921863099, "servicesUp": 5, "servicesDown": 0, "activeIncidents": 0, "activeMaintenances": 1 }
| Champ | Type | Notes |
|---|---|---|
overall | string | operational, degraded_performance, partial_outage, major_outage, maintenance |
updatedAt | entier | millisecondes epoch |
servicesUp, servicesDown | entier | services surveillés dans chaque état |
activeIncidents, activeMaintenances | entier | des compteurs. Le détail est dans /summary |
overall se déduit dans cet ordre : un service au moins hors service donne partial_outage, ou major_outage si la moitié ou plus le sont ; sinon l'incident actif le plus grave décide ; sinon une maintenance en cours donne maintenance ; sinon operational.
GET /summary
Tout ce qu'affiche la page d'accueil, en un appel.
{ "overall": "operational", "updatedAt": 1787921863099, "servicesUp": 5, "servicesDown": 0, "groups": [ { "slug": "web", "name": { "en": "Websites", "fr": "Sites" }, "description": null, "services": [ { "slug": "freshperf", "name": { "en": "freshperf.fr", "fr": "freshperf.fr" }, "description": null, "status": "up", "lastCheckAt": 1787921836639, "latencyMs": 164, "uptime90d": 99.956, "days": [ { "date": "2026-05-31", "uptimePct": 100.0, "state": "ok" } ] } ] } ], "activeIncidents": [], "maintenance": [] }
| Champ d'un service | Type | Notes |
|---|---|---|
slug | string | l'identifiant à passer à /services/{slug}/metrics |
status | string | up, down, unknown |
lastCheckAt | entier ou null | millisecondes epoch de la dernière sonde |
latencyMs | entier ou null | latence de la dernière sonde |
uptime90d | nombre ou null | disponibilité sur 90 jours, pondérée par le nombre de sondes |
days[] | tableau | un objet par jour, du plus ancien au plus récent |
days[].date | string | AAAA-MM-JJ, en UTC |
days[].uptimePct | nombre ou null | null quand ce jour n'a aucune sonde |
days[].state | string | ok (≥ 99,5 %), degraded (≥ 95 %), down, no_data |
activeIncidents contient les mêmes objets que /incidents, maintenance les mêmes que /maintenance. Les groupes et les services désactivés ne sont jamais listés.
GET /services/{slug}/metrics
| Paramètre | Type | Requis | Valeurs | D'où il vient |
|---|---|---|---|---|
slug | chemin | oui | - | /summary → groups[].services[].slug |
range | requête | non, défaut 24h | 24h, 7d, 90d | - |
curl "https://status-api.freshperf.fr/api/v1/services/freshperf/metrics?range=7d"
{ "slug": "freshperf", "range": "7d", "points": [ { "t": 1787835687488, "latencyMs": 149, "uptimePct": 100.0 } ] }
range | Source | Points |
|---|---|---|
24h, 7d | les sondes brutes, regroupées en intervalles | 200 au maximum, intervalle d'au moins une minute |
90d | les agrégats quotidiens | un par jour, jusqu'à 90 |
t est le milieu de l'intervalle en millisecondes epoch. latencyMs et uptimePct valent null quand l'intervalle n'a aucune sonde exploitable.
| Erreur | Statut |
|---|---|
{"error": "VALIDATION_FAILED", "field": "range"} | 400 |
{"error": "NOT_FOUND"} | 404, slug inconnu ou service désactivé |
GET /incidents
| Paramètre | Type | Requis | Valeurs |
|---|---|---|---|
state | requête | non, défaut all | all, active, resolved |
page | requête | non, défaut 0 | index de page, base 0 |
pageSize | requête | non, défaut 10 | 1 à 50 |
{ "items": [ { "id": 12, "severity": "major", "status": "resolved", "title": { "en": "Elevated error rate", "fr": "Taux d'erreurs élevé" }, "affectedServiceIds": [3], "startedAt": 1787440000000, "resolvedAt": 1787452000000 } ], "page": 0, "pageSize": 10, "total": 1 }
| Champ | Type | Notes |
|---|---|---|
severity | string | minor, major, critical |
status | string | investigating, identified, monitoring, resolved |
affectedServiceIds | tableau d'entiers | identifiants internes des services touchés. Ce ne sont pas les slug |
resolvedAt | entier ou null | null tant que l'incident est ouvert |
Avec state=active, la liste n'est pas paginée : page et pageSize sont ignorés et total vaut le nombre d'incidents rendus.
GET /incidents/{id}
Un incident et sa chronologie complète, la mise à jour la plus récente en premier.
{ "id": 12, "severity": "major", "status": "resolved", "title": { "en": "Elevated error rate", "fr": "Taux d'erreurs élevé" }, "affectedServiceIds": [3], "startedAt": 1787440000000, "resolvedAt": 1787452000000, "updates": [ { "status": "resolved", "body": { "en": "Incident resolved.", "fr": "Incident résolu." }, "createdAt": 1787452000000 } ] }
id inconnu : 404 {"error": "NOT_FOUND"}.
GET /maintenance
| Paramètre | Type | Requis | Valeurs |
|---|---|---|---|
window | requête | non, défaut upcoming | upcoming, past, all |
page | requête | non, défaut 0 | index de page, base 0. Pris en compte avec past uniquement |
pageSize | requête | non, défaut 10 | 1 à 50. Même règle |
{ "items": [ { "id": 4, "title": { "en": "Database upgrade", "fr": "Mise à niveau base de données" }, "body": { "en": "Planned upgrade.", "fr": "Mise à niveau planifiée." }, "scheduledStart": 1787620000000, "scheduledEnd": 1787627200000, "affectedServiceIds": [1, 3], "state": "upcoming" } ], "window": "upcoming" }
La réponse n'a ni page, ni pageSize, ni total.
window | Contenu | Tri |
|---|---|---|
upcoming | les fenêtres non terminées, hors annulées | début croissant |
past | les fenêtres terminées | début décroissant, paginé |
all | toutes, annulées comprises | début décroissant |
state se déduit de l'heure courante : cancelled, puis upcoming, in_progress ou completed.
Aller plus loin
status.freshperf.fr/fr-fr/api rend la même référence avec une console pour lancer chaque appel depuis la page.