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=resolvedem issues, que retorna 30 linhas. - Para versões em texto livre ou HTML puro do changelog, use o feed
/rssem vez de/api/changelog.
Relacionados
- Status do Serviço: Leia os mesmos dados no navegador
- Changelog: Navegue pelas entradas com filtros e paginação
- Roadmap: Vote nos itens na UI
- Issues Conhecidos: Leia issues abertos e resolvidos
- Portal de Atualizações: Visão geral da seção