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

# Create demo gift

> Use this endpoint to create non-claimable demo gifst to preview and test the full recipient experience without incurring any costs.

###### Required fields:
- `campaignId` - the Campaign ID to send under
- `recipients` - array of demo recipients

###### Optional fields:
- `customization` - Gift Customization overrides
- `metadata` - optional key-value pairs (max 50 pairs)
- `companyId` query parameter - Company ID (when not inferable from the calling key)
- `Request-Source` header - source of the request

###### Behavior Notes:
- Demo gifts are **free** and do not affect your Account's budget or Billing Method.
- Demo gifts **cannot be redeemed** for an actual product - they're for preview only.
- The recipient experience is fully interactive: unwrapping animation, collection browsing, etc. Just no Order is placed at the end.
- Same request body shape as [Create gifts](/modules/api/v2/gifts/create-gifts).

#### Permissions
- Requires: `gifts:create:demo`



## OpenAPI

````yaml post /v2/gifts/demo
openapi: 3.0.0
info:
  title: Snappy Public API
  version: 2.0.0
  contact:
    name: Snappy Support
    email: info@snappy.com
  description: >-
    Welcome to the Snappy API reference documentation!

    You can use this API to integrate with Snappy and spread smiles to your
    employees/clients/customers and much more.

    In just 3 simple steps you can start sending gifts today: pull the relevant
    campaign, send gifts to your recipients and track gift statuses.

    So let's get started!
servers:
  - url: https://api.snappy.com/public-api
    description: Base API URL
  - url: https://mtls-api.snappy.com/public-api
    description: >-
      ## mTLS URL

      You can also use mTLS to enhance your API security. To get your specific
      certificates please contact our support.

      Once you configure the certificated correctly, you need to also update
      endpoints to use the following secure api base URL:
security: []
tags:
  - name: Authentication
    description: >-
      API keys authenticate requests to the Snappy API. Use these endpoints to
      list active keys for your Company, create new keys, or delete keys you no
      longer need.
  - name: Accounts
    description: >-
      An **Account** is a sub-entity that lives within a **Company**. Accounts
      are used to separate and organize your company's campaigns and gift sends
      for different teams, departments or budget owners.
  - name: Campaigns
    description: >-
      A **Campaign** is the primary organizational object used to configure and
      send a batch of gifts. It acts as a template for all the settings of a
      single gifting initiative, including the target **Recipient** list, the
      selected **Collection** or **product**, the budget, branding, and
      notification messages.
  - name: Collections
    description: >-
      A **Collection** is a curated catalog of gift items tailored to a specific
      theme, budget range, and audience (e.g., "Birthday Gifts Under $50"). The
      gift recipient then chooses their preferred item directly from this
      collection.


      Use these endpoints to:

      - Get available collections based on budget and country requirements

      - Retrieve budget ranges for specific collections

      - Access collection details and products


      Please note: Swag collections can only be retrieved by specifying the
      accountId in the request.
  - name: Products & Variants
    description: >-
      Use these endpoints to search for and retrieve products and variants
      (including by collection and budget), and to list product tags for
      building catalog and filtering experiences in your UI.
  - name: Gifts
    description: >-
      A **Gift** is the core transactional object in the Snappy system. It
      represents the entire gifting experience for a **Recipient** within a
      **Campaign**, from initial creation to final delivery.


      The **Gift** object tracks the status and details through each stage of
      its lifecycle:

      1. **Creation:** The gift is initiated and associated with a recipient and
      campaign.

      2. **Notification:** The recipient is notified about their gift via email
      or other channels.

      3. **Selection:** The recipient selects a specific product from the gift
      collection (if applicable).

      4. **Order Generation:** An order is created based on the selected product
      and the recipient's shipping address.

      5. **Delivery:** The physical product is shipped and its delivery status
      is tracked to completion.
  - name: Orders
    description: >-
      Endpoints for programmatically claiming gifts (ordering on behalf of
      recipients), cancelling orders before they ship, and validating or
      autocompleting shipping addresses as part of your checkout or fulfillment
      flow.
  - name: Recipients
    description: A **Recipient** is the end-user who receives a **Gift**.
