API Updates Portal
Le portail des mises à jour expose une petite API JSON publique vous permettant d'interroger le statut, d'ingérer les entrées du changelog, de suivre la roadmap et de vérifier les problèmes connus depuis vos propres systèmes. Aucune authentification n'est requise. L'API fournit uniquement le texte en anglais ; tout préfixe de langue dans le chemin est ignoré.
Base URL
https://updates.foura.ai
Statut des services
GET /api/v1/status
Renvoie le statut opérationnel en direct de chaque service FourA, ainsi que les incidents actifs et récents. Mis en cache côté serveur pendant 15 secondes, un polling plus fréquent renverra donc la même charge utile.
curl https://updates.foura.ai/api/v1/status
{
"overall": "operational",
"services": [
{
"slug": "api",
"name": "API",
"description": "...",
"status": "operational",
"daily": [
{ "date": "2026-05-19", "status": "operational", "major_outage_minutes": 0, "partial_outage_minutes": 0, "degraded_minutes": 0, "internal_degraded_minutes": 0 }
]
}
],
"active_incidents": [],
"recent_incidents": [
{ "id": "...", "service_slug": "api", "service_name": "API", "impact": "minor", "started_at": "...", "resolved_at": "..." }
]
}
| Champ de premier niveau | Type | Description |
|---|---|---|
overall |
string | operational si tous les services sont fonctionnels, sinon l'une des valeurs d'état des services |
services |
array | Une entrée par service surveillé avec slug, name, description, status actuel et historique de daily (jusqu'à 90 jours) |
active_incidents |
array | Incidents actuellement ouverts |
recent_incidents |
array | Incidents résolus au cours des 14 derniers jours |
Valeurs de status du service : operational, degraded, partial_outage, major_outage, maintenance.
Valeurs de impact de l'incident : minor (performances dégradées), major (interruption partielle), critical (interruption de service).
Schéma de scrutation
Utilisez cet endpoint pour intégrer l'état de FourA dans votre propre tableau de bord ou système de notification.
Lorsque les données d'état ne peuvent pas être récupérées, l'endpoint répond 502 avec {"error": "Monitor unreachable"}. Considérez cela comme un état inconnu plutôt qu'un état défaillant, et réessayez lors de la prochaine scrutation.
import requests
def check_foura():
r = requests.get("https://updates.foura.ai/api/v1/status", timeout=5)
r.raise_for_status() # raises on the 502 "Monitor unreachable" answer: retry next poll
data = r.json()
if data["overall"] != "operational":
# Page on-call, post to Slack, flip a feature flag, etc.
for svc in data["services"]:
if svc["status"] != "operational":
print(f"{svc['name']}: {svc['status']}")
return data
L'ancien GET /api/status renvoie 410 Gone et redirige les appelants ici.
Changelog
GET /api/changelog
Renvoie les entrées publiées du changelog par ordre antichronologique.
curl "https://updates.foura.ai/api/changelog?limit=20"
Paramètres de requête :
| Paramètre | Type | Par défaut | Description |
|---|---|---|---|
page |
integer | 1 | Numéro de page indexé à partir de 1 |
limit |
integer | 20 | Entrées par page (max 50) |
category |
string | - | Filtrer par new, improved ou fixed |
{
"entries": [
{
"id": 42,
"title": "...",
"body": "Markdown body",
"category": "new",
"tags": "[\"api\",\"dashboard\"]",
"published": 1,
"published_at": "2026-05-19T12:00:00Z",
"created_at": "2026-05-19 11:42:08",
"updated_at": "2026-05-19 11:44:31"
}
],
"total": 137,
"page": 1,
"limit": 20
}
| Champ | Type | Description |
|---|---|---|
id |
integer | ID de l'entrée |
title |
string | Titre de l'entrée |
body |
string | Corps en Markdown |
category |
string | new, improved ou fixed |
tags |
string | Un tableau JSON encodé sous forme de chaîne. Analysez-le avant utilisation : json.loads(entry["tags"]). |
published |
integer | Toujours 1 ici. L'endpoint renvoie uniquement les entrées publiées. |
published_at |
string | ISO 8601 avec un suffixe Z |
created_at |
string | YYYY-MM-DD HH:MM:SS, UTC, sans indicateur de fuseau |
updated_at |
string | Même format que created_at |
Les deux formats d'horodatage sont délibérément différents : published_at est la date éditoriale et inclut un fuseau horaire, tandis que created_at et updated_at sont des horodatages de stockage. Tous deux sont en UTC. Un analyseur qui supposerait un format unique pour les trois générera une erreur sur les deux autres.
RSS
Le changelog complet (les 30 entrées les plus récentes) est également publié en flux RSS à l'adresse suivante :
https://updates.foura.ai/rss
Abonnez-vous dans Feedly, Miniflux, Thunderbird ou tout autre lecteur. Le corps du flux correspond au corps du changelog, y compris le markdown converti en HTML.
Roadmap
GET /api/roadmap
Renvoie tous les éléments publiés de la roadmap, triés par nombre de votes puis par date de création.
curl https://updates.foura.ai/api/roadmap
{
"items": [
{
"id": 12,
"title": "...",
"description": "...",
"status": "planned",
"category": "developer-experience",
"votes": 23,
"target_date": "Q3 2026",
"completed_at": null,
"created_at": "2026-03-30 09:32:47"
}
]
}
Valeurs pour status de l'élément : planned, in_progress, done, cancelled. Le tableau sur updates.foura.ai/roadmap affiche trois colonnes, donc un élément défini sur cancelled vous parvient via cet endpoint et n'apparaît jamais sur la page.
category est un slug en minuscules, pas le libellé affiché sur la page. Slugs actuellement utilisés : api, infrastructure, developer-experience, dashboard, billing, analytics, authentication. Considérez cette liste comme ouverte, car un nouvel élément peut en introduire un nouveau.
target_date est du texte libre ("Q3 2026"), pas une date. completed_at vaut null jusqu'à la publication d'un élément, puis passe au format ISO 8601 avec un suffixe Z (2026-09-01T10:15:30.000Z), le même format que le champ published_at d'une entrée de changelog. created_at utilise YYYY-MM-DD HH:MM:SS en UTC. Les deux formats diffèrent au sein d'un même objet, analysez donc chaque champ séparément.
Voting
POST /api/roadmap/:id/vote
Bascule l'état d'un vote sur un élément de la roadmap. Les votes sont anonymes et associés à l'adresse IP de l'appelant combinée aux 50 premiers caractères de son User-Agent. Un nouvel appel retire le vote. Un élément inconnu ou non publié renvoie 404 {"error": "Not found"}.
curl -X POST https://updates.foura.ai/api/roadmap/12/vote
{ "votes": 24, "voted": true }
voted indique l'état après l'appel : true si votre vote a été ajouté, false s'il a été retiré.
Les endpoints de la roadmap, GET /api/roadmap et celui-ci, sont limités à 30 requests par minute par IP source. Au-delà, la réponse est {"error": "Too many votes, slow down"}.
Problèmes connus
GET /api/issues
Renvoie les problèmes suivis par le support FourA.
curl "https://updates.foura.ai/api/issues?tab=open"
Paramètres de requête :
| Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
tab |
string | open |
open pour les incidents actifs, resolved pour les incidents résolus/fermés |
{
"issues": [
{
"id": 5,
"title": "...",
"body": "Markdown description",
"severity": "medium",
"status": "investigating",
"service_id": 3,
"resolution": "",
"opened_at": "2026-05-18T09:00:00Z",
"resolved_at": null,
"service_name": "API"
}
]
}
| Champ | Type | Description |
|---|---|---|
id |
integer | ID du problème |
title |
string | Résumé court |
body |
string | Description Markdown |
severity |
string | low, medium, high ou critical |
status |
string | open, investigating, resolved ou closed |
service_id |
integer ou null | ID numérique du service affecté. null lorsque le problème n'est associé à aucun service. |
service_name |
string ou null | Le nom d'affichage du service, résolu pour vous. Lisez ceci au lieu de mapper service_id vous-même. |
resolution |
string | Façon dont il a été résolu. Chaîne vide tant que le problème est ouvert. |
opened_at |
string | ISO 8601 avec suffixe Z |
resolved_at |
string ou null | ISO 8601 avec suffixe Z, null tant qu'il est ouvert |
service_id est une clé étrangère numérique, pas le slug affiché sur la page de statut. Associez les problèmes aux services via service_name.
Le payload du problème est une liste de colonnes fixe et ne contient pas d'horodatage de modification. Triez ou déterminez l'âge d'un problème via opened_at et resolved_at. Parmi les trois collections publiques, seules les entrées du changelog renvoient created_at et updated_at.
L'onglet resolved renvoie les 30 problèmes les plus récemment résolus et s'arrête là. L'onglet open les renvoie tous.
Notes
- Tous les endpoints sont publics et ne nécessitent aucune clé API. Les endpoints de la roadmap sont limités à 30 requêtes par minute par IP source; les autres n'ont pas de rate limit propre aujourd'hui, interrogez donc le statut sans dépasser la fréquence justifiée par son cache de 15 secondes.
- Les réponses sont en JSON sur HTTPS. La roadmap et les problèmes ne prennent aucun paramètre de pagination. La seule limite est
?tab=resolvedsur les problèmes, qui renvoie 30 lignes. - Pour les versions texte brut ou HTML brut du changelog, utilisez le flux
/rssau lieu de/api/changelog.
Ressources associées
- Statut du service: Consultez les mêmes données dans le navigateur
- Changelog: Parcourez les entrées avec filtres et pagination
- Roadmap: Votez pour des éléments dans l'interface
- Problèmes connus: Consultez les problèmes ouverts et résolus
- Portail des mises à jour: Vue d'ensemble de la section