Guides

Authentication

Every operation requires an API key sent as a bearer token. Only an administrator can create a key, and the key acts as that administrator, so decide who owns it before you create it.

Put the key in the Authorization header of every request, as a bearer token. Every key starts with fk_live_: there is a single prefix, and there are no separate test or sandbox keys, so every key works on the live data of its account. The documentation is public; what is restricted is the credential.

The header
GET /api/v1/account HTTP/1.1
Host: app.filmo.io
Authorization: Bearer <your API key>

To check what a key can do, call GET /api/v1/account. It returns the key that made the request, with its name and scopes but never its secret (apiKey).

# The scopes of the key are in data.apiKey.scopes.
curl -sS "${FILMO_BASE_URL:-https://app.filmo.io}/api/v1/account" \
  -H "Authorization: Bearer $FILMO_API_KEY" | jq '.data.apiKey'
  1. Sign in as an administrator

    Only administrators of the account can create keys, by hand or through OAuth.

  2. Open the API and MCP settings

    In the Spanish interface the section is called Ajustes → API y MCP.

  3. Create the key and name it after the integration

    Use one key per integration, so you can revoke one without touching the others.

  4. Choose the scopes

    Tick only the permissions the integration calls. The scopes of a key cannot be edited afterwards: to change them, create a new key and revoke the old one. See Scopes.

  5. Set an expiry date, if you want one

    The date is optional and must be in the future. A key without a date does not expire, and no key expires for lack of use.

  6. Copy the key and store it

    Filmo shows the key once and stores only a hash of it, so it cannot show it again. Put it in a secret manager or an environment variable before you close the dialog.

Warning:

The key is shown only once and amounts to programmatic access to your company's data. If you lose it, create a new key and revoke the old one.

The Help Center has the same procedure with screens: Generate an API key.

A key hangs from a real administrator of the account, the one who created it, and everything it writes is attributed to that administrator. The same holds for each OAuth connection.

Filmo checks that condition on every request, not only when the key is created. If the person who created the key leaves the account or is deactivated, the key answers 401 api_key_owner_inactive. If they stop being an administrator, it answers 401 api_key_owner_not_admin. The key itself is fine: what changed is the role of its owner, and the fix is to reissue the key from an account that is still an administrator.

Create production keys from a dedicated administrator account

Link to this section: Create production keys from a dedicated administrator account

Do not create production keys from the account of a person who may leave or change role. Create a dedicated, long-lived administrator account for integrations, name it after what it is for, and create the keys from it. There is no service or bot user today: the key owner is a real user. The key itself does not take a seat, but the administrator account you create it from is a user like any other and does, so budget for that account.

A developer or an agency working for a rental company is not an administrator of its account and cannot create a key. The administrator of the rental company creates the key with only the scopes the work needs and hands it over through a shared secret manager, never by email or chat. The contractor does not need an administrator login. When the work ends, the administrator revokes the key.

Revoke a key in the API and MCP section of the settings (*Ajustes → API y MCP*). A revoked key answers 401 api_key_revoked. A connection made through OAuth appears there labeled as a connected integration, and revoking it cuts off access immediately.

There is no rotation command. Several keys can be active at once, and that overlap is how you rotate a key without downtime:

  1. Create a new key

    Same name pattern and same scopes.

  2. Deploy it

    Update the secret your integration reads and restart it.

  3. Check the traffic

    Confirm the integration calls succeed with the new key.

  4. Revoke the old key

A subscription can have up to 50 keys that are not revoked (an expired key still counts). OAuth connections count in that total, but only creating a key by hand is refused at the limit. Revoke the ones you no longer use.

A request without a usable key is answered with 401 and a problem document. Branch on code. Filmo checks a key in this order: it is recognized, then not revoked, then not expired, then its owner is still an active administrator; the first check that fails decides the code. A 401 and a 403 insufficient_scope do not consume rate-limit quota; every other response of an authenticated key does.

StatusErrorMeaningWhat to do
401unauthorizedThe request has no valid Authorization bearer header.Send Authorization: Bearer <key>.
401api_key_invalidThe key is not recognized.Check that the whole key was copied; create a new one if in doubt.
401api_key_revokedThe key was revoked.Create a new key.
401api_key_expiredThe key has expired.Create a new key.
401api_key_owner_inactiveThe administrator who created the key left the account or was deactivated.Reissue the key from an account that is still an administrator.
401api_key_owner_not_adminThe owner of the key is no longer an administrator.Reissue the key from an administrator account.

