Parcourir la documentation

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 statutDétail
URL de basehttps://status-api.freshperf.fr/api/v1
Authentificationaucune. Pas de clé, pas d'en-tête
MéthodesGET uniquement
Portéel'état public de la plateforme, jamais vos services ni votre compte
Documentation détailléestatus.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"}. Statuts 400 et 404.
  • Pas d'enveloppe : la réponse est l'objet lui-même, sans data autour.
  • 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
}
ChampTypeNotes
overallstringoperational, degraded_performance, partial_outage, major_outage, maintenance
updatedAtentiermillisecondes epoch
servicesUp, servicesDownentierservices surveillés dans chaque état
activeIncidents, activeMaintenancesentierdes 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 serviceTypeNotes
slugstringl'identifiant à passer à /services/{slug}/metrics
statusstringup, down, unknown
lastCheckAtentier ou nullmillisecondes epoch de la dernière sonde
latencyMsentier ou nulllatence de la dernière sonde
uptime90dnombre ou nulldisponibilité sur 90 jours, pondérée par le nombre de sondes
days[]tableauun objet par jour, du plus ancien au plus récent
days[].datestringAAAA-MM-JJ, en UTC
days[].uptimePctnombre ou nullnull quand ce jour n'a aucune sonde
days[].statestringok (≥ 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ètreTypeRequisValeursD'où il vient
slugcheminoui-/summarygroups[].services[].slug
rangerequêtenon, défaut 24h24h, 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 } ]
}
rangeSourcePoints
24h, 7dles sondes brutes, regroupées en intervalles200 au maximum, intervalle d'au moins une minute
90dles agrégats quotidiensun 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.

ErreurStatut
{"error": "VALIDATION_FAILED", "field": "range"}400
{"error": "NOT_FOUND"}404, slug inconnu ou service désactivé

GET /incidents

ParamètreTypeRequisValeurs
staterequêtenon, défaut allall, active, resolved
pagerequêtenon, défaut 0index de page, base 0
pageSizerequêtenon, défaut 101 à 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
}
ChampTypeNotes
severitystringminor, major, critical
statusstringinvestigating, identified, monitoring, resolved
affectedServiceIdstableau d'entiersidentifiants internes des services touchés. Ce ne sont pas les slug
resolvedAtentier ou nullnull 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ètreTypeRequisValeurs
windowrequêtenon, défaut upcomingupcoming, past, all
pagerequêtenon, défaut 0index de page, base 0. Pris en compte avec past uniquement
pageSizerequêtenon, défaut 101 à 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.

windowContenuTri
upcomingles fenêtres non terminées, hors annuléesdébut croissant
pastles fenêtres terminéesdébut décroissant, paginé
alltoutes, annulées comprisesdé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.