Skip to main content
The AdStellar MCP server and REST API support two credentials:
  1. OAuth 2.1 (recommended for interactive MCP clients like Claude and ChatGPT)
  2. API keys (recommended for your own agents and scripts)
Both resolve to the same team + scopes; every tool runs as your team with full tenant isolation.

OAuth 2.1

MCP-aware clients walk the flow automatically the first time they connect to https://app.adstellar.ai/api/mcp:
  1. The server answers 401 with a WWW-Authenticate header pointing at the discovery metadata (/.well-known/oauth-protected-resource).
  2. The client registers itself via Dynamic Client Registration (RFC 7591) at /api/oauth/register.
  3. You’re redirected to the AdStellar consent screen: pick the team and the scopes to grant.
  4. The client exchanges the resulting code for an access + refresh token pair (PKCE, S256-only) at /api/oauth/token.
Access tokens live 1 hour; refresh tokens 30 days and rotate on every use. Nothing needs to be configured by hand — just paste the MCP URL into your client. Endpoints:

OpenID Connect

The authorization server is also an OpenID Connect provider, so clients that need a verified identity (for example ChatGPT Enterprise domain restrictions) can request the openid and email scopes alongside the tool scopes.
  • Discovery: https://app.adstellar.ai/.well-known/openid-configuration
  • Signing keys: https://app.adstellar.ai/.well-known/jwks.json (RS256)
  • UserInfo: GET https://app.adstellar.ai/api/oauth/userinfo with the access token as a Bearer header
When openid is granted, the token response includes an id_token with sub, aud, iss, exp, iat, the request nonce if one was sent, and, with the email scope, email and email_verified: true. Every AdStellar account has a verified email, so the claim is always true. The openid and email scopes grant no tool access and are not available for API keys.

API keys

For unattended agents, create a team-scoped key (ast_live_...) in Settings → Developers or via the management API (owner/admin):
The plaintext key is returned exactly once — only its SHA-256 hash is stored.

Scopes

Tools you don’t have the scope for are hidden from tools/list and rejected with a clear error.

Use the credential

Discovery needs no credential: initialize, ping and tools/list answer unauthenticated so a client can read every tool and its securitySchemes before linking an account. With a credential, tools/list narrows to the tools that credential’s scopes allow. tools/call always requires one.

Rate limits

120 requests per minute per credential, per endpoint. 429 responses include a Retry-After header.

Security notes

  • Keys and tokens are never logged; only hashes are stored.
  • Generation tools deduct credits from your team’s balance exactly as if you’d run them in the app.
  • Every tool that changes a live ad, spends credits, or creates a rule is two-step: called without confirmationToken it returns a preview plus a short-lived token (10 minutes, bound to the credential, tool and exact arguments); the change only happens when the tool is called again with that token. Agents must show the preview and get explicit approval in between.
  • launch_campaign publishes paused by default; pass status: "active" to start delivery immediately. It costs the same AI credits as launching in the app.
  • Write scopes can only be granted by team owners/admins on the consent screen.
  • Revoke API keys anytime (DELETE /api/settings/api-keys/<id>?teamId=...); OAuth grants expire with their refresh tokens.