Repair tickets
Create a repair ticket
Opens a repair ticket with its lines.
repair-tickets:write- 120/min
- Strict tenancy
- Add-on (402)
- Idempotency-Key
- If-Match
- MCP: filmo_repair_tickets_create
Request examples
curl https://app.filmo.io/api/v1/repair-tickets \
--request POST \
--header "Authorization: Bearer $FILMO_API_KEY" \
--header "Idempotency-Key: $(uuidgen 2>/dev/null || cat /proc/sys/kernel/random/uuid)" \
--header 'Content-Type: application/json' \
--data '{
"date": "2026-09-03T09:00:00+02:00",
"orderId": "ord_00421",
"contactId": "cont_00118",
"lines": [
{
"description": "Sustituir el anillo de zoom",
"diagnosis": "El anillo patina en el tramo largo tras la caída del rodaje",
"entityType": "item",
"entityId": "itm_00042",
"serializedItemId": "ser_00042_03",
"incidentId": "inc_00711",
"quantity": 1,
"unitPrice": "180.00"
}
]
}'Generated from the schema
unitPrice is what is quoted to the CUSTOMER; the repair cost for the company neither goes in nor comes out through this API. incidentIds converts existing incidents and the server ties each line to its own. Behind the incidence add-on: without it, 402. Returns the full repair ticket, the same projection as its GET.
Authorizations
Bearer API key with the scope below. repair-tickets:write
Headers
Unique identifier of the request, chosen by the client (a UUID works). Between 1 and 255 characters: an empty header is rejected with 400 validation_error, because the client would believe itself protected. Repeating the same key with the SAME body within 24 h returns the stored response without executing again, with the Idempotent-Replay: true header. With a DIFFERENT body it returns 422. It is the safe way to retry after a network timeout.
Limits: min length 1, max length 255
Example:"9f1c2f4e-3a5b-4f6d-8e7a-0b1c2d3e4f5a"
Optimistic locking: the ETag you read from the resource (or *). If the resource changed since, the write is rejected with 412 precondition_failed before doing anything; read it again and retry. Without the header the write always proceeds.
Example:"\"3sT3d9pBvZq4h2N0w8x1YkLmQ7c\""
Body
Body schema: RepairTicketCreateBody
Repair ticket date, in ISO 8601 with offset. Defaults to today.
Order from which the broken material returns.
Client invoiced for the repair.
Repair ticket lines. At least one.
Limits: min 1 items
Show child attributesHide child attributes
Existing line being modified. Omit it for a new line.
What needs to be repaired.
Limits: min length 1, max length 500
Technical diagnosis.
Limits: max length 5000
Type of element being repaired: item, space or kit. null or omitted for a free line.
Available options: item, space, kit
Element being repaired.
Specific physical unit, when a serialized item is repaired.
Incident that originates this line.
Affected units. Defaults to 1.
Limits: min 0
Net unit price quoted to the client, as a decimal string.
Limits: pattern ^\d{1,13}(\.\d{1,2})?$
Line notes.
Limits: max length 2000
Repair ticket notes.
Limits: max length 5000
Incidents this repair ticket converts. The server ties each line to its incident.
Response
Successful response.
Response schema: RepairTicketDetailDto
Envelope: RepairTicketDetailResponse. meta. is present only when the operation is deprecated.
Headers: X-Request-Id · RateLimit-Limit · RateLimit-Remaining · RateLimit-Reset · ETag · Idempotent-Replay
Detail of a repair ticket, with its lines.
Show child attributesHide child attributes
Unique ticket identifier.
Ticket number, for example "RT-2026-0001".
Issue date in ISO 8601 UTC.
Status of the ticket in its lifecycle.
Available options: draft, sent, partially_converted, fully_invoiced, closed
Identifier of the order it comes from; null if it was created standalone.
Number of the order it comes from; null if it was created standalone.
Identifier of the responsible client; null if none has been assigned.
Name of the responsible client; null if not resolved.
Sum of the lines before taxes, as a decimal string "1234.50".
Limits: pattern ^-?\d+\.\d{2}$
Tax total, as a decimal string "1234.50".
Limits: pattern ^-?\d+\.\d{2}$
Total including taxes, as a decimal string "1234.50".
Limits: pattern ^-?\d+\.\d{2}$
Number of lines in the ticket.
General remarks; null if it has none.
Creation date in ISO 8601 UTC.
Last modification date in ISO 8601 UTC.
Identifier of the associated project; null if it has none.
Ticket lines.
Show child attributesHide child attributes
Unique line identifier.
Type of element being repaired: item, serializedItem (a specific unit), space or kit; null for a free line (a service, a charge).
Available options: item, serializedItem, space, kit
Identifier of the element being repaired; null if it is a free line.
Name of the element being repaired; null if not resolved.
What needs to be repaired.
Technical diagnosis; null if none has been recorded.
Affected units; null if not applicable.
NET unit price quoted to the client, as a decimal string "1234.50". It is not the repair cost: that one is not published. null if the line has no price.
Limits: pattern ^-?\d+\.\d{2}$
Identifier of the incident that originated this line; null if it does not come from one.
Line notes; null if it has none.
Identifiers of the incidents that originated the ticket.
Custom field values by custom field identifier; the definitions are in /api.
Additional information about the response.
Show child attributesHide child attributes
Lifecycle warnings; present only when the operation is deprecated.
Show child attributesHide child attributes
Stable warning code.
Available options: deprecated
For people: what is deprecated, until when, and what to use.
Day (YYYY-MM-DD) the operation stops being served.
operationId of the operation to use instead, or null if there is none.
Where the deprecation is documented (the changelog).
Invalid request (validation_error): malformed query or body. errors[] lists every offending field with its stable code.
Headers: X-Request-Id · Content-Language · RateLimit-Limit · RateLimit-Remaining · RateLimit-Reset · Idempotent-Replay
Authentication failed (unauthorized, api_key_invalid, api_key_revoked, api_key_expired, api_key_owner_inactive, api_key_owner_not_admin).
Headers: X-Request-Id · Content-Language · Idempotent-Replay
Add-on required (addon_required): the account plan does not include the add-on this operation needs; requiredAddon names it.
Headers: X-Request-Id · Content-Language · RateLimit-Limit · RateLimit-Remaining · RateLimit-Reset · Idempotent-Replay
Not allowed (insufficient_scope: the API key does not have the required scope, named in requiredScope; forbidden: the owner of the key lacks the permission the operation requires). insufficient_scope is answered before the request counts against the rate limit, so it carries no RateLimit-* headers; forbidden does.
Headers: X-Request-Id · Content-Language · Idempotent-Replay
Resource not found (not_found): it does not exist or is outside the scope of the API key.
Headers: X-Request-Id · Content-Language · RateLimit-Limit · RateLimit-Remaining · RateLimit-Reset · Idempotent-Replay
Conflict (conflict): the current state of the resource prevents the operation, a request with that Idempotency-Key is already in progress, or another conditional write (If-Match) held the resource for more than five seconds. errors[0]. says which: in_progress and lock_timeout are solved by retrying; invalid_state is not, because the state of the resource forbids the operation.
Headers: X-Request-Id · Content-Language · RateLimit-Limit · RateLimit-Remaining · RateLimit-Reset · Idempotent-Replay
Precondition failed (precondition_failed): the If-Match entity tag does not match the current representation. Read the resource again and retry.
Headers: X-Request-Id · Content-Language · RateLimit-Limit · RateLimit-Remaining · RateLimit-Reset · Idempotent-Replay
Idempotency-Key reused (idempotency_key_reused): the same key was used before with a different body. Change the key.
Headers: X-Request-Id · Content-Language · RateLimit-Limit · RateLimit-Remaining · RateLimit-Reset · Idempotent-Replay
Rate limit exceeded (rate_limited): retry after Retry-After seconds; RateLimit-* says which quota ran out.
Headers: X-Request-Id · Content-Language · RateLimit-Limit · RateLimit-Remaining · RateLimit-Reset · Retry-After · Idempotent-Replay
Internal error (internal_error).
Headers: X-Request-Id · Content-Language · RateLimit-Limit · RateLimit-Remaining · RateLimit-Reset · Idempotent-Replay
Errors
| Status | Codes | Meaning |
|---|---|---|
| 400 | validation_error | Malformed query or body. errors[] lists every offending field with its stable code. |
| 402 | addon_required | The account plan does not include the add-on this operation needs; requiredAddon names it. |
| 404 | not_found | It does not exist or is outside the scope of the API key. |
| 409 | conflict | The current state of the resource prevents the operation, a request with that Idempotency-Key is already in progress, or another conditional write (If-Match) held the resource for more than five seconds. errors[0]. says which: in_progress and lock_timeout are solved by retrying; invalid_state is not, because the state of the resource forbids the operation. |
| 412 | precondition_failed | The If-Match entity tag does not match the current representation. Read the resource again and retry. |
| 422 | idempotency_key_reused | The same key was used before with a different body. Change the key. |
401, 403, 429, 500 can be returned by any operation. Errors
Deprecation
This operation is not deprecated. Deprecations are announced with a Deprecation header and a sunset date. Versioning policy
Related pages
Link to this section: Related pagesOperations
Repair ticket
Repair ticket: what broke and what is quoted to fix it.
Was this page helpful?