# Models

## The AuthorizationCodeGrantRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"AuthorizationCodeGrantRequest":{"type":"object","required":["grant_type","code","client_id","client_secret","redirect_uri"],"properties":{"grant_type":{"type":"string","enum":["authorization_code"]},"code":{"type":"string","description":"The authorization code received from the authorization endpoint"},"client_id":{"type":"string","description":"Your application's Client ID"},"client_secret":{"type":"string","description":"Your application's Client Secret"},"redirect_uri":{"type":"string","format":"uri","description":"The same redirect URI used in the authorization request"}}}}}}
```

## The RefreshTokenGrantRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"RefreshTokenGrantRequest":{"type":"object","required":["grant_type","refresh_token","client_id","client_secret"],"properties":{"grant_type":{"type":"string","enum":["refresh_token"]},"refresh_token":{"type":"string","description":"The refresh token issued alongside the access token"},"client_id":{"type":"string","description":"Your application's Client ID"},"client_secret":{"type":"string","description":"Your application's Client Secret"}}}}}}
```

## The ClientCredentialsGrantRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"ClientCredentialsGrantRequest":{"type":"object","required":["grant_type","client_id","client_secret"],"properties":{"grant_type":{"type":"string","enum":["client_credentials"]},"client_id":{"type":"string","description":"Your application's Client ID"},"client_secret":{"type":"string","description":"Your application's Client Secret"}}}}}}
```

## The TokenResponse object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"TokenResponse":{"type":"object","required":["access_token","token_type","expires_in","created_at"],"properties":{"access_token":{"type":"string","description":"The access token to use in API requests"},"token_type":{"type":"string","enum":["Bearer"],"description":"Always \"Bearer\""},"expires_in":{"type":"integer","description":"Token lifetime in seconds (default 7200 = 2 hours)"},"refresh_token":{"type":"string","description":"Token used to obtain a new access token when the current one expires. Not present for client_credentials grants."},"created_at":{"type":"integer","description":"Unix timestamp of when the token was created"}}}}}}
```

## The TokenInfo object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"TokenInfo":{"type":"object","required":["scopes","expires_in_seconds","application","created_at"],"properties":{"resource_owner_id":{"type":"integer","format":"int64","description":"The ID of the athlete who authorized the token"},"scopes":{"type":"array","items":{"type":"string"},"description":"List of scopes granted to this token"},"expires_in_seconds":{"type":"integer","description":"Seconds until the token expires"},"application":{"type":"object","properties":{"uid":{"type":"string","description":"The OAuth application's Client ID"}}},"created_at":{"type":"integer","description":"Unix timestamp of when the token was created"}}}}}}
```

## The OAuthError object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"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"}}}}}}
```

## The Athlete object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"Athlete":{"type":"object","description":"A Movemint user account","required":["id","first_name","last_name","email","handle","profile_picture","bio","dob","phone_number","gender_identity","city","state","country","zip_code","street_address","street_address_secondary","emergency_contact_name","emergency_contact_phone_number","event_director","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"first_name":{"type":"string","description":"First name"},"last_name":{"type":"string","description":"Last name"},"email":{"type":"string","format":"email","description":"Email address"},"handle":{"type":"string","description":"Unique handle (username)"},"profile_picture":{"type":"string","format":"uri","description":"URL of the user's profile picture"},"bio":{"type":"string","description":"User biography"},"dob":{"type":"string","format":"date","nullable":true,"description":"Date of birth (YYYY-MM-DD)"},"phone_number":{"type":"string","description":"Phone number"},"gender_identity":{"type":"integer","nullable":true,"description":"Gender identity enum value"},"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"},"street_address":{"type":"string","description":"Street address (line 1)"},"street_address_secondary":{"type":"string","description":"Street address (line 2)"},"emergency_contact_name":{"type":"string","description":"Emergency contact name"},"emergency_contact_phone_number":{"type":"string","description":"Emergency contact phone number"},"event_director":{"type":"boolean","description":"Whether the user is an event director"},"created_at":{"type":"string","format":"date-time","description":"Account creation timestamp"},"updated_at":{"type":"string","format":"date-time","description":"Last update timestamp"}}}}}}
```

## The Event object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"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","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"],"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"},"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"}}}}}}
```

## The EventParticipant object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"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"}}}},"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"}}}}}}
```

## The MerchandiseOrder object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"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"}}}}}}}}
```

## The CustomQuestionAnswer object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"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"}}}}}}
```

## The WebhookSubscription object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"WebhookSubscription":{"type":"object","description":"A webhook subscription that receives event notifications via HTTP POST.\n","required":["id","url","oauth_application_uid","athlete_id","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"url":{"type":"string","format":"uri","description":"The URL that receives webhook POST requests"},"secret":{"type":"string","description":"HMAC-SHA256 signing secret. Use this to verify the `X-Signature`\nheader on incoming webhook deliveries. **This value is only\nreturned when the subscription is first created.** Always present in create response.\n"},"oauth_application_uid":{"type":"string","description":"The UID of the OAuth application this subscription belongs to"},"athlete_id":{"type":"integer","format":"int64","nullable":true,"description":"ID of the athlete who created the subscription"},"created_at":{"type":"string","format":"date-time","description":"Creation timestamp"},"updated_at":{"type":"string","format":"date-time","description":"Last update timestamp"}}}}}}
```

## The WebhookEvent object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"WebhookEvent":{"type":"object","description":"The payload delivered to webhook subscription URLs. Currently the only\nsupported event type is `event.participant.created`.\n","required":["type","data"],"properties":{"type":{"type":"string","description":"The event type identifier","enum":["event.participant.created"]},"data":{"type":"object","required":["object"],"properties":{"object":{"$ref":"#/components/schemas/EventParticipant"}}}}},"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"}}}},"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"}}}}}}
```

## The EventResult object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"EventResult":{"type":"object","description":"A result container for a race within an event (e.g., \"5K\", \"10K\").\nEach event can have multiple event results.\n","required":["id","event_id","event_variant_id","name","result_type","time_precision","finisher_count","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"event_id":{"type":"integer","format":"int64","description":"ID of the parent event"},"event_variant_id":{"type":"integer","format":"int64","nullable":true,"description":"ID of the associated event variant (optional)"},"name":{"type":"string","description":"Name of the result (e.g., \"5K\", \"Half Marathon\")"},"result_type":{"type":"string","description":"Determines division behavior:\n- `irl` — Standard divisions (gender + age groups) auto-created\n- `irl_custom_divisions` — Only gender divisions auto-created; timer provides custom divisions per finisher\n","enum":["irl","irl_custom_divisions"]},"time_precision":{"type":"string","description":"How precisely result times are displayed across the platform.\nUnderlying sub-second data is always preserved regardless of this\nsetting; it only controls display rounding.\n- `full_second` — rounded to the nearest second (default)\n- `tenth_of_second` — rounded to the nearest tenth\n- `hundredth_of_second` — rounded to the nearest hundredth\n","enum":["full_second","tenth_of_second","hundredth_of_second"]},"finisher_count":{"type":"integer","description":"Number of finishers in this result"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}
```

