API de Updates Portal
El portal de actualizaciones expone una pequeña API pública de JSON para que puedas consultar el estado, incorporar entradas del changelog, seguir el roadmap y verificar problemas conocidos desde tus propios sistemas. No se requiere autenticación. La API solo ofrece el texto en inglés; cualquier prefijo de idioma en la ruta se ignora.
Base URL
https://updates.foura.ai
Estado del servicio
GET /api/v1/status
Devuelve el estado operativo en vivo de cada servicio de FourA, además de los incidentes activos y recientes. Se almacena en caché del lado del servidor durante 15 segundos, por lo que consultar con mayor frecuencia devuelve la misma respuesta.
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": "..." }
]
}
| Campo de nivel superior | Tipo | Descripción |
|---|---|---|
overall |
string | operational si todos los servicios están operativos; de lo contrario, uno de los valores de estado del servicio |
services |
array | Una entrada por servicio monitorizado con slug, name, description, status actual e historial de daily (hasta 90 días) |
active_incidents |
array | Incidentes que están abiertos actualmente |
recent_incidents |
array | Incidentes resueltos de los últimos 14 días |
Valores de status del servicio: operational, degraded, partial_outage, major_outage, maintenance.
Valores de impact del incidente: minor (rendimiento degradado), major (interrupción parcial), critical (interrupción del servicio).
Patrón de sondeo
Usa este endpoint para integrar el estado de FourA en tu propio panel de control o sistema de alertas.
Cuando no se pueden obtener los datos de estado, el endpoint responde 502 con {"error": "Monitor unreachable"}. Trata esto como un estado desconocido en lugar de un error y vuelve a intentarlo en el siguiente sondeo.
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
El GET /api/status heredado devuelve 410 Gone y redirige a los emisores aquí.
Registro de cambios
GET /api/changelog
Devuelve las entradas publicadas del changelog en orden cronológico inverso.
curl "https://updates.foura.ai/api/changelog?limit=20"
Parámetros de consulta:
| Parámetro | Tipo | Predeterminado | Descripción |
|---|---|---|---|
page |
integer | 1 | Número de página indexado en 1 |
limit |
integer | 20 | Entradas por página (máx. 50) |
category |
string | - | Filtrar por new, improved o 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
}
| Campo | Tipo | Descripción |
|---|---|---|
id |
integer | ID de la entrada |
title |
string | Título de la entrada |
body |
string | Cuerpo en Markdown |
category |
string | new, improved o fixed |
tags |
string | Un array JSON codificado como string. Analízalo antes de usarlo: json.loads(entry["tags"]). |
published |
integer | Siempre 1 aquí. El endpoint solo devuelve entradas publicadas. |
published_at |
string | ISO 8601 con un sufijo Z |
created_at |
string | YYYY-MM-DD HH:MM:SS, UTC, sin indicador de zona |
updated_at |
string | Mismo formato que created_at |
Los dos formatos de marca temporal son diferentes a propósito: published_at es la fecha editorial e incluye una zona, mientras que created_at y updated_at son marcas temporales de almacenamiento. Ambas son UTC. Un analizador que asuma un único formato para las tres generará un error en las otras dos.
RSS
El changelog completo (las 30 entradas más recientes) también se publica como RSS en:
https://updates.foura.ai/rss
Suscríbete en Feedly, Miniflux, Thunderbird o cualquier lector. El cuerpo del feed coincide con el cuerpo del changelog, incluyendo markdown renderizado a HTML.
Roadmap
GET /api/roadmap
Devuelve cada elemento publicado del roadmap, ordenado por número de votos y luego por fecha de creación.
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"
}
]
}
Valores de status del elemento: planned, in_progress, done, cancelled. El tablero en updates.foura.ai/roadmap muestra tres columnas, por lo que un elemento establecido en cancelled te llega a través de este endpoint y nunca aparece en la página.
category es un slug en minúsculas, no la etiqueta que imprime la página. Slugs en uso hoy: api, infrastructure, developer-experience, dashboard, billing, analytics, authentication. Trata la lista como abierta, ya que un nuevo elemento puede introducir uno nuevo.
target_date es texto libre ("Q3 2026"), no una fecha. completed_at es null hasta que un elemento se publica, luego ISO 8601 con un sufijo Z (2026-09-01T10:15:30.000Z), el mismo formato que el published_at de una entrada del changelog. created_at usa YYYY-MM-DD HH:MM:SS en UTC. Los dos formatos difieren dentro de un mismo objeto, así que procesa cada campo por separado.
Votación
POST /api/roadmap/:id/vote
Alterna un voto en un único elemento del roadmap. Los votos son anónimos y están vinculados a la IP de quien realiza la llamada más los primeros 50 caracteres de su User-Agent. Llamar de nuevo elimina el voto. Un elemento desconocido o no publicado responde 404 {"error": "Not found"}.
curl -X POST https://updates.foura.ai/api/roadmap/12/vote
{ "votes": 24, "voted": true }
voted informa el estado posterior a la llamada: true si tu voto fue añadido, false si fue eliminado.
Los endpoints del roadmap, GET /api/roadmap y este, están limitados a 30 requests por minuto por IP de origen. Si se supera ese límite, la respuesta es {"error": "Too many votes, slow down"}.
Known Issues
GET /api/issues
Devuelve los problemas rastreados por el soporte de FourA.
curl "https://updates.foura.ai/api/issues?tab=open"
Parámetros de consulta:
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
tab |
string | open |
open para problemas activos, resolved para resueltos o cerrados |
{
"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"
}
]
}
| Campo | Tipo | Descripción |
|---|---|---|
id |
integer | ID del problema |
title |
string | Resumen breve |
body |
string | Descripción en Markdown |
severity |
string | low, medium, high o critical |
status |
string | open, investigating, resolved o closed |
service_id |
integer or null | ID numérico del servicio afectado. null cuando el problema no está vinculado a uno. |
service_name |
string or null | Nombre para mostrar del servicio, resuelto para ti. Lee esto en lugar de mapear service_id por tu cuenta. |
resolution |
string | Cómo se solucionó. Cadena vacía mientras el problema permanezca abierto. |
opened_at |
string | ISO 8601 con sufijo Z |
resolved_at |
string or null | ISO 8601 con sufijo Z, null mientras permanezca abierto |
service_id es una clave foránea numérica, no el slug que ves en la página de estado. Asocia problemas con servicios mediante service_name.
El payload del problema es una lista fija de columnas y no incluye marca de tiempo de modificación. Ordena o calcula la antigüedad de un problema mediante opened_at y resolved_at. De las tres colecciones públicas, solo las entradas del changelog devuelven created_at y updated_at.
La pestaña resolved devuelve los 30 problemas resueltos más recientemente y se detiene allí. La pestaña open los devuelve todos.
Notas
- Todos los endpoints son públicos y no requieren API key. Los endpoints de roadmap están limitados a 30 requests por minuto por IP de origen; los demás no tienen un rate limit propio actualmente, así que sondea el estado no más seguido de lo que justifica su caché de 15 segundos.
- Las respuestas son JSON sobre HTTPS. Roadmap e issues no aceptan parámetros de paginación. El único límite es
?tab=resolveden issues, que devuelve 30 filas. - Para versiones en texto sin formato o HTML sin procesar del changelog, usa el feed
/rssen lugar de/api/changelog.
Relacionado
- Estado del servicio: Lee los mismos datos en el navegador
- Changelog: Explora entradas con filtros y paginación
- Roadmap: Vota por elementos en la UI
- Problemas conocidos: Consulta problemas abiertos y resueltos
- Portal de actualizaciones: Descripción general de la sección