Access
Authentication and permissions
Authenticate with an API key in a header, or let the client sign in with OAuth 2.1. Either way the scopes decide which tools exist.
Key or OAuth
Link to this section: Key or OAuth| API key | OAuth 2.1 | |
|---|---|---|
| How | Authorization: Bearer <key> on every request | The client signs in; an administrator consents |
| Scopes | Chosen when the key is created; fixed | Chosen in the consent screen; fixed until you reconnect |
| Who it acts as | The administrator who owns the key | The administrator who consented |
| Lifetime | Until revoked or its expiry date | Access token 1 hour; refresh token 30 days, rotated at every use |
| Revoke | In the API and MCP page of the settings | The same page; the connection is one entry |
Both end as the same thing: the access token of an OAuth connection is a Filmo key (fk_live_…), so it works on the REST API too. REST authentication covers keys; a subscription can have up to 50 keys that are not revoked, counting expired keys and OAuth connections; the limit stops you creating another key by hand.
Discovery
Link to this section: DiscoveryA call without a credential to https:// gets an HTTP 401 with a problem body and a WWW-Authenticate header: Bearer realm="filmo-public-api", resource_metadata="…", scope="<the read scopes>". The client reads the protected-resource metadata (RFC 9728) at https:// and the authorization server metadata (RFC 8414) at https://. The metadata names https:// as issuer and https:// as resource, and points its resource_documentation to this page.
- The
scopeof the 401 lists the read scopes, so clients that use it ask for reading by default. scopes_supportedlists every scope, writes included.- PKCE
S256is required;plainis refused. The only client authentication is none (public clients). - Any other production host answers with a redirect (308) to the canonical one and, for a client that does not follow it on a POST, a JSON-RPC error that names the URL. A client that follows it drops the
Authorizationheader when the origin changes. - Not announced: client ID metadata documents,
issin the authorization response,offline_accessand a revocation endpoint. Theresourceparameter is ignored: the token has no audience.
GET /.·well-known /oauth-protected-resource GET /.well-known /oauth-authorization-server Discovery (RFC 9728, RFC 8414). The 401 of
/apialready points to them in/v1 /mcp WWW-Authenticate.POST /api/v1 /oauth /register Dynamic registration (RFC 7591). Public client: you get a
client_id, never aclient_secret.Opens
GET /oauthwith a PKCE/authorize S256challengeplainis rejected.Consent
The administrator chooses the subscription. Only read permissions start checked (the ones the client asks for, or all of them if it asks for none); writes,
workflows:runandai:askalways start unchecked, even if the client asks for them, and the administrator checks them by hand.Authorization code
POST /apiwith/v1 /oauth /token grant_type=authorization_codeand the PKCE verifierAccess token (1 hour) and refresh token, with the
scopeactually grantedAuthorization: Bearer <token>The token is a short-lived API key. To renew it,
grant_type=refresh_token: the refresh token rotates on every use.
Registering a client
Link to this section: Registering a clientClients register themselves (RFC 7591) at https://. Registration is open and needs no credential, up to 10 redirect URIs per client; https ones, loopback ones (http on 127.0.0.1, localhost or [::1], any port) and the custom scheme of a native app (such as myapp://) are accepted; a fragment never is, and the redirect URI of a request has to match one exactly. It is limited to 5 registrations a minute per address.
The consent screen
Link to this section: The consent screenOnly an administrator of the Filmo account can consent, and chooses the subscription the connection is bound to. The screen offers every scope and checks by default only the minimum:
- The
*:readscopes the client asked for are checked; if it asked for none, every read scope is. - Writes,
workflows:runandai:askstart unchecked even when the client asks for them. What it asked for carries “Requested by the integration”; what it did not ask for, “Not requested by the integration”. scopeis optional in the request and scopes Filmo does not know (openid,offline_access, a typo) are ignored.- The screen shows the redirect host and warns when every redirect of the client is loopback. It does not warn about a custom app scheme.
- You can grant a scope the client did not ask for. The token response returns the scope actually granted, which can be less than requested.
Leave ai:ask unchecked unless you want the assistant to spend the account's AI credits.
Before you approve
Link to this section: Before you approveAnyone can register a client with any name, because registration is open and loopback redirects are accepted on any port. A web page or a process on your computer can therefore ask for consent as “Claude” or as any other product. Before you approve:
- Check the redirect host the screen shows against the client's page in Connect:
claude.for Claude,ai chatgpt.for ChatGPT.com - Be suspicious of a client that only redirects to your own computer unless you started it yourself, from a tool you installed.
- A redirect that is not
httpshas no host to check. A custom app scheme (myapp://) opens an application installed on this computer or phone; approve it only if you started the sign-in from that application.… - Never approve a consent you did not start.
- Check every scope. A write you do not need is a write an injected instruction can use.
- The authorization code lasts 60 seconds and works once.
- The access token lasts 1 hour. The refresh token lasts 30 days and is rotated at every exchange: the previous access token stops working at once.
- A refresh token used twice within 10 seconds by the same client returns the same pair; used again later, the whole chain is revoked and the client must ask for consent again.
- OAuth errors are
{ error, error_description }, not problem documents, and the description is in Spanish. On a 429 followRetry-After, not the body.
A scope that is missing
Link to this section: A scope that is missingA tool the connection has no scope for returns insufficient_scope as a tool error with requiredScope; there is no step-up request. To add a scope, remove the connector and add it again.
Revoking
Link to this section: RevokingRevoke a connection or a key in the API and MCP page of the app's settings. The access token fails with api_key_revoked at once, and the refresh token cannot be exchanged any more.
Related pages
Link to this section: Related pagesGuides
Scopes
A key carries scopes; each operation requires exactly one. Grant the fewest you need.
Guides
For administrators
An assistant acts with the consent of one of your administrators. Decide who may connect, what they may grant and how to take it back.
Introduction
MCP server
Connect an AI assistant to your Filmo account. It can use exactly the tools its key or connection allows.
Was this page helpful?