> For the complete documentation index, see [llms.txt](https://eventx-hq.gitbook.io/knowledge-base/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://eventx-hq.gitbook.io/knowledge-base/api-v2/check-ins.md).

# Check Ins

Per-session attendee check-in taps (physical\_event\_attendance) — CRUD with checkedAt datetime-range filter, per-session overview counts, attendee timeline; sessions read-only

## List check-in sessions

> Lists physical check-in sessions for an event (read-only via v2 — sessions are managed in the portal). Requires organizer\_api\_token read, org or event scoped.

```json
{"openapi":"3.1.0","info":{"title":"EventX Public API v2","version":"v2"},"tags":[{"name":"check-ins","description":"Per-session attendee check-in taps (physical_event_attendance) — CRUD with checkedAt datetime-range filter, per-session overview counts, attendee timeline; sessions read-only"}],"servers":[{"url":"https://api.eventx.io","description":"EventX Public API server"}],"security":[{"organizerApiToken":[]}],"components":{"securitySchemes":{"organizerApiToken":{"type":"http","scheme":"bearer","description":"Organizer API token — Authorization: Bearer evtx_live_… (Org/Event scoped, read/write)."}}},"paths":{"/v2/events/{eventId}/check-in-sessions":{"get":{"tags":["check-ins"],"summary":"List check-in sessions","description":"Lists physical check-in sessions for an event (read-only via v2 — sessions are managed in the portal). Requires organizer_api_token read, org or event scoped.","parameters":[{"schema":{"type":"string","format":"uuid","description":"Event UUID"},"required":true,"name":"eventId","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50,"description":"Limit 1-100, default 50"},"required":false,"name":"limit","in":"query"},{"schema":{"type":["integer","null"],"minimum":0,"default":0,"description":"Offset"},"required":false,"name":"offset","in":"query"}],"responses":{"200":{"description":"Paginated sessions","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Physical check-in session ID"},"eventId":{"type":["string","null"],"description":"Event ID"},"name":{"type":["string","null"],"description":"Session name (from contentI18n)"},"startsAt":{"type":["string","null"]},"endsAt":{"type":["string","null"]},"isPermitAll":{"type":["boolean","null"]},"isCheckInAnywayEnabled":{"type":["boolean","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}},"required":["id","eventId","name","startsAt","endsAt","isPermitAll","isCheckInAnywayEnabled","createdAt","updatedAt"],"description":"Physical check-in session (read-only via v2)"}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}},"required":["data","total","limit","offset"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"404":{"description":"Event not found","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}}}}}}}
```

## Get check-in session

> Get a single check-in session by ID, scoped to an event.

```json
{"openapi":"3.1.0","info":{"title":"EventX Public API v2","version":"v2"},"tags":[{"name":"check-ins","description":"Per-session attendee check-in taps (physical_event_attendance) — CRUD with checkedAt datetime-range filter, per-session overview counts, attendee timeline; sessions read-only"}],"servers":[{"url":"https://api.eventx.io","description":"EventX Public API server"}],"security":[{"organizerApiToken":[]}],"components":{"securitySchemes":{"organizerApiToken":{"type":"http","scheme":"bearer","description":"Organizer API token — Authorization: Bearer evtx_live_… (Org/Event scoped, read/write)."}}},"paths":{"/v2/events/{eventId}/check-in-sessions/{sessionId}":{"get":{"tags":["check-ins"],"summary":"Get check-in session","description":"Get a single check-in session by ID, scoped to an event.","parameters":[{"schema":{"type":"string","format":"uuid","description":"Event UUID"},"required":true,"name":"eventId","in":"path"},{"schema":{"type":"string","format":"uuid","description":"Session UUID"},"required":true,"name":"sessionId","in":"path"}],"responses":{"200":{"description":"Session","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Physical check-in session ID"},"eventId":{"type":["string","null"],"description":"Event ID"},"name":{"type":["string","null"],"description":"Session name (from contentI18n)"},"startsAt":{"type":["string","null"]},"endsAt":{"type":["string","null"]},"isPermitAll":{"type":["boolean","null"]},"isCheckInAnywayEnabled":{"type":["boolean","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}},"required":["id","eventId","name","startsAt","endsAt","isPermitAll","isCheckInAnywayEnabled","createdAt","updatedAt"],"description":"Physical check-in session (read-only via v2)"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}}}}}}}
```

## List check-ins with datetime range

> Paginated check-in taps for an event. Filter by sessionId (one session) or receptionOnly (event-level taps, session null), attendeeId, direction, method, and checkedAt from/to (ISO-8601 inclusive, max 90-day window). sessionId and receptionOnly are mutually exclusive. Requires read.

```json
{"openapi":"3.1.0","info":{"title":"EventX Public API v2","version":"v2"},"tags":[{"name":"check-ins","description":"Per-session attendee check-in taps (physical_event_attendance) — CRUD with checkedAt datetime-range filter, per-session overview counts, attendee timeline; sessions read-only"}],"servers":[{"url":"https://api.eventx.io","description":"EventX Public API server"}],"security":[{"organizerApiToken":[]}],"components":{"securitySchemes":{"organizerApiToken":{"type":"http","scheme":"bearer","description":"Organizer API token — Authorization: Bearer evtx_live_… (Org/Event scoped, read/write)."}}},"paths":{"/v2/events/{eventId}/check-ins":{"get":{"tags":["check-ins"],"summary":"List check-ins with datetime range","description":"Paginated check-in taps for an event. Filter by sessionId (one session) or receptionOnly (event-level taps, session null), attendeeId, direction, method, and checkedAt from/to (ISO-8601 inclusive, max 90-day window). sessionId and receptionOnly are mutually exclusive. Requires read.","parameters":[{"schema":{"type":"string","format":"uuid","description":"Event UUID"},"required":true,"name":"eventId","in":"path"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":50,"description":"Limit 1-100, default 50"},"required":false,"name":"limit","in":"query"},{"schema":{"type":["integer","null"],"minimum":0,"default":0,"description":"Offset"},"required":false,"name":"offset","in":"query"},{"schema":{"type":"string","format":"uuid","description":"Filter to one session"},"required":false,"name":"sessionId","in":"query"},{"schema":{"type":["boolean","null"],"description":"When true, only reception (event-level, session null) taps"},"required":false,"name":"receptionOnly","in":"query"},{"schema":{"type":"string","format":"uuid","description":"Filter to one attendee"},"required":false,"name":"attendeeId","in":"query"},{"schema":{"type":"string","enum":["in","out"],"description":"Tap direction"},"required":false,"name":"direction","in":"query"},{"schema":{"type":"string","enum":["qr_code","search","walk_in"],"description":"Check-in method"},"required":false,"name":"method","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Inclusive lower bound on checkedAt (ISO-8601)"},"required":false,"name":"from","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Inclusive upper bound on checkedAt (ISO-8601)"},"required":false,"name":"to","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"description":"Sort by checkedAt (default: desc)"},"required":false,"name":"sortDirection","in":"query"}],"responses":{"200":{"description":"Paginated check-ins","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Check-in record ID"},"eventId":{"type":["string","null"]},"sessionId":{"type":["string","null"],"description":"Physical session ID, null = reception (event-level)"},"attendeeId":{"type":["string","null"]},"checkedAt":{"type":["string","null"],"description":"Tap timestamp (the datetime-range filter field)"},"direction":{"type":["string","null"]},"method":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}},"required":["id","eventId","sessionId","attendeeId","checkedAt","direction","method","createdAt","updatedAt"],"description":"Per-session attendee check-in record"}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}},"required":["data","total","limit","offset"]}}}},"400":{"description":"Validation error (from after to, range over 90 days, sessionId + receptionOnly)","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}}}}}}}
```

## Record a check-in tap

> Records a check-in tap (sessionId null/omitted = reception). Exact duplicates (event, attendee, session, checkedAt, direction) are ignored and returned with deduped:true. Requires write.

```json
{"openapi":"3.1.0","info":{"title":"EventX Public API v2","version":"v2"},"tags":[{"name":"check-ins","description":"Per-session attendee check-in taps (physical_event_attendance) — CRUD with checkedAt datetime-range filter, per-session overview counts, attendee timeline; sessions read-only"}],"servers":[{"url":"https://api.eventx.io","description":"EventX Public API server"}],"security":[{"organizerApiToken":[]}],"components":{"securitySchemes":{"organizerApiToken":{"type":"http","scheme":"bearer","description":"Organizer API token — Authorization: Bearer evtx_live_… (Org/Event scoped, read/write)."}}},"paths":{"/v2/events/{eventId}/check-ins":{"post":{"tags":["check-ins"],"summary":"Record a check-in tap","description":"Records a check-in tap (sessionId null/omitted = reception). Exact duplicates (event, attendee, session, checkedAt, direction) are ignored and returned with deduped:true. Requires write.","parameters":[{"schema":{"type":"string","format":"uuid","description":"Event UUID"},"required":true,"name":"eventId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sessionId":{"type":["string","null"],"format":"uuid","description":"Session ID, null or omitted = reception"},"attendeeId":{"type":"string","format":"uuid","description":"Attendee UUID"},"checkedAt":{"type":"string","format":"date-time","description":"Tap timestamp (ISO-8601)"},"direction":{"type":"string","enum":["in","out"],"description":"Tap direction"},"method":{"type":"string","enum":["qr_code","search","walk_in"],"description":"Check-in method (default: qr_code)"}},"required":["attendeeId","checkedAt","direction"],"description":"Record a check-in tap — exact duplicates (event, attendee, session, checkedAt, direction) are ignored and returned with deduped:true."}}}},"responses":{"201":{"description":"Created (or deduped)","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Check-in record ID"},"eventId":{"type":["string","null"]},"sessionId":{"type":["string","null"],"description":"Physical session ID, null = reception (event-level)"},"attendeeId":{"type":["string","null"]},"checkedAt":{"type":["string","null"],"description":"Tap timestamp (the datetime-range filter field)"},"direction":{"type":["string","null"]},"method":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}},"required":["id","eventId","sessionId","attendeeId","checkedAt","direction","method","createdAt","updatedAt"],"description":"Per-session attendee check-in record"},"deduped":{"type":"boolean","description":"True when the exact tap already existed (event, attendee, session, checkedAt, direction) — no new row written"}},"required":["data","deduped"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"404":{"description":"Session not found in this event","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}}}}}}}
```

## Per-session check-in counts

> Counts visible taps grouped by session (sessionId null = reception). Accepts the same checkedAt from/to range (max 90 days). Requires read.

```json
{"openapi":"3.1.0","info":{"title":"EventX Public API v2","version":"v2"},"tags":[{"name":"check-ins","description":"Per-session attendee check-in taps (physical_event_attendance) — CRUD with checkedAt datetime-range filter, per-session overview counts, attendee timeline; sessions read-only"}],"servers":[{"url":"https://api.eventx.io","description":"EventX Public API server"}],"security":[{"organizerApiToken":[]}],"components":{"securitySchemes":{"organizerApiToken":{"type":"http","scheme":"bearer","description":"Organizer API token — Authorization: Bearer evtx_live_… (Org/Event scoped, read/write)."}}},"paths":{"/v2/events/{eventId}/check-ins/overview":{"get":{"tags":["check-ins"],"summary":"Per-session check-in counts","description":"Counts visible taps grouped by session (sessionId null = reception). Accepts the same checkedAt from/to range (max 90 days). Requires read.","parameters":[{"schema":{"type":"string","format":"uuid","description":"Event UUID"},"required":true,"name":"eventId","in":"path"},{"schema":{"type":"string","format":"date-time","description":"Inclusive lower bound on checkedAt (ISO-8601)"},"required":false,"name":"from","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Inclusive upper bound on checkedAt (ISO-8601)"},"required":false,"name":"to","in":"query"}],"responses":{"200":{"description":"Per-session counts","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"sessionId":{"type":["string","null"],"description":"Session ID, null = reception"},"count":{"type":"number"}},"required":["sessionId","count"]}}},"required":["data"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}}}}}}}
```

## Attendee check-in timeline

> Chronological tap history for one attendee (ascending checkedAt), with optional from/to range. Requires read.

```json
{"openapi":"3.1.0","info":{"title":"EventX Public API v2","version":"v2"},"tags":[{"name":"check-ins","description":"Per-session attendee check-in taps (physical_event_attendance) — CRUD with checkedAt datetime-range filter, per-session overview counts, attendee timeline; sessions read-only"}],"servers":[{"url":"https://api.eventx.io","description":"EventX Public API server"}],"security":[{"organizerApiToken":[]}],"components":{"securitySchemes":{"organizerApiToken":{"type":"http","scheme":"bearer","description":"Organizer API token — Authorization: Bearer evtx_live_… (Org/Event scoped, read/write)."}}},"paths":{"/v2/events/{eventId}/check-ins/timeline":{"get":{"tags":["check-ins"],"summary":"Attendee check-in timeline","description":"Chronological tap history for one attendee (ascending checkedAt), with optional from/to range. Requires read.","parameters":[{"schema":{"type":"string","format":"uuid","description":"Event UUID"},"required":true,"name":"eventId","in":"path"},{"schema":{"type":"string","format":"uuid","description":"Attendee UUID"},"required":true,"name":"attendeeId","in":"query"},{"schema":{"type":"integer","minimum":1,"maximum":100,"default":100,"description":"Limit 1-100, default 100"},"required":false,"name":"limit","in":"query"},{"schema":{"type":["integer","null"],"minimum":0,"default":0,"description":"Offset"},"required":false,"name":"offset","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Inclusive lower bound on checkedAt (ISO-8601)"},"required":false,"name":"from","in":"query"},{"schema":{"type":"string","format":"date-time","description":"Inclusive upper bound on checkedAt (ISO-8601)"},"required":false,"name":"to","in":"query"}],"responses":{"200":{"description":"Paginated timeline","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Check-in record ID"},"eventId":{"type":["string","null"]},"sessionId":{"type":["string","null"],"description":"Physical session ID, null = reception (event-level)"},"attendeeId":{"type":["string","null"]},"checkedAt":{"type":["string","null"],"description":"Tap timestamp (the datetime-range filter field)"},"direction":{"type":["string","null"]},"method":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}},"required":["id","eventId","sessionId","attendeeId","checkedAt","direction","method","createdAt","updatedAt"],"description":"Per-session attendee check-in record"}},"total":{"type":"number"},"limit":{"type":"number"},"offset":{"type":"number"}},"required":["data","total","limit","offset"]}}}},"400":{"description":"Validation error","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}}}}}}}
```

## Get check-in by ID

> Get a single check-in tap by ID, scoped to an event.

```json
{"openapi":"3.1.0","info":{"title":"EventX Public API v2","version":"v2"},"tags":[{"name":"check-ins","description":"Per-session attendee check-in taps (physical_event_attendance) — CRUD with checkedAt datetime-range filter, per-session overview counts, attendee timeline; sessions read-only"}],"servers":[{"url":"https://api.eventx.io","description":"EventX Public API server"}],"security":[{"organizerApiToken":[]}],"components":{"securitySchemes":{"organizerApiToken":{"type":"http","scheme":"bearer","description":"Organizer API token — Authorization: Bearer evtx_live_… (Org/Event scoped, read/write)."}}},"paths":{"/v2/events/{eventId}/check-ins/{checkInId}":{"get":{"tags":["check-ins"],"summary":"Get check-in by ID","description":"Get a single check-in tap by ID, scoped to an event.","parameters":[{"schema":{"type":"string","format":"uuid","description":"Event UUID"},"required":true,"name":"eventId","in":"path"},{"schema":{"type":"string","format":"uuid","description":"Check-in UUID"},"required":true,"name":"checkInId","in":"path"}],"responses":{"200":{"description":"Check-in","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Check-in record ID"},"eventId":{"type":["string","null"]},"sessionId":{"type":["string","null"],"description":"Physical session ID, null = reception (event-level)"},"attendeeId":{"type":["string","null"]},"checkedAt":{"type":["string","null"],"description":"Tap timestamp (the datetime-range filter field)"},"direction":{"type":["string","null"]},"method":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}},"required":["id","eventId","sessionId","attendeeId","checkedAt","direction","method","createdAt","updatedAt"],"description":"Per-session attendee check-in record"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}}}}}}}
```

## Delete a check-in tap

> Soft-deletes a tap (sets deletedAt — audit preserved, excluded from list/counts/timeline). Requires write.

```json
{"openapi":"3.1.0","info":{"title":"EventX Public API v2","version":"v2"},"tags":[{"name":"check-ins","description":"Per-session attendee check-in taps (physical_event_attendance) — CRUD with checkedAt datetime-range filter, per-session overview counts, attendee timeline; sessions read-only"}],"servers":[{"url":"https://api.eventx.io","description":"EventX Public API server"}],"security":[{"organizerApiToken":[]}],"components":{"securitySchemes":{"organizerApiToken":{"type":"http","scheme":"bearer","description":"Organizer API token — Authorization: Bearer evtx_live_… (Org/Event scoped, read/write)."}}},"paths":{"/v2/events/{eventId}/check-ins/{checkInId}":{"delete":{"tags":["check-ins"],"summary":"Delete a check-in tap","description":"Soft-deletes a tap (sets deletedAt — audit preserved, excluded from list/counts/timeline). Requires write.","parameters":[{"schema":{"type":"string","format":"uuid","description":"Event UUID"},"required":true,"name":"eventId","in":"path"},{"schema":{"type":"string","format":"uuid","description":"Check-in UUID"},"required":true,"name":"checkInId","in":"path"}],"responses":{"200":{"description":"Deleted","content":{"application/json":{"schema":{"type":"object","properties":{"deleted":{"type":"boolean"},"checkInId":{"type":"string","format":"uuid"}},"required":["deleted","checkInId"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}}}}}}}
```

## Correct a check-in tap

> Partial correction of a tap (session, timestamp, direction, method). Requires write.

```json
{"openapi":"3.1.0","info":{"title":"EventX Public API v2","version":"v2"},"tags":[{"name":"check-ins","description":"Per-session attendee check-in taps (physical_event_attendance) — CRUD with checkedAt datetime-range filter, per-session overview counts, attendee timeline; sessions read-only"}],"servers":[{"url":"https://api.eventx.io","description":"EventX Public API server"}],"security":[{"organizerApiToken":[]}],"components":{"securitySchemes":{"organizerApiToken":{"type":"http","scheme":"bearer","description":"Organizer API token — Authorization: Bearer evtx_live_… (Org/Event scoped, read/write)."}}},"paths":{"/v2/events/{eventId}/check-ins/{checkInId}":{"patch":{"tags":["check-ins"],"summary":"Correct a check-in tap","description":"Partial correction of a tap (session, timestamp, direction, method). Requires write.","parameters":[{"schema":{"type":"string","format":"uuid","description":"Event UUID"},"required":true,"name":"eventId","in":"path"},{"schema":{"type":"string","format":"uuid","description":"Check-in UUID"},"required":true,"name":"checkInId","in":"path"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sessionId":{"type":["string","null"],"format":"uuid","description":"Move tap to another session (null = reception)"},"checkedAt":{"type":"string","format":"date-time","description":"Corrected tap timestamp"},"direction":{"type":"string","enum":["in","out"],"description":"Corrected direction"},"method":{"type":"string","enum":["qr_code","search","walk_in"],"description":"Corrected method"}},"description":"Correct a check-in tap — at least one field."}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"Check-in record ID"},"eventId":{"type":["string","null"]},"sessionId":{"type":["string","null"],"description":"Physical session ID, null = reception (event-level)"},"attendeeId":{"type":["string","null"]},"checkedAt":{"type":["string","null"],"description":"Tap timestamp (the datetime-range filter field)"},"direction":{"type":["string","null"]},"method":{"type":["string","null"]},"createdAt":{"type":["string","null"]},"updatedAt":{"type":["string","null"]}},"required":["id","eventId","sessionId","attendeeId","checkedAt","direction","method","createdAt","updatedAt"],"description":"Per-session attendee check-in record"}}}},"400":{"description":"Validation","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"403":{"description":"Forbidden","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"number"},"meta":{}},"required":["code","message","status"]}}}}}}}}}
```
