업데이트 포털 API
업데이트 포털은 자체 시스템에서 상태를 폴링하고, 변경 로그 항목을 수집하며, 로드맵을 확인하고, 알려진 문제를 점검할 수 있도록 소규모 퍼블릭 JSON API를 제공합니다. 인증은 필요하지 않습니다. 이 API는 영어 텍스트만 제공하며 경로의 언어 접두사는 무시됩니다.
Base URL
https://updates.foura.ai
서비스 상태
GET /api/v1/status
모든 FourA 서비스의 실시간 운영 상태와 함께 진행 중이거나 최근 발생한 인시던트를 반환합니다. 서버 측에서 15초 동안 캐시되므로, 그보다 더 자주 폴링하면 동일한 페이로드가 반환됩니다.
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일)을 포함하는 모니터링 대상 서비스별 항목 1개 |
active_incidents |
array | 현재 진행 중인 인시던트 목록 |
recent_incidents |
array | 최근 14일간 해결된 인시던트 목록 |
서비스 status 값: operational, degraded, partial_outage, major_outage, maintenance.
인시던트 impact 값: minor (성능 저하), major (부분 장애), critical (서비스 장애).
폴링 패턴
이 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 배열입니다. 사용하기 전에 파싱하십시오: json.loads(entry["tags"]). |
published |
integer | 여기서는 항상 1입니다. 이 endpoint는 게시된 항목만 반환합니다. |
published_at |
string | Z 접미사가 포함된 ISO 8601 |
created_at |
string | YYYY-MM-DD HH:MM:SS, UTC, 시간대 표시 없음 |
updated_at |
string | created_at와 동일한 형식 |
두 타임스탬프 형식은 의도적으로 다릅니다. published_at은 편집 날짜이며 시간대가 포함되지만, created_at 및 updated_at은 스토리지 타임스탬프입니다. 둘 다 UTC입니다. 세 항목 모두에 대해 하나의 형식을 가정하는 파서는 다른 두 항목에서 오류를 발생시킵니다.
RSS
전체 변경 로그(최근 항목 30개)는 다음 위치에 RSS로도 게시됩니다:
https://updates.foura.ai/rss
Feedly, Miniflux, Thunderbird 또는 지원되는 모든 리더기에서 구독할 수 있습니다. 피드 본문은 HTML로 렌더링된 마크다운을 포함하여 changelog 본문과 동일합니다.
Roadmap
GET /api/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(으)로 설정된 항목은 이 엔드포인트를 통해 전달되며 페이지에는 표시되지 않습니다.
category은(는) 페이지에 출력되는 라벨이 아닌 소문자 슬러그입니다. 현재 사용 중인 슬러그: api, infrastructure, developer-experience, dashboard, billing, analytics, authentication. 새 항목에서 새로운 슬러그가 추가될 수 있으므로 이 목록은 고정되지 않은 것으로 간주하십시오.
target_date은(는) 날짜가 아닌 자유 형식 텍스트("Q3 2026")입니다. completed_at은(는) 항목이 배포되기 전까지는 null이며, 배포된 후에는 변경 로그 항목의 published_at와(과) 동일한 형식인 Z 접미사가 붙은 ISO 8601(2026-09-01T10:15:30.000Z) 형식입니다. created_at은(는) UTC 기준의 YYYY-MM-DD HH:MM:SS을(를) 사용합니다. 하나의 객체 내에서 두 형식이 다르므로 각 필드를 개별적으로 파싱하십시오.
투표
POST /api/roadmap/:id/vote
단일 로드맵 항목에 대한 투표를 토글합니다. 투표는 익명으로 처리되며 호출자의 IP 및 User-Agent의 처음 50자를 결합하여 연결됩니다. 다시 호출하면 투표가 취소됩니다. 알 수 없거나 게시되지 않은 항목은 404 {"error": "Not found"}(으)로 응답합니다.
curl -X POST https://updates.foura.ai/api/roadmap/12/vote
{ "votes": 24, "voted": true }
voted은 호출 후 상태를 반환합니다. 투표가 추가된 경우 true, 제거된 경우 false입니다.
로드맵 endpoint인 GET /api/roadmap 및 본 endpoint는 소스 IP당 분당 30개의 request로 제한됩니다. 초과 시 {"error": "Too many votes, slow down"} 응답이 반환됩니다.
알려진 문제
GET /api/issues
FourA 지원팀에서 추적 중인 문제를 반환합니다.
curl "https://updates.foura.ai/api/issues?tab=open"
Query 매개변수:
| Parameter | Type | Default | Description |
|---|---|---|---|
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 | Z 접미사가 포함된 ISO 8601 |
resolved_at |
string or null | Z 접미사가 포함된 ISO 8601, 열려 있는 동안에는 null |
service_id은 상태 페이지에 표시되는 슬러그가 아닌 숫자 외래 키입니다. service_name을 통해 이슈를 서비스와 매칭하세요.
이슈 payload는 고정된 컬럼 목록이며 수정 타임스탬프를 포함하지 않습니다. opened_at 및 resolved_at을 기준으로 이슈를 정렬하거나 사용 기간을 계산하세요. 세 가지 공개 컬렉션 중 변경 로그 항목만 created_at 및 updated_at을 반환합니다.
resolved 탭은 가장 최근에 해결된 30개의 이슈를 반환하고 종료됩니다. open 탭은 모든 이슈를 반환합니다.
참고 사항
- 모든 endpoint는 공개되어 있으며 API key가 필요하지 않습니다. 로드맵 endpoint는 소스 IP당 분당 30개의 request로 제한됩니다. 다른 endpoint는 현재 자체적인 rate limit이 없으므로, 15초 캐시 주기에 맞춰 상태를 폴링하세요.
- response는 HTTPS 기반 JSON 형식입니다. 로드맵 및 이슈는 페이징 매개변수를 지원하지 않습니다. 유일한 제한은 이슈의
?tab=resolved으로, 30개 행을 반환합니다. - 일반 텍스트 또는 원시 HTML 버전의 변경 로그가 필요한 경우
/api/changelog대신/rss피드를 사용하세요.