API Updates Portal

Updates Portal cung cấp một JSON API công khai nhỏ để bạn có thể truy vấn trạng thái, thu thập các mục changelog, theo dõi roadmap và kiểm tra các sự cố đã biết từ hệ thống của riêng bạn. Không yêu cầu xác thực. API chỉ cung cấp văn bản tiếng Anh; tiền tố ngôn ngữ trong đường dẫn sẽ bị bỏ qua.

Base URL

https://updates.foura.ai

Trạng thái dịch vụ

GET /api/v1/status

Trả về trạng thái hoạt động trực tiếp của mọi dịch vụ FourA, cùng với các sự cố đang diễn ra và gần đây. Được lưu trong bộ nhớ cache phía server trong 15 giây, do đó việc gửi request kiểm tra thường xuyên hơn khoảng thời gian này sẽ trả về cùng một 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": "..." }
  ]
}
Trường cấp cao nhất Kiểu dữ liệu Mô tả
overall string operational nếu mọi dịch vụ đều hoạt động bình thường, nếu không sẽ là một trong các giá trị trạng thái dịch vụ
services array Một mục cho mỗi dịch vụ được giám sát với slug, name, description, status hiện tại và lịch sử daily (tối đa 90 ngày)
active_incidents array Các sự cố hiện đang mở
recent_incidents array Các sự cố đã được giải quyết trong 14 ngày qua

Các giá trị status của dịch vụ: operational, degraded, partial_outage, major_outage, maintenance.

Các giá trị impact của sự cố: minor (hiệu năng suy giảm), major (gián đoạn một phần), critical (gián đoạn dịch vụ).

Mô hình polling

Sử dụng endpoint này để tích hợp trạng thái FourA vào bảng điều khiển hoặc hệ thống phân trang của riêng bạn.

Khi không thể lấy dữ liệu trạng thái, endpoint sẽ trả về 502 cùng với {"error": "Monitor unreachable"}. Hãy xử lý trường hợp này như một trạng thái chưa xác định thay vì trạng thái lỗi, và thử lại trong lần poll tiếp theo.

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 cũ trả về 410 Gone và điều hướng người gọi đến đây.

Changelog

GET /api/changelog

Trả về các mục changelog đã xuất bản theo thứ tự thời gian đảo ngược.

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

Query parameters:

Parameter Type Default Description
page integer 1 Số trang (bắt đầu từ 1)
limit integer 20 Số mục trên mỗi trang (tối đa 50)
category string - Lọc theo new, improved, hoặc 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
}
Trường Kiểu dữ liệu Mô tả
id integer ID mục
title string Tiêu đề mục
body string Nội dung Markdown
category string new, improved, hoặc fixed
tags string Mảng JSON được mã hóa dưới dạng chuỗi. Phân tích cú pháp trước khi dùng: json.loads(entry["tags"]).
published integer Luôn là 1 ở đây. Endpoint chỉ trả về các mục đã xuất bản.
published_at string ISO 8601 với hậu tố Z
created_at string YYYY-MM-DD HH:MM:SS, UTC, không có ký hiệu múi giờ
updated_at string Cùng định dạng với created_at

Hai định dạng timestamp khác nhau là có chủ ý: published_at là ngày biên tập và có kèm múi giờ, trong khi created_at và updated_at là timestamp lưu trữ. Cả hai đều là UTC. Trình phân tích cú pháp giả định một định dạng cho cả ba trường sẽ báo lỗi ở hai trường còn lại.

RSS

Toàn bộ changelog (30 mục gần nhất) cũng được xuất bản dưới dạng RSS tại:

https://updates.foura.ai/rss

Đăng ký trong Feedly, Miniflux, Thunderbird hoặc bất kỳ trình đọc nào. Phần thân nguồn cấp dữ liệu khớp với phần thân changelog, bao gồm cả markdown được kết xuất sang HTML.

Roadmap

GET /api/roadmap

Trả về mọi mục roadmap đã xuất bản, được sắp xếp theo số lượng phiếu bầu rồi đến thời gian tạ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"
    }
  ]
}

