API do Updates Portal

O Updates Portal disponibiliza uma pequena JSON API pública para que você possa consultar o status, ingerir entradas do changelog, acompanhar o roadmap e verificar problemas conhecidos a partir dos seus próprios sistemas. Nenhuma autenticação é necessária. A API fornece apenas o texto em inglês; prefixos de idioma no caminho são ignorados.

Base URL

https://updates.foura.ai

Status do Serviço

GET /api/v1/status

Retorna o status operacional em tempo real de cada serviço FourA, além de incidentes ativos e recentes. Armazenado em cache no servidor por 15 segundos, portanto, fazer polling com frequência maior que essa retorna a mesma payload.

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 nível superior Tipo Descrição
overall string operational se todos os serviços estiverem operacionais, caso contrário, um dos valores de status de serviço
services array Uma entrada por serviço monitorado com slug, name, description, status atual e histórico de daily (até 90 dias)
active_incidents array Incidentes que estão abertos no momento
recent_incidents array Incidentes resolvidos nos últimos 14 dias

Valores de status do serviço: operational, degraded, partial_outage, major_outage, maintenance.

Valores de impact do incidente: minor (desempenho degradado), major (interrupção parcial), critical (interrupção do serviço).

Padrão de polling

Use este endpoint para conectar o status do FourA ao seu próprio painel ou sistema de paging.

Quando os dados de status não puderem ser obtidos, o endpoint responde 502 com {"error": "Monitor unreachable"}. Trate isso como um status desconhecido em vez de um status com falha e tente novamente no próximo poll.

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

O GET /api/status legado retorna 410 Gone e direciona os chamadores para cá.

Changelog

GET /api/changelog

Retorna entradas publicadas do changelog em ordem cronológica inversa.

curl "https://updates.foura.ai/api/changelog?limit=20"

Parâmetros de consulta:

Parâmetro Tipo Padrão Descrição
page integer 1 Número da página com índice iniciado em 1
limit integer 20 Entradas por página (máx. 50)
category string - Filtrar por 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
}
Campo Tipo Descrição
id integer ID da entrada
title string Título da entrada
body string Corpo em Markdown
category string new, improved ou fixed
tags string Um array JSON codificado como string. Faça o parse antes de usar: json.loads(entry["tags"]).
published integer Sempre 1 aqui. O endpoint retorna apenas entradas publicadas.
published_at string ISO 8601 com sufixo Z
created_at string YYYY-MM-DD HH:MM:SS, UTC, sem marcador de fuso
updated_at string Mesmo formato que created_at

Os dois formatos de timestamp são diferentes de propósito: published_at é a data editorial e contém um fuso, enquanto created_at e updated_at são timestamps de armazenamento. Ambos estão em UTC. Um parser que assume um único formato para os três vai falhar nos outros dois.

RSS

O changelog completo (as 30 entradas mais recentes) também é publicado como RSS em:

https://updates.foura.ai/rss

Inscreva-se no Feedly, Miniflux, Thunderbird ou em qualquer leitor. O corpo do feed corresponde ao corpo do changelog, incluindo markdown renderizado em HTML.

Roadmap

GET /api/roadmap

Retorna todos os itens publicados do roadmap, ordenados pela contagem de votos e depois pelo momento de criação.

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 do item: planned, in_progress, done, cancelled. O quadro em updates.foura.ai/roadmap renderiza três colunas, portanto um item definido como cancelled chega até você por meio deste endpoint e nunca aparece na página.

category é um slug em letras minúsculas, não o rótulo exibido na página. Slugs em uso hoje: api, infrastructure, developer-experience, dashboard, billing, analytics, authentication. Trate a lista como aberta, pois um novo item pode introduzir um novo slug.

target_date é texto livre ("Q3 2026"), não uma data. completed_at é null até que um item seja lançado, depois ISO 8601 com sufixo Z (2026-09-01T10:15:30.000Z), o mesmo formato de published_at de uma entrada do changelog. created_at usa YYYY-MM-DD HH:MM:SS em UTC. Os dois formatos diferem dentro de um mesmo objeto, portanto faça o parse de cada campo individualmente.

Votação

POST /api/roadmap/:id/vote

Alterna um voto em um único item do roadmap. Os votos são anônimos e vinculados ao IP do chamador mais os primeiros 50 caracteres do seu User-Agent. Chamar novamente remove o voto. Um item desconhecido ou não publicado responde 404 {"error": "Not found"}.

curl -X POST https://updates.foura.ai/api/roadmap/12/vote
{ "votes": 24, "voted": true }

voted informa o estado pós-chamada: true se o seu voto foi adicionado, false se foi removido.

Os endpoints do roadmap, GET /api/roadmap e este, são limitados a 30 requests por minuto por IP de origem. Acima disso, a resposta é {"error": "Too many votes, slow down"}.

Known Issues

GET /api/issues

Retorna problemas rastreados pelo suporte da FourA.

curl "https://updates.foura.ai/api/issues?tab=open"

Parâmetros de consulta:

Parâmetro Tipo Padrão Descrição
tab string open open para problemas ativos, resolved para resolvidos/fechados
{
  "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 Descrição
id integer ID do issue
title string Resumo curto
body string Descrição em Markdown
severity string low, medium, high ou critical
status string open, investigating, resolved ou closed
service_id integer or null ID numérico do serviço afetado. null quando o issue não estiver vinculado a nenhum.
service_name string or null O nome de exibição do serviço, já resolvido para você. Leia este campo em vez de mapear service_id manualmente.
resolution string Como foi corrigido. String vazia enquanto o issue estiver aberto.
opened_at string ISO 8601 com sufixo Z
resolved_at string or null ISO 8601 com sufixo Z, null enquanto aberto

service_id é uma chave estrangeira numérica, não o slug visível na página de status. Faça a correspondência entre issues e serviços por service_name.

O payload do issue é uma lista fixa de colunas e não possui timestamp de modificação. Ordene ou calcule a idade de um issue usando opened_at e resolved_at. Das três coleções públicas, apenas as entradas do changelog retornam created_at e updated_at.

A aba resolved retorna os 30 issues resolvidos mais recentemente e para por aí. A aba open retorna todos eles.

Notas

  • Todos os endpoints são públicos e não precisam de chave de API. Os endpoints do roadmap são limitados a 30 requests por minuto por IP de origem; os demais não possuem rate limit próprio atualmente, portanto consulte o status apenas no intervalo justificado pelo cache de 15 segundos.
  • As respostas são JSON via HTTPS. O roadmap e os issues não aceitam parâmetros de paginação. O único limite é ?tab=resolved em issues, que retorna 30 linhas.
  • Para versões em texto livre ou HTML puro do changelog, use o feed /rss em vez de /api/changelog.

Relacionados

Atualizado em: 10 de setembro de 2026