Introduction
REST API overview
The Filmo REST API v1 is a JSON API over HTTPS at https://. You authenticate with an API key, and every response uses the same envelope.
Base URL and a first call
Link to this section: Base URL and a first callEvery path in this reference starts with /api, on the origin https://: for example, GET /api. Requests and successful responses are JSON (application); errors are application.
A good first call is GET /api. It needs the account:read scope and returns the account, the timezone in which bare days are read, and the scopes of the key you used. To create a key, an administrator opens the API and MCP section of the account settings in Filmo (*Ajustes → API y MCP*); see Authentication.
curl -sS --fail-with-body "${FILMO_BASE_URL:-https://app.filmo.io}/api/v1/account" \
-H "Authorization: Bearer $FILMO_API_KEY"const base = process.env.FILMO_BASE_URL ?? "https://app.filmo.io";
const res = await fetch(base + "/api/v1/account", {
headers: { Authorization: `Bearer ${process.env.FILMO_API_KEY}` },
});
if (!res.ok) throw new Error(res.status + " " + (await res.text()));
const { data } = await res.json();
console.log(data.name, data.timezone, data.currency);import os
import requests
base = os.environ.get("FILMO_BASE_URL", "https://app.filmo.io")
res = requests.get(
base + "/api/v1/account",
headers={"Authorization": f"Bearer {os.environ['FILMO_API_KEY']}"},
timeout=30,
)
res.raise_for_status()
data = res.json()["data"]
print(data["name"], data["timezone"], data["currency"])For a guided walk from a new key to your first write, follow the quickstart. The OpenAPI file and the clients you can generate from it are covered in OpenAPI file and generated clients; the reference of every operation is in the OpenAPI reference.
Response envelope
Link to this section: Response envelopeEvery response from the API has one of three shapes.
| Kind | Shape | Used for |
|---|---|---|
| List | { "data": [ … ], "pagination": { "nextCursor", "hasMore", "total"? } } | Collections such as orders or contacts. |
| Single resource | { "data": { … } } | Detail reads, creates and updates. |
| Error | An RFC 9457 problem in application: type, title, status, code, detail, requestId | Any 4xx or 5xx the API produces. |
API responses carry an X-Request-Id header, and error bodies repeat it as requestId. Quote it when you contact support. The OAuth endpoints are the exception: they do not return it. The headers, the extra meta object some operations return and the statuses in use are in Responses; every error code is in Errors.
Conventions at a glance
Link to this section: Conventions at a glance| Topic | Rule |
|---|---|
| Base URL | https:// |
| Authentication | Authorization: Bearer <API key>. Only administrators create keys. |
| Money | Decimal strings with two decimals ("1234.), never floating-point numbers. |
| Dates | ISO 8601. Writes take an instant with an offset; responses use UTC. |
| Pagination | Opaque cursor. Page size limit: 50 by default, 500 at most. |
| Rate limits | 120 requests per minute per key, and 30 per minute shared by the three availability checks. |
| Retries | Send Idempotency-Key on writes. A key is remembered for 24 hours. |
| Concurrency | Detail reads return an ETag; send it back as If-Match to avoid overwriting a newer change. |
| Versioning | Additive changes within v1; breaking changes follow the documented notice periods. |
Bearer keys, who owns a key and how to revoke it.
When to use OAuth instead of a key.
What each permission unlocks.
Envelope variants, headers and statuses.
Money, dates, nulls and maps.
Walk a list with the cursor.
sort, date windows, list filters and search.Every code and when to retry.
Quotas, headers and backoff.
Retry a write without duplicating it.
Optimistic locking with
ETagandIf-Match.What changes within v1 and what never does.
Try calls without hurting production data.
Keep another system in step by polling.
The checklist before production.
Before you start
Link to this section: Before you start- Ask an administrator of the rental company to create the key, and decide who owns it: Authentication.
- Give the key only the permissions the integration uses: Scopes.
- Read what v1 covers, and what it does not, in Capabilities and limits.
- Check which add-ons your account has: the API and MCP are included in any paid plan and are not an add-on, but a resource that belongs to a module with an add-on you have not contracted answers 402
addon_required. See Plans and add-ons. - A key works on the live data of the account it belongs to. Read Testing before your first write.
- Before you go to production, work through Going live.
Versioning and compatibility
Link to this section: Versioning and compatibilityCheck the contract version returned by GET /api or published in the OpenAPI file. The compatibility rules and notice periods are documented in Versioning.
Keeping your data in sync
Link to this section: Keeping your data in syncv1 does not send webhooks. To keep another system in step with Filmo, poll incrementally: ask each list that has updated* filters for the records that changed since your last pass. Syncing data describes an algorithm that does not skip records and how to detect deletions.
Use it from an AI assistant
Link to this section: Use it from an AI assistantEvery operation is also an MCP tool at https://, with the same key and scopes. See the MCP overview.
Related pages
Link to this section: Related pagesGet started
Quickstart
Create an API key in the API and MCP section of the Filmo settings, then call
GET /api. The response tells you the timezone, currency, add-ons and scopes to build with./v1 /account 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.
Guides
Responses
Successful responses wrap their payload in
data; lists addpagination; a few operations addmeta; errors are RFC 9457 problems. API responses share one set of headers.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.
Was this page helpful?