FreshPerfAPI

API publique

API REST en lecture seule de la page de statut FreshPerf. Sans authentification ni clé d'API. Chaque réponse est en JSON sur HTTPS.

Base URLhttps://status-api.freshperf.fr

Conventions

  • Les champs localisés sont renvoyés dans les deux langues sous la forme {"en": "...", "fr": "..."}.
  • Les horodatages sont en millisecondes epoch Unix (UTC).
  • Une limite par adresse 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.
  • La synthèse est calculée au plus toutes les 30 secondes côté serveur. Interroger plus souvent renvoie le même contenu.
  • Les erreurs renvoient un marqueur JSON générique, par exemple {"error": "NOT_FOUND"}. Aucun détail technique.
  • Le CORS autorise les appels navigateur depuis les origines de la page de statut. Les clients côté serveur ne sont pas concernés.

Statut

GET/api/v1/status

État global

État global, compteurs de services et nombre d'incidents et de maintenances actifs. Le champ overall vaut : operational, degraded_performance, partial_outage, major_outage ou maintenance.

Réponses

200Succès.
429Limite de débit dépassée.

Exemple de réponse

{
  "overall": "operational",
  "updatedAt": 1783534774997,
  "servicesUp": 12,
  "servicesDown": 0,
  "activeIncidents": 0,
  "activeMaintenances": 1
}
GET/api/v1/summary

Synthèse complète

La charge utile complète de la page d'accueil : groupes de services, état en direct par service, disponibilité quotidienne sur 90 jours (état par jour : ok, degraded, down, no_data), incidents actifs et maintenances en cours ou à venir.

Réponses

200Succès.
429Limite de débit dépassée.

Exemple de réponse

{
  "overall": "operational",
  "updatedAt": 1783534774997,
  "servicesUp": 12,
  "servicesDown": 0,
  "groups": [
    {
      "slug": "websites",
      "name": { "en": "Websites", "fr": "Sites web" },
      "description": null,
      "services": [
        {
          "slug": "main-site",
          "name": { "en": "Main site", "fr": "Site principal" },
          "status": "up",
          "lastCheckAt": 1783534770000,
          "latencyMs": 42,
          "uptime90d": 99.987,
          "days": [
            { "date": "2026-04-11", "uptimePct": 100.0, "state": "ok" }
          ]
        }
      ]
    }
  ],
  "activeIncidents": [],
  "maintenance": []
}

Services

GET/api/v1/services/{slug}/metrics

Séries de latence et disponibilité

Série temporelle d'un service. 24h et 7d sont agrégées depuis les sondes brutes (200 points au maximum). 90d renvoie un point par jour depuis les agrégats quotidiens.

Paramètres

NomEmplacementTypeDescription
slug*pathstringIdentifiant public du service (voir /api/v1/summary).
rangequery24h | 7d | 90dFenêtre de la série. Défaut : 24h.

Réponses

200Succès.
400Valeur de range invalide.
404Slug de service inconnu.
429Limite de débit dépassée.

Exemple de réponse

{
  "slug": "main-site",
  "range": "24h",
  "points": [
    { "t": 1783532993763, "latencyMs": 45, "uptimePct": 100.0 }
  ]
}

Incidents

GET/api/v1/incidents

Liste des incidents

Liste paginée des incidents, du plus récent au plus ancien. severity vaut minor, major ou critical. status vaut investigating, identified, monitoring ou resolved. affectedServiceIds contient des identifiants internes de services, pas des slugs. Avec state=active la liste n'est pas paginée : page et pageSize sont ignorés et total vaut le nombre d'éléments rendus.

Paramètres

NomEmplacementTypeDescription
statequeryactive | resolved | allFiltre. Défaut : all.
pagequeryintegerIndex de page (base 0). Défaut : 0.
pageSizequeryinteger (1-50)Éléments par page. Défaut : 10.

Réponses

200Succès.
429Limite de débit dépassée.

Exemple de réponse

{
  "items": [
    {
      "id": 12,
      "severity": "major",
      "status": "resolved",
      "title": { "en": "Elevated error rate", "fr": "Taux d'erreurs élevé" },
      "affectedServiceIds": [3],
      "startedAt": 1783440000000,
      "resolvedAt": 1783452000000
    }
  ],
  "page": 0,
  "pageSize": 10,
  "total": 1
}
GET/api/v1/incidents/{id}

Détail d'un incident

Un incident avec sa chronologie complète de mises à jour, la plus récente en premier.

Paramètres

NomEmplacementTypeDescription
id*pathintegerIdentifiant de l'incident.

Réponses

200Succès.
404Identifiant d'incident inconnu.
429Limite de débit dépassée.

Exemple de réponse

{
  "id": 12,
  "severity": "major",
  "status": "resolved",
  "title": { "en": "Elevated error rate", "fr": "Taux d'erreurs élevé" },
  "updates": [
    {
      "status": "resolved",
      "body": { "en": "Incident resolved.", "fr": "Incident résolu." },
      "createdAt": 1783452000000
    }
  ]
}

Maintenance

GET/api/v1/maintenance

Fenêtres de maintenance

Fenêtres de maintenance avec leur état dérivé (upcoming, in_progress, completed, cancelled). upcoming renvoie les fenêtres non terminées, hors annulées, du début le plus ancien au plus récent ; past renvoie les fenêtres terminées, la plus récente en premier ; all renvoie toutes les fenêtres, annulées comprises. La réponse ne porte ni page, ni pageSize, ni total.

Paramètres

NomEmplacementTypeDescription
windowqueryupcoming | past | allFiltre. Défaut : upcoming.
pagequeryintegerIndex de page (base 0). Défaut : 0. Pris en compte avec window=past uniquement.
pageSizequeryinteger (1-50)Éléments par page. Défaut : 10. Pris en compte avec window=past uniquement.

Réponses

200Succès.
429Limite de débit dépassée.

Exemple de réponse

{
  "items": [
    {
      "id": 4,
      "title": { "en": "Database upgrade", "fr": "Mise à niveau base de données" },
      "body": { "en": "Planned upgrade.", "fr": "Mise à niveau planifiée." },
      "scheduledStart": 1783620000000,
      "scheduledEnd": 1783627200000,
      "affectedServiceIds": [1, 3],
      "state": "upcoming"
    }
  ],
  "window": "upcoming"
}