Mark a participant as attended
Staff-only attendance marking: flips the participation to `attended`. Re-marking an already-attended participation is idempotent, and a `no_show` → `attended` correction is allowed; a cancelled participation (refunded purchase, or the attendee dropped out) is 409 — a cancelled spot cannot be marked attended. Once attended, the attendee's own de-registration is locked (409).
/participations/{participation_id}/mark-attendedStaff-only attendance marking: flips the participation to
attended. Re-marking an already-attended participation is
idempotent, and a no_show → attended correction is allowed;
a cancelled participation (refunded purchase, or the attendee
dropped out) is 409 — a cancelled spot cannot be marked attended.
Once attended, the attendee's own de-registration is locked (409).
Authorization
bearerAuth JWT issued by IdentityX, signed with Ed25519
In: header
Path Parameters
Participation ID.
Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X POST "https://example.com/participations/497f6eca-6276-4993-bfeb-53cbbbba6f08/mark-attended"{
"id": "497f6eca-6276-4993-bfeb-53cbbbba6f08",
"edition_id": "aeda7fca-56fe-426a-8c37-1876faaaf005",
"occurrence_id": "8508ee33-23a1-4a06-ae02-1eb167405e7b",
"registration_id": "7b2966db-5b97-451d-80d4-713d3a44078b",
"status": "registered",
"created_at": "2019-08-24T14:15:22Z",
"updated_at": "2019-08-24T14:15:22Z"
}{
"detail": "string",
"instance": "../dictionary",
"errors": [
{
"field": "string",
"message": "string"
}
],
"type": "http://example.com",
"status": 401,
"title": "Unauthenticated"
}{
"detail": "string",
"instance": "../dictionary",
"errors": [
{
"field": "string",
"message": "string"
}
],
"type": "http://example.com",
"status": 403,
"title": "Insufficient Role"
}{
"detail": "string",
"instance": "../dictionary",
"errors": [
{
"field": "string",
"message": "string"
}
],
"type": "http://example.com",
"status": 404,
"title": "Not Found"
}{
"detail": "string",
"instance": "../dictionary",
"errors": [
{
"field": "string",
"message": "string"
}
],
"type": "http://example.com",
"status": 409,
"title": "Person Has Ticket"
}{
"detail": "string",
"instance": "../dictionary",
"errors": [
{
"field": "string",
"message": "string"
}
],
"type": "http://example.com",
"status": 500,
"title": "Internal Server Error"
}Check an attendee in at a checkpoint occurrence POST
Staff-only checkpoint check-in. Checkpoints are pass-through — attendees never register for them — so an attendee is marked present by identity, gating only on "can they pass": a confirmed edition ticket plus the checkpoint's access rules (`staff_only`, `min_access_level`). The first scan upserts an attended participation anchored to the attendee's edition-ticket registration; re-scanning the same attendee is idempotent (the live participation is flipped to `attended`, never duplicated). Only checkpoint occurrences are accepted — activities keep the mark-attended flow (400 otherwise).
The caller's activity sign-ups in an edition GET
The single personal read of the activity registration feature (the public schedule stays stateless — the front joins this against it by `occurrence_id`). Returns the caller's live (non-cancelled) participations joined with their program and occurrence; cancelled rows are ledger history and never shown. `data` is `null` when the caller holds no ticket.