Products
Language models
OpenAI-compatible chat completions on open-weight Qwen and DeepSeek models.
Text to speech
Speech from text, in a built-in voice or a saved voice.
Voices
Clone, design, list, share, copy and delete saved voices, and speak any text in a saved voice.
Speech to text
Transcripts of audio files, with word and segment timestamps, on OpenAI's transcription route.
Image generation
Images from a text prompt or from another image.
Events
One-line notices from your apps, stored per source and streamed to readers.
Quick start
Get a key
The owner of albastov.com issues
abk_keys to an albastov.com account, with scopes:llmfor language models,media:generatefor speech. The key is shown once, at creation. Store the key in an environment variable:Shellexport ALBASTOV_API_KEY=abk_...Send a request
A chat completion with
qwen3.8-27b, through curl, the OpenAI Python SDK orfetch.curl
curl https://api.albastov.com/v1/chat/completions \ -H "Authorization: Bearer $ALBASTOV_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "qwen3.8-27b", "messages": [{"role": "user", "content": "Say hello in five words."}], "chat_template_kwargs": {"enable_thinking": false}, "max_tokens": 50 }'Python
import os from openai import OpenAI client = OpenAI(base_url="https://api.albastov.com/v1", api_key=os.environ["ALBASTOV_API_KEY"]) reply = client.chat.completions.create( model="qwen3.8-27b", messages=[{"role": "user", "content": "Say hello in five words."}], extra_body={"chat_template_kwargs": {"enable_thinking": False}}, max_tokens=50, ) print(reply.choices[0].message.content)JavaScript
const res = await fetch("https://api.albastov.com/v1/chat/completions", { method: "POST", headers: { Authorization: `Bearer ${process.env.ALBASTOV_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ model: "qwen3.8-27b", messages: [{ role: "user", content: "Say hello in five words." }], chat_template_kwargs: { enable_thinking: false }, max_tokens: 50, }), }); if (!res.ok) throw new Error(`${res.status} ${await res.text()}`); const reply = await res.json(); console.log(reply.choices[0].message.content);Read the reply
The reply is JSON. The answer is
choices[0].message.content;usagecounts the tokens.Response{ "id": "chatcmpl-b50af0eb9c5d02d9", "object": "chat.completion", "created": 1793305215, "model": "qwen3.8-27b", "choices": [ { "index": 0, "message": {"role": "assistant", "content": "Hello there, my friend.", "reasoning": null}, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 18, "completion_tokens": 7, "total_tokens": 25, "prompt_tokens_details": {"cached_tokens": 0}, "completion_tokens_details": {"reasoning_tokens": 0} } }
Audio models
Audio modelsBase URL and hosts
| Item | Value |
|---|---|
| Base URL | https://api.albastov.com/v1 |
| Authentication | Authorization: Bearer $ALBASTOV_API_KEY |
Albastar Corp. operates albastov.com; the Albastov API serves albastov.com accounts and their API keys. The host
citadel.albastov.com answers the same routes, for existing integrations.
Conventions
- Request and response bodies are JSON, except audio files and multipart uploads where a route says so.
- Streams are
text/event-stream. - Daily limits reset at 00:00 UTC.
Retry-Afteris in seconds. - Every response carries an
X-Request-Idheader. Include the value in a bug report. - A request may set its own
X-Request-Id: 16 to 64 lowercase hex characters. Any other value is replaced. - Every error carries a
codeto branch on: Errors. - Every limit and the error it returns: Rate limits.
- Every docs page is markdown at
GET /v1/docs/{section}/{page}.md;GET /v1/docs/llms.txtlists every page. Both routes need no key: Docs reference.
Statuses
- Stable
- Breaking changes appear in the changelog before release.
- Beta
- Details may change. Every change gets a changelog line.
- Experimental
- May change or be removed without notice.
- Coming
- Planned. No routes yet.
For agents
Every page is plain markdown at its URL plus .md. The full index is llms.txt.