## The EventResultDetail object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"EventResultDetail":{"allOf":[{"$ref":"#/components/schemas/EventResult"},{"type":"object","required":["splits","divisions"],"properties":{"splits":{"type":"array","description":"Split points for this result, ordered by position","items":{"$ref":"#/components/schemas/EventResultSplit"}},"divisions":{"type":"array","description":"Divisions for this result","items":{"$ref":"#/components/schemas/EventResultDivision"}}}}]},"EventResult":{"type":"object","description":"A result container for a race within an event (e.g., \"5K\", \"10K\").\nEach event can have multiple event results.\n","required":["id","event_id","event_variant_id","name","result_type","time_precision","finisher_count","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"event_id":{"type":"integer","format":"int64","description":"ID of the parent event"},"event_variant_id":{"type":"integer","format":"int64","nullable":true,"description":"ID of the associated event variant (optional)"},"name":{"type":"string","description":"Name of the result (e.g., \"5K\", \"Half Marathon\")"},"result_type":{"type":"string","description":"Determines division behavior:\n- `irl` — Standard divisions (gender + age groups) auto-created\n- `irl_custom_divisions` — Only gender divisions auto-created; timer provides custom divisions per finisher\n","enum":["irl","irl_custom_divisions"]},"time_precision":{"type":"string","description":"How precisely result times are displayed across the platform.\nUnderlying sub-second data is always preserved regardless of this\nsetting; it only controls display rounding.\n- `full_second` — rounded to the nearest second (default)\n- `tenth_of_second` — rounded to the nearest tenth\n- `hundredth_of_second` — rounded to the nearest hundredth\n","enum":["full_second","tenth_of_second","hundredth_of_second"]},"finisher_count":{"type":"integer","description":"Number of finishers in this result"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"EventResultSplit":{"type":"object","description":"A split point within an event result. Each result must have at\nleast one split marked as the finish.\n","required":["id","event_result_id","name","position","is_finish","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"event_result_id":{"type":"integer","format":"int64","description":"ID of the parent event result"},"name":{"type":"string","nullable":true,"description":"Name of the split (e.g., \"Mile 1\", \"Finish\")"},"position":{"type":"integer","description":"Order position (0-indexed)"},"is_finish":{"type":"boolean","description":"Whether this split represents the finish line"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"EventResultDivision":{"type":"object","description":"A division within an event result (e.g., \"Male\", \"Female 25 - 29\",\nor a custom division like \"Masters\").\n","required":["id","name","division_type","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"name":{"type":"string","description":"Display name of the division"},"division_type":{"type":"string","description":"Machine-readable division type"},"created_at":{"type":"string","format":"date-time","description":"Record creation timestamp"},"updated_at":{"type":"string","format":"date-time","description":"Last update timestamp"}}}}}}
```

## The EventResultSplit object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"EventResultSplit":{"type":"object","description":"A split point within an event result. Each result must have at\nleast one split marked as the finish.\n","required":["id","event_result_id","name","position","is_finish","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"event_result_id":{"type":"integer","format":"int64","description":"ID of the parent event result"},"name":{"type":"string","nullable":true,"description":"Name of the split (e.g., \"Mile 1\", \"Finish\")"},"position":{"type":"integer","description":"Order position (0-indexed)"},"is_finish":{"type":"boolean","description":"Whether this split represents the finish line"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}
```

## The EventResultDivision object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"EventResultDivision":{"type":"object","description":"A division within an event result (e.g., \"Male\", \"Female 25 - 29\",\nor a custom division like \"Masters\").\n","required":["id","name","division_type","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"name":{"type":"string","description":"Display name of the division"},"division_type":{"type":"string","description":"Machine-readable division type"},"created_at":{"type":"string","format":"date-time","description":"Record creation timestamp"},"updated_at":{"type":"string","format":"date-time","description":"Last update timestamp"}}}}}}
```

## The Finisher object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"Finisher":{"type":"object","description":"An individual finisher in an event result, along with their split\neffort times.\n","required":["id","event_result_id","event_participant_id","first_name","last_name","gender_identity","gender_name","dob","age","bib","city","state","country","zip_code","created_at","updated_at","split_efforts"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"event_result_id":{"type":"integer","format":"int64","description":"ID of the parent event result"},"event_participant_id":{"type":"integer","format":"int64","nullable":true,"description":"ID of the linked event participant (if any)"},"first_name":{"type":"string","description":"First name"},"last_name":{"type":"string","description":"Last name"},"gender_identity":{"type":"integer","nullable":true,"description":"Gender identity enum value (0=Male, 1=Female, 2=Nonbinary, 3=Prefer Not to Say, 4=Unknown)"},"gender_name":{"type":"string","nullable":true,"description":"Human-readable gender name"},"dob":{"type":"string","format":"date","nullable":true,"description":"Date of birth (YYYY-MM-DD)"},"age":{"type":"integer","nullable":true,"description":"Age at event start (computed from DOB)"},"bib":{"type":"string","nullable":true,"description":"Bib number"},"city":{"type":"string","nullable":true},"state":{"type":"integer","nullable":true,"description":"State enum value"},"country":{"type":"integer","nullable":true,"description":"Country enum value"},"zip_code":{"type":"string","nullable":true},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"split_efforts":{"type":"array","description":"Split effort times for this finisher","items":{"$ref":"#/components/schemas/SplitEffort"}}}},"SplitEffort":{"type":"object","description":"A finisher's time at a specific split point","required":["id","event_result_split_id","split_name","is_finish","place","chip_time","clock_time","formatted_time","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"event_result_split_id":{"type":"integer","format":"int64","description":"ID of the split this effort is for"},"split_name":{"type":"string","nullable":true,"description":"Name of the split"},"is_finish":{"type":"boolean","nullable":true,"description":"Whether this is the finish split"},"place":{"type":"integer","nullable":true,"description":"Place/position at this split"},"chip_time":{"type":"number","format":"double","nullable":true,"description":"Chip time in seconds (e.g., 1234.567)"},"clock_time":{"type":"number","format":"double","nullable":true,"description":"Clock/gun time in seconds (e.g., 1236.000)"},"formatted_time":{"type":"string","nullable":true,"description":"Human-readable formatted time (e.g., \"20:34.57\")"},"created_at":{"type":"string","format":"date-time","description":"Record creation timestamp"},"updated_at":{"type":"string","format":"date-time","description":"Last update timestamp"}}}}}}
```

## The SplitEffort object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"SplitEffort":{"type":"object","description":"A finisher's time at a specific split point","required":["id","event_result_split_id","split_name","is_finish","place","chip_time","clock_time","formatted_time","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64","description":"Unique identifier"},"event_result_split_id":{"type":"integer","format":"int64","description":"ID of the split this effort is for"},"split_name":{"type":"string","nullable":true,"description":"Name of the split"},"is_finish":{"type":"boolean","nullable":true,"description":"Whether this is the finish split"},"place":{"type":"integer","nullable":true,"description":"Place/position at this split"},"chip_time":{"type":"number","format":"double","nullable":true,"description":"Chip time in seconds (e.g., 1234.567)"},"clock_time":{"type":"number","format":"double","nullable":true,"description":"Clock/gun time in seconds (e.g., 1236.000)"},"formatted_time":{"type":"string","nullable":true,"description":"Human-readable formatted time (e.g., \"20:34.57\")"},"created_at":{"type":"string","format":"date-time","description":"Record creation timestamp"},"updated_at":{"type":"string","format":"date-time","description":"Last update timestamp"}}}}}}
```

## The EventWritableFields object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"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"}}}}}}
```

## The CreateEventRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CreateEventRequest":{"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"}}}}}}
```

## The UpdateEventRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"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"}}}}}}
```

## The ReadinessIssue object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"ReadinessIssue":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Stable machine-readable code for the issue."},"message":{"type":"string","description":"Human-readable explanation of what to fix."},"sub_event_id":{"type":"integer","format":"int64","description":"Present when the issue is scoped to a specific sub-event."}}}}}}
```

## The ReadinessReport object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"ReadinessReport":{"type":"object","required":["ready","blocking","warnings"],"properties":{"ready":{"type":"boolean","description":"True when there are no blocking issues."},"blocking":{"type":"array","items":{"$ref":"#/components/schemas/ReadinessIssue"}},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/ReadinessIssue"}}}},"ReadinessIssue":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Stable machine-readable code for the issue."},"message":{"type":"string","description":"Human-readable explanation of what to fix."},"sub_event_id":{"type":"integer","format":"int64","description":"Present when the issue is scoped to a specific sub-event."}}}}}}
```

