*MCP › Reference › Operations › Repair tickets*

# Update a repair ticket

> Changes the header of the repair ticket and, if you send `lines`, REPLACES the whole set of lines: send all of them or none.

> **Requires human confirmation:** Put this tool on your client's “ask before running” list. The annotations are hints that the server declares, not guarantees: do not decide the approval from `destructiveHint` alone.

A `closed` ticket is read-only and is rejected; in a `partially_converted` or `fully_invoiced` one, the lines already converted to a purchase or an invoice are locked and changes to them are ignored. Behind the `incidence` add-on. Returns the full repair ticket, the same projection as its GET.

TOOL `filmo_repair_tickets_update` · `repair-tickets:write` · 120/min · May need an add-on · Server annotation: Destructive · Server annotation: Idempotent · Requires human confirmation

## Arguments

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `ticketId` | string | Yes | Repair ticket identifier. |
| `date` | string<date-time> | No | New date, in ISO 8601 with offset. |
| `status` | string | No | New repair ticket status. `draft`, `sent`, `partially_converted`, `fully_invoiced`, `closed` |
| `contactId` | string | No | New client; null unlinks it. |
| `orderId` | string | No | New order; null unlinks it. |
| `projectId` | string | No | New project; null unlinks it. |
| `lines` | object[] | No | COMPLETE set of lines, which replaces the current one. Omit it to leave them untouched. |
| `lines.id` | string | No | Existing line being modified. Omit it for a new line. |
| `lines.description` | string | Yes | What needs to be repaired. |
| `lines.diagnosis` | string | No | Technical diagnosis. |
| `lines.entityType` | string | No | Type of element being repaired: item, space or kit. null or omitted for a free line. `item`, `space`, `kit` |
| `lines.entityId` | string | No | Element being repaired. |
| `lines.serializedItemId` | string | No | Specific physical unit, when a serialized item is repaired. |
| `lines.incidentId` | string | No | Incident that originates this line. |
| `lines.quantity` | number | No | Affected units. Defaults to 1. |
| `lines.unitPrice` | string | No | Net unit price quoted to the client, as a decimal string. |
| `lines.notes` | string | No | Line notes. |
| `notes` | string | No | New notes; null clears them. |
| `idempotencyKey` | string | No | Idempotency key chosen by the client (a UUID is recommended). Repeating the same key with the same arguments within 24 h returns the stored response without executing again; with different arguments it responds 422. It is the safe way to retry after a network failure. |
| `ifMatch` | string | No | Optimistic locking: the meta.etag you got from the detail read of this resource (or "*"). If the resource changed since, the call fails with 412 precondition_failed before writing anything; read it again and retry. Omit it to write unconditionally. |

## Result

On success the result carries `structuredContent` with `data` and `meta`. These are the attributes of `data`.

| Name | Type | Description |
| --- | --- | --- |
| `id` | string | Unique ticket identifier. |
| `number` | string | Ticket number, for example "RT-2026-0001". |
| `date` | string<date-time> | Issue date in ISO 8601 UTC. |
| `status` | string | Status of the ticket in its lifecycle. `draft`, `sent`, `partially_converted`, `fully_invoiced`, `closed` |
| `orderId` | string | Identifier of the order it comes from; null if it was created standalone. |
| `orderNumber` | string | Number of the order it comes from; null if it was created standalone. |
| `contactId` | string | Identifier of the responsible client; null if none has been assigned. |
| `contactName` | string | Name of the responsible client; null if not resolved. |
| `subTotal` | string | Sum of the lines before taxes, as a decimal string "1234.50". |
| `taxTotal` | string | Tax total, as a decimal string "1234.50". |
| `total` | string | Total including taxes, as a decimal string "1234.50". |
| `totalLines` | integer | Number of lines in the ticket. |
| `notes` | string | General remarks; null if it has none. |
| `createdAt` | string<date-time> | Creation date in ISO 8601 UTC. |
| `updatedAt` | string<date-time> | Last modification date in ISO 8601 UTC. |
| `projectId` | string | Identifier of the associated project; null if it has none. |
| `lines` | object[] | Ticket lines. |
| `lines.id` | string | Unique line identifier. |
| `lines.entityType` | string | Type of element being repaired: item, serializedItem (a specific unit), space or kit; null for a free line (a service, a charge). `item`, `serializedItem`, `space`, `kit` |
| `lines.entityId` | string | Identifier of the element being repaired; null if it is a free line. |
| `lines.entityName` | string | Name of the element being repaired; null if not resolved. |
| `lines.description` | string | What needs to be repaired. |
| `lines.diagnosis` | string | Technical diagnosis; null if none has been recorded. |
| `lines.quantity` | number | Affected units; null if not applicable. |
| `lines.unitPrice` | string | 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. |
| `lines.incidentId` | string | Identifier of the incident that originated this line; null if it does not come from one. |
| `lines.notes` | string | Line notes; null if it has none. |
| `sourceIncidentIds` | string[] | Identifiers of the incidents that originated the ticket. |
| `customFields` | object<string, any> | Custom field values by custom field identifier; the definitions are in `/api/v1/custom-fields`. |

*Call · filmo_repair_tickets_update*

```json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "filmo_repair_tickets_update",
    "arguments": {
      "ticketId": "tick_8f2a1c"
    }
  }
}
```

*Result (generated from the schema)*

```json
{
  "structuredContent": {
    "data": {
      "id": "id_8f2a1c",
      "number": "<number>",
      "date": "2026-09-01T08:00:00Z",
      "status": "draft",
      "orderId": "orde_8f2a1c",
      "orderNumber": "<orderNumber>",
      "contactId": "cont_8f2a1c",
      "contactName": "Example",
      "subTotal": "1234.50",
      "taxTotal": "1234.50",
      "total": "1234.50",
      "totalLines": 1,
      "notes": "<notes>",
      "createdAt": "2026-09-01T08:00:00Z",
      "updatedAt": "2026-09-01T08:00:00Z",
      "projectId": "proj_8f2a1c",
      "lines": [
        {
          "id": "id_8f2a1c",
          "entityType": "item",
          "entityId": "enti_8f2a1c",
          "entityName": "Example",
          "description": "<description>",
          "diagnosis": "<diagnosis>",
          "quantity": 1,
          "unitPrice": "1234.50",
          "incidentId": "inci_8f2a1c",
          "notes": "<notes>"
        }
      ],
      "sourceIncidentIds": [
        "sour_8f2a1c"
      ],
      "customFields": {
        "key": "<key>"
      }
    },
    "meta": {
      "idempotencyKey": "<the key you sent, or the one the server generated>",
      "rateLimit": {
        "limit": 120,
        "remaining": 119,
        "reset": 42
      }
    }
  }
}
```

## The same operation by REST

This tool runs [`PATCH /api/v1/repair-tickets/{ticketId}`](https://docs.filmo.io/rest-api/endpoint-reference/repair-tickets/update-a-repair-ticket).

---

Canonical URL: https://docs.filmo.io/mcp/tools/repair-tickets/filmo-repair-tickets-update  
Last updated: 2026-10-25