openapi: 3.0.0
paths:
  /external/v1/organizer/events/search:
    post:
      operationId: PublicApiController_searchEvents
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublicApiSearchEventsDto'
      responses:
        '201':
          description: ''
      security:
        - organizer-api-key: []
      summary: Search WODira events for an organizer
      tags:
        - WODira Organizer API
  /external/v1/organizer/events/{eventId}:
    get:
      operationId: PublicApiController_getEvent
      parameters:
        - name: eventId
          required: true
          in: path
          description: WODira event identifier
          schema:
            type: string
      responses:
        '200':
          description: ''
      security:
        - organizer-api-key: []
      summary: Get a WODira event for an organizer
      tags:
        - WODira Organizer API
  /external/v1/organizer/events/{eventId}/pricing-cards:
    get:
      operationId: PublicApiController_getPricingCards
      parameters:
        - name: eventId
          required: true
          in: path
          description: WODira event identifier
          schema:
            type: string
      responses:
        '200':
          description: ''
      security:
        - organizer-api-key: []
      summary: Get WODira event pricing cards for an organizer
      tags:
        - WODira Organizer API
  /external/v1/organizer/registrations:
    post:
      operationId: PublicApiController_createRegistration
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublicApiCreateRegistrationDto'
      responses:
        '201':
          description: ''
      security:
        - organizer-api-key: []
      summary: Create a WODira registration server-to-server
      tags:
        - WODira Organizer API
  /external/v1/organizer/registrations/search:
    post:
      operationId: PublicApiController_searchRegistrations
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublicApiSearchRegistrationsDto'
      responses:
        '201':
          description: ''
      security:
        - organizer-api-key: []
      summary: Search WODira registrations
      tags:
        - WODira Organizer API
  /external/v1/organizer/registrations/{ticketId}:
    patch:
      operationId: PublicApiController_updateRegistration
      parameters:
        - name: ticketId
          required: true
          in: path
          description: WODira athlete ticket identifier
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PublicApiUpdateRegistrationDto'
      responses:
        '200':
          description: ''
      security:
        - organizer-api-key: []
      summary: Update a WODira registration
      tags:
        - WODira Organizer API
    delete:
      operationId: PublicApiController_deleteRegistration
      parameters:
        - name: ticketId
          required: true
          in: path
          description: WODira athlete ticket identifier
          schema:
            type: string
      responses:
        '200':
          description: ''
      security:
        - organizer-api-key: []
      summary: Delete a WODira registration
      tags:
        - WODira Organizer API
  /external/v1/browser/events/search:
    post:
      operationId: BrowserPublicApiController_searchEvents
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BrowserSearchEventsDto'
      responses:
        '201':
          description: ''
      security:
        - publishable-key: []
      summary: Search published WODira events from a browser
      tags:
        - WODira Browser API
  /external/v1/browser/events/{eventId}:
    get:
      operationId: BrowserPublicApiController_getEvent
      parameters:
        - name: eventId
          required: true
          in: path
          description: WODira event identifier
          schema:
            type: string
      responses:
        '200':
          description: ''
      security:
        - publishable-key: []
      summary: Get a published WODira event
      tags:
        - WODira Browser API
  /external/v1/browser/events/{eventId}/pricing-cards:
    get:
      operationId: BrowserPublicApiController_getPricingCards
      parameters:
        - name: eventId
          required: true
          in: path
          description: WODira event identifier
          schema:
            type: string
      responses:
        '200':
          description: ''
      security:
        - publishable-key: []
      summary: Get public pricing cards for a WODira event
      tags:
        - WODira Browser API
  /external/v1/browser/checkout/registration/summary:
    post:
      operationId: BrowserPublicApiController_getRegistrationSummary
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BrowserRegistrationSummaryDto'
      responses:
        '201':
          description: ''
      security:
        - publishable-key: []
      summary: Calculate a WODira registration checkout summary
      tags:
        - WODira Browser API
  /external/v1/browser/checkout/registration/session:
    post:
      operationId: BrowserPublicApiController_createRegistrationCheckoutSession
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BrowserRegistrationCheckoutSessionDto'
      responses:
        '201':
          description: ''
      security:
        - publishable-key: []
      summary: Create a WODira registration Stripe Checkout Session
      tags:
        - WODira Browser API
  /external/v1/browser/events/{eventId}/registration-receipts/lookup:
    post:
      operationId: BrowserPublicApiController_lookupRegistrationReceipts
      parameters:
        - name: eventId
          required: true
          in: path
          description: WODira event identifier
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BrowserRegistrationReceiptRequestDto'
      responses:
        '201':
          description: ''
      security:
        - publishable-key: []
      summary: Look up WODira registration receipts by email
      tags:
        - WODira Browser API
  /external/v1/browser/events/{eventId}/registration-receipts/send:
    post:
      operationId: BrowserPublicApiController_sendRegistrationReceipts
      parameters:
        - name: eventId
          required: true
          in: path
          description: WODira event identifier
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BrowserRegistrationReceiptRequestDto'
      responses:
        '201':
          description: ''
      security:
        - publishable-key: []
      summary: Send WODira registration receipts by email
      tags:
        - WODira Browser API