A 403 is a different problem: the key authenticated but may not do this. insufficient_scope is about the key, forbidden about its owner and addon_required (402) about the add-on of a module. Errors tells them apart. Every error body carries a requestId; quote it when you contact support.

  • Call the API from a server. Never put a key in browser code, a mobile app or a public repository: anyone who has it has programmatic access to the company's data. In production the API accepts cross-origin browser requests only from https://docs.filmo.io, and the OAuth and MCP endpoints send no CORS headers at all, so a page on any other origin cannot call it anyway.
  • Read the key from an environment variable or a secret manager, as the examples do with FILMO_API_KEY.
  • Do not write the Authorization header to logs.
  • Give each integration its own key with the narrowest scopes it needs.
  • Alert on 401 api_key_owner_inactive and api_key_owner_not_admin: they mean an integration is about to stop. See Going live.

Each key carries a set of scopes, chosen when an administrator creates it in the API and MCP section of the settings (*Ajustes → API y MCP*). Each operation requires exactly one scope, shown on its page and in the OpenAPI file as x-required-scope. There are 59 scopes in all.

  • orders:read lets a key read orders. orders:write lets it create, change and act on them. Do not assume that write includes read: a key that writes orders and reads them back needs both.
  • A scope covers a resource, not a single operation. One write scope covers every create, update, delete and action on that resource.
  • Some scopes have no write twin, such as account:read, users:read and schedule:read.
  • Two scopes are special. workflows:run runs a workflow. ai:ask asks the AI about your data and spends AI credits.

Scopes bound which operations a key may call. The data it sees is bounded separately by the account (see Accounts and tenancy), and some operations also need an add-on on the account. Over MCP the same scopes apply, and a key sees only the tools it can call.

When a call is refused: 403 insufficient_scope

Link to this section: When a call is refused: 403 insufficient_scope

A key without the scope an operation needs gets 403 insufficient_scope. The body names the missing scope in requiredScope. Fix it by issuing a key that has that scope.

{
  "type": "https://docs.filmo.io/errors/insufficient_scope",
  "title": "Insufficient scope",
  "status": 403,
  "code": "insufficient_scope",
  "detail": "The API key does not have the required scope (orders:write)",
  "requiredScope": "orders:write",
  "requestId": "req_5f1c2f4e3a5b4f6d8e7a0b1c2d3e4f5a"
}

Two other refusals look similar and have different fixes.

ResponseAboutFix
403 insufficient_scopeThe key. It lacks the scope.Issue a key with the scope in requiredScope.
403 forbiddenThe owner of the key. The key is right, but its owner lacks the module, organization or administrator permission the operation needs.An administrator of the account grants the permission.
402 addon_requiredThe plan. The account has not contracted, or has let expire, the add-on of that module.Contract the add-on named in requiredAddon. No role bypasses it.

The help center explains the permissions in the app: API scopes and permissions and Roles and permissions.

  • One key per integration, so you can revoke one without touching the others.
  • Start with the :read scopes. Add a write scope only for the resource you write.
  • Always include account:read. GET /api/v1/account is the first call of any integration: it returns the scopes of the key, the add-ons of the account and the version of the contract.
  • Leave ai:ask and workflows:run out unless the integration really uses them.
  • Check what a key can really do by calling GET /api/v1/account with it. A key made through OAuth can end up with different scopes than requested (fewer, or extra ones the administrator ticked).
See the scopes of a key
curl -sS "${FILMO_BASE_URL:-https://app.filmo.io}/api/v1/account" \
  -H "Authorization: Bearer $FILMO_API_KEY"

These are starting points. Remove what your integration does not use; add what a particular call asks for in requiredScope.

Availability and reservations on a booking site

Link to this section: Availability and reservations on a booking site

Every scope, with the operations that need it, is on the scopes page.

  • Guides

    Scopes

    A key carries scopes; each operation requires exactly one. Grant the fewest you need.

  • Guides

    OAuth

    Filmo implements OAuth 2.1 for public clients: authorization code with PKCE, no client secret. The token it issues is an API key of kind OAuth, so it works on the whole REST API and on MCP, with the scopes the administrator granted.

  • Guides

    Errors

    Errors are RFC 9457 problem documents. Branch on the stable code, never on the text, and use the retry table to decide whether to try again.

  • Guides

    Going live checklist

    Go through these eight checks before your integration runs against production data. Each one points to the guide that explains it.

Was this page helpful?