paths:
  /v2/gifts/demo:
    post:
      tags:
        - Gifts
      summary: Create demo gift
      description: >-
        Use this endpoint to create non-claimable demo gifst to preview and test
        the full recipient experience without incurring any costs.


        ###### Required fields:

        - `campaignId` - the Campaign ID to send under

        - `recipients` - array of demo recipients


        ###### Optional fields:

        - `customization` - Gift Customization overrides

        - `metadata` - optional key-value pairs (max 50 pairs)

        - `companyId` query parameter - Company ID (when not inferable from the
        calling key)

        - `Request-Source` header - source of the request


        ###### Behavior Notes:

        - Demo gifts are **free** and do not affect your Account's budget or
        Billing Method.

        - Demo gifts **cannot be redeemed** for an actual product - they're for
        preview only.

        - The recipient experience is fully interactive: unwrapping animation,
        collection browsing, etc. Just no Order is placed at the end.

        - Same request body shape as [Create
        gifts](/modules/api/v2/gifts/create-gifts).


        #### Permissions

        - Requires: `gifts:create:demo`
      operationId: createDemoGift
      parameters:
        - schema:
            type: string
            pattern: ^[A-Za-z0-9]{8,}$
            description: Company ID
            example: '12345678'
          required: false
          description: Company ID
          name: companyId
          in: query
        - schema:
            $ref: '#/components/schemas/RequestSourceHeader'
          required: false
          description: Source of the request
          name: Request-Source
          in: header
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateGiftsBody'
      responses:
        '200':
          description: Ok
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateGiftsResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
              examples:
                invalid_URL_parameter_example:
                  value:
                    status: 400
                    errorCode: 41000
                    message: Invalid URL parameter
                invalid_URL_parameter_value_example:
                  value:
                    status: 400
                    errorCode: 42000
                    message: Invalid URL parameter value
                missing_mandatory_parameter_example:
                  value:
                    status: 400
                    errorCode: 43000
                    message: Missing mandatory parameter
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/ApiError'
                  - example:
                      status: 401
                      errorCode: 401001
                      message: Unauthorized
      security:
        - CompanyLevelAuthentication: []
        - BearerAuthentication: []