## The EventStatusUpdate object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"EventStatusUpdate":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["draft","live","unlisted","cancelled","archived"]}}}}}}
```

## The ReadinessGatedError object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"ReadinessGatedError":{"type":"object","required":["error"],"properties":{"error":{"type":"string"},"blocking":{"type":"array","items":{"$ref":"#/components/schemas/ReadinessIssue"}},"warnings":{"type":"array","items":{"$ref":"#/components/schemas/ReadinessIssue"}}}},"ReadinessIssue":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Stable machine-readable code for the issue."},"message":{"type":"string","description":"Human-readable explanation of what to fix."},"sub_event_id":{"type":"integer","format":"int64","description":"Present when the issue is scoped to a specific sub-event."}}}}}}
```

## The PricingModelUpdate object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"PricingModelUpdate":{"type":"object","required":["is_free"],"properties":{"is_free":{"type":"boolean","description":"True for a free event, false for a paid event."}}}}}}
```

## The CoverPhotoUpdate object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CoverPhotoUpdate":{"type":"object","required":["marketing_photo_uuid"],"properties":{"marketing_photo_uuid":{"type":"string","description":"UUID of a `ready` photo in the event's marketing album."}}}}}}
```

## The MarketingPhoto object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"MarketingPhoto":{"type":"object","required":["uuid","status","sizes"],"properties":{"uuid":{"type":"string","description":"Stable identifier for the photo across endpoints."},"status":{"type":"string","description":"Lifecycle state. `ready` means processing is complete and the\n`sizes` map is populated; other values indicate the ingest\npipeline is still running.\n"},"sizes":{"type":"object","description":"Map of size name (e.g., `original`, `lg`, `md`, `sm`) to\n`{ url, width, height }`. May be empty/partial while the photo\nis still processing.\n","additionalProperties":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"width":{"type":"integer"},"height":{"type":"integer"}}}}}}}}}
```

## The CreateMarketingPhotoRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CreateMarketingPhotoRequest":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"Publicly accessible image URL."}}}}}}
```

## The ReorderMarketingPhotosRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"ReorderMarketingPhotosRequest":{"type":"object","required":["uuids"],"properties":{"uuids":{"type":"array","description":"Photo UUIDs in the desired display order.","items":{"type":"string"}}}}}}}
```

## The SubEventPrice object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"SubEventPrice":{"type":"object","required":["id","price_cents","price_dollars","is_sliding_scale","close_date","description"],"properties":{"id":{"type":"integer","format":"int64"},"price_cents":{"type":"integer","description":"Tier price in the event's currency, in minor units (cents)."},"price_dollars":{"type":"number","format":"double","description":"Convenience copy of `price_cents` divided by 100."},"is_sliding_scale":{"type":"boolean"},"close_date":{"type":"string","format":"date-time","nullable":true,"description":"When this tier ends. Null on the final/highest tier."},"description":{"type":"string","nullable":true}}}}}}
```

## The SubEvent object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"SubEvent":{"type":"object","required":["id","name","description","start_date","end_date","start_time","end_time","registration_open_date","registration_close_date","order","max_participants","min_age","max_age","allow_race_day_registration","race_day_price_cents","hidden","invite_only","show_spots_remaining","multiple_registration","has_waitlist","waitlist_auto_invite_enabled","waitlist_invite_response_window_hours","waitlist_under_capacity_grace_period_minutes","waitlist_invite_cutoff_at","has_multiple_participants","multi_participant_count","multi_participant_max_count","allowed_gender_ids","registration_code_set","prices"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"start_date":{"type":"string","format":"date","nullable":true},"end_date":{"type":"string","format":"date","nullable":true},"start_time":{"type":"string","nullable":true,"description":"24-hour `HH:MM`."},"end_time":{"type":"string","nullable":true,"description":"24-hour `HH:MM`."},"registration_open_date":{"type":"string","format":"date-time","nullable":true},"registration_close_date":{"type":"string","format":"date-time","nullable":true},"order":{"type":"integer","nullable":true},"max_participants":{"type":"integer","nullable":true},"min_age":{"type":"integer","nullable":true},"max_age":{"type":"integer","nullable":true},"allow_race_day_registration":{"type":"boolean","nullable":true},"race_day_price_cents":{"type":"integer","nullable":true},"hidden":{"type":"boolean","nullable":true},"invite_only":{"type":"boolean","nullable":true},"show_spots_remaining":{"type":"boolean","nullable":true},"multiple_registration":{"type":"boolean","nullable":true},"has_waitlist":{"type":"boolean","nullable":true},"waitlist_auto_invite_enabled":{"type":"boolean","nullable":true},"waitlist_invite_response_window_hours":{"type":"integer","nullable":true},"waitlist_under_capacity_grace_period_minutes":{"type":"integer","nullable":true},"waitlist_invite_cutoff_at":{"type":"string","format":"date-time","nullable":true},"has_multiple_participants":{"type":"boolean","nullable":true},"multi_participant_count":{"type":"integer","nullable":true},"multi_participant_max_count":{"type":"integer","nullable":true},"allowed_gender_ids":{"type":"array","nullable":true,"description":"Array of `GenderIdentity` integer IDs that may register for this\nsub-event. `null` means all genders are allowed.\n","items":{"type":"integer"}},"registration_code_set":{"type":"boolean","description":"Whether a private registration code is configured."},"prices":{"type":"array","items":{"$ref":"#/components/schemas/SubEventPrice"}}}},"SubEventPrice":{"type":"object","required":["id","price_cents","price_dollars","is_sliding_scale","close_date","description"],"properties":{"id":{"type":"integer","format":"int64"},"price_cents":{"type":"integer","description":"Tier price in the event's currency, in minor units (cents)."},"price_dollars":{"type":"number","format":"double","description":"Convenience copy of `price_cents` divided by 100."},"is_sliding_scale":{"type":"boolean"},"close_date":{"type":"string","format":"date-time","nullable":true,"description":"When this tier ends. Null on the final/highest tier."},"description":{"type":"string","nullable":true}}}}}}
```

## The SubEventPriceTierInput object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"SubEventPriceTierInput":{"type":"object","description":"One pricing tier. Provide either `price_cents` or `price_dollars`\n(not both). Tiers without a `close_date` represent the final /\nhighest tier.\n","properties":{"price_cents":{"type":"integer"},"price_dollars":{"type":"number","format":"double"},"is_sliding_scale":{"type":"boolean"},"close_date":{"type":"string","format":"date-time","nullable":true},"description":{"type":"string","nullable":true}}}}}}
```

