The same models, from your code.
The Prabloé API is one HTTP endpoint that speaks the OpenAI chat shape. Send a list of messages and a model id, get a completion back. If you have ever called an OpenAI-style API, you already know this one.
The API is not open yet. Everything below is real — the request shapes, the models, the limits — but until this launches, calls to it answer 404. Mint a key now and you will be ready the moment it flips on.
Three steps to your first response
- 01
Sign in
Prabloé signs you in with a code sent to your email — no password to lose. Any Prabloé account can hold API keys.
- 02
Mint a key
Open Settings › Developer and create a key. It starts with
pb_secret_and is shown once. Store it somewhere your code can read and your repository cannot. - 03
Send a request
Put the key in an
Authorization: Bearerheader and POST tohttps://www.prabloe.com/api/v1/chat. The quickstart below is a working request.
A secret key is a bearer credential: anyone holding it can spend your allowance. Keep it server-side, never in a browser bundle, and revoke it the moment it leaks — revoking is instant and a new key takes seconds.
Quickstart
One request, three languages. Replace the key, run it, and you have your 200.
curl https://www.prabloe.com/api/v1/chat \
-H "Authorization: Bearer pb_secret_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-oss-20b",
"messages": [
{ "role": "user", "content": "Explain a token bucket in two sentences." }
]
}'The response body is the OpenAI chat-completion shape: choices is an array, and choices[0].message.content holds the text.
Models you can name
Send one of these ids as model — or omit it, and the endpoint answers on GPT-OSS 20B. Add stream: true for the models that think before they answer; an unstreamed call that thinks past about fifty seconds is cut.
| Model | id |
|---|---|
| GPT-OSS 20BFast, clear answers for everyday questions | gpt-oss-20b |
| GPT-6.1 SolComplex work and code, reasons more | gpt-6-1-sol |
| GPT-6 AstraTheir newest flagship, sharp on structure | gpt-6-astra |
| GPT-6 LunaFastest and cheapest of the new three | gpt-6-luna |
| Gemini 3.8 FlashGoogle's newest fast model, with tools | gemini-3-8-flash |
| Gemini 4 ArgonGoogle's stable flagship, deep reasoning, huge context | gemini-4-argon |
| Claude Sonnet 5.5The balanced middle, quick but thorough | claude-sonnet-5-5 |
| Claude Opus 5.5Long-horizon reasoning that holds its thread | claude-opus-5-5 |
| Claude Fable 5.1Mythos-class flagship, the deepest of the line | claude-fable-5-1 |
| Claude Haiku 5.5Fastest of the line, built for volume | claude-haiku-5-5 |
| Kimi K3Tireless on long tasks, huge context | kimi-k3 |
| GLM-5.3The patient one: long reasoning for hard problems | glm-5-3 |
| Grok 4.7Their newest flagship, fast with tools | grok-4-7 |
| Nemotron 3 UltraTheir largest, strong at reasoning and tools | nemotron-3-ultra |
| Nemotron 3 SuperThe balanced middle of the line | nemotron-3-super |
| DeepSeek V4.1 FlashNewest DeepSeek, huge context, quick and cheap | deepseek-flash |
| DeepSeek V4 ProTop of the open-weight reasoning table | deepseek-v4-pro |
| Qwen3.8 MaxAlibaba's flagship, reads images, huge context | qwen3-8-max |
| Qwen3.8 FlashThe quick one, cheap and sees images | qwen3-8-flash |
| MiniMax M3Long context at a low price, built for agents | minimax-m3 |
Any other id, including an earlier generation, gets a 400 with model_not_in_scope. A model that is not connected right now gets a 503 before anything is charged.
When it does not return 200
Every failure is JSON with an error.code you can branch on. The code is stable; the message is for humans and may change.
| error.code | HTTP | What happened, and what fixes it |
|---|---|---|
| invalid_key | 401 | The credential is not a pb_secret_ key at all — a pb_publishable_ key, or a secret key sent from a browser. Publishable keys authenticate a hosted app's client tier, not model calls; a secret key seen from a browser is treated as compromised. |
| key_revoked | 401 | No key matched what you sent — unknown, malformed, or genuinely revoked. Mint a fresh one; a revoked key never comes back. |
| rate_limited | 429 | You went past this credential's per-minute allowance. retry-after carries the seconds left in the current window. |
| insufficient_scope | 403 | The credential is valid but is not scoped for chat completions. Add the chat scope to it in the developer console — this is a scope problem, not a bad key, so rotating it will not help. |
| spend_limit_reached | 429 or 503 | 429 when this key's own daily budget or dollar cap is spent; 503 when Prabloé's shared platform ceiling is. Either way retry-after: 3600 is sent — both windows roll over at 00:00 UTC. |
| model_not_in_scope | 400 or 403 | 400 when the model id is unknown or simply not one this endpoint serves yet (see the table below). 403 only when the id IS the one this route serves but your key's own scope excludes it. |
| invalid_request | 400 | The request body itself is the problem: not valid JSON, stream: true (not supported yet), messages missing/empty/too many/malformed, or the text failed the safety check. |
| unavailable | 502 or 503 | The model provider, not your request, is at fault: 503 when no provider could be reached at all (retry-after: 30), 502 when one responded but with an error, an unreadable body, or an empty completion. |
Headers on every response
- x-prabloe-ratelimit-requests-limit
- How many requests the current window allows.
- x-prabloe-ratelimit-requests-remaining
- How many are left in it.
- x-prabloe-ratelimit-requests-reset
- When the window refills, as a UTC timestamp.
- retry-after
- Seconds to wait, sent whenever the failure has a natural retry time: rate_limited (429, seconds left in the minute), spend_limit_reached (429 or 503, fixed at 3600 — until 00:00 UTC), and unavailable (503 only, fixed at 30).
Rate limits
The limits below are per key: each credential you mint gets its own allowance. Your account also has daily call and spend ceilings shared across all of its keys, so minting another key does not raise those. There is no guest tier on this route — every call needs a live key, so the guest column below is always zero. The per-minute window resets at the start of each clock minute; daily budgets reset at 00:00 UTC.
| Route | Per minute | Per day, guest | Per day, per key |
|---|---|---|---|
| ChatPOST /api/v1/chat | 10 | 0 | 1000 |
Read the remaining count off the response headers rather than counting your own calls — it is the number the server actually enforced.