Skip to content

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.

NameDescription
If-None-MatchRequest header: an ETag from an earlier response; a match returns 304 without a body
ETagResponse header: the tag of the response body
Cache-ControlResponse header: public, max-age=60
Shell
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/docs

Docs 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/docs

Python

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

NameTypeDescription
base_urlstringThe base URL every example uses
updatedstringThe newest updated date of any page, YYYY-MM-DD
sectionsarrayThe sections in sidebar order

Each entry of sections:

NameTypeDescription
idstringSection slug, such as get-started or audio
topbooleantrue for a section whose pages sit at the top of the sidebar without a heading (get-started); left out otherwise
titlestringSection title
partstringSidebar label the section sits under (Guides on language-models, audio, image and events); left out otherwise
statusstringStatus of the section's first page
pagesarrayThe section's pages in sidebar order

Each entry of sections[].pages:

NameTypeDescription
sectionstringSection slug
slugstringPage slug
pathstring<section>/<slug>, the page's path under /v1/docs/ and docs.albastov.com/
titlestringPage title
orderintegerPosition in the section
statusstringstable, beta, experimental or coming
updatedstringDate of the page's last change, YYYY-MM-DD
summarystringOne line; the page's subtitle
routesarrayRoutes the page documents, as "METHOD /v1/path/{param}"
headingsarray## and ### headings: level, text and anchor id
textstringThe page as plain text, for search
groupstringSlug of the group landing the page sits under (chat-models, voice-models, transcription-models), or ""
modelstringModel pages only: the model id the API takes
categorystringModel pages only: built-in-voices, voice-cloning, speech-to-text or chat
capabilitiesarrayAudio model pages only: built-in-voices, voice-cloning, voice-design or speech-to-text; includes category
languagesstringModel pages only: language count, such as "8"
languages_sourcestringAudio model pages only: the https URL the language count comes from
accessstringOne line naming who can use the page's feature, on pages whose feature not every key can use
imageobjectThe 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 ….

Response (abridged)
{
  "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

NameTypeDescription
section requiredstringPath: section slug, such as changelog
page requiredstringPath: 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.md

Python

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 ….

Response (abridged)
{
  "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

StatusCodeMeaning
404not_foundNo 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.txt

Python

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 ….

Response (abridged)
# 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

NameTypeDescription
file requiredstringPath: 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.jpg

Python

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.

HeaderValue
Content-Typeimage/png, image/jpeg, image/webp or image/svg+xml, by extension
Cache-Controlpublic, max-age=31536000, immutable: a changed image gets a new version number, so a served file never changes
X-Content-Type-Optionsnosniff
Content-Security-PolicySVG files only: default-src 'none'; style-src 'unsafe-inline'; img-src data:; sandbox, so an SVG runs no script and loads nothing

Errors

StatusCodeMeaning
404not_foundNo 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/docs

Python

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/.