Available now. The connection layer is a first-party Vetta capability (“Passport”).
CLI
Two objects
Every connection is built from two objects. Keeping them separate is what lets one authorized app serve many identities under different policies.- Auth config — how an app authenticates. It pins the auth method (managed OAuth, your own OAuth app, or an API key), the scopes, any custom app credentials, and — the part that matters most — the operations a connection may call. Anything not pinned does not exist to the agent. One auth config per app is typically shared across the org.
- Connected account — a per-identity instance of that auth config: the actual authorization for one identity, with its own lifecycle, status, and token. This is what a
connection_callruns against.
Connecting
An end user authorizes through a hosted Connect Link. There is no non-interactive path: OAuth needs the user’s consent, and an API-key connector asks for the key on the same hosted form so it never travels through a Vetta request body. Either way the result is a connected account bound to one identity.1
Find the app
Search the catalogue, then read the one you want whole — it tells you which auth methods work, the operations pinned by default, and anything connecting will still ask for.
CLI
2
Create the auth config (once per app)
Managed OAuth needs no credentials of your own; bring a custom OAuth app or API key when you need it. Pin the operations with
--tool to narrow the surface below the app’s default set.CLI
3
Start a connection
Initiate a connected account for an identity. Vetta returns a hosted Connect Link the end user opens to authorize — see the caveat on
connect_link below about whose domain serves it.CLI
cURL
4
Authorize
The user completes OAuth (or submits the API key) at the Connect Link and is returned to your dashboard, which reads the account and says what happened. The connected account moves from
initiated to active on its own.Poll, do not wait for a webhook.
GET /v1/connections/{id} reconciles against the provider on read, so re-reading the connection is the refresh. There is no connection.* webhook yet, so a program that needs to know when a person finished authorizing polls this route.5
Use it
The identity’s agent lists the tools available on the connected account and invokes them.
CLI
The agent can start this itself
The four steps above are the operator’s path. An agent has the same flow as three tools, offered to every session whose agent has an identity — so “connect our Zendesk” is something you can say to the agent rather than something you have to go and do for it.The consent screen is the approval.
connections.connect produces a URL and nothing else: no credential exists and no tool is gained until a human opens it and authorizes at the third party. If you want a gate earlier than that, these register as ordinary tool names, so "connections.connect": { "permission": "ask" } in the agent’s tools.configs parks the session for approval like any other tool.Tools arrive on the next turn. The session resolves its connected accounts when a turn starts, so an account authorized mid-conversation is usable on the turn after it reads
active — which is what connections.status is for.Lifecycle
A connected account moves through a small set of states. Managed OAuth tokens are refreshed server-side, so anactive account keeps working without your involvement.
1
initiated
Connect Link issued; awaiting the user’s authorization.
2
active
Authorized and usable. Tokens refresh automatically in the background.
3
failed
Authorization or a refresh failed.
status_reason carries the cause (denied scope, expired grant, revoked app).4
disconnected
Revoked by the user or by you. The stored credential is dropped and calls are refused.
Calling tools
The agent works through Vetta’s connection tools, never the raw credential:connection_search— discover the tools available on a connected account.connection_call— invoke a specific tool with arguments.manage_connections— a meta-tool for listing connected accounts, checking status, and starting a new connection from inside a run.
Governance
The auth config’s pinned tools are the first governance layer, and they are enforced at the provider: an operation the config was not pinned to is refused before it is dispatched. Above that, which apps an identity may connect and which of the pinned tools are callable is controlled by policy:open, an allowlist, or a blocklist, plus per-connection approval on sensitive actions. Connecting a new app is approval-gated by default. Every call is priced against your budget and drawn from the organization balance.
Pricing
Connection usage is metered per event. These are the rates you are charged:
A run that discovers and sends one message costs a few managed tool calls — on the order of $0.001 — plus the one-time $0.10 for the connected account. Spend appears as connection line items in the agent’s breakdown and the organization ledger.
Field reference
string
required
The app to connect, by its catalogue id — e.g.
zendesk, linear, intercom. Search GET /v1/connections/apps for it; there is no fixed set. The five category words that used to be the only accepted values (email, chat, tracker, crm, docs) still resolve, onto the apps they always meant.string[]
The operations a connection made from this auth config may call. Omitted, the app’s own featured set is pinned. This is a boundary, not a filter — anything outside it is refused at the provider.
object
Values the app needs before authorization can start — an account subdomain, a region, a workspace. Read them from the app or the auth config (
connect_fields); leave them out and the hosted page asks the person instead.string
default:"managed_oauth"
Auth method on the auth config:
managed_oauth (Vetta’s OAuth app), oauth (your own OAuth app credentials), or api_key.string[]
Scopes requested at authorization. Narrower scopes reduce what a connected account can do.
string
required
The identity a connected account is bound to. One auth config can back many identities.
string
Connected-account state:
initiated, active, failed, or disconnected.string
Present on
failed — the cause (denied scope, expired grant, revoked app).string
The hosted authorization URL the end user opens to authorize. Present while
initiated, and it expires — read connect_link_expires_at and mint a new one rather than caching it.Next: the vault
Secrets the agent can use but never see.