## The SubEventWritableFields object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"SubEventWritableFields":{"type":"object","description":"Fields accepted by sub-event create/update. Direct date/time fields\naccept ISO-8601 strings (`YYYY-MM-DD` for dates, `HH:MM` for\ntimes-of-day, full ISO-8601 for datetimes).\n\n**Pricing.** Send `prices` for tiered pricing, OR `price_cents` /\n`price_dollars` as a single-tier shorthand. Supplying any of these\nreplaces the existing tier set entirely.\n\n**Gender restrictions.** `allowed_gender_ids` is an array of\n`GenderIdentity` integer IDs. Empty / omitted means \"all allowed\".\n","properties":{"name":{"type":"string"},"description":{"type":"string"},"start_date":{"type":"string","format":"date"},"end_date":{"type":"string","format":"date"},"start_time":{"type":"string","description":"24-hour `HH:MM`."},"end_time":{"type":"string","description":"24-hour `HH:MM`."},"registration_open_date":{"type":"string","format":"date-time"},"registration_close_date":{"type":"string","format":"date-time"},"max_participants":{"type":"integer","nullable":true},"min_age":{"type":"integer","nullable":true},"max_age":{"type":"integer","nullable":true},"allow_race_day_registration":{"type":"boolean"},"race_day_price":{"type":"integer","description":"Race-day price in minor units (cents)."},"race_day_price_cents":{"type":"integer"},"race_day_price_dollars":{"type":"number","format":"double"},"hidden":{"type":"boolean"},"invite_only":{"type":"boolean"},"show_spots_remaining":{"type":"boolean"},"multiple_registration":{"type":"boolean"},"has_waitlist":{"type":"boolean"},"waitlist_auto_invite_enabled":{"type":"boolean"},"waitlist_invite_response_window_hours":{"type":"integer","nullable":true},"waitlist_under_capacity_grace_period_minutes":{"type":"integer","nullable":true},"waitlist_invite_cutoff_at":{"type":"string","format":"date-time","nullable":true},"has_multiple_participants":{"type":"boolean"},"multi_participant_count":{"type":"integer","nullable":true},"multi_participant_max_count":{"type":"integer","nullable":true},"registration_code":{"type":"string","description":"Empty string clears."},"allowed_gender_ids":{"type":"array","items":{"type":"integer"}},"prices":{"type":"array","items":{"$ref":"#/components/schemas/SubEventPriceTierInput"}},"price_cents":{"type":"integer","description":"Single-tier shorthand. Mutually exclusive with `prices`."},"price_dollars":{"type":"number","format":"double","description":"Single-tier shorthand. Mutually exclusive with `prices`."}}},"SubEventPriceTierInput":{"type":"object","description":"One pricing tier. Provide either `price_cents` or `price_dollars`\n(not both). Tiers without a `close_date` represent the final /\nhighest tier.\n","properties":{"price_cents":{"type":"integer"},"price_dollars":{"type":"number","format":"double"},"is_sliding_scale":{"type":"boolean"},"close_date":{"type":"string","format":"date-time","nullable":true},"description":{"type":"string","nullable":true}}}}}}
```

## The CreateSubEventRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CreateSubEventRequest":{"allOf":[{"$ref":"#/components/schemas/SubEventWritableFields"},{"type":"object","required":["name"]}]},"SubEventWritableFields":{"type":"object","description":"Fields accepted by sub-event create/update. Direct date/time fields\naccept ISO-8601 strings (`YYYY-MM-DD` for dates, `HH:MM` for\ntimes-of-day, full ISO-8601 for datetimes).\n\n**Pricing.** Send `prices` for tiered pricing, OR `price_cents` /\n`price_dollars` as a single-tier shorthand. Supplying any of these\nreplaces the existing tier set entirely.\n\n**Gender restrictions.** `allowed_gender_ids` is an array of\n`GenderIdentity` integer IDs. Empty / omitted means \"all allowed\".\n","properties":{"name":{"type":"string"},"description":{"type":"string"},"start_date":{"type":"string","format":"date"},"end_date":{"type":"string","format":"date"},"start_time":{"type":"string","description":"24-hour `HH:MM`."},"end_time":{"type":"string","description":"24-hour `HH:MM`."},"registration_open_date":{"type":"string","format":"date-time"},"registration_close_date":{"type":"string","format":"date-time"},"max_participants":{"type":"integer","nullable":true},"min_age":{"type":"integer","nullable":true},"max_age":{"type":"integer","nullable":true},"allow_race_day_registration":{"type":"boolean"},"race_day_price":{"type":"integer","description":"Race-day price in minor units (cents)."},"race_day_price_cents":{"type":"integer"},"race_day_price_dollars":{"type":"number","format":"double"},"hidden":{"type":"boolean"},"invite_only":{"type":"boolean"},"show_spots_remaining":{"type":"boolean"},"multiple_registration":{"type":"boolean"},"has_waitlist":{"type":"boolean"},"waitlist_auto_invite_enabled":{"type":"boolean"},"waitlist_invite_response_window_hours":{"type":"integer","nullable":true},"waitlist_under_capacity_grace_period_minutes":{"type":"integer","nullable":true},"waitlist_invite_cutoff_at":{"type":"string","format":"date-time","nullable":true},"has_multiple_participants":{"type":"boolean"},"multi_participant_count":{"type":"integer","nullable":true},"multi_participant_max_count":{"type":"integer","nullable":true},"registration_code":{"type":"string","description":"Empty string clears."},"allowed_gender_ids":{"type":"array","items":{"type":"integer"}},"prices":{"type":"array","items":{"$ref":"#/components/schemas/SubEventPriceTierInput"}},"price_cents":{"type":"integer","description":"Single-tier shorthand. Mutually exclusive with `prices`."},"price_dollars":{"type":"number","format":"double","description":"Single-tier shorthand. Mutually exclusive with `prices`."}}},"SubEventPriceTierInput":{"type":"object","description":"One pricing tier. Provide either `price_cents` or `price_dollars`\n(not both). Tiers without a `close_date` represent the final /\nhighest tier.\n","properties":{"price_cents":{"type":"integer"},"price_dollars":{"type":"number","format":"double"},"is_sliding_scale":{"type":"boolean"},"close_date":{"type":"string","format":"date-time","nullable":true},"description":{"type":"string","nullable":true}}}}}}
```

## The UpdateSubEventRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"UpdateSubEventRequest":{"$ref":"#/components/schemas/SubEventWritableFields"},"SubEventWritableFields":{"type":"object","description":"Fields accepted by sub-event create/update. Direct date/time fields\naccept ISO-8601 strings (`YYYY-MM-DD` for dates, `HH:MM` for\ntimes-of-day, full ISO-8601 for datetimes).\n\n**Pricing.** Send `prices` for tiered pricing, OR `price_cents` /\n`price_dollars` as a single-tier shorthand. Supplying any of these\nreplaces the existing tier set entirely.\n\n**Gender restrictions.** `allowed_gender_ids` is an array of\n`GenderIdentity` integer IDs. Empty / omitted means \"all allowed\".\n","properties":{"name":{"type":"string"},"description":{"type":"string"},"start_date":{"type":"string","format":"date"},"end_date":{"type":"string","format":"date"},"start_time":{"type":"string","description":"24-hour `HH:MM`."},"end_time":{"type":"string","description":"24-hour `HH:MM`."},"registration_open_date":{"type":"string","format":"date-time"},"registration_close_date":{"type":"string","format":"date-time"},"max_participants":{"type":"integer","nullable":true},"min_age":{"type":"integer","nullable":true},"max_age":{"type":"integer","nullable":true},"allow_race_day_registration":{"type":"boolean"},"race_day_price":{"type":"integer","description":"Race-day price in minor units (cents)."},"race_day_price_cents":{"type":"integer"},"race_day_price_dollars":{"type":"number","format":"double"},"hidden":{"type":"boolean"},"invite_only":{"type":"boolean"},"show_spots_remaining":{"type":"boolean"},"multiple_registration":{"type":"boolean"},"has_waitlist":{"type":"boolean"},"waitlist_auto_invite_enabled":{"type":"boolean"},"waitlist_invite_response_window_hours":{"type":"integer","nullable":true},"waitlist_under_capacity_grace_period_minutes":{"type":"integer","nullable":true},"waitlist_invite_cutoff_at":{"type":"string","format":"date-time","nullable":true},"has_multiple_participants":{"type":"boolean"},"multi_participant_count":{"type":"integer","nullable":true},"multi_participant_max_count":{"type":"integer","nullable":true},"registration_code":{"type":"string","description":"Empty string clears."},"allowed_gender_ids":{"type":"array","items":{"type":"integer"}},"prices":{"type":"array","items":{"$ref":"#/components/schemas/SubEventPriceTierInput"}},"price_cents":{"type":"integer","description":"Single-tier shorthand. Mutually exclusive with `prices`."},"price_dollars":{"type":"number","format":"double","description":"Single-tier shorthand. Mutually exclusive with `prices`."}}},"SubEventPriceTierInput":{"type":"object","description":"One pricing tier. Provide either `price_cents` or `price_dollars`\n(not both). Tiers without a `close_date` represent the final /\nhighest tier.\n","properties":{"price_cents":{"type":"integer"},"price_dollars":{"type":"number","format":"double"},"is_sliding_scale":{"type":"boolean"},"close_date":{"type":"string","format":"date-time","nullable":true},"description":{"type":"string","nullable":true}}}}}}
```

## The CreateEventResultRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CreateEventResultRequest":{"type":"object","required":["event_result"],"properties":{"event_result":{"type":"object","required":["name","result_type"],"properties":{"name":{"type":"string","description":"Name of the result (e.g., \"5K\")"},"result_type":{"type":"string","enum":["irl","irl_custom_divisions"],"description":"Division mode"},"event_variant_id":{"type":"integer","format":"int64","description":"Optional event variant to associate"},"time_precision":{"type":"string","enum":["full_second","tenth_of_second","hundredth_of_second"],"description":"Display precision for result times (defaults to full_second)"},"splits":{"type":"array","description":"Inline splits to create with the result","items":{"type":"object","required":["position","is_finish"],"properties":{"name":{"type":"string"},"position":{"type":"integer"},"is_finish":{"type":"boolean"}}}}}}}}}}}
```

