API reference
Eaon speaks the OpenAI chat completions protocol. Anything that can talk to OpenAI can talk to Eaon by changing two settings. The base URL is https://ai.eaon.dev/v1.
Quickstart
1. Create a key
Issue one from the dashboard. The full key is shown once, at creation. Only a sha256 of it is stored, so a lost key has to be revoked and replaced rather than recovered.
2. Point your client at Eaon
Two environment variables. No SDK to install and no proxy to run.
~/.zshrc export EAON_API_KEY="eaon_sk_..." export OPENAI_BASE_URL="https://ai.eaon.dev/v1" export OPENAI_API_KEY="$EAON_API_KEY"3. Send a request
eaon/autopicks the cheapest model that can serve the request. Name a model directly to override it.terminal curl https://ai.eaon.dev/v1/chat/completions \ -H "Authorization: Bearer $EAON_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "eaon/auto", "messages": [{"role": "user", "content": "ping"}] }'
Editors and SDKs
Anything that speaks the OpenAI protocol works. These are the settings for the clients people ask about most.
export ANTHROPIC_BASE_URL="https://ai.eaon.dev/v1"
export ANTHROPIC_AUTH_TOKEN="eaon_sk_..."
export ANTHROPIC_MODEL="eaon/sonnet-5"
claudeUsage and limits
Every plan is a grant of real upstream spend, not a token allowance. A call costs what it actually costs to serve, and the grant refills on its reset date. Paid plans reset weekly; Free resets monthly.
| Plan | Per month | Multiplier | Credits / mo | Per 7 days | Keys |
|---|---|---|---|---|---|
| Free | $0 | — | 300 | — | 1 |
| Go | $5 | 1× | 3,000 | 750 | 5 |
| Plus | $25 | 5× | 15,000 | 3,750 | 10 |
| Pro | $50 | 10× | 30,000 | 7,500 | 10 |
| Max | $100 | 20× | 60,000 | 15,000 | 20 |
- Budget is reserved before the upstream call and reconciled to the real cost once the response is in hand, so a burst of parallel requests cannot overspend it.
- A failed upstream call is refunded. You are not charged for a response you did not get.
- Running out returns
402until the usage grant resets or you move up a plan. Requests are also capped at 300 a minute per IP address, shared across every key; going over returns429with aRetry-Afterheader.
Authentication
Send your key as a bearer token. Keys are created in the dashboard and shown once, so store it when you make it.
Authorization: Bearer eaon_sk_1f4c...POST /v1/chat/completions
The request and response bodies are the OpenAI ones. Extra fields you send are forwarded upstream untouched.
curl https://ai.eaon.dev/v1/chat/completions \
-H "Authorization: Bearer $EAON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "eaon/sonnet-5",
"temperature": 0.4,
"messages": [
{"role": "system", "content": "You are terse."},
{"role": "user", "content": "Why is my build 40 seconds slower?"}
]
}'Streaming
Set stream: true for server-sent events. Frames are passed through byte for byte, ending with data: [DONE].
from openai import OpenAI
client = OpenAI(
base_url="https://ai.eaon.dev/v1",
api_key=os.environ["EAON_API_KEY"],
)
with client.chat.completions.stream(
model="eaon/gemini-3.8-flash",
messages=[{"role": "user", "content": "Summarise this diff."}],
) as stream:
for event in stream:
if event.type == "content.delta":
print(event.delta, end="", flush=True)GET /v1/models
Returns only the models your plan can call, plus your account’s usage grant. There is no per-model rate or remaining-calls figure here — real cost depends on prompt and reply length, so the only exact number is what the whole account has left. budget_period_days is how often that grant resets — 7 for every paid plan, 30 on Free.
{
"object": "list",
"account": {
"plan": "plus",
"usage_multiplier": 5,
"api_credit_monthly_usd": { "low": 165, "high": 430 },
"budget_usd": 37.5,
"budget_period_days": 7,
"spent_usd": 12.184219,
"remaining_usd": 25.315781
},
"data": [
{
"id": "eaon/sonnet-5",
"object": "model",
"owned_by": "anthropic",
"context_window": 1000000,
"eaon": { "cost_tier": "standard", "max_output_tokens": 16000 }
}
]
}Model ids
Tier is a relative cost band: flash, standard, or frontier. Billing is always real tokens.
| Id | Tier | Plans |
|---|---|---|
| eaon/gpt-6-astra | frontier | go, plus, pro, max |
| eaon/gpt-5.6-sol | frontier | go, plus, pro, max |
| eaon/gpt-5.6-terra | standard | go, plus, pro, max |
| eaon/gpt-5.5 | standard | go, plus, pro, max |
| eaon/fable-5 | frontier | go, plus, pro, max |
| eaon/opus-5 | frontier | go, plus, pro, max |
| eaon/sonnet-5 | standard | go, plus, pro, max |
| eaon/gemini-3.8-flash | flash | free, go, plus, pro, max |
| eaon/gemini-3.7-flash | flash | free, go, plus, pro, max |
| eaon/gemini-3.1-pro-preview | standard | go, plus, pro, max |
| eaon/gemini-3.1-flash-lite | flash | free, go, plus, pro, max |
| eaon/gemini-3-flash | flash | free, go, plus, pro, max |
| eaon/grok-4.6 | standard | go, plus, pro, max |
| eaon/grok-4.5 | standard | go, plus, pro, max |
| eaon/deepseek-v4-flash | flash | free, go, plus, pro, max |
| eaon/muse-spark-1.3 | flash | free, go, plus, pro, max |
| eaon/nemotron-3.5-lightning | flash | free, go, plus, pro, max |
| eaon/qwen3.7-flash | flash | free, go, plus, pro, max |
| eaon/qwen3.8-flash | flash | free, go, plus, pro, max |
| eaon/gpt-4o-mini | flash | free, go, plus, pro, max |
| eaon/kimi-k2.6 | frontier | go, plus, pro, max |
| eaon/mimo-v2.5 | flash | free, go, plus, pro, max |
| eaon/mimo-v2.5-pro | standard | go, plus, pro, max |
| eaon/hunyuan-3 | flash | free, go, plus, pro, max |
| eaon/hunyuan-4-preview | frontier | go, plus, pro, max |
| eaon/gemini-2.5-flash-lite | flash | free, go, plus, pro, max |
| eaon/minimax-m3 | flash | free, go, plus, pro, max |
| eaon/minimax-m2.7-highspeed | flash | free, go, plus, pro, max |
| eaon/minimax-m2.7 | flash | free, go, plus, pro, max |
| eaon/minimax-m2.5-highspeed | flash | free, go, plus, pro, max |
| eaon/minimax-m2.5 | flash | free, go, plus, pro, max |
Auto-routing
Send model: "eaon/auto" and the gateway picks a model per request instead of you naming one. It looks at the conversation for signals — code, multi-step reasoning, how much context it needs — then prices every model your plan can call for a call that size, the same way it bills, and uses whichever is cheapest and still capable. A short message with no special demands lands on the cheapest model available; a pasted stack trace or an “optimize this algorithm” ask moves to one tagged for it. It only ever picks from models your plan already grants — it routes within that set, it does not unlock a new one.
The response always reports the model that actually ran it, in the body’s model field and the x-eaon-model header, plus an x-eaon-routed-from header naming that it was auto-routed.
x-eaon-model: eaon/gemini-3.8-flash
x-eaon-routed-from: eaon/auto
x-eaon-cost-usd: 0.000041Metering headers
A non-streaming response carries what it actually cost. A streamed one does not — that cost is only known once the response finishes, after the headers have already gone out — so track spend for those from GET /v1/models or the dashboard instead.
x-eaon-model: eaon/sonnet-5
x-eaon-cost-usd: 0.014820
x-eaon-upstream: liveErrors
Errors use the OpenAI envelope. A call reserves its worst-case cost against your budget before it reaches a model; if it then fails upstream, that reservation is refunded in full, so a failed call is never actually charged.
| Status | Means |
|---|---|
| 401 | Missing, unknown or revoked key. |
| 402 | This call's worst-case cost would exceed what's left of your usage grant, or the model is above your plan. |
| 404 | Model id is not in the catalogue. |
| 429 | Over the unauthenticated per-IP abuse gate, not a plan limit. Retry-After is set. |
| 502 | Upstream provider failed. Nothing was charged. |
GET /v1/health
An unauthenticated liveness check, for uptime monitors and load balancers. It reports whether the gateway is up, not whether any particular model is.
curl https://ai.eaon.dev/v1/health