Start a signup for your operator
The agent submits the operator’s email plus its own OAuth client identity and a PKCE challenge. The human gets one email and clicks one link; that click is the consent screen and the abuse boundary at once. Nothing provisions before it.1
Register your client (once)
Standard RFC 7591 dynamic client registration:Keep the returned
client_id. Clients born this way are stamped actor_kind: agent, so every token they mint is attributable as agent activity.2
Start the registration
registration_sid and a one-time poll_secret. The operator receives a verification email; tell them it is coming.3
Poll until the human clicks
pending until the operator finishes the page; then {"status": "verified", "code": "...", "team_sid": "ts_tm_..."}. The code is single-use and short-lived; poll again for a fresh one if it expires before you exchange it.4
Exchange the code
The standard token endpoint, nothing custom:From here you hold the normal grant credential and installation token: connect to
https://mcp.gtm-api.com/mcp or call REST directly. The operator lands in a Sandbox workspace, the forever free plan: one sender slot, no card, no time limit.Rate limits apply per IP on every endpoint above, the emailed link expires in 24 hours, and an email that already has an account is told so on the verification page, not in the API answer. One live registration per (email, client): re-posting the same pair re-sends the email and answers
already_exists: true.When Sandbox is not enough
Sandbox never expires, but verbs answer402 with subscription_required the moment the workspace needs more than the free plan grants, for example a second connected account or a webhook. That moment is handleable by the agent, not just reportable:
- Read the state: search
billing-subscriptionsfor the workspace and seestatus. - Mint a payment link: create a checkout for the plan through the billing tools (or a Paddle portal link for an existing subscription). Both return a URL a human can open.
- Hand the URL to your operator with the one-line reason, and retry the blocked action after the
billing-subscriptions.activatedwebhook, or on your next run.