## The UpdateEventResultRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"UpdateEventResultRequest":{"type":"object","required":["event_result"],"properties":{"event_result":{"type":"object","properties":{"name":{"type":"string"},"event_variant_id":{"type":"integer","format":"int64"},"time_precision":{"type":"string","enum":["full_second","tenth_of_second","hundredth_of_second"],"description":"Display precision for result times"}}}}}}}}
```

## The CreateSplitRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CreateSplitRequest":{"type":"object","required":["split"],"properties":{"split":{"type":"object","required":["position","is_finish"],"properties":{"name":{"type":"string"},"position":{"type":"integer"},"is_finish":{"type":"boolean"}}}}}}}}
```

## The CreateFinisherRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CreateFinisherRequest":{"type":"object","required":["finisher"],"properties":{"finisher":{"type":"object","required":["first_name","last_name"],"properties":{"first_name":{"type":"string","description":"First name"},"last_name":{"type":"string","description":"Last name"},"movemint_confirmation_number":{"type":"string","description":"Movemint registration confirmation number. If provided, the\nfinisher is automatically linked to the matching event\nparticipant and their metadata (name, gender, DOB, address,\netc.) is copied to fill in any fields not explicitly provided\nby the timer.\n"},"gender":{"oneOf":[{"type":"string","description":"Gender string (male, female, nonbinary, m, f, x)"},{"type":"integer","description":"Gender identity integer (0=Male, 1=Female, 2=Nonbinary)"}]},"dob":{"type":"string","format":"date","description":"Date of birth (YYYY-MM-DD)"},"bib":{"type":"string","description":"Bib number. If `movemint_confirmation_number` is not provided,\nthe system will attempt to link the finisher to an event\nparticipant by bib number (only if exactly one participant\nmatches).\n"},"city":{"type":"string"},"address":{"type":"string"},"state":{"type":"integer","description":"State enum value"},"country":{"type":"integer","description":"Country enum value"},"zip_code":{"type":"string"},"chip_number":{"type":"string"},"split_efforts":{"type":"array","description":"Split effort times","items":{"type":"object","required":["event_result_split_id"],"properties":{"event_result_split_id":{"type":"integer","format":"int64","description":"ID of the split to record time for"},"place":{"type":"integer","description":"Place/position at this split"},"chip_time":{"type":"number","format":"double","description":"Chip time in seconds"},"clock_time":{"type":"number","format":"double","description":"Clock/gun time in seconds"}}}},"divisions":{"type":"array","description":"Custom division names (only used when result_type is\n`irl_custom_divisions`). Ignored for `irl` results.\n","items":{"type":"string"}}}}}}}}}
```

## The TransferSettings object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"TransferSettings":{"type":"object","required":["allow_transfers","allow_event_variant_transfers","close_date","price_cents","price_dollars"],"properties":{"allow_transfers":{"type":"boolean","description":"Whether participant-to-participant transfers are enabled."},"allow_event_variant_transfers":{"type":"boolean","description":"Whether participants may also transfer between sub-events (distances)."},"close_date":{"type":"string","format":"date-time","nullable":true,"description":"ISO datetime after which transfers stop. Defaults to registration close when null."},"price_cents":{"type":"integer","nullable":true,"description":"Transfer fee in cents. Null when no fee row exists."},"price_dollars":{"type":"number","nullable":true,"description":"Transfer fee in dollars (computed from price_cents)."}}}}}}
```

## The TransferSettingsUpdate object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"TransferSettingsUpdate":{"type":"object","properties":{"allow_transfers":{"type":"boolean"},"allow_event_variant_transfers":{"type":"boolean"},"price_cents":{"type":"integer","minimum":0,"description":"Transfer fee in cents. 0 clears the fee row."},"price_dollars":{"type":"number","minimum":0,"description":"Alternative to price_cents."},"close_date":{"type":"string","format":"date-time","nullable":true}}}}}}
```

## The DeferralSchedule object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"DeferralSchedule":{"type":"object","required":["id","defer_to_event_id","defer_to_group_id","valid_until","timezone","discount_type","discount_amount"],"properties":{"id":{"type":"integer","format":"int64"},"defer_to_event_id":{"type":"integer","format":"int64","nullable":true,"description":"Event id participants get credit for, or null if the credit goes to a Group."},"defer_to_group_id":{"type":"integer","format":"int64","nullable":true,"description":"Group id participants get credit for, or null when defer_to_event_id is set."},"valid_until":{"type":"string","format":"date-time","nullable":true,"description":"Cutoff datetime for accepting deferral requests."},"timezone":{"type":"string","nullable":true,"description":"IANA timezone of the schedule."},"discount_type":{"type":"string","enum":["percentage","fixed_amount"]},"discount_amount":{"type":"integer","description":"0–100 when discount_type=percentage, integer cents when fixed_amount."}}}}}}
```

## The DeferralScheduleUpdate object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"DeferralScheduleUpdate":{"type":"object","properties":{"allow_deferrals":{"type":"boolean","description":"Pass false to delete all deferral schedules for the event."},"defer_to_event_id":{"type":"integer","format":"int64","nullable":true,"description":"Required (when allow_deferrals is not false). Event id the participant will get credit for."},"valid_until":{"type":"string","format":"date-time","nullable":true},"timezone":{"type":"string","nullable":true},"discount_type":{"type":"string","enum":["percentage","fixed_amount"]},"discount_amount":{"type":"number","description":"0–100 when percentage; integer cents when fixed_amount."}}}}}}
```

## The Tag object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"Tag":{"type":"object","required":["id","group","name","icon_name"],"properties":{"id":{"type":"integer","format":"int64"},"group":{"type":"string","enum":["activity_type","event_type","maternity_and_family","adaptability"]},"name":{"type":"string"},"icon_name":{"type":"string","nullable":true}}}}}}
```

## The Tagging object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"Tagging":{"type":"object","required":["id","tag_id","group","name"],"properties":{"id":{"type":"integer","format":"int64"},"tag_id":{"type":"integer","format":"int64"},"group":{"type":"string","enum":["activity_type","event_type","maternity_and_family","adaptability"]},"name":{"type":"string"}}}}}}
```

## The AttachTagRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"AttachTagRequest":{"type":"object","description":"Provide either {group, name} or {tag_id}.","properties":{"group":{"type":"string","enum":["activity_type","event_type","maternity_and_family","adaptability"]},"name":{"type":"string"},"tag_id":{"type":"integer","format":"int64"}}}}}}
```

