It has no base URL, no key and no wire of its own
T3 Code never talks to this API. It has no base URL setting, no API key field and no model provider of its own, and it depends on no client library that would speak to one. What it has is a per-instance list of environment variables that it injects into the child agent when it launches it. So the whole of pointing T3 Code here is: pick a child agent this API serves, configure that agent the way its own page on this site says to, and use T3 Code’s environment variables to deliver the pieces that belong in the environment. That also means every question about the endpoint belongs to the child. Whether the base URL wants/v1 on the end is the child’s answer and it differs between
them, which is exactly the trap the shared page warns about.
Which child agent
OpenCode
Chat completions. Documented here, and the shortest path to a working T3
Code instance.
Codex CLI
The Responses API. Documented here.
A worked instance, running OpenCode
Configure the child first. OpenCode reads its provider block fromopencode.json, and that block reads the key from the environment
rather than carrying it:
opencode.json
Environment variable
settings.json in
plain text. That file lives under ~/.t3 by default, which is outside your
repository, so this is a smaller exposure than the config files the shared page
warns about; mark it anyway.
Instances are independent, so a second instance of the same agent can carry a
different key and a different model list. Minting one key per instance is worth
doing for the same reason it is worth doing per harness: revoking it costs you
nothing else.
Model ids
T3 Code keeps its own model list per instance and lets you add ids as free text, so this is a second place a model id has to be pinned. Add ids this API accepts, which means a provider-pinnedprovider/model or unirouter/auto; slashes are
fine and are what the field expects. Models has the accepted
forms.
There are three model settings rather than one, and they are not all the coding
model. Besides the default model there is one for generated text, which writes
thread titles, branch names, commit messages and pull request descriptions, and
one for the source control writer. Each is its own selection and each spends.
The second of those runs often and quietly, which is the kind of traffic that
turns up in Activity unexplained if nobody pinned it on
purpose.
There is no separate model for applying an edit, because T3 Code does not apply
edits. The child agent does.
No embeddings, and no output ceiling
T3 Code indexes your workspace by filename and content search rather than by meaning, and carries no embedding provider, so nothing in it calls an embeddings endpoint. Whether the child agent does is the child’s page’s answer. It has no maximum-output-tokens setting either. Its nearest control is when a conversation gets compacted. As on every other page here, that leaves requests holding a model’s whole published maximum against your spend rate cap; see rate limits and spend controls.What we did not verify
- That a T3 Code session against this API succeeds. Nothing was run.
- Whether T3 Code passes an injected environment variable through unchanged to every driver. We read the shape of the setting and its worked example rather than tracing each driver’s launch.
- Anything about the Cursor CLI, Grok or Antigravity drivers, including whether they can be pointed at a custom endpoint at all.
- Whether a model id added to a T3 Code instance is sent as the
modelfield byte for byte. A mismatch would show as a400withmodel_id_not_pinnedor a404withmodel_not_found, neither of which costs anything. - How stable any of this is. The project has no published documentation site, its documentation lives in the repository, its own README says it is very early, and it fetches its model catalog live, so its model list changes between releases without a release happening.