Docs
The documentation as JSON, as markdown and as an llms.txt index, and its images, without a key.
The docs routes serve every page of docs.albastov.com as JSON, as markdown and as an llms.txt index, and the images the pages show. No docs route requires a key.
Headers
Every docs route except images answers with the same caching headers.
| Name | Description |
|---|---|
If-None-Match | Request header: an ETag from an earlier response; a match returns 304 without a body |
ETag | Response header: the tag of the response body |
Cache-Control | Response header: public, max-age=60 |
etag=$(curl -sI https://api.albastov.com/v1/docs \
| awk -F': ' 'tolower($1)=="etag" {print $2}' | tr -d '\r')
curl -s -o /dev/null -w '%{http_code}\n' \
-H "If-None-Match: $etag" https://api.albastov.com/v1/docsDocs index
GET /v1/docs returns every section and page in sidebar order, with each page's front matter, headings and plain
text.
Request
curl
curl https://api.albastov.com/v1/docsPython
import json
import urllib.request
req = urllib.request.Request(
"https://api.albastov.com/v1/docs",
headers={"User-Agent": "my-app/1.0"},
)
index = json.load(urllib.request.urlopen(req))
for section in index["sections"]:
print(section["title"], [page["path"] for page in section["pages"]])JavaScript
const res = await fetch("https://api.albastov.com/v1/docs");
const index = await res.json();
for (const section of index.sections) {
console.log(section.title, section.pages.map((page) => page.path));
}Response
| Name | Type | Description |
|---|---|---|
base_url | string | The base URL every example uses |
updated | string | The newest updated date of any page, YYYY-MM-DD |
sections | array | The sections in sidebar order |
Each entry of sections:
| Name | Type | Description |
|---|---|---|
id | string | Section slug, such as get-started or audio |
top | boolean | true for a section whose pages sit at the top of the sidebar without a heading (get-started); left out otherwise |
title | string | Section title |
part | string | Sidebar label the section sits under (Guides on language-models, audio, image and events); left out otherwise |
status | string | Status of the section's first page |
pages | array | The section's pages in sidebar order |
Each entry of sections[].pages:
| Name | Type | Description |
|---|---|---|
section | string | Section slug |
slug | string | Page slug |
path | string | <section>/<slug>, the page's path under /v1/docs/ and docs.albastov.com/ |
title | string | Page title |
order | integer | Position in the section |
status | string | stable, beta, experimental or coming |
updated | string | Date of the page's last change, YYYY-MM-DD |
summary | string | One line; the page's subtitle |
routes | array | Routes the page documents, as "METHOD /v1/path/{param}" |
headings | array | ## and ### headings: level, text and anchor id |
text | string | The page as plain text, for search |
group | string | Slug of the group landing the page sits under (chat-models, voice-models, transcription-models), or "" |
model | string | Model pages only: the model id the API takes |
category | string | Model pages only: built-in-voices, voice-cloning, speech-to-text or chat |
capabilities | array | Audio model pages only: built-in-voices, voice-cloning, voice-design or speech-to-text; includes category |
languages | string | Model pages only: language count, such as "8" |
languages_source | string | Audio model pages only: the https URL the language count comes from |
access | string | One line naming who can use the page's feature, on pages whose feature not every key can use |
image | object | The page's header image: src (absolute URL under https://api.albastov.com/v1/docs/images/), alt, and caption when set |
model, category, capabilities, languages, languages_source, access and image are left out on pages
without them. The first page of models is the chat-models group landing. The first page of every other section
except get-started and changelog is the section's overview, slug overview. Fields not in these tables may
appear; ignore unknown fields.
The response below is abridged: two sections, one page each, and long strings cut with ….
{
"base_url": "https://api.albastov.com/v1",
"updated": "2026-11-03",
"sections": [
{
"id": "models",
"title": "Models",
"status": "beta",
"pages": [
{
"section": "models",
"slug": "kokoro",
"path": "models/kokoro",
"title": "Kokoro",
"order": 18,
"status": "stable",
"updated": "2026-11-03",
"summary": "Speaks text in 54 built-in voices in 8 languages; …",
"routes": [],
"headings": [
{"level": 2, "text": "Samples", "id": "samples"},
{"level": 2, "text": "Capabilities", "id": "capabilities"},
{"level": 2, "text": "Request", "id": "request"}
],
"group": "voice-models",
"model": "kokoro",
"category": "built-in-voices",
"capabilities": ["built-in-voices"],
"languages": "8",
"languages_source": "https://huggingface.co/hexgrad/Kokoro-82M",
"text": "Samples …"
}
]
},
{
"id": "changelog",
"title": "Changelog",
"status": "stable",
"pages": [
{
"section": "changelog",
"slug": "changelog",
"path": "changelog/changelog",
"title": "Changelog",
"order": 1,
"status": "stable",
"updated": "2026-11-03",
"summary": "Every change to the Albastar API, newest first.",
"routes": [],
"headings": [
{"level": 2, "text": "2026-11-03", "id": "2026-11-03"}
],
"group": "",
"text": "2026-11-03 …"
}
]
}
]
}Page
GET /v1/docs/{section}/{page} returns one page as JSON: the index fields of the page and its markdown body. With
.md after the page slug, the route returns the page file as markdown.
Parameters
| Name | Type | Description |
|---|---|---|
section required | string | Path: section slug, such as changelog |
page required | string | Path: page slug, such as changelog; changelog.md returns the page file as text/markdown |
Request
curl
curl https://api.albastov.com/v1/docs/changelog/changelog
curl https://api.albastov.com/v1/docs/changelog/changelog.mdPython
import json
import urllib.request
req = urllib.request.Request(
"https://api.albastov.com/v1/docs/changelog/changelog",
headers={"User-Agent": "my-app/1.0"},
)
page = json.load(urllib.request.urlopen(req))
print(page["title"], page["status"], page["updated"])
print([heading["text"] for heading in page["headings"]])JavaScript
const url = "https://api.albastov.com/v1/docs/changelog/changelog";
const page = await (await fetch(url)).json();
console.log(page.title, page.status, page.updated);
console.log(page.headings.map((heading) => heading.text));Response
The JSON response holds the page's fields from the docs index, without text, plus markdown: the
page body without front matter. The .md response is the page file, front matter included, as
text/markdown; charset=utf-8. Both leave out the authors' comments. In both, generated lists (a model page's
samples, a group landing's model table) are filled in at request time, and image links are absolute URLs under
https://api.albastov.com/v1/docs/images/.
The response below is abridged: one heading, and the markdown cut with ….
{
"section": "changelog",
"slug": "changelog",
"path": "changelog/changelog",
"title": "Changelog",
"order": 1,
"status": "stable",
"updated": "2026-11-03",
"summary": "Every change to the Albastar API, newest first.",
"routes": [],
"headings": [
{"level": 2, "text": "2026-11-03", "id": "2026-11-03"}
],
"group": "",
"markdown": "## 2026-11-03\n\n- …"
}Errors
| Status | Code | Meaning |
|---|---|---|
404 | not_found | No page at {section}/{page} |
llms.txt
GET /v1/docs/llms.txt returns the llms.txt index: a title, a summary, then per section
every page's markdown URL with its summary, as text/plain; charset=utf-8.
Request
curl
curl https://api.albastov.com/v1/docs/llms.txtPython
import urllib.request
req = urllib.request.Request(
"https://api.albastov.com/v1/docs/llms.txt",
headers={"User-Agent": "my-app/1.0"},
)
print(urllib.request.urlopen(req).read().decode())JavaScript
const res = await fetch("https://api.albastov.com/v1/docs/llms.txt");
console.log(await res.text());Response
The response below is abridged: the first section only, and each long line cut with ….
# Albastar API
> Developer documentation for the Albastar API at https://api.albastov.com/v1, …
Send the key as `Authorization: Bearer <key>`. The same pages as JSON: …
Apps in the browser, for albastov.com accounts (no documented API routes yet): …
## Get started
- [Overview](https://api.albastov.com/v1/docs/get-started/introduction.md): …The summary line in full: "Developer documentation for the Albastar API at https://api.albastov.com/v1, for
albastov.com accounts and their keys: chat completions, text to speech, voices and voice cloning, speech to text,
images, and events. Every link below is the page as plain markdown; the rendered pages are at https://docs.albastov.com." The line after the key line names
the apps, GenAI at https://genai.albastov.com (images and videos from a prompt) and Music at
https://music.albastov.com (songs with vocals or instrumentals, with no documented API routes yet).
Images
GET /v1/docs/images/{file} returns an image a page shows: a header image (image.src in the index) or an image in
the page's markdown. Pages name images by absolute URL under https://api.albastov.com/v1/docs/images/.
Parameters
| Name | Type | Description |
|---|---|---|
file required | string | Path: the file name: lowercase letters, digits and hyphens, then -v and a version number, then .png, .jpg, .webp or .svg, such as landing-horizon-v1.jpg |
Request
curl
curl -sS -D - -o landing-horizon-v1.jpg \
https://api.albastov.com/v1/docs/images/landing-horizon-v1.jpgPython
import urllib.request
req = urllib.request.Request(
"https://api.albastov.com/v1/docs/images/landing-horizon-v1.jpg",
headers={"User-Agent": "my-app/1.0"},
)
with urllib.request.urlopen(req) as res:
print(res.headers["Content-Type"], res.headers["Cache-Control"])
open("landing-horizon-v1.jpg", "wb").write(res.read())JavaScript
const res = await fetch(
"https://api.albastov.com/v1/docs/images/landing-horizon-v1.jpg",
);
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
console.log(res.headers.get("content-type"), res.headers.get("cache-control"));Response
The response body is the image file.
| Header | Value |
|---|---|
Content-Type | image/png, image/jpeg, image/webp or image/svg+xml, by extension |
Cache-Control | public, max-age=31536000, immutable: a changed image gets a new version number, so a served file never changes |
X-Content-Type-Options | nosniff |
Content-Security-Policy | SVG files only: default-src 'none'; style-src 'unsafe-inline'; img-src data:; sandbox, so an SVG runs no script and loads nothing |
Errors
| Status | Code | Meaning |
|---|---|---|
404 | not_found | No image of that name, or a name outside the pattern above |
Language models guide
GET /v1/llm/docs is a legacy route kept for existing integrations: it returns the
Language models overview page file, front matter included, as
text/markdown; charset=utf-8.
Request
curl
curl https://api.albastov.com/v1/llm/docsPython
import urllib.request
req = urllib.request.Request(
"https://api.albastov.com/v1/llm/docs",
headers={"User-Agent": "my-app/1.0"},
)
print(urllib.request.urlopen(req).read().decode())JavaScript
console.log(await (await fetch("https://api.albastov.com/v1/llm/docs")).text());Response
The page file of language-models/overview as written in the docs tree, front matter included, with the authors'
comments left out and image links as absolute URLs under https://api.albastov.com/v1/docs/images/.