## The ReplaceTaggingsRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"ReplaceTaggingsRequest":{"type":"object","required":["tags"],"properties":{"tags":{"type":"array","items":{"type":"object","required":["group","name"],"properties":{"group":{"type":"string","enum":["activity_type","event_type","maternity_and_family","adaptability"]},"name":{"type":"string"}}}}}}}}}
```

## The CustomQuestionOption object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CustomQuestionOption":{"type":"object","required":["id","label"],"properties":{"id":{"type":"integer","format":"int64"},"label":{"type":"string"}}}}}}
```

## The CustomQuestion object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CustomQuestion":{"type":"object","required":["id","question_id","title","question_type","required","order","starts_at","ends_at","options"],"properties":{"id":{"type":"integer","format":"int64","description":"TransactableCustomQuestion id (the link row, used for update/delete)."},"question_id":{"type":"integer","format":"int64"},"title":{"type":"string"},"question_type":{"type":"string","enum":["text","multiple_choice","time_hr_min_second","time_min_second","usat_registration_id"]},"required":{"type":"boolean"},"order":{"type":"integer"},"starts_at":{"type":"string","format":"date-time","nullable":true},"ends_at":{"type":"string","format":"date-time","nullable":true},"options":{"type":"array","items":{"$ref":"#/components/schemas/CustomQuestionOption"}}}},"CustomQuestionOption":{"type":"object","required":["id","label"],"properties":{"id":{"type":"integer","format":"int64"},"label":{"type":"string"}}}}}}
```

## The CreateQuestionRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CreateQuestionRequest":{"type":"object","required":["title","question_type"],"properties":{"title":{"type":"string"},"question_type":{"type":"string","enum":["text","multiple_choice","time_hr_min_second","time_min_second","usat_registration_id"]},"required":{"type":"boolean"},"options":{"type":"array","items":{"type":"string"}},"starts_at":{"type":"string","format":"date-time"},"ends_at":{"type":"string","format":"date-time"}}}}}}
```

## The UpdateQuestionRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"UpdateQuestionRequest":{"type":"object","properties":{"title":{"type":"string"},"question_type":{"type":"string","enum":["text","multiple_choice","time_hr_min_second","time_min_second","usat_registration_id"]},"required":{"type":"boolean"},"options":{"type":"array","items":{"type":"string"}},"starts_at":{"type":"string","format":"date-time"},"ends_at":{"type":"string","format":"date-time"}}}}}}
```

## The VolunteerTimeSlot object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"VolunteerTimeSlot":{"type":"object","required":["id","start_datetime","end_datetime","limit"],"properties":{"id":{"type":"integer","format":"int64"},"start_datetime":{"type":"string","format":"date-time","nullable":true},"end_datetime":{"type":"string","format":"date-time","nullable":true},"limit":{"type":"integer","nullable":true}}}}}}
```

## The VolunteerCategory object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"VolunteerCategory":{"type":"object","required":["id","name","description","limit","active","volunteer_count","time_slots"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"limit":{"type":"integer","nullable":true},"active":{"type":"boolean"},"volunteer_count":{"type":"integer"},"time_slots":{"type":"array","items":{"$ref":"#/components/schemas/VolunteerTimeSlot"}}}},"VolunteerTimeSlot":{"type":"object","required":["id","start_datetime","end_datetime","limit"],"properties":{"id":{"type":"integer","format":"int64"},"start_datetime":{"type":"string","format":"date-time","nullable":true},"end_datetime":{"type":"string","format":"date-time","nullable":true},"limit":{"type":"integer","nullable":true}}}}}}
```

## The CreateVolunteerCategoryRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CreateVolunteerCategoryRequest":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"limit":{"type":"integer","minimum":0},"active":{"type":"boolean"}}}}}}
```

## The UpdateVolunteerCategoryRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"UpdateVolunteerCategoryRequest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"limit":{"type":"integer","minimum":0},"active":{"type":"boolean"}}}}}}
```

## The CreateVolunteerTimeSlotRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CreateVolunteerTimeSlotRequest":{"type":"object","required":["start_datetime","end_datetime"],"properties":{"start_datetime":{"type":"string","format":"date-time"},"end_datetime":{"type":"string","format":"date-time"},"limit":{"type":"integer","minimum":0}}}}}}
```

## The UpdateVolunteerTimeSlotRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"UpdateVolunteerTimeSlotRequest":{"type":"object","properties":{"start_datetime":{"type":"string","format":"date-time"},"end_datetime":{"type":"string","format":"date-time"},"limit":{"type":"integer","minimum":0}}}}}}
```

## The Discount object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"Discount":{"type":"object","required":["id","redemption_code","percentage_off","fixed_amount_off_cents","fixed_amount_off_dollars","times_redeemable","times_redeemed","redeem_by","description","minimum_event_participant_count","eligible_event_variant_ids"],"properties":{"id":{"type":"integer","format":"int64"},"redemption_code":{"type":"string"},"percentage_off":{"type":"integer","nullable":true},"fixed_amount_off_cents":{"type":"integer","nullable":true},"fixed_amount_off_dollars":{"type":"number","nullable":true},"times_redeemable":{"type":"integer","nullable":true},"times_redeemed":{"type":"integer"},"redeem_by":{"type":"string","format":"date-time","nullable":true},"description":{"type":"string","nullable":true},"minimum_event_participant_count":{"type":"integer","nullable":true},"eligible_event_variant_ids":{"type":"array","items":{"type":"integer","format":"int64"}}}}}}}
```

## The CreateDiscountRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CreateDiscountRequest":{"type":"object","required":["redemption_code"],"properties":{"redemption_code":{"type":"string"},"percentage_off":{"type":"integer","minimum":1,"maximum":100},"fixed_amount_off_cents":{"type":"integer","minimum":1},"times_redeemable":{"type":"integer","minimum":0},"redeem_by":{"type":"string","format":"date-time"},"description":{"type":"string"},"minimum_event_participant_count":{"type":"integer","minimum":0},"eligible_event_variant_ids":{"type":"array","items":{"type":"integer"}}}}}}}
```

## The UpdateDiscountRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"UpdateDiscountRequest":{"type":"object","properties":{"redemption_code":{"type":"string"},"percentage_off":{"type":"integer","minimum":1,"maximum":100},"fixed_amount_off_cents":{"type":"integer","minimum":1},"times_redeemable":{"type":"integer","minimum":0},"redeem_by":{"type":"string","format":"date-time"},"description":{"type":"string"},"eligible_event_variant_ids":{"type":"array","items":{"type":"integer"}}}}}}}
```

