openapi: 3.0.3
info:
  title: Catalog Data Ingestion API
  description: |
   The Catalog Data Ingestion API allows you to create and manage products and price books and directly integrate catalog data with the Commerce catalog service.

    This API provides the following resource collections to create and update catalog data:

    - **Metadata**—define and manage product attribute display on the storefront, define search characteristics, and so on
    - **Products**—define and manage items to include in a commerce catalog. Each product can have multiple attributes like name, description, SKU, images, etc.
    - **Price books**—define and manage unique scopes that can be used to manage product price discounts across customer tiers
    - **Prices**—define and manage the prices associated with product SKUs and assign the pricing scope where the price is used

  version: 1.0.0
servers:
  - url: https://commerce.adobe.io/<DATA_SPACE_ID>/api/
    description: Production endpoint. The DATA_SPACE_ID value is the  ID for the data space where commerce catalog data is stored. See [SaaS configuration](https://experienceleague.adobe.com/en/docs/commerce-merchant-services/user-guides/integration-services/saas#saasenv) in Adobe Experience League.

tags:
  - name: Metadata
    description: |
      Product attribute metadata allows you to define how to display product attributes on the storefront, define search characteristics, and so on.
  - name: Products
    description: Product API to manage product data
  - name: Price Books
    description: |
          Price books define a unique scope that can be used to manage product price discounts across customer tiers.
          You can also specify the currency to use for product prices in the specified price book.

          The catalog data model provides a default price book with id `main` and currency in US dollars (`USD`).
  - name: Prices
    description: |
      Define prices for product SKUs. The scope identifies the price books and price tiers where the price is used.
      is used.
paths:
  /v1/catalog/products/metadata:
    post:
      tags:
        - Metadata
      summary: Create product attribute metadata.
      description: |
        Create or replace existing product attribute metadata resources.

        To update existing product attribute metadata, use the update operation.
      operationId: ProductMetadataPut
      parameters:
        - name: Content-Type
          in: header
          required: true
          schema:
            type: string
            enum: [application/json]
        - name: x-api-key
          in: header
          required: true
          schema:
            type: string
          description: Production public API key
        - name: x-gw-signature
          in: header
          required: true
          schema:
            type: string
          description: JWT generated for Production public API key
        - name: Content-Encoding
          in: header
          required: false
          schema:
            type: string
            enum: [gzip]
          description: Use this header if the payload is compressed with gzip.
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/FeedMetadata'
            examples:
              FeedWithMetadataInformation:
                summary: Example of product attributes metadata
                description: Add product attribute information to a product.
                value:
                  [
                    {
                      "code": "name",
                      "scope": {
                        "locale": "en"
                      },
                      "label": "Product Name",
                      "dataType": "TEXT",
                      "visibleIn": ["PRODUCT_DETAIL"],
                      "filterable": false,
                      "sortable": false,
                      "searchable": true,
                      "searchWeight": 55,
                      "searchTypes": ["AUTOCOMPLETE"]
                    }
                  ]
      responses:
        '200':
          description: All items in the request are accepted for further processing.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/ProcessFeedResponse'
        '400':
          description: Request rejected. Some of the received items are invalid. Check the "message" and "errors" fields for details.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/400ProcessFeedResponse'
        '403':
          description: Unauthorized request. Verify the `x-api-key` and make sure that the JWT in `x-gw-signature` is still valid.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/403Response'
    patch:
      tags:
        - Metadata
      summary: Update product attribute metadata.
      description: |
        Update existing product attribute metadata with new values.
        When the update is processed, the merge strategy is used to apply changes to `scalar` and `object` type fields. The replace strategy is used to apply changes for fields in an `array`.
      operationId: ProductMetadataPatch
      parameters:
        - name: Content-Type
          in: header
          required: true
          schema:
            type: string
            enum: [application/json]
        - name: x-api-key
          in: header
          required: true
          schema:
            type: string
          description: Production public API key
        - name: x-gw-signature
          in: header
          required: true
          schema:
            type: string
          description: JWT generated for Production public API key.
        - name: Content-Encoding
          in: header
          required: false
          schema:
            type: string
            enum: [gzip]
          description: Use this header if the payload is compressed with gzip.
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/FeedMetadataUpdate'
            examples:
              FeedWithMetadataInformation:
                summary: Example of product attribute metadata
                description: |
                  Update existing product attribute metadata with new values.
                  Note that fields with the `array` type will replace existing data.
                  Example bellow updates the following attributes:
                  * `label` - Change the product attribute label.
                  * `visibleIn` - Add `PRODUCT_LISTING` role to the product attribute.
                value:
                  [
                    {
                      "code": "name",
                      "scope": {
                        "locale": "en"
                      },
                      "label": "Updated - Product Name",
                      "visibleIn": ["PRODUCT_DETAIL", "PRODUCT_LISTING"]
                    }
                  ]
      responses:
        '200':
          description: All items in the request are accepted for further processing.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/ProcessFeedResponse'
        '400':
          description: Request rejected. Some of the received items are invalid. Check the "invalidFeedItems" node for specific errors.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/400ProcessFeedResponse'
        '403':
          description: Unauthorized request. Verify the `x-api-key` and make sure that the JWT in `x-gw-signature` is still valid.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/403Response'
  /v1/catalog/products/metadata/delete:
    post:
      tags:
        - Metadata
      summary: Delete product attributes metadata.
      description: Remove product attribute metadata resources from the catalog data.
      operationId: ProductMetadataDelete
      parameters:
        - name: Content-Type
          in: header
          required: true
          schema:
            type: string
            enum: [application/json]
        - name: x-api-key
          in: header
          required: true
          schema:
            type: string
          description: Production public API key.
        - name: x-gw-signature
          in: header
          required: true
          schema:
            type: string
          description: JWT generated for Production public API key.
        - name: Content-Encoding
          in: header
          required: false
          schema:
            type: string
            enum: [gzip]
          description: Use this header if the payload is compressed with gzip.
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/FeedMetadataDelete'
            examples:
              FeedWithMetadataInformation:
                summary: Delete product attribute metadata.
                description: Marks existing product attribute metadata as deleted.
                value:
                  [
                    {
                      "code": "name",
                      "scope": {
                        "locale": "en"
                      }
                    }
                  ]
      responses:
        '200':
          description: All items in the request are accepted for further processing.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/ProcessFeedResponse'
        '400':
          description: Some received items are invalid. Check the ‘invalidFeedItems’ node for specific errors.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/400ProcessFeedResponse'
        '403':
          description: Unauthorized request. Verify the ‘x-api-key’ and make sure that the JWT in ‘x-gw-signature’ is still valid.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/403Response'

  /v1/catalog/products:
    post:
      tags:
        - Products
      summary: Create products.
      description: |
        <h3>Simple Products</h3>
        Create products or replace existing products with a specified `sku` and `scope`.
        If a product with the same data exists with the same SKU and scope, the product update request is ignored.

        Use the [update operation](#operation/ProductsPatch) to modify values for an existing product.

        <h3>Configurable Products</h3>
        A configurable product is a product that offers multiple options, such as color and size. Each unique combination of these options, like 'color green' and 'size large,' defines a product variant. This variant is an independent product with its own SKU, price, and inventory. The configurable product acts as a container for these product variants.

        To create a configurable product, you need the following:
        - [Product attributes](#operation/ProductMetadataPut): Define the product attributes used to define a configurable product, such as "color", "size", etc.
        - [Configurable product](#operation/ProductsPost): Define the configurable product. [Options](#operation/ProductsPost!path=options&t=request) is a required field. It defines the choices that a shopper can select.
        - [Product variant](#operation/ProductsPost): Define a product variant for a configurable product. ["Attributes"](#operation/ProductsPost!path=attributes) with ["variantReferenceId"](#operation/ProductsPost!path=attributes/variantReferenceId&t=request) and ["links"](#operation/ProductsPost!path=links&t=request) of type `VARIANT_OF` must be defined for product variants.

        Each product variant links back to the configurable product through its `variantReferenceId`, which corresponds to specific `options[].values[].id` in the configurable product.

        To unassign a product variant from a configurable product, do one of the following:
        - Use [Delete Product API](#operation/ProductsDelete) to delete the product variant.
        - Use [Update Product API](#operation/ProductsPatch) to set the ["variantReferenceId"](#operation/ProductsPost!path=attributes/variantReferenceId&t=request) to `null` and unassign the product variant from the configurable product by removing the ["links"](#operation/ProductsPost!path=links&t=request) association.
      operationId: ProductsPost
      parameters:
        - $ref: '#/components/parameters/ContentType'
        - $ref: '#/components/parameters/xApiKey'
        - $ref: '#/components/parameters/xGwSignature'
        - $ref: '#/components/parameters/ContentEncoding'
      responses:
        '200':
          $ref: '#/components/responses/AcceptedResponse'
        '400':
          $ref: '#/components/responses/InvalidItemsResponse'
        '403':
          $ref: '#/components/responses/UnauthorizedResponse'
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/FeedProduct'
            examples:
              SimpleProductWithImages:
                summary: Create a simple product.
                description: >
                  Create a simple product with required and optional fields.
                value:
                  [
                    {
                      "sku": "red-pants",
                      "scope": {
                        "locale": "en"
                      },
                      "name": "red pants",
                      "slug": "red-pants.html",
                      "status": "ENABLED",
                      "description": "long description about red pants",
                      "shortDescription": "just pants",
                      "visibleIn": [
                        "CATALOG",
                        "SEARCH"
                      ],
                      "metaTags": {
                        "title": "Yoga pants ",
                        "description": "Climb with Zeppelin Yoga Pant",
                        "keywords": [
                          "pants",
                          "yoga"
                        ]
                      },
                      "attributes": [
                        {
                          "code": "cost",
                          "type": "NUMBER",
                          "values": [
                            "10.5"
                          ]
                        },
                        {
                          "code": "states",
                          "type": "ARRAY",
                          "values": [
                            "TX",
                            "CA"
                          ]
                        }
                      ],
                      "images": [
                        {
                          "url": "https://example.com/images/pants.jpg",
                          "label": "photo of my pants!",
                          "roles": [
                            "BASE",
                            "SMALL"
                          ],
                          "customRoles": [
                            "widget"
                          ]
                        }
                      ],
                      "routes": [
                        {
                          "path": "red-pants"
                        },
                        {
                          "path": "pants/red-pants",
                          "position": 1
                        }
                      ]
                    }
                  ]
              ConfigurableProductWithVariants:
                summary: Create a configurable product with four product variants.
                description: >
                  Create a configurable product `pants` with four product variants: `pants-red-32`, `pants-red-44`, `pants-green-32` and `pants-green-44`.
                value:
                  [
                    {
                      "sku": "pants",
                      "scope": {
                        "locale": "en"
                      },
                      "name": "Yoga pants",
                      "slug": "zeppelin-yoga-pant",
                      "status": "ENABLED",
                      "visibleIn": [
                        "CATALOG"
                      ],
                      "options": [
                        {
                          "id": "color",
                          "label": "Pants color",
                          "required": true,
                          "defaultValueId": "pants-color-red",
                          "type": "SWATCH",
                          "values": [
                            {
                              "id": "pants-color-red",
                              "label": "Red",
                              "colorHex": "#ff0000"
                            },
                            {
                              "id": "pants-color-green",
                              "label": "Green",
                              "imageUrl": "https://www.example.com/media/catalog/product/green_main_1.jpg"
                            }
                          ]
                        },
                        {
                          "id": "size",
                          "label": "Pants size",
                          "required": true,
                          "defaultValueId": "pants-size-32",
                          "type": "CONFIGURABLE",
                          "values": [
                            {
                              "id": "pants-size-32",
                              "label": "32"
                            },
                            {
                              "id": "pants-size-44",
                              "label": "44"
                            }
                          ]
                        }
                      ]
                    },
                    {
                      "sku": "pants-red-32",
                      "scope": {
                        "locale": "en"
                      },
                      "name": "Zeppelin Yoga Pant Red 32 size",
                      "slug": "pants-red-32",
                      "status": "ENABLED",
                      "attributes": [
                        {
                          "code": "color",
                          "type": "STRING",
                          "values": [
                            "Red Pants"
                          ],
                          "variantReferenceId": "pants-color-red"
                        },
                        {
                          "code": "size",
                          "type": "STRING",
                          "values": [
                            "32"
                          ],
                          "variantReferenceId": "pants-size-32"

                        }
                      ],
                      "links": [
                        {
                          "type": "variant_of",
                          "sku": "pants"
                        }
                      ]
                    },
                    {
                      "sku": "pants-red-44",
                      "scope": {
                        "locale": "en"
                      },
                      "name": "Zeppelin Yoga Pant Red 44 size",
                      "slug": "pants-red-44",
                      "status": "ENABLED",
                      "attributes": [
                        {
                          "code": "color",
                          "type": "STRING",
                          "values": [
                            "Red Pants"
                          ],
                          "variantReferenceId": "pants-color-red"
                        },
                        {
                          "code": "size",
                          "type": "STRING",
                          "values": [
                            "44"
                          ],
                          "variantReferenceId": "pants-size-44"
                        }
                      ],
                      "links": [
                        {
                          "type": "VARIANT_OF",
                          "sku": "pants"
                        }
                      ]
                    },
                    {
                      "sku": "pants-green-32",
                      "scope": {
                        "locale": "en"
                      },
                      "name": "Zeppelin Yoga Pant Green 32 size",
                      "slug": "pants-green-32",
                      "status": "ENABLED",
                      "attributes": [
                        {
                          "code": "color",
                          "type": "STRING",
                          "values": [
                            "Green Pants"
                          ],
                          "variantReferenceId": "pants-color-green"
                        },
                        {
                          "code": "size",
                          "type": "STRING",
                          "values": [
                            "32"
                          ],
                          "variantReferenceId": "pants-size-32"
                        }
                      ],
                      "links": [
                        {
                          "type": "variant_of",
                          "sku": "pants"
                        }
                      ]
                    },
                    {
                      "sku": "pants-green-44",
                      "scope": {
                        "locale": "en"
                      },
                      "name": "Zeppelin Yoga Pant green 44 size",
                      "slug": "pants-green-44",
                      "status": "ENABLED",
                      "attributes": [
                        {
                          "code": "color",
                          "type": "STRING",
                          "values": [
                            "Green Pants"
                          ],
                          "variantReferenceId": "pants-color-green"
                        },
                        {
                          "code": "size",
                          "type": "STRING",
                          "values": [
                            "44"
                          ],
                          "variantReferenceId": "pants-size-44"
                        }
                      ],
                      "links": [
                        {
                          "type": "variant_of",
                          "sku": "pants"
                        }
                      ]
                    }
                  ]
    patch:
      tags:
        - Products
      summary: Update products.
      description: |
        Update products with specified "sku" and "scope" to replace existing field data with the data supplied in the request.
        When the update is processed, the merge strategy is used to apply changes to `scalar` and `object` type fields.
        The replace strategy is used to apply changes for fields in an `array`.
      operationId: ProductsPatch
      parameters:
        - $ref: '#/components/parameters/ContentType'
        - $ref: '#/components/parameters/xApiKey'
        - $ref: '#/components/parameters/xGwSignature'
        - $ref: '#/components/parameters/ContentEncoding'
      responses:
        '200':
          $ref: '#/components/responses/AcceptedResponse'
        '400':
          $ref: '#/components/responses/InvalidItemsResponse'
        '403':
          $ref: '#/components/responses/UnauthorizedResponse'
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/FeedProductUpdate'
            examples:
              SimpleProductWithImages:
                summary: Update a simple product.
                description: |
                  Update a simple product with the values provided in the request.
                  On update, changes to `scalar` and `object` type fields are applied using the merge strategy.
                  The replace strategy is used to apply changes for fields in an `array`.

                  In the example below, the following attributes are updated.
                  * `name` - Change the product name.
                  * `metaTags.title` - Change the title of the product detail page.
                  * `attributes` - Add a new state, `NM` to the `states` attribute.
                value:
                  [
                    {
                      "sku": "red-pants",
                      "scope": {
                        "locale": "en"
                      },
                      "name": "Red pants - discounts!",
                      "metaTags": {
                        "title": "Updated - Red"
                      },
                      "attributes": [
                        {
                          "code": "cost",
                          "type": "NUMBER",
                          "values": [
                            "10.5"
                          ]
                        },
                        {
                          "code": "states",
                          "type": "ARRAY",
                          "values": [
                            "TX",
                            "CA",
                            "NM"
                          ]
                        }
                      ]
                    }
                  ]
              UnassignProductVariant:
                summary: Unassign product variant `pants-red-32` from configurable product `pants`.
                description: |
                  To unassign product variant `pants-red-32` from configurable product `pants` you need:
                  * remove the `variantReferenceId` from the `attributes` field
                  * remove the `links` association
                value:
                  [
                    {
                      "sku": "pants-red-32",
                      "scope": {
                        "locale": "en"
                      },
                      "attributes": [
                        {
                          "code": "color",
                          "type": "STRING",
                          "values": [
                            "Red Pants"
                          ],
                          "variantReferenceId": null
                        },
                        {
                          "code": "size",
                          "type": "STRING",
                          "values": [
                            "32"
                          ],
                          "variantReferenceId": null

                        }
                      ],
                      "links": []
                    }
                  ]
  /v1/catalog/products/delete:
    post:
      tags:
        - Products
      summary: Delete products.
      description: >
        Delete products with specified "sku" and "scope".
      operationId: ProductsDelete
      parameters:
        - $ref: '#/components/parameters/ContentType'
        - $ref: '#/components/parameters/xApiKey'
        - $ref: '#/components/parameters/xGwSignature'
        - $ref: '#/components/parameters/ContentEncoding'
      responses:
        '200':
          $ref: '#/components/responses/AcceptedResponse'
        '400':
          $ref: '#/components/responses/InvalidItemsResponse'
        '403':
          $ref: '#/components/responses/UnauthorizedResponse'
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/FeedProductDelete'
            examples:
              DeleteSimpleProduct:
                summary: Delete product.
                description: >
                  Delete a simple product with a specified `sku` and `scope`.
                value:
                  [
                    {
                      "sku": "red-pants",
                      "scope": {
                        "locale": "en"
                      }
                    }
                  ]

  /v1/catalog/price-books:
    post:
      tags:
        - Price Books
      summary: Create price books.
      description: |
         Create or replace existing price books.

         Use the update operation to modify values for existing price books.
      operationId: PriceBooksPut
      parameters:
        - name: Content-Type
          in: header
          required: true
          schema:
            type: string
            enum: [application/json]
        - name: x-api-key
          in: header
          required: true
          schema:
            type: string
          description: Production public API key
        - name: x-gw-signature
          in: header
          required: true
          schema:
            type: string
          description: JWT generated for Production public API key
        - name: Content-Encoding
          in: header
          required: false
          schema:
            type: string
            enum: [gzip]
          description: Use this header if the payload is compressed with gzip.
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/FeedPricebook'
            examples:
              FeedWithPricebookInformation:
                summary: Create a price book.
                description: Create a price book and specify the currency for prices.
                value:
                  [
                    {
                      "priceBookId": "dealer-north",
                      "name": "Dealer North price book name",
                      "currency": "USD"
                    },
                    {
                      "priceBookId": "VIP",
                      "currency": "USD"
                    }
                  ]
      responses:
        '200':
          description: All items in the request are accepted for further processing.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/ProcessFeedResponse'
        '400':
          description: Request rejected. Some of the received items are invalid. Check the "invalidFeedItems" node for specific errors.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/400ProcessFeedResponse'
        '403':
          description: Unauthorized request. Verify the `x-api-key` and make sure that the JWT in `x-gw-signature` is still valid.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/403Response'
    patch:
      tags:
        - Price Books
      summary: Update price books.
      description: |-
        Update existing price books to change the name or the currency used for pricing.
        When the update is processed, the merge strategy is used to apply changes to `scalar` and `object` type fields. The replace strategy is used to apply changes for fields in an `array`.
        
        To update the currency for the default price book, use the price book id `main`.
      operationId: PriceBooksPatch
      parameters:
        - name: Content-Type
          in: header
          required: true
          schema:
            type: string
            enum: [application/json]
        - name: x-api-key
          in: header
          required: true
          schema:
            type: string
          description: Production public API key.
        - name: x-gw-signature
          in: header
          required: true
          schema:
            type: string
          description: JWT generated for Production public API key.
        - name: Content-Encoding
          in: header
          required: false
          schema:
            type: string
            enum: [gzip]
          description: Use this header if the payload is compressed with gzip.
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/FeedPricebook'
            examples:
              FeedWithPriceBookInformation:
                summary: Update existing price books.
                description: Update the "dealer-north" and default "main" price books to change the currency.
                value:
                  [
                    {
                      "priceBookId": "dealer-north",
                      "currency": "EUR"
                    },
                    {
                      "priceBookId": "main",
                      "currency": "EUR"
                    }
                  ]
      responses:
        '200':
          description: All items in the request are accepted for further processing.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/ProcessFeedResponse'
        '400':
          description: Request rejected. Some of the received items are invalid. Check the `invalidFeedItems` node for specific errors.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/400ProcessFeedResponse'
        '403':
          description: Unauthorized request. Verify the `x-api-key` and make sure that the JWT in `x-gw-signature` is still valid.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/403Response'
  /v1/catalog/price-books/delete:
    post:
      tags:
        - Price Books
      summary: Delete price books.
      description: |
         Delete existing price books.
         Note that you cannot delete the default price book with id `main`.
      operationId: PriceBooksDelete
      parameters:
        - name: Content-Type
          in: header
          required: true
          schema:
            type: string
            enum: [application/json]
        - name: x-api-key
          in: header
          required: true
          schema:
            type: string
          description: Production public API key.
        - name: x-gw-signature
          in: header
          required: true
          schema:
            type: string
          description: JWT generated for Production public API key.
        - name: Content-Encoding
          in: header
          required: false
          schema:
            type: string
            enum: [gzip]
          description: Use this header if the payload is compressed with gzip.
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/FeedPricebook'
            examples:
              DeleteExistingPricebook:
                summary: Delete price book "dealer-north".
                description: Delete the "dealer-north" price book.
                value:
                  [
                    {
                      "priceBookId": "dealer-north"
                    }
                  ]
      responses:
        '200':
          description: All items in the request are accepted for further processing.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/ProcessFeedResponse'
        '400':
          description: Request rejected. Some of the received items are invalid. Check the "invalidFeedItems" node for specific errors.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/400ProcessFeedResponse'
        '403':
          description: Unauthorized request. Verify the `x-api-key` and make sure that the JWT in `x-gw-signature` is still valid.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/403Response'

  /v1/catalog/products/prices:
    post:
      tags:
        - Prices
      summary: Create prices.
      description: |
        <h3>Simple Products</h3>
        Create or replace existing product prices.

        A price must be associated with at least the default price book with id `main`.
        
        <h3>Configurable Products</h3>
        Because configurable product price is calculated based on the price of the selected product variant, you don't need to send price
        data for configurable product skus. Sending price data for these skus can cause incorrect price calculations.

      operationId: PricesPut
      parameters:
        - name: Content-Type
          in: header
          required: true
          schema:
            type: string
            enum: [application/json]
        - name: x-api-key
          in: header
          required: true
          schema:
            type: string
          description: Production public API key
        - name: x-gw-signature
          in: header
          required: true
          schema:
            type: string
          description: JWT generated for Production public API key
        - name: Content-Encoding
          in: header
          required: false
          schema:
            type: string
            enum: [gzip]
          description: Use this header if the payload is compressed with gzip
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/FeedPrices'
            examples:
              FeedWithNewProductPrice:
                summary: Add product price information.
                description: Add product price information to the catalog data.
                value:
                  [
                    {
                      "sku": "red-pants",
                      "priceBookId": "main",
                      "regular": 20
                    },
                    {
                      "sku": "red-pants",
                      "priceBookId": "VIP",
                      "regular": 19.9,
                      "discounts": [
                        {"code": "discount", "percentage": 10}
                      ]
                    },
                    {
                      "sku": "red-pants",
                      "priceBookId": "dealer-north",
                      "regular": 20.5,
                      "discounts": [
                        {"code": "fixed", "price": 18}
                      ]
                    }
                  ]
      responses:
        '200':
          description: All items in the request are accepted for further processing.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/ProcessFeedResponse'
        '400':
          description: Request rejected. Some of the received items are invalid. Check the "invalidFeedItems" node for specific errors.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/400ProcessFeedResponse'
        '403':
          description: Unauthorized request. Verify the `x-api-key` and make sure that the JWT in `x-gw-signature` is still valid.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/403Response'
    patch:
      tags:
        - Prices
      summary: Update prices.
      description: |
        Change existing product prices.
        When the update is processed, the merge strategy is used to apply changes to `scalar` and `object` type fields. The replace strategy is used to apply changes for fields in an `array`.
      operationId: PricesPatch
      parameters:
        - name: Content-Type
          in: header
          required: true
          schema:
            type: string
            enum: [application/json]
        - name: x-api-key
          in: header
          required: true
          schema:
            type: string
          description: Production public API key
        - name: x-gw-signature
          in: header
          required: true
          schema:
            type: string
          description: JWT generated for Production public API key.
        - name: Content-Encoding
          in: header
          required: false
          schema:
            type: string
            enum: [gzip]
          description: Use this header if the payload is compressed with gzip.
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/FeedPricesUpdate'
            examples:
              FeedWithProductPricesInformation:
                summary: Product prices update.
                description: Update existing product prices for the given SKU ("red-pants") and price book id ("dealer-north").
                value:
                  [
                    {
                      "sku": "red-pants",
                      "priceBookId": "dealer-north",
                      "discounts": [
                        {"code": "discount", "percentage": 30}
                      ]
                    }
                  ]
      responses:
        '200':
          description: All items in the request are accepted for further processing.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/ProcessFeedResponse'
        '400':
          description: |
            Request rejected. Some of the received items are invalid.
            Check the "invalidFeedItems" node for specific errors.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/400ProcessFeedResponse'
        '403':
          description: |
            Unauthorized request. Verify the `x-api-key` and make sure that the JWT in `x-gw-signature` is still valid.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/403Response'
  /v1/catalog/products/prices/delete:
    post:
      tags:
        - Prices
      summary: Delete prices.
      description: >
        Delete existing product prices
      operationId: PricesDelete
      parameters:
        - name: Content-Type
          in: header
          required: true
          schema:
            type: string
            enum: [application/json]
        - name: x-api-key
          in: header
          required: true
          schema:
            type: string
          description: Production public API key
        - name: x-gw-signature
          in: header
          required: true
          schema:
            type: string
          description: JWT generated for Production public API key
        - name: Content-Encoding
          in: header
          required: false
          schema:
            type: string
            enum: [gzip]
          description: Use this header if the payload is compressed with gzip.
      requestBody:
        content:
          application/json:
            schema:
              type: array
              items:
                $ref: '#/components/schemas/FeedPricesDelete'
            examples:
              FeedWithProductPricesInformation:
                summary: Product prices delete.
                description: >
                  Delete the existing product prices information
                value:
                  [
                    {
                      "sku": "red-pants",
                      "priceBookId": "dealer-north",
                    }
                  ]
      responses:
        '200':
          description: All items in the request are accepted for further processing.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/ProcessFeedResponse'
        '400':
          description: Request rejected. Some of the received items are invalid. Check the "invalidFeedItems" node for specific errors.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/400ProcessFeedResponse'
        '403':
          description: Unauthorized request. Verify the `x-api-key` and make sure that the JWT in `x-gw-signature` is still valid.
          content:
            application/json;charset=UTF-8:
              schema:
                $ref: '#/components/schemas/403Response'

components:
  responses:
    AcceptedResponse:
      description: All items accepted and will be processed asynchronously
      content:
        application/json;charset=UTF-8:
          schema:
            $ref: '#/components/schemas/ProcessFeedResponse'
    InvalidItemsResponse:
      description: One or all received items are invalid. Check the "invalidFeedItems" node for details
      content:
        application/json;charset=UTF-8:
          schema:
            $ref: '#/components/schemas/400ProcessFeedResponse'
    UnauthorizedResponse:
      description: Unauthorized request. Verify the `x-api-key` value is correct and ensure the JWT is not expired in `x-gw-signature`.
      content:
        application/json;charset=UTF-8:
          schema:
            $ref: '#/components/schemas/403Response'
  parameters:
    DATA_SPACE_ID:
      name: DATA_SPACE_ID
      in: path
      description: |
        Data Space ID.

        See [SaaS data space provisioning](https://experienceleague.adobe.com/en/docs/commerce-merchant-services/user-guides/integration-services/saas#saas-data-space-provisioning)
        in Adobe Experience League.
      required: true
      style: simple
      schema:
        type: string
    ContentType:
      name: Content-Type
      in: header
      required: true
      schema:
        type: string
        enum: [application/json]
    xApiKey:
      name: x-api-key
      in: header
      required: true
      schema:
        type: string
      description: Production public API key
    xGwSignature:
      name: x-gw-signature
      in: header
      required: true
      schema:
        type: string
      description: JWT generated for Production public API key.
    ContentEncoding:
      name: Content-Encoding
      in: header
      required: false
      schema:
        type: string
        enum: [gzip]
      description: Use this header if the payload is compressed with gzip.

  schemas:
    FeedItemFailedValidationResult:
      title: FeedItemFailedValidationResult
      type: object
      properties:
        code:
          type: string
          description: Code name of invalid field.
        itemIndex:
          type: integer
          format: int32
          description: Reference to the line item with an invalid payload. The line count begins at 0.
        message:
          type: string
          description: Error description
        value:
          type: string
          description: Original value passed in the request.
    FeedMetadata:
      title: FeedMetadata
      description: Metadata information for a product attribute.
      required:
        - code
        - scope
        - label
        - dataType
      type: object
      properties:
        code:
          type: string
          description: Attribute code
        scope:
          $ref: '#/components/schemas/Scope'
        visibleIn:
          type: array
          description: |
            Determines how the attribute is used on the storefront.
            * `PRODUCT_DETAIL`: Product attribute is visible on the Product Detail Page.
            * `PRODUCT_LISTING`: Product attribute is visible on Product Listing Page.
            * `SEARCH_RESULTS`: Product attribute is visible on Search Results Page.
            * `PRODUCT_COMPARE`: Product attribute is visible on Product Compare Page.
          items:
            enum:
              - PRODUCT_DETAIL
              - PRODUCT_LISTING
              - SEARCH_RESULTS
              - PRODUCT_COMPARE
        label:
          type: string
          description: Label for the attribute that is displayed in user interfaces.
          example: Attribute Name
        dataType:
          type: string
          description: Data type
          example: TEXT
          enum:
            - TEXT
            - DECIMAL
            - INTEGER
            - BOOLEAN
        filterable:
          type: boolean
          description: Indicates whether the attribute can be used to filter products.
          example: true
        sortable:
          type: boolean
          description: Indicates whether the attribute can be used to sort products.
          example: true
        searchable:
          type: boolean
          description: Indicates whether the attribute value can be used in search queries to filter results.
          example: true
        searchWeight:
          type: number
          description: |
            The weight associated with a searchable attribute.
            Attributes with a greater weight are returned before attributes with a lower weight.
          format: float
        searchTypes:
          type: array
          description: >
            Search types associated with this attribute, for example: `autocomplete`, `starts_with`, and so on.
          items:
            type: string
            enum:
              - AUTOCOMPLETE
              - CONTAINS
              - STARTS_WITH
    FeedMetadataUpdate:
      title: FeedMetadataUpdate
      description: Metadata information for a product attribute.
      required:
        - code
        - scope
      type: object
      properties:
        code:
          type: string
          description: Attribute code
        scope:
          $ref: '#/components/schemas/Scope'
        visibleIn:
          type: array
          description: |
            Determines how the attribute is used on the storefront.
            * `PRODUCT_DETAIL`: Product attribute is visible on the Product Detail Page.
            * `PRODUCT_LISTING`: Product attribute is visible on Product Listing Page.
            * `SEARCH_RESULTS`: Product attribute is visible on Search Results Page.
            * `PRODUCT_COMPARE`: Product attribute is visible on Product Compare Page.
          items:
            enum:
              - PRODUCT_DETAIL
              - PRODUCT_LISTING
              - SEARCH_RESULTS
              - PRODUCT_COMPARE
        label:
          type: string
          description: Label for the attribute that is displayed in user interfaces.
          example: Attribute Name
        dataType:
          type: string
          description: Data type
          example: TEXT
          enum:
            - TEXT
            - DECIMAL
            - INTEGER
            - BOOLEAN
        filterable:
          type: boolean
          description: Indicates whether the attribute can be used to filter products.
          example: true
        sortable:
          type: boolean
          description: Indicates whether the attribute can be used to sort products.
          example: true
        searchable:
          type: boolean
          description: Indicates whether the attribute value can be used in search queries to filter results.
          example: true
        searchWeight:
          type: number
          description: |
            The weight associated with a searchable attribute.
            Attributes with a greater weight are returned before attributes with a lower weight.
          format: float
        searchTypes:
          type: array
          description: >
            Search types associated with this attribute, for example: `autocomplete`, `starts_with`, and so on.
          items:
            type: string
            enum:
              - AUTOCOMPLETE
              - CONTAINS
              - STARTS_WITH
    FeedMetadataDelete:
      title: Delete metadata attribute
      description: Delete metadata information for a product attribute.
      required:
        - code
        - scope
      type: object
      properties:
        code:
          type: string
          description: Attribute code
        scope:
          $ref: '#/components/schemas/Scope'
    FeedProduct:
      title: Catalog Product payload
      type: object
      required:
        - sku
        - scope
        - name
        - slug
        - status
      properties:
        sku:
          type: string
          description: SKU (Stock Keeping Unit) is a unique identifier for a product.
          example: MH01
        scope:
          $ref: '#/components/schemas/Scope'
        name:
          type: string
          description: Product name
          example: Kangaroo Hoodie
        slug:
          type: string
          description: The URL key for the product.
          example: kangaroo-hoodie.html
        description:
          type: string
          description: The main description for the product
          example: A kangaroo hoodie for all seasons
        shortDescription:
          type: string
          description: A short description of the product
          example: A hoodie for all seasons with a kangaroo pocket
        status:
          type: string
          description: |
            Indicates whether the product is visible on the storefront.
            The value is "Enabled" if it is visible, and "Disabled" if it is not visible.
          example: ENABLED
          enum:
            - ENABLED
            - DISABLED
        visibleIn:
          type: array
          description: |
            Storefront area where the product is visible. An empty list means that it is not visible as a stand alone product.
            * `CATALOG`: Product is visible on Product Listing Page and Product Detail Page.
            * `SEARCH`: Product is visible on Search Results Page and Product Detail Page.
          example: [CATALOG]
          items:
            enum:
              - CATALOG
              - SEARCH
        metaTags:
          type: object
          description: Meta attributes that are specified in <meta> tags.
          items:
            $ref: '#/components/schemas/ProductMetaAttribute'
        attributes:
          type: array
          description: A list of product attributes.
          items:
            $ref: '#/components/schemas/ProductAttribute'
        images:
          type: array
          description: A list of product images.
          items:
            $ref: '#/components/schemas/ProductImage'
        links:
          type: array
          description: A list of linked SKUs.
          items:
            $ref: '#/components/schemas/ProductLink'
        routes:
          type: array
          description: A list of product routes.
          items:
            $ref: '#/components/schemas/ProductRoutes'
        options:
          type: array
          description: Composite products, such as configurable products, must provide a list of product options that a shopper can select (for example, "color", "size", etc.).
          items:
            $ref: '#/components/schemas/ProductOption'
    FeedProductUpdate:
      title: Catalog Product payload
      type: object
      required:
        - sku
        - scope
      properties:
        sku:
          type: string
          description: SKU (Stock Keeping Unit) is a unique identifier for a product.
          example: MH01
        scope:
          $ref: '#/components/schemas/Scope'
        name:
          type: string
          description: Product name
          example: Kangaroo Hoodie
        slug:
          type: string
          description: The URL key for the product.
          example: kangaroo-hoodie.html
        description:
          type: string
          description: The main description for the product
          example: A kangaroo hoodie for all seasons
        shortDescription:
          type: string
          description: A short description of the product
          example: A hoodie for all seasons with a kangaroo pocket
        status:
          type: string
          description: |
            Indicates whether the product is visible on the storefront.
            The value is "Enabled" if it is visible, and "Disabled" if it is not visible.
          example: ENABLED
          enum:
            - ENABLED
            - DISABLED
        visibleIn:
          type: array
          description: |
            Storefront area where the product is visible. An empty list means that it is not visible as a stand alone product.
            * `CATALOG`: Product is visible on Product Listing Page and Product Detail Page.
            * `SEARCH`: Product is visible on Search Results Page and Product Detail Page.
          example: [CATALOG]
          items:
            enum:
              - CATALOG
              - SEARCH
        metaTags:
          type: object
          description: Meta attributes that are specified in <meta> tags.
          items:
            $ref: '#/components/schemas/ProductMetaAttribute'
        attributes:
          type: array
          description: A list of product attributes.
          items:
            $ref: '#/components/schemas/ProductAttribute'
        images:
          type: array
          description: A list of product images.
          items:
            $ref: '#/components/schemas/ProductImage'
        links:
          type: array
          description: |
            A list of linked SKUs. For product variants, this is a required field that establishes a link between a product variant and the corresponding configurable product.
            `VARIANT_OF` link type must be specified to establish a connection to the configurable product SKU.
          items:
            $ref: '#/components/schemas/ProductLink'
        routes:
          type: array
          description: A list of product routes.
          items:
            $ref: '#/components/schemas/ProductRoutes'
        options:
          type: array
          description: Options associated with the product.
          items:
            $ref: '#/components/schemas/ProductOption'
    FeedProductDelete:
      title: Catalog Product delete payload
      type: object
      required:
        - sku
        - scope
      properties:
        sku:
          type: string
          description: Product unique identifier
          example: MH01
        scope:
          $ref: '#/components/schemas/Scope'
    FeedPricebook:
      title: FeedPricebook
      description: Price book information
      required:
        - priceBookId
      type: object
      properties:
        priceBookId:
          type: string
          description: Price book id
        name:
          type: string
          description: Price book name
        currency:
          type: string
          description: Price book currency
          minLength: 1
          maxLength: 5
    FeedPrices:
      title: FeedPrices
      description: Product price information.
      required:
        - sku
        - priceBookId
        - regular
      type: object
      properties:
        sku:
          type: string
          description: Product SKU
        priceBookId:
          type: string
          description: Price book id
        regular:
          type: number
          format: float
          description: Regular price
        discounts:
          type: array
          description: Active discounts
          items:
            anyOf:
              - $ref: '#/components/schemas/DiscountsFinalPrice'
              - $ref: '#/components/schemas/DiscountsPercentage'
    FeedPricesUpdate:
      title: FeedPrices
      description: Product price information.
      required:
        - sku
        - priceBookId
      type: object
      properties:
        sku:
          type: string
          description: Product SKU
        priceBookId:
          type: string
          description: Price book id
        regular:
          type: number
          format: float
          description: Regular price
        discounts:
          type: array
          description: Active discounts
          items:
            anyOf:
              - $ref: '#/components/schemas/DiscountsFinalPrice'
              - $ref: '#/components/schemas/DiscountsPercentage'
    FeedPricesDelete:
      title: FeedPricesDelete
      description: Delete product price information.
      required:
        - sku
        - priceBookId
      type: object
      properties:
        sku:
          type: string
          description: Product SKU
        priceBookId:
          type: string
          description: Price book id
    DiscountsFinalPrice:
      title: Final Price
      type: object
      properties:
        code:
          type: string
        price:
          type: number
          format: float
    DiscountsPercentage:
      title: Discount
      type: object
      properties:
        code:
          type: string
        percentage:
          type: number
          format: float
    Scope:
      title: Scope
      description: Scope of the entity. For example it's locale "English"
      type: object
      required:
        - locale
      properties:
        locale:
          type: string
          description: A single value that represents content locale, for example, English.
          example: English
    ProductMetaAttribute:
      title: Meta Attributes
      type: object
      properties:
        title:
          type: string
          description: A meta title
        keywords:
          type: array
          description: A meta keywords
          items:
            type: string
        description:
          type: string
          description: A meta description
    ProductAttribute:
      title: Product Attribute
      type: object
      required:
        - code
        - type
        - values
      properties:
        code:
          type: string
          description: Product Attribute Code
        type:
          enum:
            - BOOLEAN
            - NUMBER
            - STRING
            - ARRAY
            - OBJECT
          description: |
            Type of attribute value to be applied during the rendering phase. Validation occurs only when the code is rendered. Invalid values are ignored.
            - `BOOLEAN`: Accept single value: "true" or false
            - `NUMBER`: Accept single number,e.g. "85", "0.42", etc.
            - `STRING`: Accept single string,e.g. "Great day, yall!"
            - `ARRAY`: Accept list of strings ,e.g. ["red", "green", "blue"]
            - `OBJECT`: Accept JSON object `"{"name": "swatch", "color": "red"}"`
        values:
          type: array
          description: A list of value(s) associated with a specified attribute code.
          items:
            type: string
        variantReferenceId:
          type: string
          nullable: true
          description: |
            The variant reference ID establishes a link between a product variant and the corresponding [Option Value ID](#operation/ProductsPost!path=options/values/id&t=request) in a configurable product.
            Variant reference ID must be defined only for a product that represents a variant of a configurable product.
    ProductRoutes:
      title: Routes
      type: object
      required:
        - path
      properties:
        path:
          type: string
          description: URL path
        position:
          type: integer
          description: Position of a product in the URL path. The default value is 0.
          format: int32
    ProductImage:
      title: Product Image
      type: object
      required:
        - url
      properties:
        url:
          type: string
          description: Media resource URL
        label:
          type: string
          description: Media resource label
        roles:
          type: array
          description: |
            Roles associated with this image that determine how the image is used on the storefront.
            - `BASE`: Product image is visible as a main image on the Product Detail Page.
            - `SMALL`: Product image is visible as a main image on the Category or search result page or other product listing pages.
            - `THUMBNAIL`: Thumbnail images appear in the thumbnail gallery, shopping cart, etc.
            - `SWATCH`: A swatch can be used to illustrate the color, pattern, or texture.
          items:
            enum:
              - BASE
              - SMALL
              - THUMBNAIL
              - SWATCH
        customRoles:
          type: array
          description: >
             Custom image role. Merchants can define custom roles in addition to the predefined values.
          items:
            type: string
    ProductOption:
      title: ProductOption
      type: object
      required:
        - id
        - type
        - values
      properties:
        id:
          type: string
          description: |
            Product option ID. For `CONFIGURABLE` or `SWATCH` option types, this ID must be match the ["attribute code"](#operation/ProductsPost!path=attributes/code&t=request) used for the configurable product (for example, "color").
        label:
          type: string
          description: Option label
        required:
          type: boolean
          description: Indicates whether selecting the option is required by a shopper to add a product to the shopping cart.
          example: false
        defaultValueId:
          type: string
          description: Specifies the pre-selected value id of the current option.
        type:
          type: string
          enum:
            - CONFIGURABLE
            - SWATCH
          description: |
            Option type. Indicates the product type the option can be assigned to.
            - `CONFIGURABLE`: Configurable product option
            - `SWATCH`: Swatch product option. Must be used for color or text swatches attributes
        values:
          type: array
          description: A list of option values. Defines option values available to shoppers (for example, "red" color or "large" size).
          items:
            $ref: '#/components/schemas/ProductOptionValue'
    ProductOptionValue:
      title: ProductOptionValue
      type: object
      required:
        - id
      properties:
        id:
          type: string
          description: |
            Option value ID.
            For `CONFIGURABLE` or `SWATCH` option types, this ID must match the ["variantReferenceId"](#operation/ProductsPost!path=attributes/variantReferenceId&t=request) defined in the product variant.
        label:
          type: string
          description: Option value label
        colorHex:
          type: string
          description: A hex representation of the color of the option value. Can be used for option with a SWATCH type.
        imageUrl:
          type: string
          description: Image URL of the option value. Can be used for option with a SWATCH type.
# Reason for hiding: it's relevant only for Bundle Product which is not yet supported by CCDM API
#        sku:
#          type: string
#          description: Product SKU associated with the option value.
    ProductLink:
      title: Links
      required:
        - type
        - sku
      type: object
      properties:
        type:
          type: string
          description: |
            Product link type. Merchants can define custom types in addition to the predefined values.
            `VARIANT_OF` link type must be specified to establish a connection to the configurable product SKU.
        sku:
          type: string
          description: Product SKU
      description: Product association
    ItemFailedValidationResult:
      title: ItemFailedValidationResult
      type: object
      properties:
        code:
          type: string
          description: Code for the validation error.
        itemIndex:
          type: integer
          description: Index of the conflicting item
          format: int32
        message:
          type: string
          description: Validation error message for the item.
        value:
          type: string
          description: The value supplied to the API.
    ProcessFeedResponse:
      title: Response payload
      type: object
      properties:
        status:
          type: string
          description: Request status.
          default: ACCEPTED
        acceptedCount:
          type: integer
          description: The number of received and accepted items.
          format: int32
      example:
        {
          "status": "ACCEPTED",
          "acceptedCount": 4
        }
    400ProcessFeedResponse:
      title: Response payload
      type: object
      properties:
        status:
          type: string
          description: Request status.
          default: FAILED
        message:
          type: string
          description: Error summary.
        errors:
          type: array
          description: List of items that did not pass validation. Fix the payload for invalid items before resubmitting the request.
          items:
            $ref: '#/components/schemas/FeedItemFailedValidationResult'
      example:
        {
          "status": "FAILED",
          "message": "Items validation failed for 2 items",
          "errors": [
            {
              "itemIndex": 0,
              "code": "status",
              "message": "status: does not have a value in the enumeration [\"ENABLED\", \"DISABLED\"]",
              "value": "active"
            },
            {
              "itemIndex": 1,
              "code": "scope",
              "message": "required property 'scope' not found",
              "value": ""
            }
          ]
        }
    403Response:
      title: 403 Forbidden
      type: object
      oneOf:
        - title: 403 Unauthorized - invalid JWT
          type: object
          properties:
            error_code:
              type: string
              description: Error code
            message:
              type: string
              description: Error message
          example:
            {
              "error_code":"403053",
              "message":"JWT is invalid"
            }
        - title: 403 Unauthorized
          type: object
          properties:
            error:
              type: object
              properties:
                code:
                  type: string
                  description: Error code
                message:
                  type: string
                  description: Error message
                details:
                  type: object
                  properties:
                    error_code:
                      type: string
                      description: Error code
          example:
            {
              "error": {
                "code": "Forbidden",
                "message": "Client ID is missing",
                "details": {
                  "error_code": "403000"
                }
              }
            }