Merge this ticket into another
Merge `ticket_id` (source) into `body.target_ticket_id` (winner).
/v1/tickets/{ticket_id}/mergeEditor- Operation id
- merge_ticket
- Access
- A viewer is refused.
/v1/tickets/{ticket_id}/mergeMerge ticket_id (source) into body.target_ticket_id (winner).
Use this for a duplicate. The ticket in the path is the one that goes away.
Source goes to status merged with merged_into_id pointing at the
winner. Every event from the source is copied to the winner with a
via_merge marker so the winner's timeline reflects the full picture.
Merging is not reversible and the source is terminal afterwards. It cannot be patched and cannot be reopened. Work continues on the winner.
Merging a ticket into itself is refused with 400 merge_self. Both tickets
must be in the calling workspace.
The response is the source ticket, in its merged state. Fetch the target separately to see the combined timeline.
Tenancy: the request is scoped to one workspace, and the credential presented is what selects it. A caller with no membership in that workspace is refused with 404, which is indistinguishable from a workspace that does not exist.
Authorisation: editor, admin or owner. A viewer receives 403 insufficient_role.
Access: Authorization: Bearer carrying either a realm access token or an API key. A key must hold the tickets:write scope, and the workspace role of the person who owns it must meet the floor above.
A realm-issued access token, presented as Authorization: Bearer <token>. It acts as the person who signed in, and every operation resolves their workspace role live from the membership record.
In: header
Path Parameters
uuidRequest Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/tickets/497f6eca-6276-4993-bfeb-53cbbbba6f08/merge" \ -H "Content-Type: application/json" \ -d '{ "target_ticket_id": "1c2d3e4f-5a6b-4c7d-8e9f-0a1b2c3d4e5f" }'{ "id": "5e8b0c31-7a4d-4f92-b6c8-1d3e2a5f7b90", "subject": "Card declined at checkout", "description": "Customer's Visa is declined on every attempt since Tuesday.", "status": "merged", "priority": "high", "source": "email", "assignee_id": "3fe98b76-2409-5003-b75a-93e56b450433", "assignee_name": "Dana Osei", "customer_id": "9f1d6c4e-6b6e-4b31-9a5b-2f1c9a4d5e60", "customer_name": "Sam Okafor", "customer_email": "sam.okafor@northwind.example", "team_id": "d907a188-148a-5522-82a6-55798ccdecb6", "team_name": "Billing", "tags": [ "billing", "vip" ], "metadata": { "order_id": "A-1042" }, "first_response_due": "2026-08-14T12:20:00+00:00", "resolution_due": "2026-08-15T10:20:00+00:00", "sla_breached": false, "sla_policy_id": "b6a0f2d7-4c19-4e63-8f52-7a1b9c0d3e46", "merged_into_id": "1c2d3e4f-5a6b-4c7d-8e9f-0a1b2c3d4e5f", "created_at": "2026-08-14T10:20:00+00:00", "updated_at": "2026-08-14T12:00:00+00:00", "legal_next_states": [], "assignee_email": "dana.osei@northwind.example", "time_total_minutes": 25, "time_billable_minutes": 25, "todo_counts": { "open": 1, "done": 2, "overdue": 0 }, "events": [ { "id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d", "kind": "inbound_email", "body": "My card is declined every time I try to pay.", "meta": { "channel": "email", "external_id": "0100019180a4c1f2" }, "actor_type": "customer", "created_at": "2026-08-14T10:20:00+00:00" }, { "id": "f0e9d8c7-b6a5-4948-9382-71605f4e3d2c", "kind": "internal_note", "body": "Payment provider is returning a soft decline on this BIN.", "meta": {}, "actor_user_id": "3fe98b76-2409-5003-b75a-93e56b450433", "actor_type": "user", "actor_name": "Dana Osei", "created_at": "2026-08-14T10:41:12+00:00" } ]}