FreshPerfAPI

Public API

Read-only REST API of the FreshPerf status page. No authentication, no API key. Every response is JSON over HTTPS.

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

Conventions

  • Localized fields are returned in both languages as {"en": "...", "fr": "..."}.
  • Timestamps are Unix epoch milliseconds in UTC.
  • Rate limit: 240 requests per minute per IP. Exceeding it returns HTTP 429.
  • Summary responses are cached for 30 seconds.
  • Errors return a generic JSON marker, for example {"error": "NOT_FOUND"}. No stack traces.
  • CORS allows browser calls from the status page origins. Server-side clients are unaffected.

Status

GET/api/v1/status

Overall status

Overall state, service counters and active incident and maintenance counts. The overall field is one of: operational, degraded_performance, partial_outage, major_outage, maintenance.

Responses

200Success.
429Rate limit exceeded.

Example response

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

Full summary

The full home-page payload: service groups, per-service live state, 90-day daily uptime (state per day: ok, degraded, down, no_data), active incidents and current or upcoming maintenance windows.

Responses

200Success.
429Rate limit exceeded.

Example response

{
  "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

Latency and uptime series

Time series for one service. 24h and 7d are bucketed from raw checks (at most 200 points). 90d returns one point per day from the daily rollups.

Parameters

NameInTypeDescription
slug*pathstringPublic service identifier (see /api/v1/summary).
rangequery24h | 7d | 90dWindow of the series. Default: 24h.

Responses

200Success.
400Invalid range value.
404Unknown service slug.
429Rate limit exceeded.

Example response

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

Incidents

GET/api/v1/incidents

Incident list

Paginated incident list, newest first. severity is minor, major or critical. status is investigating, identified, monitoring or resolved.

Parameters

NameInTypeDescription
statequeryactive | resolved | allFilter. Default: all.
pagequeryintegerZero-based page index. Default: 0.
pageSizequeryinteger (1-50)Items per page. Default: 10.

Responses

200Success.
429Rate limit exceeded.

Example response

{
  "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}

Incident detail

One incident with its full update timeline, newest update first.

Parameters

NameInTypeDescription
id*pathintegerIncident id.

Responses

200Success.
404Unknown incident id.
429Rate limit exceeded.

Example response

{
  "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

Maintenance windows

Maintenance windows with derived state (upcoming, in_progress, completed, cancelled). By default only windows that have not ended yet are returned.

Parameters

NameInTypeDescription
windowqueryupcoming | past | allFilter. Default: upcoming.

Responses

200Success.
429Rate limit exceeded.

Example response

{
  "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"
}