info:
  title: WODira External API
  description: >-
    Public developer API for integrating organizer backends and browser
    applications with WODira.
  version: '1.0'
  contact: {}
tags: []
servers:
  - url: https://api.wodira.app
    description: Production
components:
  securitySchemes:
    organizer-api-key:
      scheme: bearer
      bearerFormat: JWT
      type: http
      description: WODira secret API key (wd_live_...) for trusted organizer backends.
    publishable-key:
      type: apiKey
      in: header
      name: x-publishable-key
      description: WODira publishable key (wpk_live_...) restricted by allowed Origin.
  schemas:
    PublicApiSearchEventsDto:
      type: object
      properties:
        search:
          description: Search field.
          type: string
          maxLength: 100
        status:
          type: string
          enum:
            - DRAFT
            - PUBLISHED
            - UNDER_REVIEW
            - POSTPONED
            - COMPLETED
            - CANCELLED
            - ARCHIVED
        limit:
          default: 50
          description: Limit field.
          type: integer
          minimum: 1
          maximum: 100
        offset:
          default: 0
          description: Offset field.
          type: integer
          minimum: 0
          maximum: 9007199254740991
    PublicApiCreateRegistrationDto:
      type: object
      properties:
        eventId:
          type: string
          minLength: 1
          description: Event ID for the manual registration.
        categoryId:
          type: string
          minLength: 1
          description: Category ID selected for the registration.
        teamName:
          type: string
          minLength: 1
          description: Team name used in the registration.
        club:
          description: Optional club, gym, or affiliation name.
          type: string
        bibRaceNumber:
          description: Optional bib or race number assigned to the team.
          type: integer
          exclusiveMinimum: 0
          maximum: 9007199254740991
        athletes:
          minItems: 1
          type: array
          items:
            type: object
            properties:
              fullname:
                type: string
                minLength: 1
                description: Fullname field.
              idNumber:
                type: string
                minLength: 1
                description: Id Number field.
              email:
                type: string
                format: email
                pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                description: Email field.
              phone:
                type: string
                pattern: ^\+[1-9]\d{6,14}$
                description: Phone field.
              gender:
                type: string
                enum:
                  - MALE
                  - FEMALE
                description: Gender field.
              birthDate:
                type: string
                format: date
                pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
                description: Birth Date field.
            required:
              - fullname
              - idNumber
              - email
              - phone
              - gender
              - birthDate
          description: Athletes included in the registration.
        checkedInAt:
          description: Optional manual check-in timestamp.
          type: array
          items:
            type: string
        note:
          description: Internal note for the registration.
          type: string
        customFields:
          description: Custom field values captured for the registration.
          type: array
          items:
            type: object
            properties:
              fieldId:
                type: string
                minLength: 1
                description: Custom field ID.
              value:
                description: Value for the custom field.
            required:
              - fieldId
              - value
        selectedSupplementIds:
          description: IDs de suplementos de precio único seleccionados.
          type: array
          items:
            type: string
        supplementSelections:
          description: Opciones de suplementos seleccionadas.
          type: array
          items:
            type: object
            properties:
              supplementId:
                type: string
                minLength: 1
                description: Supplement Id field.
              optionId:
                type: string
                minLength: 1
                description: Option Id field.
            required:
              - supplementId
              - optionId
      required:
        - eventId
        - categoryId
        - teamName
        - athletes
    PublicApiSearchRegistrationsDto:
      type: object
      properties:
        search:
          description: Free-text search across athlete tickets.
          type: string
          minLength: 1
          maxLength: 100
        athleteId:
          description: Filter tickets by athlete ID.
          type: string
        eventId:
          description: Filter tickets by event ID.
          type: string
        ticketId:
          description: Filter tickets by athlete ticket ID.
          type: string
        categoryId:
          description: Filter tickets by event category ID.
          type: string
        gender:
          description: Filter tickets by participant gender.
          type: string
          enum:
            - MALE
            - FEMALE
        ageMin:
          description: Minimum participant age.
          type: integer
          minimum: 0
          maximum: 120
        ageMax:
          description: Maximum participant age.
          type: integer
          minimum: 0
          maximum: 120
        checkIn:
          description: Filter tickets by check-in status.
          type: string
          enum:
            - checked-in
            - pending
        sortBy:
          description: Sort option for athlete ticket queries.
          type: string
          enum:
            - createdAt-desc
            - createdAt-asc
            - athlete-asc
            - amount-desc
            - bib-asc
            - category-asc
        status:
          description: Filter tickets by related order status.
          type: string
          enum:
            - PENDING
            - COMPLETED
            - FAILED
            - CANCELLED
            - REFUNDED
        ticketStatus:
          description: Filter by athlete ticket lifecycle status. Defaults to ACTIVE.
          anyOf:
            - type: string
              enum:
                - ACTIVE
                - CANCELLED
              description: Athlete Ticket Status Enum schema.
            - type: string
              const: ALL
        participantDataStatus:
          description: >-
            Filter by participant data readiness independently from ticket
            status.
          type: string
          enum:
            - READY
            - PENDING_PARTICIPANTS
        cancelledFrom:
          description: Inclusive cancellation date lower bound.
          type: array
          items:
            type: string
        cancelledTo:
          description: Exclusive cancellation date upper bound.
          type: array
          items:
            type: string
        customFieldFilters:
          description: Advanced filters for custom registration form fields.
          maxItems: 20
          type: array
          items:
            type: object
            properties:
              fieldId:
                type: string
                minLength: 1
                description: Custom event form field ID.
              operator:
                type: string
                enum:
                  - contains
                  - equals
                  - has-any
                  - is-empty
                  - is-not-empty
                description: Operator used to match a registration custom field response.
              value:
                description: Value to match for the field.
                anyOf:
                  - type: string
                  - type: number
                  - type: boolean
                  - type: array
                    items:
                      type: string
            required:
              - fieldId
              - operator
            description: Advanced filter for a registration custom field response.
        supplementFilters:
          description: Advanced filters for selected registration supplements.
          maxItems: 20
          type: array
          items:
            type: object
            properties:
              supplementId:
                type: string
                minLength: 1
                description: Event supplement ID selected by the registration.
              optionIds:
                description: Optional supplement option IDs to match.
                type: array
                items:
                  type: string
                  minLength: 1
            required:
              - supplementId
            description: Advanced filter for a registration supplement selection.
        limit:
          description: Maximum number of tickets to return.
          type: number
          minimum: 1
          maximum: 100
        offset:
          description: Number of tickets to skip.
          type: number
          minimum: 0
    PublicApiUpdateRegistrationDto:
      type: object
      properties:
        eventId:
          type: string
          minLength: 1
          description: Event ID for the manual registration.
        categoryId:
          type: string
          minLength: 1
          description: Category ID selected for the registration.
        teamName:
          type: string
          minLength: 1
          description: Team name used in the registration.
        club:
          description: Optional club, gym, or affiliation name.
          type: string
        bibRaceNumber:
          description: Optional bib or race number assigned to the team.
          type: integer
          exclusiveMinimum: 0
          maximum: 9007199254740991
        athletes:
          minItems: 1
          type: array
          items:
            type: object
            properties:
              fullname:
                type: string
                minLength: 1
                description: Fullname field.
              idNumber:
                type: string
                minLength: 1
                description: Id Number field.
              email:
                type: string
                format: email
                pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                description: Email field.
              phone:
                type: string
                pattern: ^\+[1-9]\d{6,14}$
                description: Phone field.
              gender:
                type: string
                enum:
                  - MALE
                  - FEMALE
                description: Gender field.
              birthDate:
                type: string
                format: date
                pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
                description: Birth Date field.
            required:
              - fullname
              - idNumber
              - email
              - phone
              - gender
              - birthDate
          description: Athletes included in the registration.
        checkedInAt:
          description: Optional manual check-in timestamp.
          type: array
          items:
            type: string
        note:
          description: Internal note for the registration.
          type: string
        customFields:
          description: Custom field values captured for the registration.
          type: array
          items:
            type: object
            properties:
              fieldId:
                type: string
                minLength: 1
                description: Custom field ID.
              value:
                description: Value for the custom field.
            required:
              - fieldId
              - value
        selectedSupplementIds:
          description: IDs de suplementos de precio único seleccionados.
          type: array
          items:
            type: string
        supplementSelections:
          description: Opciones de suplementos seleccionadas.
          type: array
          items:
            type: object
            properties:
              supplementId:
                type: string
                minLength: 1
                description: Supplement Id field.
              optionId:
                type: string
                minLength: 1
                description: Option Id field.
            required:
              - supplementId
              - optionId
        notifyEmailChange:
          default: false
          description: >-
            If true, sends an update confirmation email when the primary email
            changes.
          type: boolean
    BrowserSearchEventsDto:
      type: object
      properties:
        search:
          description: Search field.
          type: string
          maxLength: 100
        limit:
          default: 50
          description: Limit field.
          type: integer
          minimum: 1
          maximum: 100
        offset:
          default: 0
          description: Offset field.
          type: integer
          minimum: 0
          maximum: 9007199254740991
    BrowserRegistrationSummaryDto:
      type: object
      properties:
        previewToken:
          description: Event preview token.
          type: string
          minLength: 1
        categoryId:
          type: string
          minLength: 1
          description: Category Id field.
        promocode:
          description: Promocode field.
          type: string
          format: uppercase
          pattern: ^[^a-z]*$
        selectedSupplementIds:
          description: Selected Supplement Ids field.
          type: array
          items:
            type: string
        supplementSelections:
          description: Supplement Selections field.
          type: array
          items:
            type: object
            properties:
              supplementId:
                type: string
                minLength: 1
                description: Supplement Id field.
              optionId:
                type: string
                minLength: 1
                description: Option Id field.
            required:
              - supplementId
              - optionId
        guestRegistrations:
          description: Guest Registrations field.
          maxItems: 10
          type: array
          items:
            type: object
            properties:
              categoryId:
                type: string
                minLength: 1
                description: Category Id field.
              selectedSupplementIds:
                description: Selected Supplement Ids field.
                type: array
                items:
                  type: string
              supplementSelections:
                description: Supplement Selections field.
                type: array
                items:
                  type: object
                  properties:
                    supplementId:
                      type: string
                      minLength: 1
                      description: Supplement Id field.
                    optionId:
                      type: string
                      minLength: 1
                      description: Option Id field.
                  required:
                    - supplementId
                    - optionId
            required:
              - categoryId
        purchaserEmail:
          type: string
          format: email
          pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
          description: Purchaser Email field.
      required:
        - categoryId
        - purchaserEmail
    BrowserRegistrationCheckoutSessionDto:
      type: object
      properties:
        eventId:
          type: string
          minLength: 1
          description: Event Id field.
        idempotencyKey:
          type: string
          minLength: 8
          maxLength: 120
          pattern: ^[a-zA-Z0-9._:-]+$
        categoryId:
          type: string
          minLength: 1
          description: Category Id field.
        teamName:
          type: string
          minLength: 1
          description: Team Name field.
        club:
          description: Club field.
          type: string
        promocode:
          description: Promocode field.
          type: string
          format: uppercase
          pattern: ^[^a-z]*$
        athletes:
          minItems: 1
          type: array
          items:
            type: object
            properties:
              fullname:
                type: string
                minLength: 1
                description: Fullname field.
              idNumber:
                type: string
                minLength: 1
                description: Id Number field.
              email:
                type: string
                format: email
                pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                description: Email field.
              phone:
                type: string
                pattern: ^\+[1-9]\d{6,14}$
                description: Phone field.
              gender:
                type: string
                enum:
                  - MALE
                  - FEMALE
                description: Gender field.
              birthDate:
                type: string
                format: date
                pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
                description: Birth Date field.
            required:
              - fullname
              - idNumber
              - email
              - phone
              - gender
              - birthDate
          description: Athletes field.
        deferredTeamCompletion:
          description: Participant places that will be completed after payment.
          type: object
          properties:
            pendingParticipantCount:
              type: integer
              minimum: 1
              maximum: 9007199254740991
            pendingParticipantPositions:
              minItems: 1
              maxItems: 100
              type: array
              items:
                type: integer
                minimum: 0
                maximum: 9007199254740991
            slotGenders:
              minItems: 1
              maxItems: 100
              type: array
              items:
                type: string
                enum:
                  - MALE
                  - FEMALE
                description: Gender Enum schema.
            participantWaivers:
              minItems: 1
              type: array
              items:
                type: object
                properties:
                  waiversAccepted:
                    type: object
                    propertyNames:
                      type: string
                      minLength: 1
                    additionalProperties:
                      type: boolean
                required:
                  - waiversAccepted
          required:
            - pendingParticipantCount
            - participantWaivers
        customFields:
          type: array
          items:
            type: object
            properties:
              fieldId:
                type: string
                minLength: 1
                description: Field Id field.
              value:
                description: Value field.
            required:
              - fieldId
              - value
        waiversAccepted:
          description: Waivers Accepted field.
          type: object
          propertyNames:
            type: string
            minLength: 1
          additionalProperties:
            type: boolean
        legalSignature:
          description: Electronic signature for this order.
          type: object
          properties:
            signerName:
              type: string
              minLength: 2
              maxLength: 160
            signerIdNumber:
              type: string
              minLength: 3
              maxLength: 80
            authorityAccepted:
              type: boolean
              const: true
            minorRelationship:
              type: string
              minLength: 2
              maxLength: 120
            guardianAuthorityAccepted:
              type: boolean
              const: true
            locale:
              default: es
              type: string
              enum:
                - es
                - en
                - pt
            waiverVersions:
              minItems: 1
              maxItems: 50
              type: array
              items:
                type: object
                properties:
                  waiverId:
                    type: string
                    minLength: 1
                  version:
                    type: integer
                    exclusiveMinimum: 0
                    maximum: 9007199254740991
                required:
                  - waiverId
                  - version
            strokes:
              minItems: 1
              maxItems: 20
              type: array
              items:
                minItems: 2
                maxItems: 1000
                type: array
                items:
                  type: object
                  properties:
                    x:
                      type: number
                      minimum: 0
                      maximum: 1
                    'y':
                      type: number
                      minimum: 0
                      maximum: 1
                    t:
                      type: integer
                      minimum: 0
                      maximum: 300000
                  required:
                    - x
                    - 'y'
                    - t
          required:
            - signerName
            - signerIdNumber
            - authorityAccepted
            - waiverVersions
            - strokes
        selectedSupplementIds:
          description: IDs de los suplementos seleccionados para agregar a la orden
          type: array
          items:
            type: string
        supplementSelections:
          description: Opciones de suplementos seleccionadas para agregar a la orden
          type: array
          items:
            type: object
            properties:
              supplementId:
                type: string
                minLength: 1
                description: Supplement Id field.
              optionId:
                type: string
                minLength: 1
                description: Option Id field.
            required:
              - supplementId
              - optionId
        termsAccepted:
          type: boolean
          description: Terms Accepted field.
        guestRegistrations:
          description: Guest Registrations field.
          maxItems: 10
          type: array
          items:
            type: object
            properties:
              guestEmail:
                type: string
                format: email
                pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                description: Guest Email field.
              guestName:
                type: string
                minLength: 2
                description: Guest Name field.
              categoryId:
                type: string
                minLength: 1
                description: Category Id field.
              teamName:
                type: string
                minLength: 1
                description: Team Name field.
              club:
                description: Club field.
                type: string
              athletes:
                minItems: 1
                type: array
                items:
                  type: object
                  properties:
                    fullname:
                      type: string
                      minLength: 1
                      description: Fullname field.
                    idNumber:
                      type: string
                      minLength: 1
                      description: Id Number field.
                    email:
                      type: string
                      format: email
                      pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                      description: Email field.
                    phone:
                      type: string
                      pattern: ^\+[1-9]\d{6,14}$
                      description: Phone field.
                    gender:
                      type: string
                      enum:
                        - MALE
                        - FEMALE
                      description: Gender field.
                    birthDate:
                      type: string
                      format: date
                      pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
                      description: Birth Date field.
                  required:
                    - fullname
                    - idNumber
                    - email
                    - phone
                    - gender
                    - birthDate
                description: Athletes field.
              customFields:
                type: array
                items:
                  type: object
                  properties:
                    fieldId:
                      type: string
                      minLength: 1
                      description: Field Id field.
                    value:
                      description: Value field.
                  required:
                    - fieldId
                    - value
              waiversAccepted:
                description: Waivers Accepted field.
                type: object
                propertyNames:
                  type: string
                  minLength: 1
                additionalProperties:
                  type: boolean
              selectedSupplementIds:
                description: Selected Supplement Ids field.
                type: array
                items:
                  type: string
              supplementSelections:
                description: Supplement Selections field.
                type: array
                items:
                  type: object
                  properties:
                    supplementId:
                      type: string
                      minLength: 1
                      description: Supplement Id field.
                    optionId:
                      type: string
                      minLength: 1
                      description: Option Id field.
                  required:
                    - supplementId
                    - optionId
            required:
              - guestEmail
              - guestName
              - categoryId
              - teamName
              - athletes
        ipEnrichment:
          description: >-
            Optional browser-reported IP enrichment metadata for checkout
            security.
          type: object
          properties:
            provider:
              type: string
              enum:
                - ipquery
                - ipwhois
                - ipapiis
                - ipapico
            countryCode:
              type: string
              minLength: 2
              maxLength: 2
              pattern: ^[a-zA-Z]{2}$
            country:
              type: string
              minLength: 1
              maxLength: 120
            regionCode:
              type: string
              minLength: 1
              maxLength: 32
            region:
              type: string
              minLength: 1
              maxLength: 120
            city:
              type: string
              minLength: 1
              maxLength: 120
            timezone:
              type: string
              minLength: 1
              maxLength: 120
            network:
              type: object
              properties:
                asn:
                  type: string
                  minLength: 1
                  maxLength: 32
                organization:
                  type: string
                  minLength: 1
                  maxLength: 180
                isp:
                  type: string
                  minLength: 1
                  maxLength: 180
            risk:
              type: object
              properties:
                vpn:
                  type: boolean
                proxy:
                  type: boolean
                tor:
                  type: boolean
                hosting:
                  type: boolean
          required:
            - provider
            - countryCode
          additionalProperties: false
        purchaserEmail:
          type: string
          format: email
          pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
          description: Purchaser Email field.
        purchaserName:
          type: string
          minLength: 2
          maxLength: 120
          description: Purchaser Name field.
        checkoutResumeSecret:
          type: string
          minLength: 32
          maxLength: 128
        successUrl:
          type: string
          format: uri
          description: Success Url field.
        cancelUrl:
          type: string
          format: uri
          description: Cancel Url field.
      required:
        - eventId
        - categoryId
        - teamName
        - athletes
        - termsAccepted
        - purchaserEmail
        - purchaserName
        - successUrl
        - cancelUrl
    BrowserRegistrationReceiptRequestDto:
      type: object
      properties:
        email:
          type: string
          minLength: 3
          maxLength: 254
          format: email
          pattern: ^(?!\.)(?!.*\.\.)([A-Za-z0-9_'+\-\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
      required:
        - email
