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=resolved sur les problèmes, qui renvoie 30 lignes.
  • Pour les versions texte brut ou HTML brut du changelog, utilisez le flux /rss au lieu de /api/changelog.

Ressources associées

Mis à jour : 10 septembre 2026