Repair tickets

Create a repair ticket

Opens a repair ticket with its lines.

POST
/api/v1/repair-tickets

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"
    }
  ]
}'
{
  "data": {
    "id": "repair_ticket_9f3a2b",
    "number": "2026-0001",
    "date": "2026-09-01T08:00:00.000Z",
    "status": "draft",
    "orderId": "order_9f3a2b",
    "orderNumber": "2026-0001",
    "contactId": "contact_9f3a2b",
    "contactName": "Example contact name",
    "subTotal": "120.00",
    "taxTotal": "120.00",
    "total": "120.00",
    "totalLines": 1,
    "notes": "Example text.",
    "createdAt": "2026-09-01T08:00:00.000Z",
    "updatedAt": "2026-09-01T08:00:00.000Z",
    "projectId": "project_9f3a2b",
    "lines": [
      {
        "id": "line_9f3a2b",
        "entityType": "item",
        "entityId": "entity_9f3a2b",
        "entityName": "Example entity name",
        "description": "Example text.",
        "diagnosis": "Example diagnosis",
        "quantity": 1,
        "unitPrice": "120.00",
        "incidentId": "incident_9f3a2b",
        "notes": "Example text."
      }
    ],
    "sourceIncidentIds": [
      "source_incident_9f3a2b"
    ],
    "customFields": {
      "example": "example"
    }
  }
}

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

Idempotency-Keystring

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"

If-Matchstring

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

application/json

Body schema: RepairTicketCreateBody

datestring<date-time>

Repair ticket date, in ISO 8601 with offset. Defaults to today.

orderIdstring

Order from which the broken material returns.

contactIdstring

Client invoiced for the repair.

linesobject[]Required

Repair ticket lines. At least one.

Limits: min 1 items

Show child attributes
lines.idstring

Existing line being modified. Omit it for a new line.

lines.descriptionstringRequired

What needs to be repaired.

Limits: min length 1, max length 500

lines.diagnosisstring

Technical diagnosis.

Limits: max length 5000

lines.entityTypestring | null

Type of element being repaired: item, space or kit. null or omitted for a free line.

Available options: item, space, kit

lines.entityIdstring

Element being repaired.

lines.serializedItemIdstring

Specific physical unit, when a serialized item is repaired.

lines.incidentIdstring

Incident that originates this line.

lines.quantitynumber

Affected units. Defaults to 1.

Limits: min 0

lines.unitPricestring

Net unit price quoted to the client, as a decimal string.

Limits: pattern ^\d{1,13}(\.\d{1,2})?$

lines.notesstring

Line notes.

Limits: max length 2000

notesstring

Repair ticket notes.

Limits: max length 5000

incidentIdsstring[]

Incidents this repair ticket converts. The server ties each line to its incident.

Response

application/json

Successful response.

Response schema: RepairTicketDetailDto

Envelope: RepairTicketDetailResponse. meta.warnings is present only when the operation is deprecated.

Headers: X-Request-Id · RateLimit-Limit · RateLimit-Remaining · RateLimit-Reset · ETag · Idempotent-Replay

dataobject

Detail of a repair ticket, with its lines.

Show child attributes
data.idstring

Unique ticket identifier.

data.numberstring

Ticket number, for example "RT-2026-0001".

data.datestring<date-time>

Issue date in ISO 8601 UTC.

data.statusstring

Status of the ticket in its lifecycle.

Available options: draft, sent, partially_converted, fully_invoiced, closed

data.orderIdstring | null

Identifier of the order it comes from; null if it was created standalone.

data.orderNumberstring | null

Number of the order it comes from; null if it was created standalone.

data.contactIdstring | null

Identifier of the responsible client; null if none has been assigned.

data.contactNamestring | null

Name of the responsible client; null if not resolved.

data.subTotalstring

Sum of the lines before taxes, as a decimal string "1234.50".

Limits: pattern ^-?\d+\.\d{2}$

data.taxTotalstring

Tax total, as a decimal string "1234.50".

Limits: pattern ^-?\d+\.\d{2}$

data.totalstring

Total including taxes, as a decimal string "1234.50".

Limits: pattern ^-?\d+\.\d{2}$

data.totalLinesinteger

Number of lines in the ticket.

data.notesstring | null

General remarks; null if it has none.

data.createdAtstring<date-time>

Creation date in ISO 8601 UTC.

data.updatedAtstring<date-time>

Last modification date in ISO 8601 UTC.

data.projectIdstring | null

Identifier of the associated project; null if it has none.

data.linesobject[]

Ticket lines.

Show child attributes
data.lines.idstring

Unique line identifier.

data.lines.entityTypestring | null

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

data.lines.entityIdstring | null

Identifier of the element being repaired; null if it is a free line.

data.lines.entityNamestring | null

Name of the element being repaired; null if not resolved.

data.lines.descriptionstring

What needs to be repaired.

data.lines.diagnosisstring | null

Technical diagnosis; null if none has been recorded.

data.lines.quantitynumber | null

Affected units; null if not applicable.

data.lines.unitPricestring | null

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}$

data.lines.incidentIdstring | null

Identifier of the incident that originated this line; null if it does not come from one.

data.lines.notesstring | null

Line notes; null if it has none.

data.sourceIncidentIdsstring[]

Identifiers of the incidents that originated the ticket.

data.customFieldsobject<string, any>

Custom field values by custom field identifier; the definitions are in /api/v1/custom-fields.

metaobject

Additional information about the response.

Show child attributes
meta.warningsobject[]

Lifecycle warnings; present only when the operation is deprecated.

Show child attributes
meta.warnings.codestring

Stable warning code.

Available options: deprecated

meta.warnings.messagestring

For people: what is deprecated, until when, and what to use.

meta.warnings.sunsetstring

Day (YYYY-MM-DD) the operation stops being served.

meta.warnings.replacementstring | null

operationId of the operation to use instead, or null if there is none.

Errors

StatusCodesMeaning
400validation_errorMalformed query or body. errors[] lists every offending field with its stable code.
402addon_requiredThe account plan does not include the add-on this operation needs; requiredAddon names it.
404not_foundIt does not exist or is outside the scope of the API key.
409conflictThe 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].code says which: in_progress and lock_timeout are solved by retrying; invalid_state is not, because the state of the resource forbids the operation.
412precondition_failedThe If-Match entity tag does not match the current representation. Read the resource again and retry.
422idempotency_key_reusedThe 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

  • Operations

    Repair ticket

    Repair ticket: what broke and what is quoted to fix it.