Check an attendee in at a checkpoint occurrence
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).
/occurrences/{occurrence_id}/check-inStaff-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).
Authorization
bearerAuth JWT issued by IdentityX, signed with Ed25519
In: header
Path Parameters
Occurrence ID.
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Request body for checkpoint check-in. attendee_id is the
IdentityX actor id resolved from the attendee's badge QR.
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/occurrences/497f6eca-6276-4993-bfeb-53cbbbba6f08/check-in" \ -H "Content-Type: application/json" \ -d '{ "attendee_id": "2e6c6b0e-9c2a-4c1e-8d4f-9e1b7f3a5c2d" }'{
"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": 400,
"title": "Validation Failed"
}{
"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": 500,
"title": "Internal Server Error"
}List an occurrence's participants GET
The staff attendance surface: every live participation with the attendee's name/email from their registration. Any event staff (owner/admin/staff) may read it. Cancelled rows are history and are never listed — staff mark the people who are coming.
Mark a participant as attended POST
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).