AuralisDocs
OperationsTickets

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.
POST/v1/tickets/{ticket_id}/merge

Merge 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.

Authorization

AuthorizationBearer <token>

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

ticket_id*Ticket Id
Formatuuid

Request 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"    }  ]}