## The Wave object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"Wave":{"type":"object","required":["id","name","position","public","start_time","max_participants","gender_identity","gender_name","assigned_count","remaining_capacity","event_variant_ids","transactable_custom_question_id","min_time_seconds","max_time_seconds","created_at","updated_at"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"position":{"type":"integer"},"public":{"type":"boolean","description":"Public waves are the ones bulk/auto-assignment fills."},"start_time":{"type":"string","format":"date-time","nullable":true},"max_participants":{"type":"integer","nullable":true,"description":"Capacity cap; null means unlimited."},"gender_identity":{"type":"integer","nullable":true,"description":"Gender restriction (0=Male, 1=Female, 2=Nonbinary, 3=Prefer Not to Say). Null = no restriction."},"gender_name":{"type":"string","nullable":true},"assigned_count":{"type":"integer"},"remaining_capacity":{"type":"integer","nullable":true},"event_variant_ids":{"type":"array","description":"Linked sub-event ids. Empty means the wave applies to every sub-event (shared).","items":{"type":"integer","format":"int64"}},"transactable_custom_question_id":{"type":"integer","format":"int64","nullable":true,"description":"Time-based custom question that gates eligibility, when set."},"min_time_seconds":{"type":"integer","nullable":true},"max_time_seconds":{"type":"integer","nullable":true},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}}}}}
```

## The WaveWritableFields object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"WaveWritableFields":{"type":"object","properties":{"public":{"type":"boolean"},"start_time":{"type":"string","format":"date-time"},"max_participants":{"type":"integer","minimum":1},"gender_identity":{"type":"integer","enum":[0,1,2,3],"description":"0=Male, 1=Female, 2=Nonbinary, 3=Prefer Not to Say."},"position":{"type":"integer"},"transactable_custom_question_id":{"type":"integer","format":"int64","description":"Required if you set min/max time bounds. Clearing it clears the bounds."},"min_time_seconds":{"type":"integer","minimum":0},"max_time_seconds":{"type":"integer","minimum":0},"event_variant_ids":{"type":"array","description":"Sub-event ids to link. Replace-not-merge. Pass [] for a shared wave.","items":{"type":"integer","format":"int64"}}}}}}}
```

## The CreateWaveRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CreateWaveRequest":{"allOf":[{"$ref":"#/components/schemas/WaveWritableFields"},{"type":"object","required":["name"],"properties":{"name":{"type":"string"}}}]},"WaveWritableFields":{"type":"object","properties":{"public":{"type":"boolean"},"start_time":{"type":"string","format":"date-time"},"max_participants":{"type":"integer","minimum":1},"gender_identity":{"type":"integer","enum":[0,1,2,3],"description":"0=Male, 1=Female, 2=Nonbinary, 3=Prefer Not to Say."},"position":{"type":"integer"},"transactable_custom_question_id":{"type":"integer","format":"int64","description":"Required if you set min/max time bounds. Clearing it clears the bounds."},"min_time_seconds":{"type":"integer","minimum":0},"max_time_seconds":{"type":"integer","minimum":0},"event_variant_ids":{"type":"array","description":"Sub-event ids to link. Replace-not-merge. Pass [] for a shared wave.","items":{"type":"integer","format":"int64"}}}}}}}
```

## The UpdateWaveRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"UpdateWaveRequest":{"allOf":[{"$ref":"#/components/schemas/WaveWritableFields"},{"type":"object","properties":{"name":{"type":"string"}}}]},"WaveWritableFields":{"type":"object","properties":{"public":{"type":"boolean"},"start_time":{"type":"string","format":"date-time"},"max_participants":{"type":"integer","minimum":1},"gender_identity":{"type":"integer","enum":[0,1,2,3],"description":"0=Male, 1=Female, 2=Nonbinary, 3=Prefer Not to Say."},"position":{"type":"integer"},"transactable_custom_question_id":{"type":"integer","format":"int64","description":"Required if you set min/max time bounds. Clearing it clears the bounds."},"min_time_seconds":{"type":"integer","minimum":0},"max_time_seconds":{"type":"integer","minimum":0},"event_variant_ids":{"type":"array","description":"Sub-event ids to link. Replace-not-merge. Pass [] for a shared wave.","items":{"type":"integer","format":"int64"}}}}}}}
```

## The WaveAssignment object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"WaveAssignment":{"type":"object","required":["participant_id","wave_id","wave_number"],"properties":{"participant_id":{"type":"integer","format":"int64"},"wave_id":{"type":"integer","format":"int64"},"wave_number":{"type":"string","nullable":true}}}}}}
```

## The AssignParticipantRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"AssignParticipantRequest":{"type":"object","required":["participant_id","wave_id"],"properties":{"participant_id":{"type":"integer","format":"int64"},"wave_id":{"type":"integer","format":"int64"},"wave_number":{"type":"string","description":"Optional number within the wave. Auto-assigned when the event uses auto wave numbers and none is given."}}}}}}
```

## The BulkWaveAssignmentRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"BulkWaveAssignmentRequest":{"type":"object","required":["assignments"],"properties":{"assignments":{"type":"array","minItems":1,"items":{"type":"object","description":"Identify the participant by id OR confirmation_number, and the wave by id OR name.","properties":{"participant_id":{"type":"integer","format":"int64"},"confirmation_number":{"type":"string"},"wave_id":{"type":"integer","format":"int64"},"wave_name":{"type":"string"},"wave_number":{"type":"string"}}}}}}}}}
```

## The WaveGenerationRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"WaveGenerationRequest":{"type":"object","properties":{"ordering":{"type":"string","enum":["registration_date","custom_question","name","age","random"],"description":"How candidates are ordered before filling waves. Defaults to registration_date."},"direction":{"type":"string","enum":["asc","desc"],"description":"asc fills front waves with earliest/fastest first. Defaults to asc."},"gender_mode":{"type":"string","enum":["none","separate_waves","order_within"]},"transactable_custom_question_id":{"type":"integer","format":"int64","description":"Required when ordering=custom_question. Orders by the answer to this time-based question."},"assign_wave_numbers":{"type":"boolean","description":"Defaults to the event's auto_assign_wave_numbers setting."},"overwrite":{"type":"boolean","description":"Re-assign everyone (clears existing public-wave assignments first). Defaults to false (fill unassigned only)."},"dry_run":{"type":"boolean","description":"Preview the result without persisting."}}}}}}
```

## The WaveGenerationResult object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"WaveGenerationResult":{"type":"object","required":["assigned_count","overflow_count","dry_run","wave_summaries"],"properties":{"assigned_count":{"type":"integer"},"overflow_count":{"type":"integer"},"dry_run":{"type":"boolean"},"wave_summaries":{"type":"array","items":{"type":"object","required":["id","name","newly_assigned","existing_assigned","capacity"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"newly_assigned":{"type":"integer"},"existing_assigned":{"type":"integer"},"capacity":{"type":"integer","nullable":true}}}}}}}}}
```

## The WaveSettings object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"WaveSettings":{"type":"object","required":["uses_wave_numbers","auto_assign_wave_numbers","sub_events"],"properties":{"uses_wave_numbers":{"type":"boolean"},"auto_assign_wave_numbers":{"type":"boolean"},"sub_events":{"type":"array","items":{"type":"object","required":["id","name","auto_assign_waves"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"auto_assign_waves":{"type":"boolean"}}}}}}}}}
```

## The WaveSettingsUpdateRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"WaveSettingsUpdateRequest":{"type":"object","properties":{"uses_wave_numbers":{"type":"boolean"},"auto_assign_wave_numbers":{"type":"boolean"},"variant_settings":{"type":"object","description":"Map of sub-event id (string) to a boolean auto_assign_waves flag.","additionalProperties":{"type":"boolean"}}}}}}}
```

## The WaveParticipantList object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"WaveParticipantList":{"type":"object","required":["participants","total_count","page","per_page","total_pages"],"properties":{"participants":{"type":"array","items":{"type":"object","required":["id","first_name","last_name","email","confirmation_number","event_variant_id","wave_assignment"],"properties":{"id":{"type":"integer","format":"int64"},"first_name":{"type":"string","nullable":true},"last_name":{"type":"string","nullable":true},"email":{"type":"string","nullable":true},"confirmation_number":{"type":"string","nullable":true},"event_variant_id":{"type":"integer","format":"int64"},"wave_assignment":{"type":"object","nullable":true,"required":["wave_id","wave_name","wave_number"],"properties":{"wave_id":{"type":"integer","format":"int64"},"wave_name":{"type":"string","nullable":true},"wave_number":{"type":"string","nullable":true}}}}}},"total_count":{"type":"integer"},"page":{"type":"integer"},"per_page":{"type":"integer"},"total_pages":{"type":"integer"}}}}}}
```