Các giá trị của item status: planned, in_progress, done, cancelled. Bảng tại updates.foura.ai/roadmap hiển thị ba cột, vì vậy một item được đặt thành cancelled sẽ đến bạn qua endpoint này và không bao giờ xuất hiện trên trang.

category là slug chữ thường, không phải nhãn hiển thị trên trang. Các slug đang được sử dụng hiện nay: api, infrastructure, developer-experience, dashboard, billing, analytics, authentication. Danh sách này có thể mở rộng, vì một item mới có thể giới thiệu một slug mới.

target_date là văn bản tự do ("Q3 2026"), không phải ngày tháng. completed_at là null cho đến khi một item được phát hành, sau đó là ISO 8601 với hậu tố Z (2026-09-01T10:15:30.000Z), cùng định dạng với published_at của changelog entry. created_at sử dụng YYYY-MM-DD HH:MM:SS theo UTC. Hai định dạng này khác nhau trong cùng một object, vì vậy hãy parse từng trường riêng biệt.

Voting

POST /api/roadmap/:id/vote

Bật hoặc tắt bình chọn cho một roadmap item. Lượt bình chọn là ẩn danh và gắn liền với IP của bên gọi cùng với 50 ký tự đầu tiên của User-Agent. Gọi lại lần nữa sẽ hủy bình chọn. Một item không tồn tại hoặc chưa xuất bản sẽ trả về 404 {"error": "Not found"}.

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

voted báo cáo trạng thái sau lệnh gọi: true nếu lượt bình chọn của bạn đã được thêm, false nếu đã bị xoá.

Các endpoint roadmap, GET /api/roadmap và endpoint này, bị giới hạn 30 request mỗi phút cho mỗi IP nguồn. Vượt quá mức đó, phản hồi sẽ là {"error": "Too many votes, slow down"}.

Known Issues

GET /api/issues

Trả về các sự cố được theo dõi bởi bộ phận hỗ trợ FourA.

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

Query parameters:

Parameter Type Mặc định Mô tả
tab string open open cho các sự cố đang hoạt động, resolved cho các sự cố đã giải quyết/đã đóng
{
  "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"
    }
  ]
}
Field Type Description
id integer ID của sự cố
title string Tóm tắt ngắn gọn
body string Mô tả định dạng Markdown
severity string low, medium, high, hoặc critical
status string open, investigating, resolved, hoặc closed
service_id integer or null ID số của dịch vụ bị ảnh hưởng. null khi sự cố không gắn với dịch vụ nào.
service_name string or null Tên hiển thị của dịch vụ, đã được phân giải sẵn. Đọc giá trị này thay vì tự ánh xạ service_id.
resolution string Cách thức khắc phục. Chuỗi rỗng khi sự cố đang mở.
opened_at string ISO 8601 với hậu tố Z
resolved_at string or null ISO 8601 với hậu tố Z, null khi đang mở

service_id là khóa ngoại dạng số, không phải slug hiển thị trên trang trạng thái. Khớp sự cố với dịch vụ bằng service_name.

Payload của sự cố là danh sách cột cố định và không có timestamp sửa đổi. Sắp xếp thứ tự hoặc tính tuổi thọ sự cố bằng opened_at và resolved_at. Trong ba tập hợp công khai, chỉ các mục changelog mới trả về created_at và updated_at.

Tab resolved trả về 30 sự cố được giải quyết gần đây nhất rồi dừng lại. Tab open trả về toàn bộ sự cố.

Ghi chú

  • Mọi endpoint đều công khai và không cần API key. Các endpoint roadmap bị giới hạn 30 request mỗi phút cho mỗi IP nguồn; các endpoint khác hiện không có rate limit riêng, vì vậy không nên poll trạng thái thường xuyên hơn mức cache 15 giây cho phép.
  • Phản hồi là JSON qua HTTPS. Roadmap và issues không nhận tham số phân trang. Giới hạn duy nhất là ?tab=resolved trên issues, trả về 30 hàng.
  • Đối với phiên bản văn bản thuần hoặc HTML thô của changelog, hãy sử dụng nguồn cấp /rss thay vì /api/changelog.

Liên quan

Cập nhật: 10 tháng 9, 2026