Changelog
What’s new
Updates to the REST API and the MCP server, newest first.
REST API 1.0.0
Version 1.0.0 of the Filmo REST API.
Added
retryAfteron the429 rate_limitedproblem (REST and MCP): seconds to wait before retrying, the same value as theRetry-Afterheader;detailsays it too.GET /plannerrows carry/services rowKind(summaryordetail): a service comes as onesummaryrow (no assignee) plus onedetailrow per person or vehicle assigned, with the sameorderServiceId. Group byorderServiceId; a nullstaffMemberIdon the summary row does not mean uncovered.- Every successful response (2xx) of every operation carries an
example: deterministic, fictitious data (RFC 2606 domains) that validates against the response schema. - One example response per error code (the 20
codes), ascomponents.and referenced from the error responses of every operation, with the realexamples. Problem_<code> titleand shape of the problem.
Changed
- Error
typeURIs are nowhttps://(they weredocs. filmo. io /errors /<code> https://). Branch ondevelopers. filmo. io /errors /<code> code, not on the URI. - Every 409
conflictnow carries its cause inerrors[0].:code in_progress,lock_timeoutorinvalid_state. Whereerrors[].used to becode conflict(unique violations, and the lines of an atomic batch that fail because their state forbids the operation) it is nowinvalid_state; a batch line that does not exist or has an invalid quantity still reportsnot_foundorvalidation_error. - Success bodies are named schemas with an optional
meta.; write responses declare thewarnings Idempotent-Replayheader. - The documentation moved to https://docs.filmo.io; in production
/apiredirects there./v1 /docs - Date filters (
createdOn,issueDateBefore,returnTo…) are published as a singletype: stringwith apattern(a bare dayYYYY-MM-DDor an ISO 8601 instant with offset) instead ofanyOfofdateanddate-time, which some client generators could not compile. The server accepts exactly the same values. - The 401 and 403 responses no longer declare the
RateLimit-*headers: they were never sent (those errors are answered before the request counts against the limit). - Every operation that can answer 402 for a missing add-on names it in its
x-required-addonextension (e.g.["incidence"]).ProblemDetails.andrequiredAddon AccountDto.are now closed enums of add-on ids;addons GET /accountonly lists ids from that catalog. - The
pathof theerrors[]entries of a 409contact_in_use(the type of record that uses the contact:orders,projects,quotes,invoices,proformas,creditNotes,simpleCreditNotes,salesReceipts,supplierInvoices,contracts,subrents,purchaseOrders,sepaMandates,receipts,consignments),address_in_use(alwaysorders) andinsufficient_stock(itemsorspaces) is a closed set, published per code in thex-path-valuesextension ofProblemDetails..errors[]. path Idempotency-Keyis declared withminLength: 1. An empty key was already a 400validation_errorover REST; the MCP tools now reject an emptyidempotencyKeythe same way (errors[0].=path idempotencyKey) instead of ignoring it and running the write unprotected.
Fixed
- Every MCP tool result now validates with the official SDKs (
Client.in TypeScript and Python): successes withcallTool meta.and every error used to fail withidempotencyKey -32602 Structured content does not match the tool's output schema. - Detail reads sent with
If-None-Matchnow answer304 Not Modified(no body, withETag) when the tag is current, as the spec already declared. Until now they returned a full 200. - Without
Accept-Language, the 401s of a key that exists (revoked, expired, owner inactive or not an administrator) and the 403insufficient_scopecame back in Spanish whatever the owner of the key preferred. They now use the preferred language of the owner, like every later error; a request with no credential or an unknown key is still Spanish. upsertExternalInvoicedocumented customer and totals problems as 422; they are 400validation_error, anderrors[0].now names the field (path contactId,contactTaxId,contactName,subTotal,taxTotal,total,lines[n].).taxRate
Was this page helpful?