Aelius Code
One OpenAI-compatible endpoint that turns your editor into an agent running on Aelius. Point Cline, Continue, Roo Code, opencode or Qwen Code at it, paste a key, and the model reads and edits your repository the way it reads a chat. Free with any account.
New to this? Getting a key and Qwen Code, step by step have a screenshot of every click.
This is one of two Aelius APIs, and it is the free one. Aelius
Code is an OpenAI-compatible endpoint for editors and coding agents: keys
start aelius_code_, cost nothing with any account, and are
issued the moment you ask for one.
The other is the general API — Aelius’s
own JSON API at /api/ext/v1, for vision and schema-checked JSON
called from software you are writing. Its keys start ael_sk_,
and access to it is
requested and reviewed by a person. You do not
need it to use your editor, and nothing on this page depends on it.
Overview
- Model
- qwen3.8-27b
- Context window
- 262,144 tokens
- Protocol
- OpenAI Chat Completions, streaming and non-streaming
- Auth
- Authorization: Bearer aelius_code_…
- Price
- Free with any account
It is the same model the chat product runs on, reached without the chat product's system prompt or behaviour, and with the entire context window rather than the slice a web conversation gets. That is the point of it: an agent is only useful on a real codebase if the codebase fits in the window.
- Tool calling works. Read a file, run a command, write a patch — the endpoint speaks the same tool-call protocol your extension already expects, so agent modes work rather than just autocomplete.
- Streaming is live. Tokens arrive as they are produced. Tool-call arguments are the one exception and are delivered whole, because a half-written JSON argument is worse to an agent than a short wait.
- Long turns run to completion. Nothing on this side imposes a deadline, so an agent working through a large repository is not cut off part way.
Getting a key
Keys are free with any accountFree and are created and revoked in Settings. Nothing is reviewed and there is no waiting: that is the general API, which is a different product.
It takes about a minute. Open Aelius and sign in first: a guest session cannot hold a key, so sign up if you have not.
-
Open Settings
Click your name at the bottom of the sidebar. On a phone the sidebar is behind the menu button at the top left.
The circled row is the account button. The cog on the right of it opens the same sheet. -
Choose Aelius Code
Settings opens on Account. Aelius Code is the third entry in the menu down the left.
Aelius Code, third in the settings menu. -
Name the key and create it
The top of the panel holds the three values your editor will ask for. Name the key after the machine or editor it is for, then click Create a key.
Top ring: the three values to copy. Bottom ring: the button. The line above them is your current allowance. -
Copy it now
The key appears once, with a Copy button. Put it somewhere you can reach before configuring an editor: this is the only time it can be read.
The Copy button. Pressing Done clears it from the screen for good.
The key is shown once. Only its SHA-256 is stored, so nobody, including us, can read it back to you afterwards. If you lose it, revoke it and create another; that takes about five seconds and is the intended recovery path, not a punishment.
A key looks like aelius_code_ followed by 40 hexadecimal
characters. Treat it like a password: it can spend your allowance and it is
attached to your account. Revoking one from Settings stops it working
within a minute.
The three values every editor asks for
Whatever you are setting up will want these. They are also printed at the top of the Settings panel.
https://code.aeliusai.com/v1
qwen3.8-27b
262144
aelius_code_… (yours, from step 4)
Next: Qwen Code, step by step shows every click. If you know your way around, Cline, Continue and Roo Code are three fields each, and opencode is one config file.
Qwen Code, step by step
Qwen Code is an agent in a VS Code side panel: it reads the folder you have open, writes files and runs commands, against any OpenAI-compatible endpoint. Eleven steps, a screenshot of each, and the thing to click circled in amber.
Before you start you need VS Code, the desktop application rather than the browser build, because the extension works on files on your disk. You also need a key: get one first if you have not, and have it on your clipboard before step 9, because the prompt that asks for it closes the moment you click somewhere else.
Install the extension
-
Open the Extensions view
Click the Extensions icon in the activity bar running down the left edge of the window, or press Ctrl Shift X (Cmd Shift X on a Mac).
The circled icon is Extensions. The badge on it counts pending updates and has nothing to do with this. -
Search for
qwen codeand find the right oneSeveral extensions come back with near-identical names and only one is the agent: Qwen Code Companion, published by qwenlm. Read the publisher line, not the title.
The one called simply Qwen, by Kingleo, is a wrapper around the qwenlm.ai website: it has nowhere to put a base URL, so it will never reach Aelius. The correct extension's identifier is
qwenlm.qwen-code-vscode-ide-companion.
Top ring: the search box. Second ring: the only correct result. Note the publisher, qwenlm. -
Install it
Open its page and click Install. The Preview badge is its authors' label for their own release stage.
The Install button on the extension page. -
Open the panel
Install becomes Installed, and a Qwen icon appears in the toolbar at the top right. Click it to open the panel. No icon means the extension has not loaded yet: press Ctrl Shift P and run Developer: Reload Window.
Left ring: proof it installed. Right ring: the toolbar icon that opens the panel.
Point it at Aelius
The rest happens in prompts that drop down from the top of the window, one after another. Enter confirms and Esc cancels, and cancelling one abandons the sequence: start again at step 5.
-
Run
/authType
/authin the panel's message box and press Enter. It is offered twice while you type, under ACCOUNT and under SLASH COMMANDS; either will do.
/authtyped into the circled message box. This is the only command you need. -
Choose Custom Provider
Scroll to the bottom of the provider list and pick Custom Provider, the only entry that lets you type a URL of your own. The two at the top are Alibaba Cloud's own paid tiers.
Custom Provider, last in the list. Not Standard API Key, which is Alibaba's ModelStudio. -
Protocol: OpenAI Compatible
Take the first one. Anthropic and Gemini are different request formats and fail immediately against this endpoint.
OpenAI Compatible, the highlighted first row. -
Base URL
Type the endpoint exactly as it appears here:
https://code.aeliusai.com/v1Include the
/v1, with no trailing slash. The extension appends/chat/completionsitself, so a URL that already ends in/v1/or/chat/completionsgives a 404 that reads convincingly like the server being down.
The circled field holds the whole endpoint, /v1included. -
API key
Paste your
aelius_code_key. The field is masked, so paste rather than type and watch for a trailing space: it is the usual cause of a401 invalid_api_keyon the first message.
Masked on purpose. If you have lost the key, revoke it in Settings and make another; it cannot be read back. -
Model
The endpoint serves exactly one model. Type its name:
qwen3.8-27bThe prompt takes a comma-separated list, so one entry and no comma is right. Spell it exactly: anything else is a 404, not a correction.
One model, named exactly. -
Say hello
That is the setup. Send anything. A Thinking block appears first, because reasoning is on for this model, and the answer follows underneath.
Aelius answering inside VS Code. The circled reply came from the same model the website runs on.
Two settings to change before you do real work
It works now, but two defaults will bite on a real repository.
1. Tell it the real context window
Qwen Code will report a 1,000k context window. The real one is
262,144. It never asks the server. It
matches the model name against a table it ships with, and anything called
qwen3-… gets Qwen's own 1M figure. Uncorrected, it builds
prompts four times larger than this endpoint accepts, and the turn fails
after it has already read half your repository.
Fix it in ~/.qwen/settings.json, which on Windows is
%USERPROFILE%\.qwen\settings.json. It goes on the provider
entry, beside the baseUrl you set above:
{
"modelProviders": {
"openai": [
{
"id": "qwen3.8-27b",
"baseUrl": "https://code.aeliusai.com/v1",
"generationConfig": {
"contextWindowSize": 262144
}
}
]
}
}It must be on the provider entry, not under a top-level
model key. Qwen Code 0.21 reads
model.generationConfig only when no
modelProviders entry matches the model you are using, and
silently ignores it when one does. It prints
contextWindowSize is ignored for provider model … on
startup when you get this wrong, which is easy to scroll past.
Restart VS Code afterwards. The same file applies from a terminal too. Its auto-compaction threshold is a fraction of whatever figure it believes, so this is also what makes it compact at the right moment.
2. Turn off, or raise, any request timeout
An agent turn on a real repository can run for minutes, with the connection open and quiet while it does. An extension that gives up on it turns a slow answer into an error, which is the most common reason people report that Aelius Code has stopped working.
When it does not work
| What you see | What it usually is |
|---|---|
| No Qwen icon after installing | The window has not reloaded. Ctrl Shift P, then Developer: Reload Window. |
| Nowhere to enter a base URL | The wrong extension, or the wrong provider. It must be
Qwen Code Companion by qwenlm, and
Custom Provider at step 6. |
401 invalid_api_key |
A space copied along with the key, or a key that has been
revoked. Run /auth again and paste it once
more. |
404, or an empty model list |
A trailing slash on the base URL, or the model name misspelled
at step 10. It is qwen3.8-27b. |
| A long turn ends in a network error | A client-side timeout. Raise it or turn it off, as above. |
| The prompt is rejected as too long | The 1,000k figure. Set contextWindowSize as
above. |
429 quota_exceeded |
The allowance on this key. Retry-After carries the
real wait, and Settings shows both windows. See
Limits. |
503 verification_unavailable |
Your key is fine; the account service is briefly unreachable. Wait a few seconds. Do not regenerate the key. |
Qwen Code in a terminal
The same agent runs in a terminal, where it reads the standard OpenAI environment variables. Three exports are the whole setup:
export OPENAI_BASE_URL="https://code.aeliusai.com/v1"
export OPENAI_API_KEY="aelius_code_YOUR_KEY_HERE"
export OPENAI_MODEL="qwen3.8-27b"
qwen
In PowerShell these are $env:OPENAI_BASE_URL and so on. The
~/.qwen/settings.json fix applies here too, and matters more: a
terminal session runs longer and fills the window further before anything
notices.
The same variables work for anything else that speaks the OpenAI protocol.
Cline
Three fields on one form, and the quickest of these to set up.
Same three values. The Qwen Code walkthrough shows each being entered.
- Install Cline from the VS Code marketplace.
- Open its settings and set API Provider to OpenAI Compatible.
- Fill in the three fields:
- Base URL
- https://code.aeliusai.com/v1
- API Key
- aelius_code_…
- Model ID
- qwen3.8-27b
Then turn on Enable streaming if it is not already on, and set the
context window to 262,144 so
Cline does not truncate prompts it did not need to.
Continue
No form and no prompts to photograph. Same three values.
Continue is configured from a file rather than a form. Open
~/.continue/config.yaml and add a model block:
models:
- name: Aelius
provider: openai
model: qwen3.8-27b
apiBase: https://code.aeliusai.com/v1
apiKey: aelius_code_YOUR_KEY_HERE
defaultCompletionOptions:
contextLength: 262144
roles:
- chat
- edit
- applyDo not add autocomplete to roles.
Inline completion fires on every keystroke pause and would spend your whole
daily request allowance in an afternoon, on suggestions you mostly did not
read. Aelius Code is built for agent turns, not for tab-completion.
Roo Code
Roo Code is a fork of Cline and is configured the same way: choose the
OpenAI Compatible provider, then set Base URL to
https://code.aeliusai.com/v1, the API key to your
aelius_code_… key, and the model to
qwen3.8-27b. Leave "Use Azure" off.
Same shape as Cline. The Qwen Code walkthrough covers the traps they share: a trailing slash on the base URL, a space copied with the key.
opencode
opencode comes in three interfaces — the terminal TUI, the desktop
app, and opencode web in a browser. All three read the same
config file, and none of them has a form for a base URL. opencode will
not find Aelius on its own either: it knows the providers listed at
models.dev, and this endpoint is not one of them. You declare it yourself,
once, in a file. That is the whole reason this one feels harder than the
rest. Once the file exists it is the same
three values as everywhere else.
Using the desktop app? Do this file first anyway, then see the desktop app and the connect dialog for what its Custom option does and does not cover.
The short way: one command, no config file
Aelius serves opencode's own remote-config endpoint, so it can fetch the whole setup instead of you transcribing it. Export your key, then hand opencode the domain:
export AELIUS_CODE_API_KEY="aelius_code_YOUR_KEY_HERE"
opencode auth login https://aeliusai.com
That is the whole setup. No opencode.json, and no provider
id to invent — opencode reads
/.well-known/opencode and arrives already
knowing the base URL, the model, the context window and the timeouts. Start
it with opencode and the model is selected.
It is also the version that cannot drift. The context window in that file is read from the gateway when you fetch it, so it is whatever is really being served — where a figure you copied by hand stays at whatever it was on the day you copied it. If the model or the window changes, the next login picks it up.
What it runs on your machine. opencode obtains the key by running
a command this endpoint names, which is worth reading before you trust any
domain this way. Ours does one thing — echo
AELIUS_CODE_API_KEY, and fail if it is empty:
curl -s https://aeliusai.com/.well-known/opencode | python3 -m json.toolThe key is then stored by opencode in
~/.local/share/opencode/auth.json, and the export is no longer
needed in later shells.
Prefer to see every value, or not to let a domain configure your editor? The file below is exactly what this endpoint would have supplied, and nothing on the rest of this page depends on the short way.
The long way: write the config yourself
The provider id is a name you make up. This is the field that stops people, because opencode asks for it as though there were a correct answer somewhere and there is not. It is not issued by Aelius, it is not your key, and it is not looked up anywhere — it is just the label this config uses for this endpoint, and it becomes the part before the slash when you pick a model.
Use aelius. Lower case, no spaces. Then the model you select
is aelius/qwen3.8-27b, and the only rule is that the two
spellings match: the key under provider and the prefix in
model are the same word. Call it banana and, as
long as you also write banana/qwen3.8-27b, it works
identically.
- Install opencode, if you have not:
curl -fsSL https://opencode.ai/install | bash - Put your key in the environment rather than in the file, so the file is
safe to keep in a dotfiles repo:
Add that line to
export AELIUS_CODE_API_KEY="aelius_code_YOUR_KEY_HERE"~/.zshrcor~/.bashrcso it survives a new terminal. In PowerShell it is$env:AELIUS_CODE_API_KEY. - Create
~/.config/opencode/opencode.json. The directory will not exist yet on a fresh install —mkdir -p ~/.config/opencodefirst. Paste this in whole; the three placesaeliusappears are the provider id, and nothing in here needs changing except your key:{ "$schema": "https://opencode.ai/config.json", "provider": { "aelius": { "npm": "@ai-sdk/openai-compatible", "name": "Aelius", "options": { "baseURL": "https://code.aeliusai.com/v1", "apiKey": "{env:AELIUS_CODE_API_KEY}" }, "models": { "qwen3.8-27b": { "name": "Aelius Code", "limit": { "context": 262144, "output": 32768 } } } } }, "model": "aelius/qwen3.8-27b", "small_model": "aelius/qwen3.8-27b" } - Confirm opencode can see it before you open the editor:
You want one line back:
opencode models | grep aeliusaelius/qwen3.8-27b. Nothing back means the config file is not where opencode is looking, or is not valid JSON — a trailing comma is the usual culprit, and opencode skips a file it cannot parse without saying so. - Run
opencode. It is already on the right model because of themodelkey;/modelsinside the TUI switches between them if you configure more later.
What each part of that file is doing
- npm
@ai-sdk/openai-compatibleis the driver that speaks plain OpenAI HTTP. opencode downloads it on first launch, so that launch needs a network and a working Node. Every other value is yours.- aelius
- The provider id — a label, chosen by you, not given to you. It has
to match the prefix in
"model": "aelius/…"exactly; if you rename one, rename both. - baseURL
https://code.aeliusai.com/v1— ending at/v1, with no trailing slash and no/chat/completions. opencode appends the path itself.- limit.context
- opencode never asks the server how big the window is, so this figure is the only one it has. It is what decides when a session compacts. Setting it too high is the failure described under Limits: prompts get built larger than this endpoint will accept, after the agent has already read half your repository.
- small_model
- opencode runs a second, cheaper model for session titles and summaries. Leave it unset and it goes looking for one somewhere else, which with Aelius as your only provider means an error on the first message. Pointing it at the same model is correct here.
A project can override this. An opencode.json in a
repository root wins over the global file. That is useful, but keep the key
out of it — {env:AELIUS_CODE_API_KEY} works there too, and
a literal aelius_code_… in a committed file is a key you
will be revoking later.
The desktop app, and the connect dialog
The desktop app and the TUI share one credential store and one config file,
so nothing above changes when you use the GUI. What the GUI adds is a dialog
for the key: connect provider, then the entry at the bottom
of the list called Custom in the desktop app and Other in the
TUI's /connect. It is worth knowing exactly what that dialog
covers before you rely on it.
The dialog asks for a provider id and an API key. That is all it
asks for, and that is all it saves. There is no base URL field in it and
no model field, because it only writes credentials — to
~/.local/share/opencode/auth.json. Nothing in it tells opencode
that https://code.aeliusai.com/v1 exists.
So filling the dialog in on its own leaves you with a key for a provider
that has no address, which is the state most people get stuck in. The
config file is not optional in the GUI. The dialog is an alternative to
the apiKey line inside it, not an alternative to the file.
Which makes the Provider ID box the same invented label as before, and the one place the two halves have to meet:
-
Write the config file first
~/.config/opencode/opencode.json, exactly as above. Do this before you open the app: the dialog in the next step has nowhere to put a base URL, so until this file exists there is nothing for the app to connect to.
Left ring: the provider id. Right ring: the same word again, as the prefix of model. -
Open the connect provider dialog
In the desktop app, the entry you want is at the bottom of the provider list and is called Custom. In the TUI the same dialog is
/connectand the entry is called Other; from a plain terminal it isopencode auth login, also Other.
The Custom entry, below the providers opencode already knows about. -
Provider ID:
aeliusCharacter for character the key you used under
providerin the file. This is the join, and the only thing this dialog is really for. TypeAeliusoraelius-codehere and the model still appears in the picker, then returns401on your first message, because the key was filed under a provider that does not exist.
Lower case, no spaces, and identical to the config file. -
API key
Your
aelius_code_…key. The dialog saves it to~/.local/share/opencode/auth.jsonand saves nothing else.
A newline copied along with the key looks identical here and fails as a 401. -
Take the key back out of the config
Now that opencode holds it, delete the
"apiKey"line fromopencode.json, and theAELIUS_CODE_API_KEYexport if you set one. Mind the trailing comma on the line above it, or the file stops parsing and opencode goes back to not knowing about Aelius at all. -
Pick the model
It is listed as
aelius/qwen3.8-27b— the provider id, then the model name from the config file. Selecting it is the last step; the first message will tell you whether the two halves met.
The model picker, with qwen3.8-27b under the provider you named.
No “Custom” entry in your connect dialog? The desktop app only gained it in a January 2026 release. Update the app, or skip the dialog entirely and keep the key in the config file the way the steps above set it up — that path works on every version and every interface.
Where opencode keeps its files
| What | macOS and Linux | Windows |
|---|---|---|
| Config | ~/.config/opencode/opencode.json |
%USERPROFILE%\.config\opencode\opencode.json |
| Keys from the dialog | ~/.local/share/opencode/auth.json |
%USERPROFILE%\.local\share\opencode\auth.json |
| Logs | ~/.local/share/opencode/log/ |
%USERPROFILE%\.local\share\opencode\log |
opencode.jsonc is accepted in place of opencode.json
if you want comments in it. Very old installs keep the config in
~/.local/share/opencode/ instead; if a file is there, that is the
one being read, and it is worth moving to the path above.
When it does not work
| What you see | What it usually is |
|---|---|
opencode models lists nothing for Aelius |
The config is not being read. Check the path, and check the JSON
parses: python3 -m json.tool ~/.config/opencode/opencode.json.
A project opencode.json in the directory you launched
from can also be shadowing it. |
| Filled in the desktop app's Custom dialog, and Aelius still is not in the model picker | The dialog saves a key and nothing else. Without the config file there is no base URL and no model for it to show. See above. |
Provider aelius not found |
The id under provider and the prefix in
model disagree. |
| 401 on the first message | The environment variable is not set in the shell that launched
opencode — echo $AELIUS_CODE_API_KEY in that
same terminal. If you used the connect dialog instead, the
provider id you typed there does not match the one in the config
file. A newline copied with the key looks identical and fails the
same way. |
| 404, or an HTML error page in the log | A trailing slash on baseURL, or
/chat/completions left on the end of it. |
| Works, then fails partway through a long session | limit.context does not match
262,144, so it
compacted too late. See Limits. |
| Times out on a long turn | An agent turn on a real repository runs for minutes with the connection open and quiet. Raise any timeout you have set rather than reading it as an outage. |
Anything else
If your tool accepts a base URL, a key and a model name, it will work,
and the three values above are all it needs. A plain
curl to prove the endpoint is reachable and your key is good:
curl https://code.aeliusai.com/v1/chat/completions \
-H "Authorization: Bearer aelius_code_YOUR_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{
"model": "qwen3.8-27b",
"messages": [{"role": "user", "content": "Reply with the word ready."}],
"stream": false
}'
A 401 means the key is wrong or revoked; anything else means
the key is fine and you are reading a real answer. See
Errors.
Endpoints
The one you will use. Standard OpenAI Chat Completions: messages,
tools, tool_choice, temperature,
top_p, max_tokens, stream. Reasoning
is enabled on this model and arrives in a reasoning_content
delta, which every extension listed above already understands.
Legacy text completion, supported for tools that still need it. Prefer
/chat/completions.
Returns the one model served, with its context length. Requires a key. Many extensions call this to populate a dropdown before their first real request, which is why a bad key often shows up as an empty model list rather than as an error.
Limits
Every limit below is per key. The model, the context window and the protocol do not vary: they are the same on every account and every request.
| Limit | Your account | What happens at the ceiling |
|---|---|---|
| Credits per 5 hours, per key | 200 | 429 quota_exceeded, with the exact wait in
Retry-After |
| Credits per week, per key | 800 | 429 quota_exceeded, same |
| Requests per minute, per key | 40 | 429, retry after 10s |
| Concurrent turns, per key | 2 | 429, retry after 5s |
| Requests per 5 hours, per key | 245 | 429 quota_exceeded; a backstop against a
runaway loop, not a limit normal work meets |
| Active keys per account | 1 | Revoke one before creating another |
| Request body | 64 MB | 413 |
A guest session is a cookie, so it cannot hold a key that stays revocable afterwards. Signing up is free and takes a moment.
The context window, and clients that guess it
One request may carry 262,144 tokens,
prompt and reply together, on every plan. The endpoint publishes that figure
on GET /v1/models — under context_length,
context_window, max_model_len,
max_context_length and max_input_tokens, because
there is no agreed name for it — and on GET /props as
n_ctx, for tools that speak the llama.cpp dialect.
Some clients never look. They keep a table of model names and their context sizes, and pick a row by matching the name you configured. Qwen Code does this and will show 1,000k; see Qwen Code for the one line that corrects it. If your editor shows a figure that is not the one above, that is what has happened, and it is worth fixing rather than ignoring: a client that believes it has four times the room will send prompts this endpoint has to reject.
The concurrency cap counts turns in flight, not turns started, so it is the one you are most likely to meet while working.
How the allowance works
The shape is the same as Codex's, so the two are comparable: a rolling five-hour window with a weekly cap on top, counted in credits rather than messages. Everything the model reads and writes counts — your prompt, the files it opens, tool and terminal output, and its reply — but not all of it counts the same.
| Token | Credits per million | Why |
|---|---|---|
| Output — what the model writes | 500 | Generated one token at a time. This is the expensive one, and the only one you control by asking for less. |
| Input — new context you send | 100 | Read in one pass before the reply starts. |
| Cached input — context sent before | 10 | Already in the server's cache from an earlier turn, so it costs almost nothing to reuse. A tenth of the price. |
Those weights are Codex's, at their flagship model's rate, so a credit here means what a credit means there. They also describe the real cost fairly: an editor that resends the same file tree every turn is resending something already held in cache, and charging full price for it would be billing for work nobody did.
- The window rolls. It opens on your first request and clears five hours after that, not at a fixed time of day. Stop for five hours and you start fresh.
- The weekly cap sits on top. You can empty a five-hour window with most of the week still available; several maxed-out days in a row will find the weekly ceiling.
- Failed turns cost nothing. Only a turn the model actually served is counted.
- A long conversation gets cheaper per turn, not dearer. The part of the context that has not changed since your last message is charged at the cached rate.
What the allowance is actually worth. Measured here against a real editor session rather than estimated: an agent turn carrying about 34,000 tokens of repository context costs 1.14 credits on average, once the unchanged part of that context is coming from cache. So a window is roughly 180 agent turns.
How long that lasts depends entirely on how hard you drive it, and the honest warning is that an agent is fast: in the session those figures come from, an editor ran eight turns a minute at its peak, spending 63 credits in twelve minutes. At that pace a window goes in about half an hour. Thinking between prompts, it lasts far longer. Turned loose on a repository, it will not. That is the same reason OpenAI quotes a usage range rather than a message count.
One account per network. The allowance belongs to an account, and an
account is tied to the network it works from: the first Aelius account to use
Aelius Code from a given address keeps it, and a second account on that same
address is refused with
network_in_use. It is there so that an allowance cannot simply be
restarted by signing up again, which would leave everybody else queueing
behind it. One account may use as many networks as it likes, so a laptop that
moves between home, an office and a phone hotspot is fine. An address stops
being spoken for once it has gone a fortnight unused.
If you share a connection with somebody who also uses Aelius Code, that is a real case and not one we want to block. Tell us and we will mark the network as shared.
Your own usage, both windows, is on the same Settings page the key came from.
Errors
For what these look like inside an editor, see When it does not work.
| Status | Code | Meaning |
|---|---|---|
| 401 | invalid_api_key |
No key, or one that has never existed. Check for a copied space. |
| 401 | revoked_api_key |
The key was revoked from Settings. Create a new one. |
| 403 | account_suspended |
The account behind the key is suspended. |
| 429 | rate_limit_error |
Too many requests or too many at once. Honour Retry-After. |
| 429 | quota_exceeded |
The key has spent its five-hour or weekly allowance. Not a fixed
time of day: Retry-After carries the exact wait, and
the body names which window ran out. |
| 403 | network_in_use |
A different Aelius account already uses Aelius Code from this network. Waiting does not clear it, which is why it is not a 429. Use that account's key here, or ask us to mark the network as shared. |
| 503 | verification_unavailable |
Your key is probably fine; the account service is briefly unreachable. Retry in a few seconds. Deliberately not a 401, so nobody regenerates a key that was never the problem. |
| 502 | — | The model itself is down or restarting. |
Data and privacy
- Your code is not stored. Prompts stream through to the model and are not written to disk. Nothing you send through this endpoint is used for training, ever.
- What is recorded is accounting. Per request: the time, the token counts, how long it took, your key, your account, the requesting IP and your editor's user-agent string. Never the prompt or the answer.
- A short prompt fragment is visible live. While a turn is actually running, the first 160 characters of the last user message appear on the operator dashboard so a long-running turn can be recognised. It is held in memory only and disappears the moment the turn ends.
- Request records are kept 45 days, then deleted. The running totals on your key survive that, because they are counters rather than records.