> ## Documentation Index
> Fetch the complete documentation index at: https://partner-help.letsdothis.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Import add-ons

> Creates add-on products from the batch, queueing one isolated task per product. This endpoint is create-only: a product whose `externalAddOnId` was already imported is reported as `alreadyImported` and left unchanged. Use the `PUT` endpoint to update imported products.

<Warning>This endpoint is restricted and not generally available: organizations that have not been enabled receive a `403`. Contact your Let's Do This representative if you'd like access.</Warning>


## OpenAPI

````yaml /openapi.json post /v0/add-ons/import
openapi: 3.1.0
info:
  title: Let's Do This API
  version: 0.1.0
  description: >
    The full reference — getting started, pagination, error responses, rate
    limits and the changelog — lives at

    [partner-help.letsdothis.com/api-reference](https://partner-help.letsdothis.com/api-reference/overview).

    This page is the interactive OpenAPI view of the same specification.


    # Authentication


    Create an API key from **Settings** → **Credentials** in your Let's Do This
    account and send it as a bearer token:


    ```bash

    curl --request GET \
     --url "https://api.letsdothis.com/v0/participants" \
     --header "Authorization: Bearer YOUR-API-KEY"
    ```


    Keep the key secret: it identifies your organization, so do not ship it in a
    website or native app. If a key is exposed,

    revoke it from the same section and create a replacement.


    # OpenAPI schema


    Download the [OpenAPI schema](https://api.letsdothis.com/documentation/json)
    to use with Postman or an OpenAPI client

    generator.
servers:
  - url: https://api.letsdothis.com
    description: Production
  - url: https://api.staging.letsdothis.com
    description: Staging
security:
  - bearerAuth: []
tags:
  - name: Events
    x-group: Events
    description: Events that participants can register for.
  - name: EventOccurrences
    x-group: Event occurrences
    description: >-
      Event occurrences scoped to the organizer associated with your Public API
      credentials. Unlike the public Events catalog, results are limited to your
      own events.
  - name: Races
    x-group: Races
    description: >-
      Races within an event occurrence. An event occurrence may have one or more
      races, for example a 5K and a 10K within the same race day.
  - name: Tickets
    x-group: Tickets
    description: Tickets that are available for events.
  - name: BookingForms
    x-group: Booking forms
    description: >-
      Booking forms define the questions a booker answers when registering for a
      ticket. A ticket usually references a single booking form, so expect zero
      or one, while a booking form may be shared across multiple tickets.
  - name: BookingFormFields
    x-group: Booking form fields
    description: >-
      Booking form fields are the individual questions on a booking form — their
      type, label, options, and whether an answer is required. A field can be
      reused across multiple forms.
  - name: Bookings
    x-group: Bookings
    description: >-
      Bookings are the transaction record for a registration. A booking may
      contain one or more participants (entries).
  - name: Participant
    x-group: Participants
    description: Participants are users who successfully booked an event.
  - name: LineItem
    x-group: Line items
    description: Financial details related to individual items within transactions.
  - name: AddOns
    x-group: Add-ons
    description: >-
      Organizer-owned products that can be purchased and allocated to
      participants. Imported products retain stable external identities.
  - name: DiscountCodes
    x-group: Discount codes
    description: >-
      Discount codes participants enter at checkout to reduce the price of a
      booking.
  - name: Credits
    x-group: Credits
    description: >-
      Credits are balances participants can spend at checkout, identified by
      their email address.
  - name: Referrals
    x-group: Referrals
    description: >-
      Referral programs, the referrers registered on them, and asynchronous
      imports of historical referrals.
  - name: Application
    x-group: Applications
    description: >-
      Applications are created when a user applies for tickets that are set up
      to require an application process, such as balloted or "Good For Age"
      entries.
  - name: Partner
    x-group: Partners
    description: >-
      Partners that were created by the organization who can have Reserved
      Entries assigned to them.
  - name: ReservedEntries
    x-group: Reserved entries
    description: >-
      Reserved Entries are entries that are reserved for a partner. After being
      assigned, the partner can then allocate these entries to participants.
  - name: Timing
    x-group: Timing
    description: >-
      Timing providers push bib numbers and bib-pack shipments back to Let's Do
      This for the startlist entries they received. Available to select timing
      partners only.
paths:
  /v0/add-ons/import:
    post:
      tags:
        - AddOns
      summary: Import add-ons
      description: >-
        Creates add-on products from the batch, queueing one isolated task per
        product. This endpoint is create-only: a product whose `externalAddOnId`
        was already imported is reported as `alreadyImported` and left
        unchanged. Use the `PUT` endpoint to update imported products.
      parameters:
        - schema:
            type: string
            minLength: 1
            maxLength: 255
          in: header
          name: idempotency-key
          required: false
          description: >-
            Returns the original job when retried with the same method, path,
            and body.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddOnProductImportRequest'
      responses:
        '202':
          description: Default Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AddOnProductImportAccepted'
        '400':
          description: Malformed request
          content:
            application/json:
              schema:
                description: Malformed request
                type: object
                properties:
                  statusCode:
                    type: number
                    enum:
                      - 400
                  error:
                    type: string
                  message:
                    type: string
        '404':
          description: Not found
          content:
            application/json:
              schema:
                description: Not found
                type: object
                properties:
                  statusCode:
                    type: number
                    enum:
                      - 404
                  error:
                    type: string
                  message:
                    type: string
        '409':
          description: Idempotency conflict
          content:
            application/json:
              schema:
                description: Idempotency conflict
                type: object
                properties:
                  statusCode:
                    type: number
                    enum:
                      - 409
                  error:
                    type: string
                  message:
                    type: string
        '413':
          description: Request too large
          content:
            application/json:
              schema:
                description: Request too large
                type: object
                properties:
                  statusCode:
                    type: number
                    enum:
                      - 413
                  error:
                    type: string
                  message:
                    type: string
        '429':
          description: Rate limit exceeded
          headers:
            retry-after:
              schema:
                type: integer
              description: Seconds to wait before retrying the request.
            x-ratelimit-limit:
              schema:
                type: integer
              description: Requests permitted in the current window.
            x-ratelimit-remaining:
              schema:
                type: integer
              description: Requests still permitted in the current window.
            x-ratelimit-reset:
              schema:
                type: integer
              description: Seconds until the current window resets.
          content:
            application/json:
              schema:
                description: Rate limit exceeded
                type: object
                properties:
                  statusCode:
                    type: number
                    enum:
                      - 429
                  error:
                    type: string
                  message:
                    type: string
components:
  schemas:
    AddOnProductImportRequest:
      title: AddOnProductImportRequest
      type: object
      properties:
        addOns:
          type: array
          items:
            $ref: '#/components/schemas/AddOnProductInput'
          minItems: 1
          maxItems: 1000
      required:
        - addOns
      additionalProperties: false
      description: >-
        Production bulk import. Poll the returned job for product-level
        outcomes.
    AddOnProductImportAccepted:
      title: AddOnProductImportAccepted
      type: object
      properties:
        importId:
          type: string
        jobId:
          type: string
        status:
          type: string
          enum:
            - queued
        replayed:
          type: boolean
      required:
        - importId
        - jobId
        - status
        - replayed
      additionalProperties: false
      description: An add-on import accepted for asynchronous execution.
      example:
        importId: 3a55dc4c-6fd2-49bd-90cd-32c65fce7b1a
        jobId: 65f60718293a4b5c6d7e8f90
        status: queued
        replayed: false
    AddOnProductInput:
      title: AddOnProductInput
      type: object
      properties:
        externalAddOnId:
          type: string
          description: Stable product identity in the importing platform.
          minLength: 1
          maxLength: 255
        name:
          type: string
          minLength: 1
          maxLength: 500
        description:
          type: string
          maxLength: 10000
        allocationType:
          type: string
          description: >-
            V1 accepts only `TO_PARTICIPANT`; unsupported values fail this
            product result.
        eventIds:
          type: array
          items:
            type: string
          description: >-
            Current product applicability. Each referenced resource must belong
            to the caller.
          maxItems: 100
        eventOccurrenceIds:
          type: array
          items:
            type: string
          maxItems: 100
        raceIds:
          type: array
          items:
            type: string
          maxItems: 100
        ticketSlugs:
          type: array
          items:
            type: string
          maxItems: 100
        variants:
          type: array
          items:
            $ref: '#/components/schemas/AddOnVariantInput'
          minItems: 1
          maxItems: 100
      required:
        - externalAddOnId
        - name
        - description
        - allocationType
        - variants
      additionalProperties: false
      description: >-
        One product imported as an atomic result unit with all its supplied
        variants.
    AddOnVariantInput:
      title: AddOnVariantInput
      type: object
      properties:
        externalVariantId:
          type: string
          description: Stable variant identity in the importing platform.
          minLength: 1
          maxLength: 255
        name:
          type: string
          minLength: 1
          maxLength: 500
        price:
          $ref: '#/components/schemas/AddOnPriceInput'
        properties:
          type: object
          additionalProperties:
            type: string
        externalSku:
          type: string
          description: Mutable stock-keeping reference; never used as import identity.
          minLength: 1
          maxLength: 255
        fulfilmentMethods:
          type: array
          items:
            type: string
      required:
        - externalVariantId
        - name
        - price
      additionalProperties: false
      description: One externally identified variant in an imported add-on product.
    AddOnPriceInput:
      title: AddOnPriceInput
      type: object
      properties:
        value:
          type: number
        currencyCode:
          type: string
      required:
        - value
        - currencyCode
      additionalProperties: false
      description: >-
        Price input is deliberately broad so product-level validation stays
        isolated.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````