Skip to content

Undo a merge of this person into another, with evidence (session only)

POST
/persons/{person_id}/unmerge
curl --request POST \
--url https://quikstik-core.fly.dev/persons/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/unmerge \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'x-tenant-id: 2489E9AD-2EE2-8E00-8EC9-32D5F69181C0' \
--data '{ "merge_event_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "evidence": "example" }'

A human decision: session bearer only (an operator key is 401). person_id is the person that was folded away; merge_event_id is the event_id the merge returned. The store restores exactly what that merge moved (identities, threads, messages, the person’s prior status) and records a reversible unmerge event. 404 merge_not_found when the event is not a merge of person_id (nothing changes); 409 not_unmergeable when it is not a merge or was already undone. Rooms follow on the next rebuild.

person_id
required
string format: uuid
x-tenant-id
required
string format: uuid

Tenant identifier (UUID).

Authn/authz semantics are intentionally TBD for this contract slice; this header exists to keep the contract explicitly multi-tenant from day 0.

Media typeapplication/json
object
merge_event_id
required

The event_id the merge returned.

string format: uuid
evidence
required

One line — what was wrong with the merge.

string
<= 240 characters

Example generated

{
"merge_event_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"evidence": "example"
}

Undone.

Media typeapplication/json
object
event_id
required
string format: uuid
from_person_id
required
string format: uuid
to_person_id
required
string format: uuid
moved
required
object
identities
required
integer
threads
required
integer
messages
required
integer

Example generated

{
"event_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"from_person_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"to_person_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"moved": {
"identities": 1,
"threads": 1,
"messages": 1
}
}

Missing or invalid session bearer token

Media typeapplication/json
object
reason
required

Stable, machine-readable reason code (e.g. “sold_out”, “processor_not_configured”, “rail_refused”).

string

Example

{
"reason": "sold_out"
}

The session’s effect authority does not cover this operation

Media typeapplication/json
object
reason
required

Stable, machine-readable reason code (e.g. “sold_out”, “processor_not_configured”, “rail_refused”).

string

Example

{
"reason": "sold_out"
}

Expired, consumed, unknown, or unresolvable — indistinguishable by design

Media typeapplication/json
object
reason
required
string

Example generated

{
"reason": "example"
}

Not a merge, or already undone (not_unmergeable).

Missing/over-long evidence.

No durable backend is wired for this operation (fail-closed)

Media typeapplication/json
object
reason
required

Stable, machine-readable reason code (e.g. “sold_out”, “processor_not_configured”, “rail_refused”).

string

Example

{
"reason": "sold_out"
}