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=resolved en issues, que devuelve 30 filas.
  • Para versiones en texto sin formato o HTML sin procesar del changelog, usa el feed /rss en lugar de /api/changelog.

Relacionado

Actualizado: 10 de septiembre de 2026