Skip to content

Fix a participant's height or display name

POST
/account/participants/{participant_id}/details
curl --request POST \
--url https://quikstik-core.fly.dev/account/participants/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/details \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "height_cm": 1, "display_name": "example", "phone": "example" }'

Customer portal, guest-scoped (HANDOFF-account-self-serve-2026-10-18 WP4). local-person session; the participant must be the caller’s own or belong to a Person they head (payer/coordinator edge) — anything else is 404, as for GET /account/readiness/{participant_id}. height_cm is recorded as the tenant’s height_cm trait value exactly as POST /participant-trait-values records it (validated against the definition’s bounds; a prior value is superseded, history stays append-only; an identical value writes nothing). display_name goes through the profile-correction path (POST /persons/{person_id}/profile-corrections) for the participant’s Person. Email is not editable here (it is the login identity; changing it is an operator action) — an email field is refused as an unknown field. Phone is refused (422 phone_not_supported): profile-corrections carries no phone and the participants context stores none. A refused request applies nothing. The waiver stays the existing /w/{token} link.

participant_id
required
string format: uuid
Media typeapplication/json
object
height_cm
integer format: int64
display_name
string
<= 120 characters
phone

Accepted only to be refused with 422 phone_not_supported

string

Example generated

{
"height_cm": 1,
"display_name": "example",
"phone": "example"
}

Applied (applied lists only the fields that changed)

Media typeapplication/json
object
participant_id
required
string format: uuid
applied
required
Array<string>
Allowed values: height_cm display_name

Example

{
"applied": [
"height_cm"
]
}

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

no_changes, phone_not_supported, display_name_invalid, height_out_of_range, participant_has_no_person, or an unknown request field (including email)

Media typeapplication/json
object
reason
required

Stable machine reason

string
detail

Finer machine code under reason

string
current
object
booking_id
required
string format: uuid
refund_minor
required

Minor units the card gets back

integer format: int64
refund_bps
required
integer
<= 10000
tier_hours

Hours-before-departure the applying tier requires; absent when no tier applies

integer
deadline_at

Last instant this refund still applies; absent when no tier applies

string format: date-time
currency
required
string

Example generated

{
"reason": "example",
"detail": "example",
"current": {
"booking_id": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0",
"refund_minor": 1,
"refund_bps": 1,
"tier_hours": 1,
"deadline_at": "2026-04-15T12:00:00Z",
"currency": "example"
}
}

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