openapi: 3.0.0
info:
  title: DriveThruRPG
  version: 1.0.0
  description: >
    OpenAPI specification for the DriveThruRPG API. Authentication is performed
    by exchanging an application key for a JWT token, which is then passed as a
    Bearer token in the Authorization header for subsequent requests.
servers:
  - url: https://api.drivethrurpg.com/api
paths:
  /{DTRPG_API_VERSION}/auth_key:
    post:
      summary: Get token
      description: >
        This request exchanges your DriveThruRPG application key for an
        authentication token.


        **Endpoint**

        - `POST {{baseUrl}}/:DTRPG_API_VERSION/auth_key`

        - Uses path variable `DTRPG_API_VERSION` (e.g., `vBeta`).

        - Uses environment variable `DTRPG_APPLICATION_KEY` for the DriveThruRPG
        application key.


        **Behavior**

        On success (`200 OK`), the response body includes:

        - `token`: JWT auth token used to authenticate subsequent requests.

        - `refreshToken`: Token that can be used to obtain a new auth token when
        the current one expires.

        - `refreshTokenTTL`: Unix timestamp indicating when the refresh token
        expires.

        These values define the API contract for downstream SDK and application
        repositories. SDKs and applications may adapt these values into
        language-specific or UX-specific behavior, but they must not redefine
        their meaning.
      tags:
        - Auth
      requestBody:
        content:
          application/json:
            schema:
              type: object
      responses:
        '200':
          description: Success
          headers:
            Set-Cookie:
              schema:
                type: string
              description: >-
                Sets the refreshToken cookie used by the refresh endpoint.
                Scoped to the refresh path, secure and httponly.
              example: >-
                refreshToken=4496d1c728d6b238161013719b8f4ba18cd770ed2f2c8323e9d8b2749455fd2358f0a30ab71377eec464a135bc8e03ecaa0debc0e3a80d4116e85810f7c55d04;
                expires=Fri, 20 Feb 2026 00:27:13 GMT; Max-Age=2592000;
                path=/api/vBeta/auth/refresh; domain=.drivethrurpg.com; secure;
                httponly; samesite=strict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthTokenResponse'
              example:
                token: >-
                  eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE3Njg5NTUyMzMsImV4cCI6MTc2ODk3NjgzMywicm9sZXMiOlsiUk9MRV9QUk9YWSIsIlJPTEVfTElCUkFSSUFOIl0sImVtYWlsIjoicGF1bEBzY2hpZmZlcmVycy5uZXQiLCJwcmV2aW91c0xvZ2luIjp7ImRhdGUiOiIyMDI2LTAxLTE5IDIwOjExOjQ3LjAwMDAwMCIsInRpbWV6b25lX3R5cGUiOjMsInRpbWV6b25lIjoiVVMvQ2VudHJhbCJ9LCJ1c2VybmFtZSI6InBhdWxAc2NoaWZmZXJlcnMubmV0Iiwic2l0ZUlkIjoxMCwiZ3JvdXBJZCI6MSwibmFtZSI6IkRyaXZlVGhydVJQRy5jb20iLCJsb2dpbklwIjoiOTguOTcuNDEuMTQ0IiwiZG9tYWluIjoiYXBpLmRyaXZldGhydXJwZy5jb20iLCJsb2dpbk9yaWdpbiI6MjUsInJvbGVfbGlicmFyaWFuIjoxLCJyb2xlX2Rpc3RyaWJ1dG9yIjowLCJyb2xlX2dsb2JhbF9kaXN0cmlidXRvciI6MCwiY3VycmVudElwIjoiOTguOTcuNDEuMTQ0IiwiY3VzdG9tZXJJZCI6Mzk5MTQ0LCJjdXN0b21lckZpcnN0TmFtZSI6IlBhdWwiLCJjdXN0b21lckxhc3ROYW1lIjoiU2NoaWZmZXJlciIsInB1Ymxpc2hlcklkIjoxMjkxNiwiaW5pdGlhbEFkdWx0Q29udGVudE9wdEluIjpmYWxzZSwiaW5pdGlhbEFpR2VuQ29udGVudEVuYWJsZWQiOnRydWUsImluaXRpYWxEZWZhdWx0Q3VycmVuY3kiOiJVU0QiLCJpbml0aWFsRGVmYXVsdExhbmd1YWdlSWQiOjEsImlzR3Vlc3QiOmZhbHNlLCJiYXNrZXRVVUlEIjoiMzk3NTUyNDctYTU5MS00OTFmLTgyOTktNGNlNGJmZTE4YzM0In0.liWGMSyhTKAlWKmFAIIf-xDZkN5yPHHaP6epkwNxZoM9si9x5XgxGuTbUNPl3K-OfCtxUrqCMUVt7CWgA2iWcxj_rEIdtbwlVUZQ4Da8Q0unxnz6ogwBTlIB1x64Qye-qDxJYUrw8F3Gj9gm8utg0h04-KtSCCGb8yLqLQSePSmS47Fvah3FKLPuH8ufbgYP5fttLW3Nz44cjkPPsLBKf1nVXplVC6GGnEw2h6jAaS_tikcFo816krlm_rDijRKBHfdyC3I8BJgqu5CyJ_xFvcArNg-Sajl7s7ilUuv6lSvAHEPpodZsSCERJXberqJvvY4Wyiil5OBLgfcfWRCoVQ
                refreshToken: >-
                  4496d1c728d6b238161013719b8f4ba18cd770ed2f2c8323e9d8b2749455fd2358f0a30ab71377eec464a135bc8e03ecaa0debc0e3a80d4116e85810f7c55d04
                refreshTokenTTL: 1771547233
        '401':
          description: Authentication failed for the supplied application key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthSessionError'
              example:
                errorCode: invalid_application_key
                message: The supplied application key is invalid or no longer active.
                authState: unauthenticated
        default:
          description: Request failed before an auth session could be established
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthSessionError'
    parameters:
      - name: DTRPG_API_VERSION
        in: path
        required: true
        schema:
          type: string
        example: vBeta

  /{DTRPG_API_VERSION}/order_products:
    get:
      summary: Get ordered products
      description: >
        This request asks for a list of products ordered by the user.

        The user is determined from the authentication token provided in the request.

        If the token is expired, invalid, or otherwise unusable, the API
        defines the resulting auth/session failure behavior and downstream
        repositories must treat that behavior as the source of truth.
      tags:
        - Products
      security:
        - ApiKeyAuth: []
        - BearerAuth: []
      parameters:
        - name: getChecksum
          in: query
          description: Should the response include checksums for the files?
          schema:
            type: integer
            minimum: 0
            maximum: 1
          example: 0
        - name: getFilters
          in: query
          description: >-
            Should the response include applicable filter information for the
            product?
          schema:
            type: integer
            minimum: 0
            maximum: 1
          example: 1
        - name: page
          in: query
          description: The ordinal page number of the response data
          schema:
            type: integer
          example: 1
        - name: pageSize
          in: query
          description: The maximum number of items to include in the response
          schema:
            type: integer
          example: 50
        - name: library
          in: query
          description: Filter to items in the user's library
          schema:
            type: boolean
          example: true
        - name: archived
          in: query
          description: Should the response data include archived items?
          schema:
            type: integer
            minimum: 0
            maximum: 1
          example: 0
        - name: updatedDate[after]
          in: query
          description: Include items that have been updated after the specified date (ISO 8601)
          schema:
            type: string
            format: date-time
          example: '2025-11-26T14:09:36-08:00'
      responses:
        '200':
          description: Ordered product list
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrderProductListResponse'
              example:
                links:
                  self: /api/vBeta/order_products?archived=0&getChecksum=1&getFilters=1&library=true&pageSize=50&updatedDate%5Bafter%5D=2025-11-26T14%3A09%3A36-08%3A00&page=1
                meta:
                  itemsPerPage: 50
                  currentPage: 1
                data:
                  - id: /api/vBeta/order_products/170405504
                    type: OrderProduct
                    attributes:
                      orderId: 49674203
                      productId: 430675
                      royaltyPublisherId: 12407
                      isbn: 978-2-9603330-3-9
                      name: Sandbox Generator
                      datePurchased: null
                      filesize: null
                      finalPrice: 12
                      quantity: 1
                      bundleId: 0
                      archived: 0
                      addOnInfo: null
                      orderProductId: 170405504
                      customerId: 399144
                      fileLastModified: '2024-07-16T10:45:52-05:00'
                      fileLastDownloaded: '2025-11-26T16:25:56-06:00'
                      files:
                        - index: 0
                          orderProductDownloadId: 167421777
                          title: Sandbox_Generator.pdf
                          filename: Sandbox_Generator.pdf
                          size: 5894763
                          sizeMB: '5.89'
                          checksums:
                            - checksum: d29c480df2a96506c189bc71de50efa5
                              checksumDate: '2023-04-04T11:06:00-05:00'
                      filters:
                        - filterId: 2120
                          parentFilterId: 2150
                          name: Setting Guides
                          parentName: Product Type
                      history:
                        - changed: '2024-07-16T00:00:00-05:00'
                          changes: Updated file.
                      attributes:
                        - orderId: 49674203
                          optionName: Download Format
                          optionValueName: PDF
                          price: '0.0000'
                          pricePrefix: +
                          optionValueId: 8
                          optionType: digital
        default:
          description: Request failed, including auth/session failures for missing, expired, or invalid token state
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthSessionError'
    parameters:
      - name: DTRPG_API_VERSION
        in: path
        required: true
        schema:
          type: string
        example: vBeta

  /{DTRPG_API_VERSION}/order_products/{orderProductId}:
    get:
      summary: Get order product
      description: >
        Retrieve a single ordered product by its order product ID.
      tags:
        - Products
      security:
        - ApiKeyAuth: []
        - BearerAuth: []
      responses:
        '200':
          description: Order product detail
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/OrderProductItem'
        default:
          description: Request failed, including auth/session failures for missing, expired, or invalid token state
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthSessionError'
    parameters:
      - name: DTRPG_API_VERSION
        in: path
        required: true
        schema:
          type: string
        example: vBeta
      - name: orderProductId
        in: path
        required: true
        description: The unique identifier for the order product
        schema:
          type: integer
        example: 174269090

  /{DTRPG_API_VERSION}/order_products/{orderProductId}/prepare:
    get:
      summary: Prepare order product download
      description: >
        Prepares a download for the specified order product. This endpoint is
        called before initiating a file download to obtain the download URL or
        token.
      tags:
        - Products
      security:
        - ApiKeyAuth: []
        - BearerAuth: []
      responses:
        '200':
          description: Download preparation details
          content:
            application/json:
              schema:
                type: object
        default:
          description: Request failed, including auth/session failures for missing, expired, or invalid token state
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthSessionError'
    parameters:
      - name: DTRPG_API_VERSION
        in: path
        required: true
        schema:
          type: string
        example: vBeta
      - name: orderProductId
        in: path
        required: true
        description: The unique identifier for the order product
        schema:
          type: integer
        example: 174269090

  /{DTRPG_API_VERSION}/product_lists:
    get:
      summary: Get product lists
      description: >
        Retrieves the custom product lists created by the authenticated user.
      tags:
        - Products
      security:
        - ApiKeyAuth: []
        - BearerAuth: []
      parameters:
        - name: page
          in: query
          description: The ordinal page number of the response data
          schema:
            type: integer
          example: 1
        - name: pageSize
          in: query
          description: The maximum number of items to include in the response
          schema:
            type: integer
          example: 50
      responses:
        '200':
          description: Product list collection
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductListCollectionResponse'
              example:
                links:
                  self: /api/vBeta/product_lists?pageSize=50&page=1
                meta:
                  itemsPerPage: 50
                  currentPage: 1
                data:
                  - id: /api/vBeta/product_lists/1498
                    type: ProductList
                    attributes:
                      customerId: 399144
                      name: Maps
                      dateCreated: '2022-06-22T21:25:25-05:00'
                      productListId: 1498
                      slug: maps
                      itemCount: 359
                  - id: /api/vBeta/product_lists/1499
                    type: ProductList
                    attributes:
                      customerId: 399144
                      name: Settings
                      dateCreated: '2022-06-22T21:25:31-05:00'
                      productListId: 1499
                      slug: settings
                      itemCount: 0
        default:
          description: Request failed, including auth/session failures for missing, expired, or invalid token state
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthSessionError'
    parameters:
      - name: DTRPG_API_VERSION
        in: path
        required: true
        schema:
          type: string
        example: vBeta

  /{DTRPG_API_VERSION}/product_list_items:
    get:
      summary: Get product list items
      description: >
        Retrieves the products contained within a specific product list, identified
        by its product list ID.
      tags:
        - Products
      security:
        - ApiKeyAuth: []
        - BearerAuth: []
      parameters:
        - name: page
          in: query
          description: The ordinal page number of the response data
          schema:
            type: integer
          example: 1
        - name: pageSize
          in: query
          description: The maximum number of items to include in the response
          schema:
            type: integer
          example: 50
        - name: productListId
          in: query
          required: true
          description: The ID of the product list whose items should be returned
          schema:
            type: integer
          example: 1498
      responses:
        '200':
          description: Product list items
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedResponse'
        default:
          description: Request failed, including auth/session failures for missing, expired, or invalid token state
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthSessionError'
    parameters:
      - name: DTRPG_API_VERSION
        in: path
        required: true
        schema:
          type: string
        example: vBeta

