TheBrief · Authentication Profile
Thebrief Authentication
Authentication
TheBrief declares 3 security scheme(s) across its OpenAPI definitions.
CompanyAdvertisingCreativeDesignArtificial IntelligenceMarketingAd ServingSaaSGraphQLCreative AutomationDigital Asset ManagementWebhooks
Methods:
Schemes: 3
OAuth flows:
API key in:
Security Schemes
http
scheme: bearer
http
scheme: bearer
jwt
Source
Authentication Profile
generated: '2026-08-12'
method: searched
source: https://docs.thebrief.ai/public-api/authentication
docs:
- https://docs.thebrief.ai/public-api/authentication
- https://docs.thebrief.ai/public-api/rest-api/auth
- https://docs.thebrief.ai/public-api
- https://docs.thebrief.ai/app-integration
summary: >-
The Brief Public API (REST at https://api.thebrief.ai/v1 and GraphQL at
https://graphql.thebrief.ai/public) authenticates with a JWT bearer token minted from a
clientId / clientSecret pair the team creates in the app under Manage account >
API credentials. There is no OAuth 2.0 authorization server, no OpenID Connect
discovery document and no mTLS surface; token scopes are carried in the token, not
negotiated. The same clientId/secret pair also signs the session JWT used by the
App Integration (embedded editor) flow.
credential_issuance:
console_url: https://app.thebrief.ai/go-to/settings/api-credentials
path_in_app: Profile > Manage account > API credentials
credential_pair:
- {name: clientId, type: uuid, role: public identifier}
- {name: clientSecret, type: uuid, role: signing secret, note: Kept private; never shared client-side.}
revocation:
supported: true
note: >-
The docs warn that deleting an API key blocks every already-configured integration
from accessing The Brief — deletion is the documented revocation mechanism.
source: https://docs.thebrief.ai/zapier-integration
schemes:
- id: rest_bearer_jwt
type: http
scheme: bearer
bearerFormat: JWT
header: Authorization
value_format: 'Bearer <jwt>'
applies_to: https://api.thebrief.ai/v1
token_endpoint: https://api.thebrief.ai/v1/auth/token
token_endpoint_method: POST
token_request_body:
- {name: clientId, required: true, type: string}
- {name: clientSecret, required: true, type: string}
token_response_field: token
note: >-
POST the clientId/clientSecret pair to /v1/auth/token and the API returns
{"token": "<jwt>"} to send as Authorization: Bearer on every subsequent request.
- id: graphql_bearer_jwt
type: http
scheme: bearer
bearerFormat: JWT
header: Authorization
applies_to: https://graphql.thebrief.ai/public
note: >-
The GraphQL endpoint accepts the same bearer token. Anonymous __schema introspection
IS permitted (verified 2026-08-12, HTTP 200) but executing queries/mutations is not.
- id: self_signed_jwt
type: jwt
signing: HS256 (jsonwebtoken sign with the clientSecret)
claims:
- {name: clientId, required: true, description: The public clientId from API credentials.}
- {name: iat, required: false, description: Issued-at timestamp.}
- {name: userId, required: false, description: App Integration only — the team user to impersonate for the session.}
- {name: action, required: false, description: App Integration only — the session action (create_design_from_template, create_blank_design, edit_design, get_share_link).}
- {name: sessionConfig, required: false, description: App Integration only — UI configuration for the session.}
note: >-
Clients may sign their own JWT with the secret rather than calling /v1/auth/token.
The App Integration (embedded editor) flow REQUIRES this form — the signed token is
handed to https://app.thebrief.ai/tokenAuth?token=<jwt> (or app-proxy.thebrief.ai in
an iframe) to open an impersonated editor session.
source: https://docs.thebrief.ai/app-integration
token_scopes:
model: api-token-scope
note: >-
Not OAuth 2.0 scopes. The public GraphQL schema publishes an ApiTokenScope enum naming
the surfaces an API token may be issued against; this is the only scope vocabulary The
Brief exposes, and it is captured verbatim from the live introspection response.
source: graphql/thebrief-public.graphql (enum ApiTokenScope)
scopes:
- {name: CREATOPY_API, description: Access to Creatopy API}
- {name: FIGMA, description: Access to Figma plugin}
- {name: ZAPIER, description: Access to Zapier integration}
authorization:
model: team-scoped
admin_gated_operations:
note: >-
The GraphQL schema marks a set of team-administration fields as requiring admin access
in their own descriptions (teamUsers, createTeamUser, deleteTeamUser, updateTeamUserRole).
The InputAuthorization input type carries needAdmin and requiredScopes, confirming the
server evaluates both an admin flag and a scope list per request.
fields: [teamUsers, createTeamUser, deleteTeamUser, updateTeamUserRole]
impersonation:
supported: true
note: >-
A clientId/secret pair generated by a team owner or admin may impersonate any user on
that team by putting their userId in the App Integration session JWT.
not_present:
oauth2: {documented: false, note: No OAuth 2.0 authorization-code/client-credentials flow is documented.}
openid_connect: {documented: false, probe: 'https://www.thebrief.ai/.well-known/openid-configuration -> 404 (also 404 on api., docs.)'}
oauth_authorization_server_metadata: {documented: false, probe: 'https://api.thebrief.ai/.well-known/oauth-authorization-server -> 404'}
mutual_tls: {documented: false}
api_key_header: {documented: false, note: The "API key" named in the UI is the clientId/clientSecret pair, exchanged for a JWT — not a raw key header.}
cross_links:
conventions: conventions/thebrief-conventions.yml
errors: errors/thebrief-error-codes.yml
rate_limits: rate-limits/thebrief-rate-limits.yml
graphql: graphql/thebrief-public.graphql