> For the complete documentation index, see [llms.txt](https://movemint.gitbook.io/movemint-developer-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://movemint.gitbook.io/movemint-developer-docs/open-api-specification/core-resources/events.md).

# Events

Access event data (requires event admin permissions)

## List the events you administer

> Returns compact summaries of every event the authenticated user\
> administers, most recent first (events without a start date sort\
> last). Use the returned \`handle\` to address an event on any other\
> endpoint.\
> \
> This is a list view: it returns identity and scheduling fields only.\
> Call \`GET /api/v1/events/{handle}\` for the full event record.<br>

````json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"tags":[{"name":"Events","description":"Access event data (requires event admin permissions)"}],"servers":[{"url":"https://www.movemint.cc","description":"Production"}],"security":[{"bearerAuth":[]},{"oauth2":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Pass the access token in the `Authorization` header:\n```\nAuthorization: Bearer YOUR_ACCESS_TOKEN\n```\n"},"oauth2":{"type":"oauth2","description":"OAuth 2.0 authentication using the Authorization Code or Client\nCredentials grant flow.\n","flows":{"authorizationCode":{"authorizationUrl":"https://www.movemint.cc/oauth/authorize","tokenUrl":"https://www.movemint.cc/oauth/token","refreshUrl":"https://www.movemint.cc/oauth/token","scopes":{}},"clientCredentials":{"tokenUrl":"https://www.movemint.cc/oauth/token","scopes":{}}}}},"schemas":{"EventSummary":{"type":"object","description":"Compact list-view representation of an event, returned by\n`GET /api/v1/events`. All properties are always present; nullable\nproperties may have a null value.\n","required":["id","handle","name","status","start_date","end_date","city","state"],"properties":{"id":{"type":"integer","description":"Unique event identifier"},"handle":{"type":"string","description":"URL-safe unique identifier used to address the event on other endpoints"},"name":{"type":"string","nullable":true,"description":"Event name"},"status":{"type":"string","description":"Event lifecycle status"},"start_date":{"type":"string","format":"date","nullable":true,"description":"Event start date (YYYY-MM-DD)"},"end_date":{"type":"string","format":"date","nullable":true,"description":"Event end date (YYYY-MM-DD)"},"city":{"type":"string","nullable":true,"description":"Event city"},"state":{"type":"string","nullable":true,"description":"Event state or region"}}},"OAuthError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Machine-readable error code"},"error_description":{"type":"string","description":"Human-readable description of the error"}}}},"responses":{"Unauthorized":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}}}},"paths":{"/api/v1/events":{"get":{"tags":["Events"],"summary":"List the events you administer","description":"Returns compact summaries of every event the authenticated user\nadministers, most recent first (events without a start date sort\nlast). Use the returned `handle` to address an event on any other\nendpoint.\n\nThis is a list view: it returns identity and scheduling fields only.\nCall `GET /api/v1/events/{handle}` for the full event record.\n","operationId":"listEvents","parameters":[{"name":"q","in":"query","required":false,"description":"Case-insensitive substring match against event name and handle.","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of events to return (default 50, maximum 200).","schema":{"type":"integer","minimum":1,"maximum":200}}],"responses":{"200":{"description":"Events the authenticated user administers","content":{"application/json":{"schema":{"type":"object","properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/EventSummary"}}},"required":["events"]}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}}}}
````

## Create an event

> Creates an event owned by the authenticated user. The user is\
> automatically added as an \`owner\` admin of the new event.\
> \
> A random handle is assigned if one isn't provided in the request\
> body.\
> \
> The optional top-level \`status\` selects what the event is born as, and\
> accepts only the two statuses that publish nothing:\
> \
> \- \`draft\` (the default) — invisible, still being set up.\
> \- \`past\_event\` — a race that already happened, kept as a record of\
> &#x20; its participants, results and photos. It is not open for\
> &#x20; registration. Requires \`name\` and \`start\_date\`; the event is created\
> &#x20; free, with \`end\_date\` defaulting to \`start\_date\` and a readable\
> &#x20; handle derived from the name and year.\
> \
> Any other status is rejected with \`422\`. Publishing goes through\
> \`PATCH /api/v1/events/{handle}/status\`, which runs the readiness\
> check — creation is deliberately not a way around it.<br>

````json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"tags":[{"name":"Events","description":"Access event data (requires event admin permissions)"}],"servers":[{"url":"https://www.movemint.cc","description":"Production"}],"security":[{"bearerAuth":[]},{"oauth2":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Pass the access token in the `Authorization` header:\n```\nAuthorization: Bearer YOUR_ACCESS_TOKEN\n```\n"},"oauth2":{"type":"oauth2","description":"OAuth 2.0 authentication using the Authorization Code or Client\nCredentials grant flow.\n","flows":{"authorizationCode":{"authorizationUrl":"https://www.movemint.cc/oauth/authorize","tokenUrl":"https://www.movemint.cc/oauth/token","refreshUrl":"https://www.movemint.cc/oauth/token","scopes":{}},"clientCredentials":{"tokenUrl":"https://www.movemint.cc/oauth/token","scopes":{}}}}},"schemas":{"CreateEventRequest":{"type":"object","required":["event"],"properties":{"status":{"type":"string","enum":["draft","past_event"],"default":"draft","description":"The status the event is created in. Only these two are accepted —\nthey publish nothing. `past_event` additionally requires `name`\nand `start_date`. Every other status goes through the\nreadiness-gated status endpoint.\n"},"edition_of":{"type":"string","description":"Handle of an existing event this new event is another edition of.\nThe new event is linked into that event's edition group in the same\nrequest, so creating and linking cannot come apart. The caller must\nadminister the named event: an unknown handle returns `404` and one\nthe caller cannot administer returns `403` — in both cases no event\nis created.\n"},"copy_marketing_photos":{"type":"boolean","default":true,"description":"Whether the `edition_of` event's marketing photos are copied onto\nthe new event as independent photos, so deleting one from either\nevent leaves the other's gallery alone. Ignored when `edition_of`\nis absent. The response's `marketing_photos_copied` reports how\nmany were copied; a photo whose stored image cannot be read is\nskipped rather than failing the request, so the count can be lower\nthan the source gallery.\n"},"event":{"$ref":"#/components/schemas/EventWritableFields"}}},"EventWritableFields":{"type":"object","description":"Subset of `Event` fields that can be set or modified through\n`POST /api/v1/events` and `PATCH /api/v1/events/{handle}`. Other\nfields (status, pricing model, sub-events, etc.) have dedicated\nendpoints. All fields are optional on update; on create, you almost\nalways want to send `name`, `start_date`, `end_date`, and a\nlocation.\n","properties":{"name":{"type":"string"},"handle":{"type":"string","description":"URL slug. Auto-generated on create if omitted."},"start_date":{"type":"string","format":"date"},"end_date":{"type":"string","format":"date"},"registration_open_date":{"type":"string","format":"date-time"},"registration_close_date":{"type":"string","format":"date-time"},"description":{"type":"string"},"email":{"type":"string","format":"email"},"phone_number":{"type":"string"},"website":{"type":"string","format":"uri"},"address":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"zip":{"type":"string"},"country":{"type":"string"},"latitude":{"type":"number","format":"double"},"longitude":{"type":"number","format":"double"},"timezone":{"type":"string","description":"IANA timezone identifier (e.g., \"America/New_York\")."},"currency":{"type":"string","description":"ISO 4217 code (e.g., \"USD\")."},"sport_type":{"type":"string"},"max_participants":{"type":"integer"},"single_participant_only":{"type":"boolean"}}},"CreateEventResponse":{"allOf":[{"$ref":"#/components/schemas/Event"},{"type":"object","properties":{"edition_group_name":{"type":"string","nullable":true,"description":"Name of the edition group the new event was linked into. Only\npresent when `edition_of` was given.\n"},"marketing_photos_copied":{"type":"integer","description":"How many of the `edition_of` event's marketing photos were\ncopied onto the new event. Only present when `edition_of` was\ngiven and `copy_marketing_photos` was not `false`.\n"}}}]},"Event":{"type":"object","description":"An event on the Movemint platform. All properties are always present in the response; nullable properties may have a null value.","required":["id","name","latitude","longitude","start_date","end_date","sport_type","registration_open_date","registration_close_date","phone_number","email","website","description","max_participants","address","city","state","zip","presented_by","handle","created_at","updated_at","blurb","custom_waiver","status","collect_gender_identity","option_nonbinary","option_prefer_not_to_say","instagram_url","strava_club_url","x_url","facebook_url","donation_goal_cents","registration_included_in_donation_goal","currency","volunteer_message","allow_participant_transfer","participant_transfer_close_date","country","tax_address","collect_phone_number","collect_dob","collect_address","collect_emergency_contact","peer_to_peer_fundraiser","merchandise_tax_rate","service_fee_tax_rate","registration_tax_rate","stripe_account_id","onboarding_step","new_participant_owner_email_setting","show_signup_count","protecht_enabled","send_participant_confirmation_emails","teams_enabled","show_teams_on_start_list","show_teams_on_results","show_relay_teams_on_start_list","timezone","email_owner_on_merchandise_order","email_check_in_confirmation","team_password_setting","sms_enabled","is_free","show_start_list","event_cancellation_insurance_enabled","last_transaction_date","allow_event_variant_transfers","partner_program_eligible","show_event_variant_price_schedule","require_one_sub_event","frictionless_protecht","buy_now_pay_later","show_location","merchandise_store_close_date_time_utc","presale_registration_open_date","presale_registration_code","write_to_strava_activity_on_finish","tax_exempt","name_with_start_date","formatted_start_date","name_with_year"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"name":{"type":"string","description":"Event name"},"latitude":{"type":"string","description":"Venue latitude (decimal as string for precision)"},"longitude":{"type":"string","description":"Venue longitude (decimal as string for precision)"},"start_date":{"type":"string","format":"date-time","description":"Event start date and time (UTC)"},"end_date":{"type":"string","format":"date-time","nullable":true,"description":"Event end date and time (UTC), if applicable"},"sport_type":{"type":"string","description":"Type of sport"},"registration_open_date":{"type":"string","format":"date-time","description":"When registration opens (UTC)"},"registration_close_date":{"type":"string","format":"date-time","nullable":true,"description":"When registration closes (UTC)"},"phone_number":{"type":"string","nullable":true,"description":"Contact phone number"},"email":{"type":"string","format":"email","description":"Contact email for the event"},"website":{"type":"string","format":"uri","description":"Event website URL"},"description":{"type":"string","description":"Full event description (may contain HTML)"},"max_participants":{"type":"integer","nullable":true,"description":"Maximum number of participants allowed; null if unlimited"},"address":{"type":"string","description":"Venue address or venue name"},"city":{"type":"string","description":"City"},"state":{"type":"integer","description":"State enum value (e.g. 21 for Massachusetts)"},"zip":{"type":"string","description":"ZIP or postal code"},"presented_by":{"type":"string","nullable":true,"description":"Presenting sponsor or organization name"},"handle":{"type":"string","description":"Unique URL-safe handle used in paths"},"created_at":{"type":"string","format":"date-time","description":"Record creation timestamp (UTC)"},"updated_at":{"type":"string","format":"date-time","description":"Last update timestamp (UTC)"},"blurb":{"type":"string","description":"Short event summary"},"custom_waiver":{"type":"string","nullable":true,"description":"Custom waiver text shown during registration"},"status":{"type":"string","enum":["draft","live","unlisted","landing_page","past_event"],"description":"Event visibility/status"},"collect_gender_identity":{"type":"boolean","description":"Whether gender identity is collected during registration"},"option_nonbinary":{"type":"boolean","description":"Whether non-binary is offered as a gender identity option"},"option_prefer_not_to_say":{"type":"boolean","description":"Whether \"prefer not to say\" is offered for gender identity"},"instagram_url":{"type":"string","format":"uri","nullable":true,"description":"Instagram profile URL"},"strava_club_url":{"type":"string","format":"uri","nullable":true,"description":"Strava club URL"},"x_url":{"type":"string","format":"uri","nullable":true,"description":"X (Twitter) profile URL"},"facebook_url":{"type":"string","format":"uri","nullable":true,"description":"Facebook page URL"},"donation_goal_cents":{"type":"integer","format":"int64","nullable":true,"description":"Donation goal in cents, if fundraising is enabled"},"registration_included_in_donation_goal":{"type":"boolean","description":"Whether registration revenue counts toward donation goal"},"currency":{"type":"string","description":"ISO 4217 currency code"},"volunteer_message":{"type":"string","nullable":true,"description":"Message or instructions for volunteers"},"allow_participant_transfer":{"type":"boolean","description":"Whether participant transfers are allowed"},"participant_transfer_close_date":{"type":"string","format":"date-time","nullable":true,"description":"Deadline for participant transfers (UTC)"},"country":{"type":"integer","description":"Country enum value (e.g. 187 for United States)"},"tax_address":{"type":"string","nullable":true,"description":"Address used for tax purposes"},"collect_phone_number":{"type":"boolean","description":"Whether phone number is collected during registration"},"collect_dob":{"type":"boolean","description":"Whether date of birth is collected during registration"},"collect_address":{"type":"boolean","description":"Whether address is collected during registration"},"collect_emergency_contact":{"type":"boolean","description":"Whether emergency contact is collected during registration"},"peer_to_peer_fundraiser":{"type":"boolean","description":"Whether peer-to-peer fundraising is enabled"},"merchandise_tax_rate":{"type":"string","nullable":true,"description":"Tax rate for merchandise (decimal as string, e.g. 0.0)"},"service_fee_tax_rate":{"type":"string","nullable":true,"description":"Tax rate for service fees (decimal as string, e.g. 0.0625)"},"registration_tax_rate":{"type":"string","nullable":true,"description":"Tax rate for registration (decimal as string)"},"stripe_account_id":{"type":"integer","format":"int64","nullable":true,"description":"Stripe Connect account ID when connected"},"onboarding_step":{"type":"integer","nullable":true,"description":"Current step in event onboarding flow"},"new_participant_owner_email_setting":{"type":"string","enum":["never_email_owner","email_owner_every_participant"],"description":"When the event owner is emailed about new participants"},"show_signup_count":{"type":"boolean","description":"Whether the signup count is publicly visible"},"protecht_enabled":{"type":"boolean","description":"Whether event cancellation insurance (Protecht) is offered"},"send_participant_confirmation_emails":{"type":"boolean","description":"Whether confirmation emails are sent to participants"},"teams_enabled":{"type":"boolean","description":"Whether team registration is enabled"},"show_teams_on_start_list":{"type":"boolean","description":"Whether teams are shown on the start list"},"show_teams_on_results":{"type":"boolean","description":"Whether teams are shown on results"},"show_relay_teams_on_start_list":{"type":"boolean","description":"Whether relay teams are shown on the start list"},"timezone":{"type":"string","description":"IANA timezone string"},"email_owner_on_merchandise_order":{"type":"boolean","description":"Whether the owner is emailed on merchandise orders"},"email_check_in_confirmation":{"type":"boolean","description":"Whether check-in confirmation emails are sent"},"team_password_setting":{"type":"string","enum":["no_password","optional","required"],"description":"Whether team join requires a password"},"sms_enabled":{"type":"boolean","description":"Whether SMS notifications are enabled"},"is_free":{"type":"boolean","description":"Whether the event is free to register"},"show_start_list":{"type":"boolean","description":"Whether the start list is publicly visible"},"event_cancellation_insurance_enabled":{"type":"boolean","description":"Whether event cancellation insurance is enabled"},"last_transaction_date":{"type":"string","format":"date-time","nullable":true,"description":"Timestamp of last transaction (UTC)"},"allow_event_variant_transfers":{"type":"boolean","description":"Whether transfers between event variants are allowed"},"partner_program_eligible":{"type":"boolean","description":"Whether the event is eligible for partner program"},"show_event_variant_price_schedule":{"type":"boolean","description":"Whether event variant price schedule is shown"},"require_one_sub_event":{"type":"boolean","description":"Whether participant must choose at least one sub-event"},"frictionless_protecht":{"type":"boolean","description":"Whether frictionless Protecht signup is enabled"},"buy_now_pay_later":{"type":"boolean","description":"Whether buy-now-pay-later is offered"},"show_location":{"type":"boolean","description":"Whether the event location is shown publicly"},"merchandise_store_close_date_time_utc":{"type":"string","format":"date-time","nullable":true,"description":"When the merchandise store closes (UTC)"},"presale_registration_open_date":{"type":"string","format":"date-time","nullable":true,"description":"When presale registration opens (UTC)"},"presale_registration_code":{"type":"string","nullable":true,"description":"Code required for presale registration"},"write_to_strava_activity_on_finish":{"type":"boolean","description":"Whether finishing writes to Strava activity"},"tax_exempt":{"type":"boolean","description":"Whether the event is tax exempt"},"name_with_start_date":{"type":"string","description":"Event name combined with formatted start date"},"formatted_start_date":{"type":"string","description":"Human-readable formatted start date"},"name_with_year":{"type":"string","description":"Event name with year"}}},"OAuthError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Machine-readable error code"},"error_description":{"type":"string","description":"Human-readable description of the error"}}},"ValidationError":{"type":"object","description":"A validation error response with a list of error messages","required":["errors"],"properties":{"errors":{"type":"array","items":{"type":"string"},"description":"List of validation error messages"}}}},"responses":{"Unauthorized":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}}}},"paths":{"/api/v1/events":{"post":{"tags":["Events"],"summary":"Create an event","description":"Creates an event owned by the authenticated user. The user is\nautomatically added as an `owner` admin of the new event.\n\nA random handle is assigned if one isn't provided in the request\nbody.\n\nThe optional top-level `status` selects what the event is born as, and\naccepts only the two statuses that publish nothing:\n\n- `draft` (the default) — invisible, still being set up.\n- `past_event` — a race that already happened, kept as a record of\n  its participants, results and photos. It is not open for\n  registration. Requires `name` and `start_date`; the event is created\n  free, with `end_date` defaulting to `start_date` and a readable\n  handle derived from the name and year.\n\nAny other status is rejected with `422`. Publishing goes through\n`PATCH /api/v1/events/{handle}/status`, which runs the readiness\ncheck — creation is deliberately not a way around it.\n","operationId":"createEvent","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEventRequest"}}}},"responses":{"201":{"description":"Event created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateEventResponse"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}}}}}}}
````

## Get an event by handle

> Returns details for a single event identified by its unique handle.\
> The authenticated user must be an admin of the event.<br>

````json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"tags":[{"name":"Events","description":"Access event data (requires event admin permissions)"}],"servers":[{"url":"https://www.movemint.cc","description":"Production"}],"security":[{"bearerAuth":[]},{"oauth2":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Pass the access token in the `Authorization` header:\n```\nAuthorization: Bearer YOUR_ACCESS_TOKEN\n```\n"},"oauth2":{"type":"oauth2","description":"OAuth 2.0 authentication using the Authorization Code or Client\nCredentials grant flow.\n","flows":{"authorizationCode":{"authorizationUrl":"https://www.movemint.cc/oauth/authorize","tokenUrl":"https://www.movemint.cc/oauth/token","refreshUrl":"https://www.movemint.cc/oauth/token","scopes":{}},"clientCredentials":{"tokenUrl":"https://www.movemint.cc/oauth/token","scopes":{}}}}},"parameters":{"EventHandle":{"name":"handle","in":"path","required":true,"description":"The unique handle (slug) of the event","schema":{"type":"string"}}},"schemas":{"Event":{"type":"object","description":"An event on the Movemint platform. All properties are always present in the response; nullable properties may have a null value.","required":["id","name","latitude","longitude","start_date","end_date","sport_type","registration_open_date","registration_close_date","phone_number","email","website","description","max_participants","address","city","state","zip","presented_by","handle","created_at","updated_at","blurb","custom_waiver","status","collect_gender_identity","option_nonbinary","option_prefer_not_to_say","instagram_url","strava_club_url","x_url","facebook_url","donation_goal_cents","registration_included_in_donation_goal","currency","volunteer_message","allow_participant_transfer","participant_transfer_close_date","country","tax_address","collect_phone_number","collect_dob","collect_address","collect_emergency_contact","peer_to_peer_fundraiser","merchandise_tax_rate","service_fee_tax_rate","registration_tax_rate","stripe_account_id","onboarding_step","new_participant_owner_email_setting","show_signup_count","protecht_enabled","send_participant_confirmation_emails","teams_enabled","show_teams_on_start_list","show_teams_on_results","show_relay_teams_on_start_list","timezone","email_owner_on_merchandise_order","email_check_in_confirmation","team_password_setting","sms_enabled","is_free","show_start_list","event_cancellation_insurance_enabled","last_transaction_date","allow_event_variant_transfers","partner_program_eligible","show_event_variant_price_schedule","require_one_sub_event","frictionless_protecht","buy_now_pay_later","show_location","merchandise_store_close_date_time_utc","presale_registration_open_date","presale_registration_code","write_to_strava_activity_on_finish","tax_exempt","name_with_start_date","formatted_start_date","name_with_year"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"name":{"type":"string","description":"Event name"},"latitude":{"type":"string","description":"Venue latitude (decimal as string for precision)"},"longitude":{"type":"string","description":"Venue longitude (decimal as string for precision)"},"start_date":{"type":"string","format":"date-time","description":"Event start date and time (UTC)"},"end_date":{"type":"string","format":"date-time","nullable":true,"description":"Event end date and time (UTC), if applicable"},"sport_type":{"type":"string","description":"Type of sport"},"registration_open_date":{"type":"string","format":"date-time","description":"When registration opens (UTC)"},"registration_close_date":{"type":"string","format":"date-time","nullable":true,"description":"When registration closes (UTC)"},"phone_number":{"type":"string","nullable":true,"description":"Contact phone number"},"email":{"type":"string","format":"email","description":"Contact email for the event"},"website":{"type":"string","format":"uri","description":"Event website URL"},"description":{"type":"string","description":"Full event description (may contain HTML)"},"max_participants":{"type":"integer","nullable":true,"description":"Maximum number of participants allowed; null if unlimited"},"address":{"type":"string","description":"Venue address or venue name"},"city":{"type":"string","description":"City"},"state":{"type":"integer","description":"State enum value (e.g. 21 for Massachusetts)"},"zip":{"type":"string","description":"ZIP or postal code"},"presented_by":{"type":"string","nullable":true,"description":"Presenting sponsor or organization name"},"handle":{"type":"string","description":"Unique URL-safe handle used in paths"},"created_at":{"type":"string","format":"date-time","description":"Record creation timestamp (UTC)"},"updated_at":{"type":"string","format":"date-time","description":"Last update timestamp (UTC)"},"blurb":{"type":"string","description":"Short event summary"},"custom_waiver":{"type":"string","nullable":true,"description":"Custom waiver text shown during registration"},"status":{"type":"string","enum":["draft","live","unlisted","landing_page","past_event"],"description":"Event visibility/status"},"collect_gender_identity":{"type":"boolean","description":"Whether gender identity is collected during registration"},"option_nonbinary":{"type":"boolean","description":"Whether non-binary is offered as a gender identity option"},"option_prefer_not_to_say":{"type":"boolean","description":"Whether \"prefer not to say\" is offered for gender identity"},"instagram_url":{"type":"string","format":"uri","nullable":true,"description":"Instagram profile URL"},"strava_club_url":{"type":"string","format":"uri","nullable":true,"description":"Strava club URL"},"x_url":{"type":"string","format":"uri","nullable":true,"description":"X (Twitter) profile URL"},"facebook_url":{"type":"string","format":"uri","nullable":true,"description":"Facebook page URL"},"donation_goal_cents":{"type":"integer","format":"int64","nullable":true,"description":"Donation goal in cents, if fundraising is enabled"},"registration_included_in_donation_goal":{"type":"boolean","description":"Whether registration revenue counts toward donation goal"},"currency":{"type":"string","description":"ISO 4217 currency code"},"volunteer_message":{"type":"string","nullable":true,"description":"Message or instructions for volunteers"},"allow_participant_transfer":{"type":"boolean","description":"Whether participant transfers are allowed"},"participant_transfer_close_date":{"type":"string","format":"date-time","nullable":true,"description":"Deadline for participant transfers (UTC)"},"country":{"type":"integer","description":"Country enum value (e.g. 187 for United States)"},"tax_address":{"type":"string","nullable":true,"description":"Address used for tax purposes"},"collect_phone_number":{"type":"boolean","description":"Whether phone number is collected during registration"},"collect_dob":{"type":"boolean","description":"Whether date of birth is collected during registration"},"collect_address":{"type":"boolean","description":"Whether address is collected during registration"},"collect_emergency_contact":{"type":"boolean","description":"Whether emergency contact is collected during registration"},"peer_to_peer_fundraiser":{"type":"boolean","description":"Whether peer-to-peer fundraising is enabled"},"merchandise_tax_rate":{"type":"string","nullable":true,"description":"Tax rate for merchandise (decimal as string, e.g. 0.0)"},"service_fee_tax_rate":{"type":"string","nullable":true,"description":"Tax rate for service fees (decimal as string, e.g. 0.0625)"},"registration_tax_rate":{"type":"string","nullable":true,"description":"Tax rate for registration (decimal as string)"},"stripe_account_id":{"type":"integer","format":"int64","nullable":true,"description":"Stripe Connect account ID when connected"},"onboarding_step":{"type":"integer","nullable":true,"description":"Current step in event onboarding flow"},"new_participant_owner_email_setting":{"type":"string","enum":["never_email_owner","email_owner_every_participant"],"description":"When the event owner is emailed about new participants"},"show_signup_count":{"type":"boolean","description":"Whether the signup count is publicly visible"},"protecht_enabled":{"type":"boolean","description":"Whether event cancellation insurance (Protecht) is offered"},"send_participant_confirmation_emails":{"type":"boolean","description":"Whether confirmation emails are sent to participants"},"teams_enabled":{"type":"boolean","description":"Whether team registration is enabled"},"show_teams_on_start_list":{"type":"boolean","description":"Whether teams are shown on the start list"},"show_teams_on_results":{"type":"boolean","description":"Whether teams are shown on results"},"show_relay_teams_on_start_list":{"type":"boolean","description":"Whether relay teams are shown on the start list"},"timezone":{"type":"string","description":"IANA timezone string"},"email_owner_on_merchandise_order":{"type":"boolean","description":"Whether the owner is emailed on merchandise orders"},"email_check_in_confirmation":{"type":"boolean","description":"Whether check-in confirmation emails are sent"},"team_password_setting":{"type":"string","enum":["no_password","optional","required"],"description":"Whether team join requires a password"},"sms_enabled":{"type":"boolean","description":"Whether SMS notifications are enabled"},"is_free":{"type":"boolean","description":"Whether the event is free to register"},"show_start_list":{"type":"boolean","description":"Whether the start list is publicly visible"},"event_cancellation_insurance_enabled":{"type":"boolean","description":"Whether event cancellation insurance is enabled"},"last_transaction_date":{"type":"string","format":"date-time","nullable":true,"description":"Timestamp of last transaction (UTC)"},"allow_event_variant_transfers":{"type":"boolean","description":"Whether transfers between event variants are allowed"},"partner_program_eligible":{"type":"boolean","description":"Whether the event is eligible for partner program"},"show_event_variant_price_schedule":{"type":"boolean","description":"Whether event variant price schedule is shown"},"require_one_sub_event":{"type":"boolean","description":"Whether participant must choose at least one sub-event"},"frictionless_protecht":{"type":"boolean","description":"Whether frictionless Protecht signup is enabled"},"buy_now_pay_later":{"type":"boolean","description":"Whether buy-now-pay-later is offered"},"show_location":{"type":"boolean","description":"Whether the event location is shown publicly"},"merchandise_store_close_date_time_utc":{"type":"string","format":"date-time","nullable":true,"description":"When the merchandise store closes (UTC)"},"presale_registration_open_date":{"type":"string","format":"date-time","nullable":true,"description":"When presale registration opens (UTC)"},"presale_registration_code":{"type":"string","nullable":true,"description":"Code required for presale registration"},"write_to_strava_activity_on_finish":{"type":"boolean","description":"Whether finishing writes to Strava activity"},"tax_exempt":{"type":"boolean","description":"Whether the event is tax exempt"},"name_with_start_date":{"type":"string","description":"Event name combined with formatted start date"},"formatted_start_date":{"type":"string","description":"Human-readable formatted start date"},"name_with_year":{"type":"string","description":"Event name with year"}}},"OAuthError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Machine-readable error code"},"error_description":{"type":"string","description":"Human-readable description of the error"}}},"Error":{"type":"object","description":"A generic error response","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message"}}}}},"paths":{"/api/v1/events/{handle}":{"get":{"tags":["Events"],"summary":"Get an event by handle","description":"Returns details for a single event identified by its unique handle.\nThe authenticated user must be an admin of the event.\n","operationId":"getEvent","parameters":[{"$ref":"#/components/parameters/EventHandle"}],"responses":{"200":{"description":"Event details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"401":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"403":{"description":"Forbidden - user is not an admin of this event","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Event not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````

## Update an event

> Update top-level fields on an event. Only fields explicitly listed in\
> \`UpdateEventRequest\` can be modified through this endpoint. Other\
> attributes (sub-events, marketing photos, status, pricing model)\
> have their own dedicated endpoints.<br>

````json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"tags":[{"name":"Events","description":"Access event data (requires event admin permissions)"}],"servers":[{"url":"https://www.movemint.cc","description":"Production"}],"security":[{"bearerAuth":[]},{"oauth2":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Pass the access token in the `Authorization` header:\n```\nAuthorization: Bearer YOUR_ACCESS_TOKEN\n```\n"},"oauth2":{"type":"oauth2","description":"OAuth 2.0 authentication using the Authorization Code or Client\nCredentials grant flow.\n","flows":{"authorizationCode":{"authorizationUrl":"https://www.movemint.cc/oauth/authorize","tokenUrl":"https://www.movemint.cc/oauth/token","refreshUrl":"https://www.movemint.cc/oauth/token","scopes":{}},"clientCredentials":{"tokenUrl":"https://www.movemint.cc/oauth/token","scopes":{}}}}},"parameters":{"EventHandle":{"name":"handle","in":"path","required":true,"description":"The unique handle (slug) of the event","schema":{"type":"string"}}},"schemas":{"UpdateEventRequest":{"type":"object","required":["event"],"properties":{"event":{"$ref":"#/components/schemas/EventWritableFields"}}},"EventWritableFields":{"type":"object","description":"Subset of `Event` fields that can be set or modified through\n`POST /api/v1/events` and `PATCH /api/v1/events/{handle}`. Other\nfields (status, pricing model, sub-events, etc.) have dedicated\nendpoints. All fields are optional on update; on create, you almost\nalways want to send `name`, `start_date`, `end_date`, and a\nlocation.\n","properties":{"name":{"type":"string"},"handle":{"type":"string","description":"URL slug. Auto-generated on create if omitted."},"start_date":{"type":"string","format":"date"},"end_date":{"type":"string","format":"date"},"registration_open_date":{"type":"string","format":"date-time"},"registration_close_date":{"type":"string","format":"date-time"},"description":{"type":"string"},"email":{"type":"string","format":"email"},"phone_number":{"type":"string"},"website":{"type":"string","format":"uri"},"address":{"type":"string"},"city":{"type":"string"},"state":{"type":"string"},"zip":{"type":"string"},"country":{"type":"string"},"latitude":{"type":"number","format":"double"},"longitude":{"type":"number","format":"double"},"timezone":{"type":"string","description":"IANA timezone identifier (e.g., \"America/New_York\")."},"currency":{"type":"string","description":"ISO 4217 code (e.g., \"USD\")."},"sport_type":{"type":"string"},"max_participants":{"type":"integer"},"single_participant_only":{"type":"boolean"}}},"Event":{"type":"object","description":"An event on the Movemint platform. All properties are always present in the response; nullable properties may have a null value.","required":["id","name","latitude","longitude","start_date","end_date","sport_type","registration_open_date","registration_close_date","phone_number","email","website","description","max_participants","address","city","state","zip","presented_by","handle","created_at","updated_at","blurb","custom_waiver","status","collect_gender_identity","option_nonbinary","option_prefer_not_to_say","instagram_url","strava_club_url","x_url","facebook_url","donation_goal_cents","registration_included_in_donation_goal","currency","volunteer_message","allow_participant_transfer","participant_transfer_close_date","country","tax_address","collect_phone_number","collect_dob","collect_address","collect_emergency_contact","peer_to_peer_fundraiser","merchandise_tax_rate","service_fee_tax_rate","registration_tax_rate","stripe_account_id","onboarding_step","new_participant_owner_email_setting","show_signup_count","protecht_enabled","send_participant_confirmation_emails","teams_enabled","show_teams_on_start_list","show_teams_on_results","show_relay_teams_on_start_list","timezone","email_owner_on_merchandise_order","email_check_in_confirmation","team_password_setting","sms_enabled","is_free","show_start_list","event_cancellation_insurance_enabled","last_transaction_date","allow_event_variant_transfers","partner_program_eligible","show_event_variant_price_schedule","require_one_sub_event","frictionless_protecht","buy_now_pay_later","show_location","merchandise_store_close_date_time_utc","presale_registration_open_date","presale_registration_code","write_to_strava_activity_on_finish","tax_exempt","name_with_start_date","formatted_start_date","name_with_year"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"name":{"type":"string","description":"Event name"},"latitude":{"type":"string","description":"Venue latitude (decimal as string for precision)"},"longitude":{"type":"string","description":"Venue longitude (decimal as string for precision)"},"start_date":{"type":"string","format":"date-time","description":"Event start date and time (UTC)"},"end_date":{"type":"string","format":"date-time","nullable":true,"description":"Event end date and time (UTC), if applicable"},"sport_type":{"type":"string","description":"Type of sport"},"registration_open_date":{"type":"string","format":"date-time","description":"When registration opens (UTC)"},"registration_close_date":{"type":"string","format":"date-time","nullable":true,"description":"When registration closes (UTC)"},"phone_number":{"type":"string","nullable":true,"description":"Contact phone number"},"email":{"type":"string","format":"email","description":"Contact email for the event"},"website":{"type":"string","format":"uri","description":"Event website URL"},"description":{"type":"string","description":"Full event description (may contain HTML)"},"max_participants":{"type":"integer","nullable":true,"description":"Maximum number of participants allowed; null if unlimited"},"address":{"type":"string","description":"Venue address or venue name"},"city":{"type":"string","description":"City"},"state":{"type":"integer","description":"State enum value (e.g. 21 for Massachusetts)"},"zip":{"type":"string","description":"ZIP or postal code"},"presented_by":{"type":"string","nullable":true,"description":"Presenting sponsor or organization name"},"handle":{"type":"string","description":"Unique URL-safe handle used in paths"},"created_at":{"type":"string","format":"date-time","description":"Record creation timestamp (UTC)"},"updated_at":{"type":"string","format":"date-time","description":"Last update timestamp (UTC)"},"blurb":{"type":"string","description":"Short event summary"},"custom_waiver":{"type":"string","nullable":true,"description":"Custom waiver text shown during registration"},"status":{"type":"string","enum":["draft","live","unlisted","landing_page","past_event"],"description":"Event visibility/status"},"collect_gender_identity":{"type":"boolean","description":"Whether gender identity is collected during registration"},"option_nonbinary":{"type":"boolean","description":"Whether non-binary is offered as a gender identity option"},"option_prefer_not_to_say":{"type":"boolean","description":"Whether \"prefer not to say\" is offered for gender identity"},"instagram_url":{"type":"string","format":"uri","nullable":true,"description":"Instagram profile URL"},"strava_club_url":{"type":"string","format":"uri","nullable":true,"description":"Strava club URL"},"x_url":{"type":"string","format":"uri","nullable":true,"description":"X (Twitter) profile URL"},"facebook_url":{"type":"string","format":"uri","nullable":true,"description":"Facebook page URL"},"donation_goal_cents":{"type":"integer","format":"int64","nullable":true,"description":"Donation goal in cents, if fundraising is enabled"},"registration_included_in_donation_goal":{"type":"boolean","description":"Whether registration revenue counts toward donation goal"},"currency":{"type":"string","description":"ISO 4217 currency code"},"volunteer_message":{"type":"string","nullable":true,"description":"Message or instructions for volunteers"},"allow_participant_transfer":{"type":"boolean","description":"Whether participant transfers are allowed"},"participant_transfer_close_date":{"type":"string","format":"date-time","nullable":true,"description":"Deadline for participant transfers (UTC)"},"country":{"type":"integer","description":"Country enum value (e.g. 187 for United States)"},"tax_address":{"type":"string","nullable":true,"description":"Address used for tax purposes"},"collect_phone_number":{"type":"boolean","description":"Whether phone number is collected during registration"},"collect_dob":{"type":"boolean","description":"Whether date of birth is collected during registration"},"collect_address":{"type":"boolean","description":"Whether address is collected during registration"},"collect_emergency_contact":{"type":"boolean","description":"Whether emergency contact is collected during registration"},"peer_to_peer_fundraiser":{"type":"boolean","description":"Whether peer-to-peer fundraising is enabled"},"merchandise_tax_rate":{"type":"string","nullable":true,"description":"Tax rate for merchandise (decimal as string, e.g. 0.0)"},"service_fee_tax_rate":{"type":"string","nullable":true,"description":"Tax rate for service fees (decimal as string, e.g. 0.0625)"},"registration_tax_rate":{"type":"string","nullable":true,"description":"Tax rate for registration (decimal as string)"},"stripe_account_id":{"type":"integer","format":"int64","nullable":true,"description":"Stripe Connect account ID when connected"},"onboarding_step":{"type":"integer","nullable":true,"description":"Current step in event onboarding flow"},"new_participant_owner_email_setting":{"type":"string","enum":["never_email_owner","email_owner_every_participant"],"description":"When the event owner is emailed about new participants"},"show_signup_count":{"type":"boolean","description":"Whether the signup count is publicly visible"},"protecht_enabled":{"type":"boolean","description":"Whether event cancellation insurance (Protecht) is offered"},"send_participant_confirmation_emails":{"type":"boolean","description":"Whether confirmation emails are sent to participants"},"teams_enabled":{"type":"boolean","description":"Whether team registration is enabled"},"show_teams_on_start_list":{"type":"boolean","description":"Whether teams are shown on the start list"},"show_teams_on_results":{"type":"boolean","description":"Whether teams are shown on results"},"show_relay_teams_on_start_list":{"type":"boolean","description":"Whether relay teams are shown on the start list"},"timezone":{"type":"string","description":"IANA timezone string"},"email_owner_on_merchandise_order":{"type":"boolean","description":"Whether the owner is emailed on merchandise orders"},"email_check_in_confirmation":{"type":"boolean","description":"Whether check-in confirmation emails are sent"},"team_password_setting":{"type":"string","enum":["no_password","optional","required"],"description":"Whether team join requires a password"},"sms_enabled":{"type":"boolean","description":"Whether SMS notifications are enabled"},"is_free":{"type":"boolean","description":"Whether the event is free to register"},"show_start_list":{"type":"boolean","description":"Whether the start list is publicly visible"},"event_cancellation_insurance_enabled":{"type":"boolean","description":"Whether event cancellation insurance is enabled"},"last_transaction_date":{"type":"string","format":"date-time","nullable":true,"description":"Timestamp of last transaction (UTC)"},"allow_event_variant_transfers":{"type":"boolean","description":"Whether transfers between event variants are allowed"},"partner_program_eligible":{"type":"boolean","description":"Whether the event is eligible for partner program"},"show_event_variant_price_schedule":{"type":"boolean","description":"Whether event variant price schedule is shown"},"require_one_sub_event":{"type":"boolean","description":"Whether participant must choose at least one sub-event"},"frictionless_protecht":{"type":"boolean","description":"Whether frictionless Protecht signup is enabled"},"buy_now_pay_later":{"type":"boolean","description":"Whether buy-now-pay-later is offered"},"show_location":{"type":"boolean","description":"Whether the event location is shown publicly"},"merchandise_store_close_date_time_utc":{"type":"string","format":"date-time","nullable":true,"description":"When the merchandise store closes (UTC)"},"presale_registration_open_date":{"type":"string","format":"date-time","nullable":true,"description":"When presale registration opens (UTC)"},"presale_registration_code":{"type":"string","nullable":true,"description":"Code required for presale registration"},"write_to_strava_activity_on_finish":{"type":"boolean","description":"Whether finishing writes to Strava activity"},"tax_exempt":{"type":"boolean","description":"Whether the event is tax exempt"},"name_with_start_date":{"type":"string","description":"Event name combined with formatted start date"},"formatted_start_date":{"type":"string","description":"Human-readable formatted start date"},"name_with_year":{"type":"string","description":"Event name with year"}}},"OAuthError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Machine-readable error code"},"error_description":{"type":"string","description":"Human-readable description of the error"}}},"Error":{"type":"object","description":"A generic error response","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message"}}},"ValidationError":{"type":"object","description":"A validation error response with a list of error messages","required":["errors"],"properties":{"errors":{"type":"array","items":{"type":"string"},"description":"List of validation error messages"}}}},"responses":{"Unauthorized":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"Forbidden":{"description":"Forbidden - user is not an admin of this event","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"EventNotFound":{"description":"Event not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/api/v1/events/{handle}":{"patch":{"tags":["Events"],"summary":"Update an event","description":"Update top-level fields on an event. Only fields explicitly listed in\n`UpdateEventRequest` can be modified through this endpoint. Other\nattributes (sub-events, marketing photos, status, pricing model)\nhave their own dedicated endpoints.\n","operationId":"updateEvent","parameters":[{"$ref":"#/components/parameters/EventHandle"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateEventRequest"}}}},"responses":{"200":{"description":"Event updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/EventNotFound"},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationError"}}}}}}}}}
````

## List event participants

> Returns participants for an event, ordered by registration date\
> (newest first). The authenticated user must be an admin of the event.\
> \
> Results use cursor (keyset) pagination. A page holds at most 250\
> participants (\`limit\` defaults to and is capped at 250). When more\
> rows remain, the response includes an opaque \`X-Next-Cursor\` header;\
> pass its value back as the \`cursor\` query parameter to fetch the next\
> page. The final page omits the header. The response body is always a\
> bare JSON array of participants.\
> \
> Cursor pagination is stable while registrations arrive mid-iteration:\
> paging will not skip or duplicate rows the way offset paging can.\
> \
> Each participant includes nested event details, event variant,\
> merchandise orders, and custom question answers.<br>

````json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"tags":[{"name":"Events","description":"Access event data (requires event admin permissions)"}],"servers":[{"url":"https://www.movemint.cc","description":"Production"}],"security":[{"bearerAuth":[]},{"oauth2":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Pass the access token in the `Authorization` header:\n```\nAuthorization: Bearer YOUR_ACCESS_TOKEN\n```\n"},"oauth2":{"type":"oauth2","description":"OAuth 2.0 authentication using the Authorization Code or Client\nCredentials grant flow.\n","flows":{"authorizationCode":{"authorizationUrl":"https://www.movemint.cc/oauth/authorize","tokenUrl":"https://www.movemint.cc/oauth/token","refreshUrl":"https://www.movemint.cc/oauth/token","scopes":{}},"clientCredentials":{"tokenUrl":"https://www.movemint.cc/oauth/token","scopes":{}}}}},"parameters":{"EventHandle":{"name":"handle","in":"path","required":true,"description":"The unique handle (slug) of the event","schema":{"type":"string"}}},"schemas":{"EventParticipant":{"type":"object","description":"A registered participant for an event. Includes nested event details,\nevent variant, merchandise orders, and custom question answers.\n","required":["id","athlete_id","event_variant_id","confirmation_number","first_name","last_name","email","phone_number","dob","gender_identity","gender_name","phone_number_with_country_code","street_address","street_address_secondary","city","state","country","zip_code","country_code","emergency_contact_name","emergency_contact_phone_number","emergency_contact_phone_country_code","amount_paid_cents","stripe_checkout_id","stripe_receipt_url","stripe_receipt_number","bib_number","checked_in","registration_source","sms_opt_in","signed_waiver_at","confirmation_page","created_at","updated_at","event","event_variant","merchandise_orders","custom_question_text_answers"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"athlete_id":{"type":"integer","format":"int64","nullable":true,"description":"ID of the associated athlete account (if linked)"},"event_variant_id":{"type":"integer","format":"int64","description":"ID of the event variant (ticket type) the participant registered for"},"confirmation_number":{"type":"string","description":"Unique registration confirmation number (always present for saved records)"},"first_name":{"type":"string","description":"Participant's first name"},"last_name":{"type":"string","description":"Participant's last name"},"email":{"type":"string","format":"email","description":"Participant's email address"},"phone_number":{"type":"string","description":"Participant's phone number"},"dob":{"type":"string","format":"date","nullable":true,"description":"Date of birth (YYYY-MM-DD)"},"gender_identity":{"type":"integer","nullable":true,"description":"Gender identity enum value"},"gender_name":{"type":"string","description":"Human-readable gender name"},"phone_number_with_country_code":{"type":"string","description":"Full phone number including country code"},"street_address":{"type":"string","description":"Street address (line 1)"},"street_address_secondary":{"type":"string","description":"Street address (line 2)"},"city":{"type":"string","description":"City"},"state":{"type":"integer","nullable":true,"description":"State enum value"},"country":{"type":"integer","nullable":true,"description":"Country enum value"},"zip_code":{"type":"string","description":"ZIP or postal code"},"country_code":{"type":"integer","nullable":true,"description":"Phone country code"},"emergency_contact_name":{"type":"string","description":"Emergency contact full name"},"emergency_contact_phone_number":{"type":"string","description":"Emergency contact phone number"},"emergency_contact_phone_country_code":{"type":"integer","nullable":true,"description":"Emergency contact phone country code"},"amount_paid_cents":{"type":"integer","nullable":true,"description":"Total amount paid in cents"},"stripe_checkout_id":{"type":"string","description":"Stripe Checkout session ID"},"stripe_receipt_url":{"type":"string","format":"uri","description":"URL to the Stripe payment receipt"},"stripe_receipt_number":{"type":"string","description":"Stripe receipt number"},"bib_number":{"type":"integer","nullable":true,"description":"Assigned bib number (if applicable)"},"checked_in":{"type":"boolean","description":"Whether the participant has been checked in at the event"},"registration_source":{"type":"integer","description":"How the participant was registered (enum value)"},"sms_opt_in":{"type":"boolean","description":"Whether the participant opted in to SMS notifications"},"signed_waiver_at":{"type":"string","format":"date-time","nullable":true,"description":"When the participant signed the waiver"},"confirmation_page":{"type":"string","format":"uri","description":"URL to the participant's confirmation page"},"created_at":{"type":"string","format":"date-time","description":"Registration timestamp"},"updated_at":{"type":"string","format":"date-time","description":"Last update timestamp"},"event":{"type":"object","description":"Summary of the parent event","required":["handle","name","start_date","event_page_url"],"properties":{"handle":{"type":"string","description":"Event handle"},"name":{"type":"string","description":"Event name"},"start_date":{"type":"string","format":"date-time","nullable":true,"description":"Event start date"},"event_page_url":{"type":"string","format":"uri","description":"Public URL of the event page"}}},"event_variant":{"type":"object","description":"The ticket type / variant the participant registered for","required":["id","name"],"properties":{"id":{"type":"integer","format":"int64","description":"Event variant ID"},"name":{"type":"string","description":"Event variant name"}}},"merchandise_orders":{"type":"array","description":"Merchandise orders placed during registration","items":{"$ref":"#/components/schemas/MerchandiseOrder"}},"custom_question_text_answers":{"type":"array","description":"Answers to custom registration questions","items":{"$ref":"#/components/schemas/CustomQuestionAnswer"}},"financials":{"description":"Per-registration money breakdown, in integer cents. Only present\nwhen the authenticated user is a full admin or owner of the event;\nomitted entirely for other admin roles.\n","$ref":"#/components/schemas/ParticipantFinancials"}}},"MerchandiseOrder":{"type":"object","description":"A merchandise order placed during event registration","required":["id","merchandise_id","merchandise_option_id","athlete_id","confirmation_number","stripe_checkout_id","stripe_receipt_url","stripe_receipt_number","amount_paid_cents","first_name","last_name","email","created_at","updated_at","merchandise","merchandise_option"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"merchandise_id":{"type":"integer","format":"int64","description":"ID of the merchandise item"},"merchandise_option_id":{"type":"integer","format":"int64","nullable":true,"description":"ID of the selected merchandise option (e.g., size)"},"athlete_id":{"type":"integer","format":"int64","nullable":true,"description":"ID of the athlete who placed the order"},"confirmation_number":{"type":"string","description":"Order confirmation number"},"stripe_checkout_id":{"type":"string","description":"Stripe Checkout session ID"},"stripe_receipt_url":{"type":"string","format":"uri","description":"URL to the Stripe payment receipt"},"stripe_receipt_number":{"type":"string","description":"Stripe receipt number"},"amount_paid_cents":{"type":"integer","nullable":true,"description":"Amount paid in cents"},"first_name":{"type":"string","description":"Buyer's first name"},"last_name":{"type":"string","description":"Buyer's last name"},"email":{"type":"string","format":"email","description":"Buyer's email address"},"created_at":{"type":"string","format":"date-time","description":"Order creation timestamp"},"updated_at":{"type":"string","format":"date-time","description":"Last update timestamp"},"merchandise":{"type":"object","description":"The merchandise item","required":["id","name"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}}},"merchandise_option":{"type":"object","description":"The selected option (e.g., size, color)","required":["id","name"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"}}}}},"CustomQuestionAnswer":{"type":"object","description":"A participant's answer to a custom registration question. In addition\nto the standard fields, the response includes a dynamic key derived\nfrom the question title (camelCase) mapped to the answer value.\n","required":["id","question","answer","question_answer","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64","description":"Answer record ID"},"question":{"type":"string","description":"The question text"},"answer":{"type":"string","description":"The participant's answer"},"question_answer":{"type":"object","description":"A single-entry object mapping the question text to the answer","additionalProperties":{"type":"string"}},"created_at":{"type":"string","format":"date-time","description":"Record creation timestamp"},"updated_at":{"type":"string","format":"date-time","description":"Last update timestamp"}}},"ParticipantFinancials":{"type":"object","description":"Per-registration money breakdown, all in integer cents. Each value is\n0 when the corresponding adjustment does not apply to the registration.\n\nThe deductions (`discount_cents`, `credit_cents`, `gift_card_cents`,\n`referral_credit_cents`) are disjoint — a given amount is reported under\nexactly one of them, so they can be summed.\n","required":["discount_cents","credit_cents","gift_card_cents","referral_credit_cents","tax_cents","service_fee_cents"],"properties":{"discount_cents":{"type":"integer","description":"Amount discounted via a redeemed discount code. A discount that came from a\nreferral link is reported under `referral_credit_cents` instead.\n"},"credit_cents":{"type":"integer","description":"Account credit applied to the registration."},"gift_card_cents":{"type":"integer","description":"Gift card value applied to the registration."},"referral_credit_cents":{"type":"integer","description":"Amount discounted because the registrant used a referral link. 0 if they\nreplaced the referral with their own discount code, which is reported\nunder `discount_cents`.\n"},"tax_cents":{"type":"integer","description":"Sales tax charged on the registration."},"service_fee_cents":{"type":"integer","description":"Platform / service fee for the registration (flat plus percentage)."}}},"Error":{"type":"object","description":"A generic error response","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message"}}},"OAuthError":{"type":"object","required":["error"],"properties":{"error":{"type":"string","description":"Machine-readable error code"},"error_description":{"type":"string","description":"Human-readable description of the error"}}}}},"paths":{"/api/v1/events/{handle}/event_participants":{"get":{"tags":["Events"],"summary":"List event participants","description":"Returns participants for an event, ordered by registration date\n(newest first). The authenticated user must be an admin of the event.\n\nResults use cursor (keyset) pagination. A page holds at most 250\nparticipants (`limit` defaults to and is capped at 250). When more\nrows remain, the response includes an opaque `X-Next-Cursor` header;\npass its value back as the `cursor` query parameter to fetch the next\npage. The final page omits the header. The response body is always a\nbare JSON array of participants.\n\nCursor pagination is stable while registrations arrive mid-iteration:\npaging will not skip or duplicate rows the way offset paging can.\n\nEach participant includes nested event details, event variant,\nmerchandise orders, and custom question answers.\n","operationId":"listEventParticipants","parameters":[{"$ref":"#/components/parameters/EventHandle"},{"name":"cursor","in":"query","required":false,"description":"Opaque cursor identifying the page to fetch. Omit for the first\npage; otherwise pass the value of the `X-Next-Cursor` header from\nthe previous response. A malformed cursor returns 400.\n","schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of participants to return. Defaults to 250 and is\ncapped at 250; larger values are clamped to 250.\n","schema":{"type":"integer","minimum":1,"maximum":250,"default":250}}],"responses":{"200":{"description":"A page of event participants","headers":{"X-Next-Cursor":{"description":"Opaque cursor for the next page. Present only when more\nparticipants remain; absent on the final page.\n","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EventParticipant"}}}}},"400":{"description":"Malformed cursor","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Unauthorized - invalid or missing token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthError"}}}},"403":{"description":"Forbidden - user is not an admin of this event","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Event not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}}}
````