## The ReferralPolicy object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"ReferralPolicy":{"type":"object","required":["id","active","referrer_cents","referrer_dollars","referee_cents","referee_dollars"],"properties":{"id":{"type":"integer","format":"int64"},"active":{"type":"boolean"},"referrer_cents":{"type":"integer"},"referrer_dollars":{"type":"number"},"referee_cents":{"type":"integer"},"referee_dollars":{"type":"number"}}}}}}
```

## The ReferralPolicyUpdate object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"ReferralPolicyUpdate":{"type":"object","properties":{"active":{"type":"boolean"},"referrer_cents":{"type":"integer","minimum":0},"referee_cents":{"type":"integer","minimum":0}}}}}}
```

## The Sponsor object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"Sponsor":{"type":"object","required":["id","sponsor_id","name","url","featured","order","logo_url"],"properties":{"id":{"type":"integer","format":"int64","description":"EventsSponsor link id (used for update/delete)."},"sponsor_id":{"type":"integer","format":"int64"},"name":{"type":"string"},"url":{"type":"string","nullable":true},"featured":{"type":"boolean"},"order":{"type":"integer","nullable":true},"logo_url":{"type":"string","nullable":true}}}}}}
```

## The CreateSponsorRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CreateSponsorRequest":{"type":"object","required":["name","logo_url"],"properties":{"name":{"type":"string"},"url":{"type":"string"},"logo_url":{"type":"string","format":"uri"},"featured":{"type":"boolean"}}}}}}
```

## The UpdateSponsorRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"UpdateSponsorRequest":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"logo_url":{"type":"string","format":"uri"},"featured":{"type":"boolean"}}}}}}
```

## The DonationCategory object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"DonationCategory":{"type":"object","required":["id","name","description","website","active","donation_goal_cents","order","suggested_amounts_dollars","default_amount_dollars","logo_attached","stripe_product_id"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"website":{"type":"string","nullable":true},"active":{"type":"boolean"},"donation_goal_cents":{"type":"integer","nullable":true},"order":{"type":"integer","nullable":true},"suggested_amounts_dollars":{"type":"array","items":{"type":"number"}},"default_amount_dollars":{"type":"number","nullable":true},"logo_attached":{"type":"boolean"},"stripe_product_id":{"type":"string","nullable":true}}}}}}
```

## The CreateDonationCategoryRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CreateDonationCategoryRequest":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"website":{"type":"string"},"active":{"type":"boolean"},"donation_goal_cents":{"type":"integer","minimum":0},"logo_url":{"type":"string","format":"uri"},"suggested_amounts_dollars":{"type":"array","items":{"type":"number"}},"default_amount_dollars":{"type":"number"}}}}}}
```

## The UpdateDonationCategoryRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"UpdateDonationCategoryRequest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"website":{"type":"string"},"active":{"type":"boolean"},"donation_goal_cents":{"type":"integer","minimum":0},"logo_url":{"type":"string","format":"uri"},"suggested_amounts_dollars":{"type":"array","items":{"type":"number"}},"default_amount_dollars":{"type":"number"}}}}}}
```

## The StripeAccountRequiredError object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"StripeAccountRequiredError":{"type":"object","required":["error","message","connect_path"],"properties":{"error":{"type":"string","enum":["stripe_account_required"]},"message":{"type":"string"},"connect_path":{"type":"string"}}}}}}
```

## The MerchandiseOption object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"MerchandiseOption":{"type":"object","required":["id","name","quantity"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"quantity":{"type":"integer","nullable":true}}}}}}
```

## The Merchandise object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"Merchandise":{"type":"object","required":["id","name","description","merchandise_type","price_cents","price_dollars","quantity","currency","active","show_in_store","collect_shipping","stripe_product_id","options","photo_count"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"merchandise_type":{"type":"string","enum":["clothing","food","lodging","other","other_non_taxable","athletic_membership"]},"price_cents":{"type":"integer"},"price_dollars":{"type":"number"},"quantity":{"type":"integer","nullable":true},"currency":{"type":"string"},"active":{"type":"boolean"},"show_in_store":{"type":"boolean"},"collect_shipping":{"type":"boolean"},"stripe_product_id":{"type":"string","nullable":true},"options":{"type":"array","items":{"$ref":"#/components/schemas/MerchandiseOption"}},"photo_count":{"type":"integer"}}},"MerchandiseOption":{"type":"object","required":["id","name","quantity"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"quantity":{"type":"integer","nullable":true}}}}}}
```

## The CreateMerchandiseRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CreateMerchandiseRequest":{"type":"object","required":["name","merchandise_type","price_cents"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"merchandise_type":{"type":"string","enum":["clothing","food","lodging","other","other_non_taxable","athletic_membership"]},"price_cents":{"type":"integer","minimum":0},"quantity":{"type":"integer","minimum":0},"active":{"type":"boolean"},"show_in_store":{"type":"boolean"},"collect_shipping":{"type":"boolean"},"options":{"type":"array","items":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"quantity":{"type":"integer","minimum":0}}}},"images":{"type":"array","items":{"type":"string","format":"uri"}}}}}}}
```

## The UpdateMerchandiseRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"UpdateMerchandiseRequest":{"type":"object","properties":{"name":{"type":"string"},"description":{"type":"string"},"merchandise_type":{"type":"string","enum":["clothing","food","lodging","other","other_non_taxable","athletic_membership"]},"price_cents":{"type":"integer","minimum":0},"quantity":{"type":"integer","minimum":0},"active":{"type":"boolean"},"show_in_store":{"type":"boolean"},"collect_shipping":{"type":"boolean"},"options":{"type":"array","items":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"quantity":{"type":"integer","minimum":0}}}},"images":{"type":"array","items":{"type":"string","format":"uri"}}}}}}}
```

## The CourseMap object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CourseMap":{"type":"object","required":["id","name","provider","provider_route_id","provider_created_at"],"properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"provider":{"type":"string","enum":["strava","ride_with_gps","other"]},"provider_route_id":{"type":"string","description":"Numeric provider id, returned as a string to avoid JS number precision loss."},"provider_created_at":{"type":"string","format":"date-time","nullable":true}}}}}}
```

## The CreateCourseMapRequest object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CreateCourseMapRequest":{"type":"object","description":"For Strava routes pass `{source: \"strava\", strava_route_id}`. For\nRide with GPS pass `{source: \"ride_with_gps\", route_id}`.\n","required":["source"],"properties":{"source":{"type":"string","enum":["strava","ride_with_gps"]},"strava_route_id":{"type":"integer"},"route_id":{"type":"integer"}}}}}}
```

## The CourseMapOAuthError object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"CourseMapOAuthError":{"type":"object","required":["error","provider","message"],"properties":{"error":{"type":"string","enum":["oauth_required","insufficient_scope"]},"provider":{"type":"string","enum":["strava","ride_with_gps"]},"message":{"type":"string"},"connect_url":{"type":"string"}}}}}}
```

## The UnknownTagError object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"UnknownTagError":{"type":"object","required":["error","message"],"properties":{"error":{"type":"string","enum":["unknown_tag"]},"message":{"type":"string"},"missing":{"type":"array","description":"Tags that did not resolve. Present on bulk-replace; absent on single-attach.","items":{"type":"object","properties":{"group":{"type":"string"},"name":{"type":"string"},"tag_id":{"type":"integer","format":"int64"}}}}}}}}}
```

## The Error object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"Error":{"type":"object","description":"A generic error response","required":["error"],"properties":{"error":{"type":"string","description":"Human-readable error message"}}}}}}
```

## The ValidationError object

```json
{"openapi":"3.1.0","info":{"title":"Movemint API","version":"1.0"},"components":{"schemas":{"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"}}}}}}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://movemint.gitbook.io/movemint-developer-docs/open-api-specification/models.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
