Get the Ox Alpha API
Ox Alpha is available through OpenRouter. From zero to your first streamed answer in about five minutes.
Create an OpenRouter account
Ox Alpha is served through OpenRouter under the model id stealth/ox-alpha. Sign up at openrouter.ai — email or Google works. No approval or waitlist is needed for stealth models.
Generate an API key
Open Keys in your OpenRouter dashboard (openrouter.ai/keys) and click Create Key. Copy it once — you won't see it again. Keys look like sk-or-v1-.... Keep it secret; treat it like a password.
Add credit (optional in stealth)
Ox Alpha is $0 during the stealth preview, so you can call it with a zero balance. Adding a small amount of credit — or your own provider key under Integrations — lifts the shared free-pool rate limits (the 429s you'll occasionally hit).
Make your first call
Point any OpenAI-compatible client at OpenRouter's /chat/completions endpoint with model: "stealth/ox-alpha" and reasoning: { enabled: true }.
Quickstart — cURL
Set OPENROUTER_API_KEY in your shell, then:
curl https://openrouter.ai/api/v1/chat/completions \
-H "Authorization: Bearer $OPENROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "stealth/ox-alpha",
"messages": [
{ "role": "user", "content": "How many r'\''s are in \"strawberry\"?" }
],
"reasoning": { "enabled": true, "effort": "high" }
}'
Python
The reasoning block returns the chain of thought alongside the answer.
import os, requests
resp = requests.post(
"https://openrouter.ai/api/v1/chat/completions",
headers={"Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}"},
json={
"model": "stealth/ox-alpha",
"messages": [{"role": "user", "content": "Explain your reasoning process."}],
"reasoning": {"enabled": True, "effort": "high"},
},
)
msg = resp.json()["choices"][0]["message"]
print("REASONING:\n", msg.get("reasoning"))
print("ANSWER:\n", msg["content"])
Streaming (Node)
Set stream: true and read the SSE deltas — reasoning and content arrive separately.
// Node — stream tokens as they arrive
const res = await fetch("https://openrouter.ai/api/v1/chat/completions", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OPENROUTER_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "stealth/ox-alpha",
messages: [{ role: "user", content: "Write a haiku about context windows." }],
reasoning: { enabled: true },
stream: true,
}),
});
const reader = res.body.getReader();
const decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) break;
for (const line of decoder.decode(value).split("\n")) {
if (!line.startsWith("data: ")) continue;
const data = line.slice(6);
if (data === "[DONE]") break;
const delta = JSON.parse(data).choices[0].delta;
if (delta.reasoning) process.stdout.write(delta.reasoning); // thinking
if (delta.content) process.stdout.write(delta.content); // answer
}
}
Good to know
- Reasoning is mandatory — effort levels are
low,high,max. - Strict JSON schema (
response_format) isn't reliably enforced — use tool calling for structured output. - The free stealth pool rate-limits (HTTP 429) intermittently — retry with backoff, or add your own provider key.
- It's a preview model that may be logged — don't send secrets or personal data.