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.
Ids are opaque
Link to this section: Ids are opaqueIdentifiers 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.
Where your id can live
Link to this section: Where your id can liveOnly some resources have a writable field for a reference from your system. The table is generated from the spec.
| Field | Yes or no |
|---|---|
ContactDto. | No |
ContactDetailDto. | No |
ContactCreateBody. | Yes |
ContactUpdateBody. | Yes |
OrderDto. | No |
OrderDetailDto. | No |
ProjectDto. | No |
ProjectDetailDto. | No |
ProjectCreateBody. | Yes |
StaffMemberDto. | No |
StaffUpdateBody. | Yes |
ProjectUpdateBody. | Yes |
upsertExternalInvoice. | Yes |
upsertExternalInvoice. | Yes |
| Resource | What exists today |
|---|---|
| Projects | externalReference on create and externalReference on update, up to 200 characters. |
| Staff | externalRef, set on update only; the create body has none. null clears it. |
| Invoices issued elsewhere | The pair originSystem and originExternalId in the path of PUT /api is the key of the mirror: repeating it updates the same mirror. |
| Orders | externalReference is returned, but the create and update bodies have no such field: you can read it but not write it through the API yet. |
| Contacts | No 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. |
Looking up contacts
Link to this section: Looking up contactsPOST /api 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.
Keep your own mapping table
Link to this section: Keep your own mapping tableStore 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.
Custom fields
Link to this section: Custom fieldsThe 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, 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.
Tags and notes
Link to this section: Tags and notes- Tags:
GET /apireturns the vocabulary with how many entities use each./v1 /tags POST /apiattaches an existing tag to an entity./v1 /tags /{tagId} /assignments DELETE /apiremoves the link and does not delete the tag./v1 /tags /{tagId} /assignments - Notes:
POST /apiwrites a note on an entity, and/v1 /notes GET /apireads the notes of one entity, never all of them. Who wrote a note is not returned. Mentioning users notifies them in Filmo./v1 /notes
Related pages
Link to this section: Related pagesCore 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-Keyheader 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.
Was this page helpful?