Updates Portal API

Updates Portal предоставя малък публичен JSON API, за да можете да проверявате статуса, да извличате записи от changelog, да следите roadmap и да проверявате известни проблеми от вашите собствени системи. Не се изисква автентикация. Този API връща само текст на английски език; езиковият префикс в пътя се игнорира.

Base URL

https://updates.foura.ai

Статус на услугите

GET /api/v1/status

Връща текущото работно състояние на всяка FourA услуга, както и активните и скорошните инциденти. Кешира се от страна на сървъра за 15 секунди, така че по-честото изпращане на заявки връща същия 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": "..." }
  ]
}
Поле от най-високо ниво Тип Описание
overall string operational, ако всяка услуга работи нормално, в противен случай една от стойностите за статус на услуга
services array По един запис за всяка наблюдавана услуга с slug, name, description, текущ status и daily история (до 90 дни)
active_incidents array Инциденти, които в момента са отворени
recent_incidents array Решени инциденти от последните 14 дни

Стойности за status на услуга: operational, degraded, partial_outage, major_outage, maintenance.

Стойности за impact на инцидент: minor (влошена производителност), major (частично прекъсване), critical (прекъсване на услугата).

Модел на периодично извличане (polling)

Използвайте този endpoint, за да свържете статуса на FourA със собствено табло за управление или пейджинг система.

Когато данните за статуса не могат да бъдат извлечени, endpoint връща 502 с {"error": "Monitor unreachable"}. Третирайте това като неизвестен статус, а не като грешен, и опитайте отново при следващата проверка.

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

Остарелият GET /api/status връща 410 Gone и пренасочва извикванията тук.

Changelog

GET /api/changelog

Връща публикуваните записи в changelog в обратен хронологичен ред.

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

Query параметри:

Параметър Тип По подразбиране Описание
page integer 1 Номер на страницата (индексиране от 1)
limit integer 20 Записи на страница (макс. 50)
category string - Филтриране по new, improved или 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
}
Поле Тип Описание
id integer ID на записа
title string Заглавие на записа
body string Markdown тяло
category string new, improved или fixed
tags string JSON масив, кодиран като string. Парснете го преди употреба: json.loads(entry["tags"]).
published integer Винаги 1 тук. Този endpoint връща само публикувани записи.
published_at string ISO 8601 със суфикс Z
created_at string YYYY-MM-DD HH:MM:SS, UTC, без маркер за часова зона
updated_at string Същият формат като created_at

Двата формата за времеви отпечатък са различни умишлено: published_at е редакционната дата и съдържа часова зона, докато created_at и updated_at са времеви отпечатъци за съхранение. И двата са в UTC. Парсер, който предполага един и същ формат за трите, ще генерира грешка при другите два.

RSS

Пълният changelog (30-те най-нови записа) се публикува и като RSS на адрес:

https://updates.foura.ai/rss

Абонирайте се във Feedly, Miniflux, Thunderbird или друг четец. Съдържанието на фийда съвпада със съдържанието на changelog-а, включително markdown, рендериран към HTML.

Roadmap

GET /api/roadmap

Връща всеки публикуван елемент от roadmap-а, сортиран по брой гласове и след това по време на създаване.

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"
    }
  ]
}

Стойности на status на елемент: planned, in_progress, done, cancelled. Таблото на updates.foura.ai/roadmap показва три колони, така че елемент, зададен на cancelled, достига до вас през този endpoint и никога не се появява на страницата.

category е slug с малки букви, а не етикетът, който се изписва на страницата. Използвани slugs към момента: api, infrastructure, developer-experience, dashboard, billing, analytics, authentication. Считайте списъка за отворен, тъй като нов елемент може да въведе нов slug.

target_date е свободен текст ("Q3 2026"), а не дата. completed_at е null, докато даден елемент не бъде пуснат, след което е ISO 8601 със суфикс Z (2026-09-01T10:15:30.000Z), същият формат като published_at на запис от changelog. created_at използва YYYY-MM-DD HH:MM:SS в UTC. Двата формата се различават в рамките на един обект, затова парсвайте всяко поле поотделно.

Гласуване

POST /api/roadmap/:id/vote

Превключва глас за отделен roadmap елемент. Гласовете са анонимни и свързани с IP адреса на извикващия плюс първите 50 знака от неговия User-Agent. Повторното извикване премахва гласа. Непознат или непубликуван елемент връща 404 {"error": "Not found"}.

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

voted отчита състоянието след извикването: true, ако гласът ви е добавен, false, ако е премахнат.

Пътната карта endpoints, GET /api/roadmap и този, са ограничени до 30 requests в минута на изходен IP адрес. При превишаване отговорът е {"error": "Too many votes, slow down"}.

Known Issues

GET /api/issues

Връща проблеми, проследявани от поддръжката на FourA.

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

Query параметри:

Параметър Тип По подразбиране Описание
tab string open open за активни проблеми, resolved за разрешени/затворени
{
  "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"
    }
  ]
}
Поле Тип Описание
id integer ID на проблема
title string Кратко обобщение
body string Markdown описание
severity string low, medium, high или critical
status string open, investigating, resolved или closed
service_id integer or null Числово ID на засегнатата услуга. null, когато проблемът не е свързан с конкретна услуга.
service_name string or null Екранно име на услугата, вече резолвнато. Използвайте това вместо да мапвате service_id сами.
resolution string Как е бил отстранен проблемът. Празен низ, докато проблемът е отворен.
opened_at string ISO 8601 с наставка Z
resolved_at string or null ISO 8601 с наставка Z, null докато е отворен

service_id е числов foreign key, а не slug стойността, която виждате на страницата за статус. Свързвайте проблемите с услугите чрез service_name.

Payload на проблема е фиксиран списък от колони и не съдържа timestamp за модификация. Сортирайте или определяйте възрастта на проблем чрез opened_at и resolved_at. От трите публични колекции само записите в changelog връщат created_at и updated_at.

Разделът resolved връща последните 30 разрешени проблема и спира дотам. Разделът open връща всички.

Бележки

  • Всички endpoint адреси са публични и не изискват API key. Roadmap endpoint адресите са ограничени до 30 заявки в минута за IP адрес на източника; останалите в момента нямат собствен rate limit, затова проверявайте статуса не по-често, отколкото 15-секундният кеш позволява.
  • Отговорите са JSON през HTTPS. Roadmap и проблемите не приемат параметри за пагинация. Единственото ограничение е ?tab=resolved при проблемите, което връща 30 реда.
  • За версии на changelog в свободен текст или суров HTML използвайте емисията /rss вместо /api/changelog.

Свързани

Обновено: 10 септември 2026 г.