Core concepts

Records and ids

Every record has an opaque id that Filmo assigns. Keep your own ids in a mapping table on your side, and use a reference field only where the API has one.

Identifiers are opaque strings. Never assume their format, length or ordering, and never build one. Pagination cursors are opaque in the same way. Human numbers such as orderNumber or contactNumber are for people: use id to address a record.

Only some resources have a writable field for a reference from your system. The table is generated from the spec.

FieldYes or no
ContactDto.contactNumberNo
ContactDetailDto.contactNumberNo
ContactCreateBody.contactNumberYes
ContactUpdateBody.contactNumberYes
OrderDto.externalReferenceNo
OrderDetailDto.externalReferenceNo
ProjectDto.externalReferenceNo
ProjectDetailDto.externalReferenceNo
ProjectCreateBody.externalReferenceYes
StaffMemberDto.externalRefNo
StaffUpdateBody.externalRefYes
ProjectUpdateBody.externalReferenceYes
upsertExternalInvoice.originSystemYes
upsertExternalInvoice.originExternalIdYes
ResourceWhat exists today
ProjectsexternalReference on create and externalReference on update, up to 200 characters.
StaffexternalRef, set on update only; the create body has none. null clears it.
Invoices issued elsewhereThe pair originSystem and originExternalId in the path of PUT /api/v1/invoices/external/{originSystem}/{originExternalId} is the key of the mirror: repeating it updates the same mirror.
OrdersexternalReference is returned, but the create and update bodies have no such field: you can read it but not write it through the API yet.
ContactsNo external reference field. contactNumber is a free reference, up to 50 characters, that you can write on create and on update. It is not unique: Filmo does not stop two contacts from sharing a number, so check what a lookup returns.

POST /api/v1/contacts/lookup takes up to 200 references and compares each one, exactly and without any normalisation, with the contactNumber of the contacts, and with nothing else. It returns two lists: notFound, the references that match no contact, and contacts, the contacts that matched, each with id, name and contactNumber. It writes nothing, even though it is a POST.

The response does not pair a reference with a contact, and the order of contacts is not guaranteed. Pair them yourself by comparing each contact's contactNumber with your reference. Because contactNumber is not unique, several contacts may come back for one reference: decide what to do in that case instead of taking the first one. Use notFound to learn what to create, and keep the Filmo id in your own table once you have it.

Store your external id and the Filmo id side by side in your own database. An Idempotency-Key only deduplicates retries for 24 hours; it does not replace that table (Idempotency). With the table you can update the right record, detect duplicates and decide what to delete. For the pattern in a CRM, see the contact sync tutorial.

The values of custom fields are read in the customFields map of a record, keyed by the identifier of the field definition. The definitions come from GET /api/v1/custom-fields, with the entity each applies to (applyAt), the type and the values a dropdown accepts. Values travel inside each resource; the definitions endpoint does not return them. v1 has no operation that writes a custom field: the create and update bodies have no customFields property, so set them in the app.

  • Core concepts

    Data model

    Orders connect a contact, an optional project and the equipment rented; documents, payments, planning and the catalog hang from them.

  • Guides

    Syncing data

    Filmo v1 does not send webhooks, so you keep another system in step by polling: read what changed in half-open time windows, and run a separate sweep to find what was deleted. Do not follow the pagination cursor to decide what changed or what disappeared.

  • Guides

    Idempotency and safe retries

    Send an Idempotency-Key header with every write and reuse the same value when you retry that operation: Filmo returns the stored result of the first attempt instead of writing twice.

  • Tutorials

    Sync contacts from your CRM

    Mirror the people in your CRM as Filmo contacts and keep duplicates in check, since the API cannot rule them out: match by email or by the contact number you set, keep your own table of ids, and ignore the echo of your own writes.