components:
  schemas:
    AuthTokenResponse:
      type: object
      properties:
        token:
          type: string
          description: JWT auth token used to authenticate subsequent requests until it expires or is otherwise invalidated by the API.
        refreshToken:
          type: string
          description: Token that can be used to obtain a new auth token when the current auth token expires, subject to API-defined refresh semantics.
        refreshTokenTTL:
          type: integer
          description: Unix timestamp indicating when the refresh token expires according to API-owned session lifecycle semantics.
      required:
        - token
        - refreshToken
        - refreshTokenTTL

    AuthSessionError:
      type: object
      description: Error payload for failures related to authentication or session state.
      properties:
        errorCode:
          type: string
          description: Machine-readable code describing the auth or session failure.
          example: token_expired
        message:
          type: string
          description: Human-readable explanation of the auth or session failure.
          example: The authentication token has expired.
        authState:
          type: string
          description: Session state observed by the API when the failure occurred.
          enum:
            - unauthenticated
            - token_invalid
            - token_expired
            - refresh_expired
            - unauthorized
          example: token_expired
      required:
        - errorCode
        - message
        - authState

    PaginationLinks:
      type: object
      description: Hypermedia links for pagination
      properties:
        self:
          type: string
          description: URL of the current page
        first:
          type: string
          description: URL of the first page
        last:
          type: string
          description: URL of the last page
        prev:
          type: string
          description: URL of the previous page
          nullable: true
        next:
          type: string
          description: URL of the next page
          nullable: true
      required:
        - self

    PaginationMeta:
      type: object
      description: Pagination metadata
      properties:
        itemsPerPage:
          type: integer
          description: Number of items included in each page
        currentPage:
          type: integer
          description: The current page number (1-indexed)
      required:
        - itemsPerPage
        - currentPage

    PaginatedResponse:
      type: object
      properties:
        links:
          $ref: '#/components/schemas/PaginationLinks'
        meta:
          $ref: '#/components/schemas/PaginationMeta'
        data:
          type: array
          items:
            type: object
      required:
        - links
        - meta
        - data

    FileChecksum:
      type: object
      description: Checksum record for a downloadable file
      properties:
        checksum:
          type: string
          description: MD5 checksum of the file
          example: d29c480df2a96506c189bc71de50efa5
        checksumDate:
          type: string
          format: date-time
          description: Date when the checksum was computed
          example: '2023-04-04T11:06:00-05:00'
      required:
        - checksum
        - checksumDate

    OrderProductFile:
      type: object
      description: A downloadable file associated with an ordered product
      properties:
        index:
          type: integer
          description: Zero-based index of this file within the product's file list
          example: 0
        orderProductDownloadId:
          type: integer
          description: Unique identifier for this download record
          example: 167421777
        title:
          type: string
          description: Display title of the file
          example: Sandbox_Generator.pdf
        filename:
          type: string
          description: Actual filename of the downloadable file
          example: Sandbox_Generator.pdf
        size:
          type: integer
          description: File size in bytes
          example: 5894763
        sizeMB:
          type: string
          description: File size in megabytes, formatted as a string with two decimal places
          example: '5.89'
        checksums:
          type: array
          description: Checksums for verifying file integrity
          items:
            $ref: '#/components/schemas/FileChecksum'
      required:
        - index
        - orderProductDownloadId
        - title
        - filename
        - size
        - sizeMB
        - checksums

    OrderProductFilter:
      type: object
      description: A taxonomy filter tag associated with the product
      properties:
        filterId:
          type: integer
          description: Unique identifier for the filter
          example: 2120
        parentFilterId:
          type: integer
          description: Identifier of the parent filter category
          example: 2150
        name:
          type: string
          description: Name of the filter value
          example: Setting Guides
        parentName:
          type: string
          description: Name of the parent filter category
          example: Product Type
      required:
        - filterId
        - parentFilterId
        - name
        - parentName

    OrderProductHistoryEntry:
      type: object
      description: A changelog entry recording a change to the product's files
      properties:
        changed:
          type: string
          format: date-time
          description: Date when the change was made
          example: '2024-07-16T00:00:00-05:00'
        changes:
          type: string
          description: Human-readable description of what changed
          example: Updated file.
      required:
        - changed
        - changes

    OrderProductAttribute:
      type: object
      description: A purchase option attribute (e.g., download format)
      properties:
        orderId:
          type: integer
          description: The order ID this attribute belongs to
          example: 49674203
        optionName:
          type: string
          description: Name of the product option
          example: Download Format
        optionValueName:
          type: string
          description: Selected value for the option
          example: PDF
        price:
          type: string
          description: Price modifier for this option, formatted as a decimal string
          example: '0.0000'
        pricePrefix:
          type: string
          description: Prefix indicating how the price modifier is applied (e.g., "+")
          example: +
        optionValueId:
          type: integer
          description: Unique identifier for the selected option value
          example: 8
        optionType:
          type: string
          description: Type category for this option (e.g., "digital", "physical")
          example: digital
      required:
        - orderId
        - optionName
        - optionValueName
        - price
        - pricePrefix
        - optionValueId
        - optionType

    OrderProductAttributes:
      type: object
      description: The attributes of an ordered product
      properties:
        orderId:
          type: integer
          description: Unique identifier for the order that contains this product
          example: 49674203
        productId:
          type: integer
          description: Unique identifier for the product in the DTRPG catalog
          example: 430675
        royaltyPublisherId:
          type: integer
          description: Publisher ID used for royalty calculation
          example: 12407
        isbn:
          type: string
          description: ISBN of the product, if applicable
          example: '978-2-9603330-3-9'
          nullable: true
        name:
          type: string
          description: Display name of the product
          example: Sandbox Generator
        datePurchased:
          type: string
          format: date-time
          description: Date the product was purchased
          example: null
          nullable: true
        filesize:
          type: integer
          description: Total file size in bytes (may be null if not yet computed)
          example: null
          nullable: true
        finalPrice:
          type: number
          description: Final price paid for this order product
          example: 12
        quantity:
          type: integer
          description: Quantity of this item in the order
          example: 1
        bundleId:
          type: integer
          description: Bundle ID if part of a bundle, otherwise 0
          example: 0
        archived:
          type: integer
          description: Whether the product has been archived by the user (0 = no, 1 = yes)
          minimum: 0
          maximum: 1
          example: 0
        addOnInfo:
          type: string
          description: Add-on information if applicable
          example: null
          nullable: true
        orderProductId:
          type: integer
          description: Unique identifier for this order product record
          example: 170405504
        customerId:
          type: integer
          description: Unique identifier for the customer who purchased the product
          example: 399144
        fileLastModified:
          type: string
          format: date-time
          description: Date and time when the product files were last modified by the publisher
          example: '2024-07-16T10:45:52-05:00'
          nullable: true
        fileLastDownloaded:
          type: string
          format: date-time
          description: Date and time when the customer last downloaded this product
          example: '2025-11-26T16:25:56-06:00'
          nullable: true
        files:
          type: array
          description: List of downloadable files associated with this order product
          items:
            $ref: '#/components/schemas/OrderProductFile'
        filters:
          type: array
          description: Taxonomy filter tags classifying the product (populated when getFilters=1)
          items:
            $ref: '#/components/schemas/OrderProductFilter'
        history:
          type: array
          description: Changelog entries recording updates to the product's files
          items:
            $ref: '#/components/schemas/OrderProductHistoryEntry'
        attributes:
          type: array
          description: Purchase option attributes (e.g., download format selections)
          items:
            $ref: '#/components/schemas/OrderProductAttribute'
      required:
        - orderId
        - productId
        - royaltyPublisherId
        - name
        - finalPrice
        - quantity
        - bundleId
        - archived
        - orderProductId
        - customerId
        - files

    OrderProductItem:
      type: object
      description: A JSON:API resource object representing a single ordered product
      properties:
        id:
          type: string
          description: Resource identifier URL for this order product
          example: /api/vBeta/order_products/170405504
        type:
          type: string
          description: JSON:API resource type
          enum:
            - OrderProduct
          example: OrderProduct
        attributes:
          $ref: '#/components/schemas/OrderProductAttributes'
      required:
        - id
        - type
        - attributes

    PublisherAttributes:
      type: object
      description: Attributes of a publisher
      properties:
        name:
          type: string
          description: Display name of the publisher
          example: Tabletop Adventures, LLC
        publisherId:
          type: integer
          description: Unique identifier for the publisher
          example: 367
        slug:
          type: string
          description: URL-friendly slug for the publisher
          example: tabletop-adventures-llc
      required:
        - name
        - publisherId
        - slug

    PublisherItem:
      type: object
      description: A JSON:API resource object representing a publisher
      properties:
        id:
          type: string
          description: Resource identifier URL for this publisher
          example: /api/vBeta/publishers/367
        type:
          type: string
          enum:
            - Publisher
          example: Publisher
        attributes:
          $ref: '#/components/schemas/PublisherAttributes'
      required:
        - id
        - type
        - attributes

    OrderProductListResponse:
      type: object
      description: Paginated list of ordered products
      properties:
        links:
          $ref: '#/components/schemas/PaginationLinks'
        meta:
          $ref: '#/components/schemas/PaginationMeta'
        data:
          type: array
          description: Array of ordered product resource objects
          items:
            $ref: '#/components/schemas/OrderProductItem'
        included:
          type: array
          description: >
            Sideloaded related resources (JSON:API). Currently includes Publisher
            objects referenced by the order products in this response.
          items:
            $ref: '#/components/schemas/PublisherItem'
      required:
        - links
        - meta
        - data

    ProductListAttributes:
      type: object
      description: The attributes of a customer-created product list
      properties:
        customerId:
          type: integer
          description: Unique identifier for the customer who owns this list
          example: 399144
        name:
          type: string
          description: Display name of the product list
          example: Maps
        dateCreated:
          type: string
          format: date-time
          description: Date and time when the list was created
          example: '2022-06-22T21:25:25-05:00'
        productListId:
          type: integer
          description: Unique identifier for the product list
          example: 1498
        slug:
          type: string
          description: URL-friendly slug for the product list
          example: maps
        itemCount:
          type: integer
          description: Number of products currently in the list
          example: 359
      required:
        - customerId
        - name
        - dateCreated
        - productListId
        - slug
        - itemCount

    ProductListItem:
      type: object
      description: A JSON:API resource object representing a customer product list
      properties:
        id:
          type: string
          description: Resource identifier URL for this product list
          example: /api/vBeta/product_lists/1498
        type:
          type: string
          description: JSON:API resource type
          enum:
            - ProductList
          example: ProductList
        attributes:
          $ref: '#/components/schemas/ProductListAttributes'
      required:
        - id
        - type
        - attributes

    ProductListCollectionResponse:
      type: object
      description: Paginated collection of customer product lists
      properties:
        links:
          $ref: '#/components/schemas/PaginationLinks'
        meta:
          $ref: '#/components/schemas/PaginationMeta'
        data:
          type: array
          description: Array of product list resource objects
          items:
            $ref: '#/components/schemas/ProductListItem'
      required:
        - links
        - meta
        - data

  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: query
      name: applicationKey
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >
        JWT token obtained from the /auth_key endpoint. Pass as the value of
        the Authorization header in the format "Bearer <token>".

security:
  - ApiKeyAuth: []