components:
  schemas:
    RequestSourceHeader:
      type: string
      enum:
        - api_native
        - api_zapier
        - api_salesforce
        - api_ftp
        - api_make
      description: Source of the request
      example: api_native
    CreateGiftsBody:
      type: object
      properties:
        campaignId:
          type: string
          pattern: ^[A-Za-z0-9]{8,}$
          description: Campaign ID
          example: '12345678'
        recipients:
          type: array
          items:
            $ref: '#/components/schemas/Recipient'
          description: The recipients of the gift.
        sendingMethod:
          $ref: '#/components/schemas/SendingMethod'
        customization:
          $ref: '#/components/schemas/Customization'
        metadata:
          $ref: '#/components/schemas/Metadata'
      required:
        - campaignId
        - recipients
      additionalProperties: false
      description: The gift object.
      example:
        campaignId: '12345678'
        recipients:
          - firstname: John
            lastname: Doe
            externalId: '1234567890'
            phone: '+1234567890'
            email: example@domain.com
            key: abc123
        sendingMethod: mail
        customization:
          recipientExperience:
            type: enterAddress
            visualElements:
              reveal:
                type: snowGlobe
                primaryColor: '#000000'
                secondaryColor: '#000000'
                mediaItems:
                  logo:
                    - type: image
                      url: https://example.com/media-item-1.jpg
              greeting:
                content:
                  ops:
                    - attributes:
                        font: pacifico
                        size: 32px
                        color: '#000000'
                      insert: Happy Birthday!
                banner:
                  mediaItems:
                    background:
                      - type: image
                        url: https://example.com/media-item-1.jpg
                  text: 🎁 Enjoy your gift!
                  color: '#36d4ff'
              postClaim:
                redirectAfterClaim: https://example.com/redirect
          giftProperties:
            selectedGiftType: product
            product:
              id: productId
              displayType: displayAsSurprise
            budget:
              max: 100
              min: 76
            expiration:
              type: daysFromSend
              numberOfDays: 30
          notificationPolicy:
            sendingChannels:
              - mail
            disableReminders: true
        metadata:
          key1: value1
          key2: value2
    CreateGiftsResponse:
      type: object
      properties:
        message:
          type: string
          description: The message of the response
        metadata:
          $ref: '#/components/schemas/Metadata'
        results:
          type: array
          items:
            type: object
            properties:
              success:
                type: boolean
                description: The success of the gift creation
              link:
                type: string
                description: The link to the gift
              id:
                type: string
                description: The gift id
              experienceId:
                type: string
                description: The experience id
              message:
                type: string
                description: The error message
              errorCode:
                type: string
                description: The error code
            required:
              - success
              - link
              - id
              - experienceId
              - message
              - errorCode
      required:
        - message
        - metadata
        - results
      additionalProperties: false
      description: The response of the gift creation
      example:
        message: 2 gifts out of 3 have been sent successfully
        metadata:
          campaignName: Employee Appreciation Q1 2025
          totalRecipients: 3
          batchId: batch_20250609_001
        results:
          - success: true
            link: https://snappy.com/experience/K9mP3xL7dN
            id: G7nR4bD9mK
            experienceId: exp_2024_john_001
          - success: true
            link: https://snappy.com/experience/X2pQ8vB5jL
            id: H8sT6cF2nP
            experienceId: exp_2024_jane_002
          - success: false
            message: Gift creation failed
            errorCode: 40000
    ApiError:
      type: object
      properties:
        status:
          type: integer
          description: The HTTP status code.
          example: 400
        errorCode:
          anyOf:
            - type: number
            - type: string
          description: >-
            Internal error code, helps Snappy's technical team to troubleshoot
            if needed.
          example: 10000
        message:
          type: string
          description: The error message.
          example: Unauthorized
        errors:
          type: array
          items:
            type: object
            properties:
              path:
                type: string
                description: The path of the field that caused the error.
                example: body.recipients.0.email
              message:
                type: string
                description: The error message.
                example: Invalid email.
              errorCode:
                anyOf:
                  - type: number
                  - type: string
                description: >-
                  Internal error code, helps Snappy's technical team to
                  troubleshoot if needed.
                example: 10000
            required:
              - path
              - message
              - errorCode
          description: >-
            An array of client errors. This field is being returned only for
            errors the client should fix, usually with status code 400.
      required:
        - status
        - errorCode
        - message
      description: Standard API error response with optional client error details
      example:
        status: 400
        errorCode: 400001
        message: Bad Request
    Recipient:
      type: object
      properties:
        firstname:
          type: string
          pattern: >-
            ^(?=.{1,50}$)[a-zA-Z0-9_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01FF\u0100-\u017F\u0180-\u024F\u1E00-\u1EFF\u0400-\u04FF\u0500-\u052F\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\uAC00-\uD7AF\u0E00-\u0E7F][a-zA-Z0-9_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01FF\u0100-\u017F\u0180-\u024F\u1E00-\u1EFF\u0400-\u04FF\u0500-\u052F\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\uAC00-\uD7AF\u0E00-\u0E7F\u0300-\u036F\u1AB0-\u1AFF\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]*([\s\(\)\.\-_'\u2018\u2019]*[a-zA-Z0-9_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01FF\u0100-\u017F\u0180-\u024F\u1E00-\u1EFF\u0400-\u04FF\u0500-\u052F\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\uAC00-\uD7AF\u0E00-\u0E7F][a-zA-Z0-9_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01FF\u0100-\u017F\u0180-\u024F\u1E00-\u1EFF\u0400-\u04FF\u0500-\u052F\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\uAC00-\uD7AF\u0E00-\u0E7F\u0300-\u036F\u1AB0-\u1AFF\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]*)*[
            \(\)\.\-_'\u2018\u2019]*$
          description: The first name of the recipient.
          example: John
        lastname:
          type: string
          pattern: >-
            ^(?=.{1,50}$)[a-zA-Z0-9_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01FF\u0100-\u017F\u0180-\u024F\u1E00-\u1EFF\u0400-\u04FF\u0500-\u052F\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\uAC00-\uD7AF\u0E00-\u0E7F][a-zA-Z0-9_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01FF\u0100-\u017F\u0180-\u024F\u1E00-\u1EFF\u0400-\u04FF\u0500-\u052F\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\uAC00-\uD7AF\u0E00-\u0E7F\u0300-\u036F\u1AB0-\u1AFF\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]*([\s\(\)\.\-_'\u2018\u2019]*[a-zA-Z0-9_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01FF\u0100-\u017F\u0180-\u024F\u1E00-\u1EFF\u0400-\u04FF\u0500-\u052F\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\uAC00-\uD7AF\u0E00-\u0E7F][a-zA-Z0-9_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01FF\u0100-\u017F\u0180-\u024F\u1E00-\u1EFF\u0400-\u04FF\u0500-\u052F\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\uAC00-\uD7AF\u0E00-\u0E7F\u0300-\u036F\u1AB0-\u1AFF\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]*)*[
            \(\)\.\-_'\u2018\u2019]*$
          description: The last name of the recipient.
          example: Doe
        phone:
          type: string
          description: |-
            The phone number that the gift will be sent to.
            ( at the beginning is optional). Format: E.164.
          example: '+1234567890'
        email:
          type: string
          pattern: >-
            ^(?=.{1,60}$)(?!.*[.]{2})(?!\.)[a-zA-Z0-9._%+\-\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01FF\u0100-\u017F\u0180-\u024F']+(?<!\.)@(?!-)[a-zA-Z0-9.-\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u01FF\u0100-\u017F\u0180-\u024F]+\.(?!(?:con|cim|ocm|cmo)$)[a-zA-Z]{2,}$/i
          description: The email address that the gift will be sent to.
          example: example@domain.com
        key:
          type: string
          description: >-
            An optional unique identifier for the gift sending, used to avoid
            duplicated gifts sending to the same recipients when not intending
            to. For example, if you implement a retry mechanism and want to
            avoid sending the same gift.
          example: abc123
        externalId:
          type: string
          description: The id of the recipient in your own system.
          example: '1234567890'
      required:
        - firstname
      additionalProperties: false
      description: The gift recipient object.
      example:
        firstname: John
        lastname: Doe
        externalId: '1234567890'
        phone: '+1234567890'
        email: example@domain.com
        key: abc123
    SendingMethod:
      type: string
      enum:
        - mail
        - sms
        - mailAndSms
        - link
      example: mail
      deprecated: true
      description: >-
        Deprecated. Use "customization.notificationPolicy.sendingChannels"
        instead.
    Customization:
      type: object
      properties:
        giftProperties:
          $ref: '#/components/schemas/GiftProperties'
        notificationPolicy:
          $ref: '#/components/schemas/NotificationPolicy'
        recipientExperience:
          allOf:
            - $ref: '#/components/schemas/RecipientExperience'
            - type: object
              properties:
                visualElements:
                  allOf:
                    - $ref: '#/components/schemas/VisualElements'
                    - type: object
                      properties:
                        reveal:
                          allOf:
                            - $ref: '#/components/schemas/Reveal'
                            - type: object
                              properties:
                                primaryColor:
                                  anyOf:
                                    - type: string
                                      pattern: ^#[0-9A-Fa-f]{6}$
                                    - type: string
                                      enum:
                                        - ''
                                    - nullable: true
                                  description: >-
                                    Primary color of reveal experience. Required
                                    unless type is noReveal.
                                  example: '#000000'
                                  format: hex
                                secondaryColor:
                                  anyOf:
                                    - type: string
                                      pattern: ^#[0-9A-Fa-f]{6}$
                                    - type: string
                                      enum:
                                        - ''
                                    - nullable: true
                                  description: >-
                                    Secondary color of reveal experience.
                                    Required unless type is noReveal.
                                  example: '#000000'
                                  format: hex
                              additionalProperties: false
                          description: >-
                            The reveal animation creates an emotional moment of
                            surprise.

                            Choose the animation type, color scheme, and branded
                            elements to personalize the recipient's first
                            impression and enhance gift anticipation.
                          example:
                            type: snowGlobe
                            primaryColor: '#000000'
                            secondaryColor: '#000000'
                            mediaItems:
                              background:
                                - type: image
                                  url: https://example.com/image.jpg
                              logo:
                                - type: image
                                  url: https://example.com/image.jpg
                      additionalProperties: false
                  description: Visual elements of recipient experience.
                  example:
                    reveal:
                      type: snowGlobe
                      primaryColor: '#000000'
                      secondaryColor: '#000000'
                      mediaItems:
                        background:
                          - type: image
                            url: https://example.com/image.jpg
                        logo:
                          - type: image
                            url: https://example.com/image.jpg
                    greeting:
                      content:
                        ops:
                          - attributes:
                              font: pacifico
                            insert: Happy Birthday!
                      banner:
                        text: Happy Birthday!
                        color: '#000000'
                        mediaItems:
                          background:
                            - type: image
                              url: https://example.com/image.jpg
                          logo:
                            - type: image
                              url: https://example.com/image.jpg
              additionalProperties: false
          description: >-
            Defines the interactive journey recipients experience when receiving
            your gift - from the initial unwrapping animation to greeting
            message presentation and delivery address collection process.
          example:
            type: enterAddress
            visualElements:
              reveal:
                type: snowGlobe
                primaryColor: '#000000'
                secondaryColor: '#000000'
              greeting:
                content:
                  ops:
                    - insert: Happy Birthday!
                banner:
                  text: Happy Birthday!
                  color: '#000000'
                  mediaItems:
                    background:
                      - type: image
                        url: https://example.com/image.jpg
              postClaim:
                redirectAfterClaim: https://example.com/redirect
      additionalProperties: false
      description: Customization configuration of the gift.
    Metadata:
      type: object
      additionalProperties:
        type: string
        maxLength: 500
        pattern: ^[a-zA-Z0-9\s\-_.]+$
      maxProperties: 50
      description: >-
        Optional metadata object with key-value pairs. Keys must be alphanumeric
        (including underscores) and up to 40 characters. Values must be
        alphanumeric and up to 500 characters. Maximum 50 key-value pairs
        allowed.
      example:
        key1: value1
        key2: value2
    GiftProperties:
      type: object
      properties:
        budget:
          $ref: '#/components/schemas/Budget'
        expiration:
          $ref: '#/components/schemas/Expiration'
        guaranteedGift:
          $ref: '#/components/schemas/GuaranteedGift'
        selectedGiftType:
          type: string
          enum:
            - collection
            - product
        collection:
          $ref: '#/components/schemas/GiftCollectionResponse'
        product:
          allOf:
            - $ref: '#/components/schemas/Product'
            - type: object
              properties:
                name:
                  type: string
              additionalProperties: false
          description: |-
            Product configuration for campaign gifts.
            Required when selectedGiftType is product, otherwise not allowed.
          example:
            id: '12345678'
            displayType: displayAsSurprise
      additionalProperties: false
      description: >-
        Gift properties determine the core characteristics of your gift - budget
        constraints, expiration settings, and content type (collection or
        specific product).

        These settings influence what options will be available to your
        recipient.
      example:
        budget:
          max: 100
          min: 76
    NotificationPolicy:
      type: object
      properties:
        sendingChannels:
          type: array
          items:
            type: string
            enum:
              - mail
              - sms
              - link
              - code
              - slack
              - teams
          minItems: 1
          description: List of channels to send notifications through
          example:
            - mail
            - sms
        disableReminders:
          type: boolean
          description: Whether reminder notifications are disabled
          example: false
      additionalProperties: false
      description: >-
        Notification settings control how recipients are informed about their
        gift - via email, SMS, link sharing or other channels.

        Also manages reminder behavior to optimize engagement rates.
      example:
        sendingChannels:
          - mail
          - sms
        disableReminders: false
    RecipientExperience:
      type: object
      properties:
        type:
          type: string
          enum:
            - enterAddress
          description: >-
            The type of recipient experience.

            Currently, we support 'enterAddress' type.

            In the future, we plan to support the 'ship to address' feature and
            will add another type.
          example: enterAddress
        visualElements:
          $ref: '#/components/schemas/VisualElements'
        postClaim:
          $ref: '#/components/schemas/PostClaim'
      additionalProperties: false
      description: >-
        Defines the interactive journey recipients experience when receiving
        your gift - from the initial unwrapping animation to greeting message
        presentation and delivery address collection process.
      example:
        type: enterAddress
        visualElements:
          reveal:
            type: snowGlobe
            primaryColor: '#000000'
            secondaryColor: '#000000'
          greeting:
            content:
              ops:
                - insert: Happy Birthday!
            banner:
              text: Happy Birthday!
              color: '#000000'
              mediaItems:
                background:
                  - type: image
                    url: https://example.com/image.jpg
          postClaim:
            redirectAfterClaim: https://example.com/redirect
    VisualElements:
      type: object
      properties:
        reveal:
          $ref: '#/components/schemas/Reveal'
        greeting:
          $ref: '#/components/schemas/Greeting'
      required:
        - reveal
        - greeting
      additionalProperties: false
      description: Visual elements of recipient experience.
      example:
        reveal:
          type: snowGlobe
          primaryColor: '#000000'
          secondaryColor: '#000000'
          mediaItems:
            background:
              - type: image
                url: https://example.com/image.jpg
            logo:
              - type: image
                url: https://example.com/image.jpg
        greeting:
          content:
            ops:
              - attributes:
                  font: pacifico
                insert: Happy Birthday!
          banner:
            text: Happy Birthday!
            color: '#000000'
            mediaItems:
              background:
                - type: image
                  url: https://example.com/image.jpg
              logo:
                - type: image
                  url: https://example.com/image.jpg
    Reveal:
      type: object
      properties:
        type:
          type: string
          enum:
            - noReveal
            - snowGlobe
            - snowMan
            - pinata
            - boxTap
            - growingPlant
            - mountainClimbMask
            - elegantBoxMask
            - newHireMask
            - casinoMachineMask
            - anniversaryBottleMask
            - happyBirthdayMask
            - newbornEggMask
            - nostalgiaMask
            - cozyHolidayMask
            - thanksgivingMask
            - customImageScratch
            - brandScratch
            - customVideo
            - specialDeliveryMask
            - newYearMask
            - appreciationDayMask
            - magicalMask
            - thinkingOfYouMask
            - winterKnittingMask
            - starMask
            - winterTrainMask
          description: Type of reveal experience.
          example: snowGlobe
        primaryColor:
          type: string
          format: hex
          pattern: ^#[0-9A-Fa-f]{6}$
          description: Primary color of reveal experience.
          example: '#000000'
        secondaryColor:
          type: string
          format: hex
          pattern: ^#[0-9A-Fa-f]{6}$
          description: Secondary color of reveal experience.
          example: '#000000'
        mediaItems:
          $ref: '#/components/schemas/RevealMediaItems'
      required:
        - type
        - primaryColor
        - secondaryColor
      additionalProperties: false
      description: >-
        The reveal animation creates an emotional moment of surprise.

        Choose the animation type, color scheme, and branded elements to
        personalize the recipient's first impression and enhance gift
        anticipation.
      example:
        type: snowGlobe
        primaryColor: '#000000'
        secondaryColor: '#000000'
        mediaItems:
          background:
            - type: image
              url: https://example.com/image.jpg
          logo:
            - type: image
              url: https://example.com/image.jpg
    Budget:
      type: object
      properties:
        max:
          type: number
          minimum: 1
          maximum: 20000
          description: Maximum budget allowed for gifts (between 1-20,000)
          example: 100
        min:
          type: number
          minimum: 1
          maximum: 10000
          description: Minimum budget allowed for gifts (between 1-10,000)
          example: 76
      required:
        - max
      additionalProperties: false
      description: Budget constraints for gifts
      example:
        max: 100
        min: 76
    Expiration:
      type: object
      properties:
        type:
          type: string
          enum:
            - unlimited
            - specificDate
            - daysFromSend
          default: unlimited
          description: Type of expiration
          example: daysFromSend
        date:
          type: string
          format: date-time
          description: Required when type is specificDate, otherwise not allowed
        numberOfDays:
          type: number
          minimum: 1
          maximum: 365
          description: Required when type is daysFromSend, otherwise not allowed
      additionalProperties: false
      description: >-
        Flexible expiration options let you set a specific end date, number of
        days from sending, or unlimited usage period.

        This helps manage campaign relevance and encourages timely recipient
        action while maintaining control over your gifting program timeline.
      example:
        type: daysFromSend
        numberOfDays: 30
    GuaranteedGift:
      type: object
      properties:
        type:
          type: string
          enum:
            - specificDate
            - daysFromSend
          description: Type of guaranteed gift expiration
          example: daysFromSend
        date:
          type: string
          format: date-time
          description: Required when type is specificDate, otherwise not allowed
        numberOfDays:
          type: number
          minimum: 1
          maximum: 365
          description: Required when type is daysFromSend, otherwise not allowed
      required:
        - type
      additionalProperties: false
      description: >-
        Flexible guaranteed gift options mirror campaign expiration settings and
        allow specific date or days from send configuration.
      example:
        type: daysFromSend
        numberOfDays: 30
    GiftCollectionResponse:
      allOf:
        - $ref: '#/components/schemas/GiftCollection'
        - type: object
          properties:
            name:
              type: string
          additionalProperties: false
      description: |-
        Collection configuration for campaign gifts.
        Required when selectedGiftType is collection, otherwise not allowed.
      example:
        id: '12345678'
        featuredProductId: '12345678'
    Product:
      type: object
      properties:
        id:
          type: string
          description: The id of the product.
          example: '12345678'
        displayType:
          type: string
          enum:
            - displayAsSurprise
            - displayProduct
          default: displayProduct
          example: displayAsSurprise
      required:
        - id
      additionalProperties: false
      description: |-
        Product configuration for campaign gifts.
        Required when selectedGiftType is product, otherwise not allowed.
      example:
        id: '12345678'
        displayType: displayAsSurprise
    PostClaim:
      type: object
      properties:
        redirectAfterClaim:
          type: string
          format: uri
          description: URL to direct to after the recipient claims the gift.
          example: https://example.com/redirect
      required:
        - redirectAfterClaim
      additionalProperties: false
      description: An object defining the customizations in the postClaim step.
      example:
        redirectAfterClaim: https://example.com/redirect
    Greeting:
      type: object
      properties:
        content:
          type: object
          properties:
            ops:
              type: array
              items:
                nullable: true
                additionalProperties: true
          required:
            - ops
          additionalProperties:
            nullable: true
          description: Quill formatted JSON with ops array and any additional properties.
          example:
            ops:
              - attributes:
                  font: pacifico
                insert: Happy Birthday!
            customProperty: customValue
        banner:
          type: object
          properties:
            text:
              type: string
            color:
              type: string
              pattern: ^#[0-9A-Fa-f]{6}$
            mediaItems:
              $ref: '#/components/schemas/BannerMediaItems'
          required:
            - text
            - color
            - mediaItems
          additionalProperties: false
          description: >-
            The banner serves as the main visual element of the gift page.

            Customize background, logo, text, and colors to create a unique
            branded experience.
          example:
            text: Happy Birthday!
            color: '#000000'
            mediaItems:
              background:
                - type: image
                  url: https://example.com/image.jpg
              logo:
                - type: image
                  url: https://example.com/image.jpg
      required:
        - content
        - banner
      additionalProperties: false
      description: >-
        A personalized greeting with customizable fonts, colors, and media
        elements.

        Craft an emotional message that accompanies your gift and conveys your
        sentiment to the recipient.
      example:
        content:
          ops:
            - attributes:
                font: pacifico
              insert: Happy Birthday!
        banner:
          text: Happy Birthday!
          color: '#000000'
          mediaItems:
            background:
              - type: image
                url: https://example.com/image.jpg
            logo:
              - type: image
                url: https://example.com/image.jpg
    RevealMediaItems:
      type: object
      properties:
        background:
          type: array
          items:
            $ref: '#/components/schemas/MediaItems'
          maxItems: 1
        logo:
          type: array
          items:
            $ref: '#/components/schemas/MediaItems'
          maxItems: 1
      additionalProperties: false
      description: Media items of reveal experience.
      example:
        background:
          - type: image
            url: https://example.com/image.jpg
        logo:
          - type: image
            url: https://example.com/image.jpg
    GiftCollection:
      type: object
      properties:
        id:
          type: string
          description: The id of the collection.
          example: '12345678'
        featuredProductId:
          type: string
          description: The id of the featured product.
          example: '12345678'
      required:
        - id
      additionalProperties: false
      description: |-
        Collection configuration for campaign gifts.
        Required when selectedGiftType is collection, otherwise not allowed.
      example:
        id: '12345678'
        featuredProductId: '12345678'
    BannerMediaItems:
      type: object
      properties:
        background:
          type: array
          items:
            $ref: '#/components/schemas/MediaItems'
          minItems: 0
          maxItems: 1
        logo:
          type: array
          items:
            $ref: '#/components/schemas/MediaItems'
          maxItems: 1
      required:
        - background
      additionalProperties: false
      description: Media items of banner.
      example:
        background:
          - type: image
            url: https://example.com/image.jpg
        logo:
          - type: image
            url: https://example.com/image.jpg
    MediaItems:
      type: object
      properties:
        type:
          type: string
          enum:
            - image
            - video
          description: Type of media item.
          example: image
        url:
          type: string
          format: uri
          description: URL of the media item.
          example: https://example.com/image.jpg
      required:
        - type
        - url
      additionalProperties: false
      description: Media item object.
      example:
        type: image
        url: https://example.com/image.jpg
  securitySchemes:
    CompanyLevelAuthentication:
      type: apiKey
      in: header
      name: X-Api-Key
      description: >
        ## Company Level Authentication


        Company level authentication provides access to all resources under your
        company, including accounts, campaigns, gifts, and recipients.


        ### Getting Your API Key


        1. **Create an API Key**: Use the `POST /v2/authentication/apiKeys`
        endpoint to generate a new API key

        2. **Set Expiration**: Choose from 30, 60, 90, or 180 days (default: 90
        days)

        3. **Optional mTLS**: Enable mutual TLS for enhanced security

        4. **Name Your Key**: Provide a descriptive name for easy identification


        ### Using Your API Key


        Include your API key in the `X-Api-Key` header for every request:

        ```

        X-Api-Key: YOUR_24_CHARACTER_API_KEY

        ```


        ### API Key Management


        - **Maximum Keys**: Up to 3 active API keys per company

        - **Rotation**: Delete old keys before creating new ones when at the
        limit

        - **Security**: Keys are hashed and cannot be retrieved after creation


        ### Enhanced Security (mTLS)


        For production environments, enable mutual TLS authentication:

        1. Set `enforceMtls: true` when creating the API key

        2. Contact support to obtain your client certificates

        3. Use the mTLS endpoint: `https://mtls-api.snappy.com/public-api`
    BearerAuthentication:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Bearer authentication provides access to all resources under your
        company, including accounts, campaigns, gifts, and recipients.

````