See the Credential vault guide for the injection model.
The vault object
string
Unique id (e.g.
vlt_01H...).string
Always
vault.string
Human-readable name.
integer
How many credentials it holds. The metadata itself comes from
GET /v1/vaults/{id}/credentials — a vault read never embeds it.string
Creation timestamp.
Create a vault
POST /v1/vaults — scope admin
string
required
Human-readable name.
string
The identity that owns the vault. Defaults to
null.Add a credential
POST /v1/vaults/{id}/credentials
string
required
One of
env_var, static_bearer, or mcp_oauth. env_var is refused with feature_not_configured —
substituting it needs an egress boundary on the sandbox’s network path, and storing a secret under a
guarantee that cannot be kept is worse than refusing it. Use an MCP kind, which is injected before the
sandbox sees the value.string
required
The reference name — for
env_var, the environment variable name (e.g. PAYMENTS_API_KEY).string
Required for
env_var — the one exact destination host the value may be substituted for. Never a wildcard.string
Required for
static_bearer and mcp_oauth — the server URL the token is matched to.string
required
The secret. Write-only — accepted here and never returned by any endpoint.
string
Optional expiry, as an RFC 3339 timestamp with an offset.
How injection works
env_var— not available on this deployment. The design is an opaque placeholder in the sandbox with the real value substituted at the egress boundary; that boundary does not exist yet, so the route refuses the kind rather than storing a secret it cannot protect.static_bearer/mcp_oauth— injected server-side when the agent connects to the matching MCP server URL. Matching is by URL: a credential is injected when itsmcp_server_urlequals one of the agent version’smcp_servers[].url. There is no per-session credential selection.
Scopes
Writing a secret is an
admin act; listing what exists is not. That split lets an agent-facing key confirm a credential is present without ever being able to add or remove one.
Retrieve a vault
GET /v1/vaults/{id} — scope agents:read. Returns the vault object with credential_count. Metadata only, like every other read here — no secret value is reachable through this or any route.
Response
List vaults & credentials
limit and after. See Pagination.
Delete
Response
Rotating a credential
There is no update route for a credential, and that is the contract rather than an omission. Rotate by adding the new secret and then deleting the old one — two records, two ids. That keepslast_injected_at attributable to exactly one secret, so an audit can still answer which value was in use at the moment of a given call.
Back to core resources
The Phase 1 resource set.