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.
  • A per-address rate limit guards against bursts of failing calls; a client getting 200 responses does not meet it. Polling every 30 to 60 seconds is enough.
  • The summary is computed at most every 30 seconds server-side. Polling faster returns the same content.
  • 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. affectedServiceIds holds internal service ids, not slugs. With state=active the list is not paginated: page and pageSize are ignored and total is the number of items returned.

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). upcoming returns windows that have not ended, cancelled ones excluded, oldest start first; past returns finished ones, newest first; all returns every window, cancelled included. The response carries no page, pageSize or total.

Parameters

NameInTypeDescription
windowqueryupcoming | past | allFilter. Default: upcoming.
pagequeryintegerZero-based page index. Default: 0. Honoured with window=past only.
pageSizequeryinteger (1-50)Items per page. Default: 10. Honoured with window=past only.

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