Status
GET /v1/status, the current state of the API and of each product, with 90 days of daily states and uptime.
GET /v1/status
Returns the current state of the API and of each product, the state of each for every UTC day of the last 90 days, and the uptime of each over the same days. The route requires no key.
Request
curl
curl https://api.albastov.com/v1/statusPython
import json, urllib.request
req = urllib.request.Request("https://api.albastov.com/v1/status", headers={"User-Agent": "my-app/1.0"})
status = json.load(urllib.request.urlopen(req))
print(status["status"])
for component in status["components"]:
print(component["name"], component["status"], component["uptime_90d"])JavaScript
const res = await fetch("https://api.albastov.com/v1/status");
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const status = await res.json();
console.log(status.status);
for (const component of status.components) console.log(component.name, component.status, component.uptime_90d);Response
200, Content-Type: application/json, Cache-Control: public, max-age=30. The server computes the response at
most once every 30 seconds; updated_at is the time of that computation. The example shows one component and
two of its 90 days.
{
"status": "operational",
"updated_at": "2026-11-03T12:00:00Z",
"components": [
{
"id": "api",
"name": "API",
"status": "operational",
"uptime_90d": 99.98,
"days": [
{"date": "2026-08-06", "status": "unknown"},
{"date": "2026-11-03", "status": "operational"}
]
}
]
}| Field | Value |
|---|---|
status | The overall state: down when the api component is down, degraded when any component is not operational, otherwise operational |
updated_at | RFC 3339 time in UTC |
components | Six entries, always in this order: api API, language-models Language models, text-to-speech Text to speech, speech-to-text Speech to text, voices Voices, events Events |
components[].status | The current state: operational, degraded or down |
components[].uptime_90d | Percent of the 90 days with the component's health checks passing, 2 decimal places; 100 with no failed checks |
components[].days | Exactly 90 entries, oldest first; the last entry is the current UTC day |
components[].days[].date | YYYY-MM-DD, a UTC day |
components[].days[].status | operational, degraded, down or unknown |
Status rules
Each component has health checks and, except api and events, a failure share: the share of its API key
requests answered with a 5xx status, and for text-to-speech and speech-to-text also the share of its finished
jobs that failed on the server side. A request or job refused for the caller's input counts as an attempt, not a
failure; a cancelled job counts as neither.
| Component | Health checks | Requests |
|---|---|---|
api | API | none |
language-models | API, model service | POST /v1/chat/completions, GET /v1/models |
text-to-speech | API, model service | POST /v1/audio/speech, speech jobs |
speech-to-text | API, model service | POST /v1/audio/transcriptions, transcription jobs |
voices | API | /v1/media/voices routes |
events | API | none |
| State | Current status | Day status |
|---|---|---|
down | A health check fails now, or at least 50 % of the last 60 minutes' attempts failed, from 5 attempts | Health checks failed for 60 minutes or more, or at least 50 % of the day's attempts failed, from 10 attempts |
degraded | At least 20 % of the last 60 minutes' attempts failed, from 5 attempts | Health checks failed for under 60 minutes, or at least 10 % of the day's attempts failed, from 10 attempts |
operational | Neither of the above | Neither of the above |
unknown | Not used | The day precedes the start of the status history |
A day takes the worst state of its health checks and failure shares. uptime_90d is
100 × (1 − time with a failed health check ÷ time covered), where the time covered runs from the first of the 90
days, or from the start of the status history when later, to updated_at.
Errors
| Status | Code | Meaning |
|---|---|---|
| 500 | internal | Server error |
| 503 | unavailable | The status cannot be read now; retry after 30 seconds |