# Batch import promotions

- Operation ID: `BatchImportPromotions`
- HTTP method: `POST`
- Path: `/v4/promotions/v2/promotion/batch`
- [Human-readable API reference](https://hub.synerise.com/api-reference/loyalty-and-engagement#tag/Promotions/operation/BatchImportPromotions)

## Self-contained OpenAPI method

The fenced document below contains this method's documentation and all of its local references. It is self-contained; no category or master specification fetch is required.

```yaml
openapi: 3.0.0
info:
  title: Synerise Public API
  version: 1.9.1
paths:
  /v4/promotions/v2/promotion/batch:
    post:
      tags:
        - Promotions
      summary: Batch import promotions
      description: |
        Submit a batch of promotions for asynchronous import (upsert). Items are validated individually and queued for processing. Returns 202 if all items are valid, or 207 if some fail validation.

        ---

        **API consumers:** <a href="/api-reference/authorization?tag=Authorization&amp;operationId=profileLogin" target="_blank" rel="noopener">Workspace (Business Profile)</a>, <a href="/api-reference/authorization?tag=Authorization&amp;operationId=userLogin" target="_blank" rel="noopener">Synerise User</a>

        **API key permission required:** `PROMOTIONS_IMPORT_PROMOTIONS_CREATE`

        **User role permission required:** `campaigns_promotions: create`
      operationId: BatchImportPromotions
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required:
                - data
              properties:
                data:
                  type: array
                  items:
                    type: object
                    description: |
                      Promotion payload accepted by the batch import endpoint. Applies SPD-2026-03 limits.

                      Cross-field validation (items violating these rules are rejected as `PromotionImportStatus` with `status: FAILED` on the `promotions-changes` topic):
                        - `name` and `headerName` MUST be non-empty when `visibilityStatus` is `HIDDEN` or `PUBLISH`.
                        - `catalog` is REQUIRED when `catalogItemType` is `SELECTED` or `FILTERED`.
                        - `excludeCatalog` is REQUIRED when `excludeCatalogItemType` is `SELECTED` or `FILTERED`.
                        - When `details.discountType.name` is `BOGO` and `itemScope` is `LINE_ITEM`, `discountType` MUST be one of `PERCENT`, `AMOUNT`, `EXACT_PRICE`, `DIGITAL_CASHBACK`.
                        - `expireAt` MUST be greater than `startAt`; `displayTo` MUST be greater than `displayFrom`; `maxBasketValue` MUST be greater than `minBasketValue`.
                    anyOf:
                      - required:
                          - uuid
                      - required:
                          - code
                    properties:
                      uuid:
                        type: string
                        description: Unique UUIDv4.
                      code:
                        type: string
                        maxLength: 64
                        description: Unique code
                      visibilityStatus:
                        type: string
                        description: Profile-oriented status of the promotion.
                        enum:
                          - DRAFT
                          - PUBLISH
                          - HIDDEN
                        default: DRAFT
                      type:
                        type: string
                        description: Promotion type
                        enum:
                          - MEMBERS_ONLY
                          - HANDBILL
                          - CUSTOM
                          - GENERAL
                        default: GENERAL
                      redeemLimitPerClient:
                        type: integer
                        description: Limit how many times a Profile can redeem this promotion.
                        default: 0
                        minimum: 0
                        maximum: 32767
                        nullable: true
                      redeemQuantityPerActivation:
                        type: integer
                        nullable: true
                        description: How many times per activation a multibuy promotion can be redeemed
                        minimum: 0
                        maximum: 8388607
                      redeemLimitGlobal:
                        type: integer
                        deprecated: true
                        format: int32
                        description: Limit the total of redemptions by all Profiles
                        default: 0
                        minimum: 0
                        maximum: 2147483647
                        nullable: true
                      redeemType:
                        type: string
                        description: Promotion redemption type
                        enum:
                          - FULL
                          - PARTIAL
                      autoRedeem:
                        type: boolean
                        nullable: true
                        description: If true, the promotion is automatically redeemed on activation.
                      activationLimitGlobalType:
                        type: string
                        nullable: true
                        default: LIFETIME
                        description: |-
                          Promotion activation limit type
                          * `LIFETIME` – No additional configuration required. The limit applies to the entire lifespan of the promotion. * `RELATIVE` – Requires specifying a relative time window (number of minutes from the current time).
                        enum:
                          - RELATIVE
                          - LIFETIME
                      activationLimitGlobalLimit:
                        type: integer
                        format: int32
                        description: Limit the total of activations by all Profiles within given time unit.
                        minimum: 1
                        maximum: 2147483647
                        nullable: true
                      activationLimitGlobalRelativeMinutes:
                        type: integer
                        format: int32
                        nullable: true
                        default: null
                        minimum: 1
                        maximum: 527040
                        description: Used only when `type` is `RELATIVE`. Defines how many minutes back from the current time the limit applies.
                      discountType:
                        type: string
                        description: The type of discount
                        enum:
                          - PERCENT
                          - POINTS
                          - AMOUNT
                          - NONE
                          - MULTIBUY
                          - 2_FOR_1
                          - EXACT_PRICE
                          - DIGITAL_CASHBACK
                        default: NONE
                      details:
                        type: object
                        description: |
                          Promotion details.

                          Import limit — serialized JSON must not exceed 128 KB (131072 bytes).
                        nullable: true
                        properties:
                          discountType:
                            type: object
                            description: Details that apply for specific discount type.
                            required:
                              - name
                              - outerScope
                              - requiredItemsCount
                              - discountedItemsCount
                            properties:
                              name:
                                type: string
                                enum:
                                  - BOGO
                                default: BOGO
                              outerScope:
                                type: boolean
                                description: |
                                  This defines whether a defined promotion trigger for discount is based on different item scope.
                                  When set to
                                    * `false` it means items are from the same scope,
                                    * `true` it means items are from outer scope and `requiredItems` should be defined.
                                default: false
                                example: true
                              requiredItemsCount:
                                description: Number of items that should be purchased to meet the promotion condition.
                                type: integer
                                format: int32
                                example: 2
                              requiredItems:
                                type: object
                                description: Catalog items definition details
                                required:
                                  - catalog
                                  - catalogItemType
                                nullable: true
                                properties:
                                  catalog:
                                    type: string
                                    description: ID of the item catalog that the promotion applies to
                                    nullable: true
                                    example: "221"
                                  catalogItemType:
                                    type: string
                                    enum:
                                      - ALL
                                      - SELECTED
                                      - FILTERED
                                      - QUERY
                                    description: |
                                      
                                      - If set to "ALL", define the catalog in the `catalog` field and set `catalogIndexItems` to null.

                                      - If set to "SELECTED", define the catalog in the `catalog` field and provide a list of catalog items in `catalogIndexItems`.

                                      - If set to "FILTERED", define the catalog in the `catalog` field and provide a list of catalog filter ids in `catalogFilterIds`.

                                      - If set to "QUERY", define the catalog in the `catalog` field and provide an inline RSQL expression in `catalogFilterQuery`.
                                    default: ALL
                                    example: FILTERED
                                  catalogIndexItems:
                                    type: array
                                    items:
                                      type: string
                                    description: |
                                      
                                      'An array of items from the catalog to be included in the promotion if `catalogItemType` is set to `SELECTED`.


                                      If `catalogItemType` is set to `ALL`, set `catalogIndexItems` to null.'
                                    nullable: true
                                    example: []
                                  catalogFilterIds:
                                    type: array
                                    items:
                                      type: string
                                    description: |
                                      
                                      'An array of catalog filter IDs to be executed to fetch catalog items if `catalogItemType` is set to `FILTERED`.


                                      If `catalogItemType` is set to `ALL`, set `catalogFilterIds` to null.'
                                    nullable: true
                                    example:
                                      - f978b20f-7156-40ed-99c2-3af62b76af12
                                  catalogFilterQuery:
                                    type: string
                                    maxLength: 1024
                                    description: |
                                      
                                      An RSQL expression that the Catalogs API resolves to matching catalog items when `catalogItemType` is set to `QUERY`.

                                      This field is required when `catalogItemType` is set to `QUERY`. A catalog must also be defined. Otherwise, set this field to null.

                                      **Structure**

                                      An expression consists of one or more rules joined by:

                                      - `;` — AND

                                      - `,` — OR

                                      RSQL expressions are case-insensitive.

                                      **Attribute predicates**

                                      | Operator | Type | Meaning | Example |
                                      | --- | --- | --- | --- |
                                      | `==` | string / number / boolean | Equals | `category==shampoo` |
                                      | `!=` | string / number | Does not equal | `brand!=Nivea` |
                                      | `=in=(a,b,…)` | string | Value is in the set | `sku=in=(SKU1,SKU2)` |
                                      | `=out=(a,b,…)` | string | Value is not in the set | `brand=out=(Nivea,Dove)` |
                                      | `=contains=` | string | Value contains the specified string | `brand=contains=nike` |
                                      | `=startsWith=` | string | Value starts with the specified string | `brand=startsWith=nik` |
                                      | `=endsWith=` | string | Value ends with the specified string | `brand=endsWith=ike` |
                                      | `>` / `=gt=` | number | Greater than | `price>2` |
                                      | `>=` / `=gte=` | number | Greater than or equal to | `price>=2` |
                                      | `<` / `=lt=` | number | Less than | `price<2` |
                                      | `<=` / `=lte=` | number | Less than or equal to | `price<=2` |

                                      **Important:** Attributes used in the expression must be indexed in the catalog. Read more about [indexing catalogs](https://hub.synerise.com/docs/assets/catalogs/creating-catalogs#indexing-catalogs).
                                    nullable: true
                                    example: color==green;price=lt=100
                              discountedItemsCount:
                                description: Number of items to apply the discount to.
                                type: integer
                                format: int32
                                example: 1
                          cashbackSettings:
                            type: object
                            description: Settings for cashback mechanism
                            nullable: true
                            required:
                              - exchangeRate
                            properties:
                              exchangeRate:
                                type: number
                                minimum: 0.0001
                                description: Defines how much currency corresponds to one point. For example, if the currency is PLN and exchangeRate is 2, then 1 point equals 2 PLN.
                              limits:
                                type: object
                                nullable: true
                                description: Defines the limits on cashback usage
                                properties:
                                  minPoints:
                                    type: integer
                                    nullable: true
                                    minimum: 1
                                    description: The minimum number of points required to spend for cashback. If null - there is no limit defined.
                                    example: 10
                                  maxPoints:
                                    type: integer
                                    nullable: true
                                    minimum: 1
                                    description: The maximum number of points allowed to spend for cashback. If null - there is no limit defined.
                                    example: 1000
                                  maxTransactionAmount:
                                    type: number
                                    nullable: true
                                    minimum: 0.01
                                    description: Maximum amount in local currency to redeem in a transaction. If null - there is no limit defined.
                                    example: 20
                                  maxTransactionPercentage:
                                    type: number
                                    nullable: true
                                    description: Defines how much (in percent) of the total transaction amount can be treated as cashback. If null - there is no limit defined.
                                    example: 50
                                    minimum: 0.01
                                    maximum: 100
                      discountValue:
                        type: number
                        description: How much discount to apply
                        default: 0
                        minimum: 0
                        maximum: 100
                      discountMode:
                        type: string
                        description: Promotion discount mode
                        enum:
                          - STATIC
                          - STEP
                        default: STATIC
                      discountModeDetails:
                        type: object
                        nullable: true
                        description: Step discount configuration (import limit — up to 5 steps).
                        required:
                          - discountUsageTrigger
                        properties:
                          steps:
                            type: array
                            minItems: 1
                            maxItems: 5
                            items:
                              required:
                                - discountValue
                                - usageThreshold
                              type: object
                              properties:
                                discountValue:
                                  type: number
                                  description: Discount value in given step.
                                usageThreshold:
                                  type: number
                                  description: Threshold after current step would apply.
                          discountUsageTrigger:
                            type: string
                            enum:
                              - TRANSACTION
                              - REDEEM
                            description: Describe after what action new steps would be applied.
                      preDiscountValue:
                        type: number
                        minimum: 0
                        nullable: true
                        default: 0
                        description: In single-item promotions, this is the price of the item before the discount. This is in regular units of currency. For example, if the currency is USD and `preDiscountValue` is set to 1.2, the price before discount is 1 dollar and 20 cents.
                      requireRedeemedPoints:
                        type: number
                        nullable: true
                        format: int32
                        description: How many loyalty points are needed to activate the promotion
                      headerName:
                        type: string
                        maxLength: 255
                        description: Name displayed in Synerise Web UI
                      headerDescription:
                        type: string
                        maxLength: 255
                        description: Description displayed in Synerise Web UI
                        nullable: true
                      name:
                        type: string
                        maxLength: 255
                        description: Promotion name displayed to viewers
                      headline:
                        type: string
                        nullable: true
                        maxLength: 255
                        description: Promotion headline displayed to viewers (import limit — 255 chars).
                      description:
                        type: string
                        maxLength: 2048
                        nullable: true
                        description: Details of the promotion displayed to viewers
                      images:
                        type: array
                        maxItems: 8
                        nullable: true
                        items:
                          required:
                            - url
                            - type
                          type: object
                          properties:
                            url:
                              description: Image or thumbnail source
                              type: string
                              example: https://www.snrcdn.net/upload/f2afa4d4d7af216196047d1f7f0613f22a50a8c8/default/origin/1537188683527-el-ipadpro.png
                            type:
                              type: string
                              enum:
                                - image
                                - thumbnail
                        description: Images and thumbnails for the promotion (import limit — 8 entries).
                      tags:
                        description: |
                          An array of tags (import limit — 20 entries).

                          **IMPORTANT:** To be able to use a tag for promotions, you must first assign the tag to a directory with `"type":"promotion"`. If the directory type does not exist, create it using [this endpoint](https://developers.synerise.com/AssetManagement/AssetManagement.html#operation/createDirectoryType). Then create a directory of that type and assign tags to it.
                        type: array
                        maxItems: 20
                        items:
                          type: object
                          properties:
                            hash:
                              type: string
                              description: Hash ID of the tag
                              example: 6f54671d-157f-4c4e-a577-11fac3111293
                        nullable: true
                      metric:
                        nullable: true
                        type: string
                        maxLength: 64
                        description: Currently unused
                      startAt:
                        type: string
                        nullable: true
                        format: date-time
                        description: Time when the promotion becomes available. Defaults to current time.
                      expireAt:
                        type: string
                        nullable: true
                        format: date-time
                        description: Time when the promotion ends for all profiles. Defaults to current time. Has to be greater than startAt
                      displayFrom:
                        type: string
                        nullable: true
                        description: Time when the promotion becomes displayable. Defaults to null.
                      displayTo:
                        type: string
                        nullable: true
                        description: Time when the promotion stops being displayed for users. Defaults to null. Has to be greater than displayFrom.
                      lastingTime:
                        type: integer
                        format: int32
                        nullable: true
                        description: Duration of the promotion in seconds. This countdown starts when the profile activates a promotion and is individual for each profile.
                        default: 0
                      params:
                        type: object
                        description: |
                          A JSON object with any custom parameters of type string, object, array.

                          Import limit — serialized JSON must not exceed 128 KB (131072 bytes).
                        nullable: true
                        additionalProperties: true
                      itemScope:
                        type: string
                        description: |-
                          The scope of of the promotion.
                          * LINE_ITEM is a promotion used for certain items in the basket
                          * BASKET is a promotion that applies to the entire basket
                        enum:
                          - LINE_ITEM
                          - BASKET
                        default: LINE_ITEM
                      minBasketValue:
                        type: number
                        nullable: true
                        default: null
                        minimum: 0
                        description: |
                          Minimal basket value required to trigger the application of the promotion. This is the basket value after calculating other promotions that apply to the items in the basket. 

                          `minBasketValue` must be lower than `maxBasketValue`.
                      maxBasketValue:
                        type: number
                        nullable: true
                        default: null
                        minimum: 0
                        description: |
                          
                          The maximum basket value to apply the promotion to. Any amount above the maximum is not discounted. This is the basket value after calculating other promotions that apply to the items in the basket.

                          `maxBasketValue` must be greater than `minBasketValue`

                          **Example:**<br/>
                          The maximum basket value is set to 500 USD. The discount is 10%. A basket's total is 700 USD. The discount is 50 USD.
                      catalog:
                        type: string
                        nullable: true
                        maxLength: 255
                        description: ID of the item catalog targeted by the promotion (import limit — 255 chars). Required when `catalogItemType` is `SELECTED` or `FILTERED`.
                      catalogItemType:
                        type: string
                        enum:
                          - ALL
                          - SELECTED
                          - FILTERED
                          - QUERY
                        description: |
                          
                          - If set to "ALL", define the catalog in the `catalog` field and set `catalogIndexItems` to null.

                          - If set to "SELECTED", define the catalog in the `catalog` field and provide a list of catalog items in `catalogIndexItems`.

                          - If set to "FILTERED", define the catalog in the `catalog` field and provide a list of catalog filter ids in `catalogFilterIds`.

                          - If set to "QUERY", define the catalog in the `catalog` field and provide an inline RSQL expression in `catalogFilterQuery`.
                        default: ALL
                        example: FILTERED
                      catalogIndexItems:
                        type: array
                        items:
                          type: string
                        nullable: true
                        maxItems: 50
                        description: Catalog items included in the promotion (import limit — 50 entries). Requires `catalog` to be defined.
                      catalogFilterIds:
                        type: array
                        items:
                          type: string
                        nullable: true
                        maxItems: 5
                        description: Catalog filter IDs for FILTERED targeting (import limit — 5 entries). Requires `catalog` to be defined.
                      catalogFilterQuery:
                        type: string
                        maxLength: 1024
                        description: |
                          
                          An RSQL expression that the Catalogs API resolves to matching catalog items when `catalogItemType` is set to `QUERY`.

                          This field is required when `catalogItemType` is set to `QUERY`. A catalog must also be defined. Otherwise, set this field to null.

                          **Structure**

                          An expression consists of one or more rules joined by:

                          - `;` — AND

                          - `,` — OR

                          RSQL expressions are case-insensitive.

                          **Attribute predicates**

                          | Operator | Type | Meaning | Example |
                          | --- | --- | --- | --- |
                          | `==` | string / number / boolean | Equals | `category==shampoo` |
                          | `!=` | string / number | Does not equal | `brand!=Nivea` |
                          | `=in=(a,b,…)` | string | Value is in the set | `sku=in=(SKU1,SKU2)` |
                          | `=out=(a,b,…)` | string | Value is not in the set | `brand=out=(Nivea,Dove)` |
                          | `=contains=` | string | Value contains the specified string | `brand=contains=nike` |
                          | `=startsWith=` | string | Value starts with the specified string | `brand=startsWith=nik` |
                          | `=endsWith=` | string | Value ends with the specified string | `brand=endsWith=ike` |
                          | `>` / `=gt=` | number | Greater than | `price>2` |
                          | `>=` / `=gte=` | number | Greater than or equal to | `price>=2` |
                          | `<` / `=lt=` | number | Less than | `price<2` |
                          | `<=` / `=lte=` | number | Less than or equal to | `price<=2` |

                          **Important:** Attributes used in the expression must be indexed in the catalog. Read more about [indexing catalogs](https://hub.synerise.com/docs/assets/catalogs/creating-catalogs#indexing-catalogs).
                        nullable: true
                        example: color==green;price=lt=100
                      excludeCatalog:
                        type: string
                        nullable: true
                        maxLength: 255
                        description: ID of the item catalog excluded from the promotion (import limit — 255 chars). Required when `excludeCatalogItemType` is `SELECTED` or `FILTERED`.
                      excludeCatalogItemType:
                        type: string
                        enum:
                          - ALL
                          - SELECTED
                          - FILTERED
                          - QUERY
                        description: |
                          
                          - If set to "ALL", define the catalog in the `excludeCatalog` field and set `excludeCatalogIndexItems` to null.

                          - If set to "SELECTED", define the catalog in the `excludeCatalog` field and provide a list of catalog items in `excludeCatalogIndexItems`.

                          - If set to "FILTERED", define the catalog in the `excludeCatalog` field and provide a list of catalog filter ids in `excludeCatalogFilterIds`.

                          - If set to "QUERY", define the catalog in the `excludeCatalog` field and provide an inline RSQL expression in `excludeCatalogFilterQuery`.
                        default: ALL
                        example: SELECTED
                      excludeCatalogIndexItems:
                        type: array
                        items:
                          type: string
                        nullable: true
                        maxItems: 50
                        description: Catalog items excluded from the promotion (import limit — 50 entries). Requires `excludeCatalog` to be defined.
                      excludeCatalogFilterIds:
                        type: array
                        items:
                          type: string
                        nullable: true
                        maxItems: 5
                        description: Catalog filter IDs for FILTERED exclusion (import limit — 5 entries). Requires `excludeCatalog` to be defined.
                      excludeCatalogFilterQuery:
                        type: string
                        maxLength: 1024
                        description: |
                          
                          'An inline RSQL expression resolved by Catalogs into the catalog items to exclude if `excludeCatalogItemType` is set to `QUERY`.

                          Required (and `excludeCatalog` must be defined) when `excludeCatalogItemType` is `QUERY`; otherwise set to null.'
                        nullable: true
                        example: brand==acme
                      storeCatalog:
                        type: string
                        nullable: true
                        minLength: 1
                        maxLength: 255
                        description: ID of the store catalog that the promotion applies to (import limit — 255 chars).
                      storeItemType:
                        type: string
                        enum:
                          - ALL
                          - SELECTED
                        description: Defines if the promotion is available for the entire store catalog or only certain stores (listed in `storeIds`).
                        default: ALL
                      storeIds:
                        type: array
                        maxItems: 500
                        items:
                          type: string
                        description: An array of stores from the store catalog where the promotion is available if `storeItemType` is set to `SELECTED` (import limit — 500 entries).
                        nullable: true
                      targetType:
                        type: string
                        description: If this field is set to "SEGMENT", you must provide a list of segments in `targetSegment`.
                        default: ALL
                        enum:
                          - ALL
                          - SEGMENT
                      targetSegment:
                        type: array
                        maxItems: 10
                        nullable: true
                        description: This field applies only when `targetType` is set to "SEGMENT" (import limit — 10 entries).
                        items:
                          type: string
                          description: ID of the segmentation of profiles that can redeem this promotion
                      price:
                        description: In single-item promotions, this is the price of the item in the smallest unit of currency. For example, if the currency is USD and `price` is 120, the price is 1 dollar and 20 cents.
                        type: integer
                        default: 0
                        minimum: 0
                        maximum: 2147483647
                      priority:
                        description: Defines the promotion's priority, used both for display order and to order candidate promotions when they are selected during handbill and checkout assignment. Values are ordered ascending, so a lower number means a higher priority and `1` is the highest. When the per-slot read limit or the AI request cap truncates the candidate list, the higher-priority (lower-numbered) promotions are the ones kept. Promotions that share the same priority have no further guaranteed ordering between them, so when a truncation boundary falls inside a group of equal priority it is not defined which of them are kept — assign distinct priorities to the promotions that must always win.
                        type: integer
                        minimum: 1
                        maximum: 500
                        default: 250
                      voucherPool:
                        type: object
                        description: Settings for assigning codes from a voucher pool when the promotion is activated. When this is used, a promotion can only be redeemed once per activation.
                        properties:
                          enabled:
                            type: boolean
                            default: false
                            description: Enables automatic assignment of codes from the pool when the promotion is activated.
                          uuid:
                            type: string
                            format: uuid
                            description: UUID of the voucher pool
                          transferable:
                            type: boolean
                            default: false
                            description: When `true`, the voucher can be redeemed by a different user than the one who activated the promotion.
                  minItems: 1
                  maxItems: 1000
                  description: Array of promotion objects to import (upsert)
                extra:
                  type: object
                  description: Import metadata
                  nullable: true
                  properties:
                    importHash:
                      type: string
                      description: Import identifier for troubleshooting
                      maxLength: 255
                      nullable: true
        required: true
      responses:
        "202":
          description: All items accepted for processing
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    title: Import
                    type: array
                    description: Promotions with correct data, queued for import. If `discountMode` wasn't included in the request, it's set to `STATIC`. Other properties are only included if they were added to the request.
                    items:
                      type: object
                      description: |
                        Promotion payload accepted by the batch import endpoint. Applies SPD-2026-03 limits.

                        Cross-field validation (items violating these rules are rejected as `PromotionImportStatus` with `status: FAILED` on the `promotions-changes` topic):
                          - `name` and `headerName` MUST be non-empty when `visibilityStatus` is `HIDDEN` or `PUBLISH`.
                          - `catalog` is REQUIRED when `catalogItemType` is `SELECTED` or `FILTERED`.
                          - `excludeCatalog` is REQUIRED when `excludeCatalogItemType` is `SELECTED` or `FILTERED`.
                          - When `details.discountType.name` is `BOGO` and `itemScope` is `LINE_ITEM`, `discountType` MUST be one of `PERCENT`, `AMOUNT`, `EXACT_PRICE`, `DIGITAL_CASHBACK`.
                          - `expireAt` MUST be greater than `startAt`; `displayTo` MUST be greater than `displayFrom`; `maxBasketValue` MUST be greater than `minBasketValue`.
                      anyOf:
                        - required:
                            - uuid
                        - required:
                            - code
                      properties:
                        uuid:
                          type: string
                          description: Unique UUIDv4.
                        code:
                          type: string
                          maxLength: 64
                          description: Unique code
                        visibilityStatus:
                          type: string
                          description: Profile-oriented status of the promotion.
                          enum:
                            - DRAFT
                            - PUBLISH
                            - HIDDEN
                          default: DRAFT
                        type:
                          type: string
                          description: Promotion type
                          enum:
                            - MEMBERS_ONLY
                            - HANDBILL
                            - CUSTOM
                            - GENERAL
                          default: GENERAL
                        redeemLimitPerClient:
                          type: integer
                          description: Limit how many times a Profile can redeem this promotion.
                          default: 0
                          minimum: 0
                          maximum: 32767
                          nullable: true
                        redeemQuantityPerActivation:
                          type: integer
                          nullable: true
                          description: How many times per activation a multibuy promotion can be redeemed
                          minimum: 0
                          maximum: 8388607
                        redeemLimitGlobal:
                          type: integer
                          deprecated: true
                          format: int32
                          description: Limit the total of redemptions by all Profiles
                          default: 0
                          minimum: 0
                          maximum: 2147483647
                          nullable: true
                        redeemType:
                          type: string
                          description: Promotion redemption type
                          enum:
                            - FULL
                            - PARTIAL
                        autoRedeem:
                          type: boolean
                          nullable: true
                          description: If true, the promotion is automatically redeemed on activation.
                        activationLimitGlobalType:
                          type: string
                          nullable: true
                          default: LIFETIME
                          description: |-
                            Promotion activation limit type
                            * `LIFETIME` – No additional configuration required. The limit applies to the entire lifespan of the promotion. * `RELATIVE` – Requires specifying a relative time window (number of minutes from the current time).
                          enum:
                            - RELATIVE
                            - LIFETIME
                        activationLimitGlobalLimit:
                          type: integer
                          format: int32
                          description: Limit the total of activations by all Profiles within given time unit.
                          minimum: 1
                          maximum: 2147483647
                          nullable: true
                        activationLimitGlobalRelativeMinutes:
                          type: integer
                          format: int32
                          nullable: true
                          default: null
                          minimum: 1
                          maximum: 527040
                          description: Used only when `type` is `RELATIVE`. Defines how many minutes back from the current time the limit applies.
                        discountType:
                          type: string
                          description: The type of discount
                          enum:
                            - PERCENT
                            - POINTS
                            - AMOUNT
                            - NONE
                            - MULTIBUY
                            - 2_FOR_1
                            - EXACT_PRICE
                            - DIGITAL_CASHBACK
                          default: NONE
                        details:
                          type: object
                          description: |
                            Promotion details.

                            Import limit — serialized JSON must not exceed 128 KB (131072 bytes).
                          nullable: true
                          properties:
                            discountType:
                              type: object
                              description: Details that apply for specific discount type.
                              required:
                                - name
                                - outerScope
                                - requiredItemsCount
                                - discountedItemsCount
                              properties:
                                name:
                                  type: string
                                  enum:
                                    - BOGO
                                  default: BOGO
                                outerScope:
                                  type: boolean
                                  description: |
                                    This defines whether a defined promotion trigger for discount is based on different item scope.
                                    When set to
                                      * `false` it means items are from the same scope,
                                      * `true` it means items are from outer scope and `requiredItems` should be defined.
                                  default: false
                                  example: true
                                requiredItemsCount:
                                  description: Number of items that should be purchased to meet the promotion condition.
                                  type: integer
                                  format: int32
                                  example: 2
                                requiredItems:
                                  type: object
                                  description: Catalog items definition details
                                  required:
                                    - catalog
                                    - catalogItemType
                                  nullable: true
                                  properties:
                                    catalog:
                                      type: string
                                      description: ID of the item catalog that the promotion applies to
                                      nullable: true
                                      example: "221"
                                    catalogItemType:
                                      type: string
                                      enum:
                                        - ALL
                                        - SELECTED
                                        - FILTERED
                                        - QUERY
                                      description: |
                                        
                                        - If set to "ALL", define the catalog in the `catalog` field and set `catalogIndexItems` to null.

                                        - If set to "SELECTED", define the catalog in the `catalog` field and provide a list of catalog items in `catalogIndexItems`.

                                        - If set to "FILTERED", define the catalog in the `catalog` field and provide a list of catalog filter ids in `catalogFilterIds`.

                                        - If set to "QUERY", define the catalog in the `catalog` field and provide an inline RSQL expression in `catalogFilterQuery`.
                                      default: ALL
                                      example: FILTERED
                                    catalogIndexItems:
                                      type: array
                                      items:
                                        type: string
                                      description: |
                                        
                                        'An array of items from the catalog to be included in the promotion if `catalogItemType` is set to `SELECTED`.


                                        If `catalogItemType` is set to `ALL`, set `catalogIndexItems` to null.'
                                      nullable: true
                                      example: []
                                    catalogFilterIds:
                                      type: array
                                      items:
                                        type: string
                                      description: |
                                        
                                        'An array of catalog filter IDs to be executed to fetch catalog items if `catalogItemType` is set to `FILTERED`.


                                        If `catalogItemType` is set to `ALL`, set `catalogFilterIds` to null.'
                                      nullable: true
                                      example:
                                        - f978b20f-7156-40ed-99c2-3af62b76af12
                                    catalogFilterQuery:
                                      type: string
                                      maxLength: 1024
                                      description: |
                                        
                                        An RSQL expression that the Catalogs API resolves to matching catalog items when `catalogItemType` is set to `QUERY`.

                                        This field is required when `catalogItemType` is set to `QUERY`. A catalog must also be defined. Otherwise, set this field to null.

                                        **Structure**

                                        An expression consists of one or more rules joined by:

                                        - `;` — AND

                                        - `,` — OR

                                        RSQL expressions are case-insensitive.

                                        **Attribute predicates**

                                        | Operator | Type | Meaning | Example |
                                        | --- | --- | --- | --- |
                                        | `==` | string / number / boolean | Equals | `category==shampoo` |
                                        | `!=` | string / number | Does not equal | `brand!=Nivea` |
                                        | `=in=(a,b,…)` | string | Value is in the set | `sku=in=(SKU1,SKU2)` |
                                        | `=out=(a,b,…)` | string | Value is not in the set | `brand=out=(Nivea,Dove)` |
                                        | `=contains=` | string | Value contains the specified string | `brand=contains=nike` |
                                        | `=startsWith=` | string | Value starts with the specified string | `brand=startsWith=nik` |
                                        | `=endsWith=` | string | Value ends with the specified string | `brand=endsWith=ike` |
                                        | `>` / `=gt=` | number | Greater than | `price>2` |
                                        | `>=` / `=gte=` | number | Greater than or equal to | `price>=2` |
                                        | `<` / `=lt=` | number | Less than | `price<2` |
                                        | `<=` / `=lte=` | number | Less than or equal to | `price<=2` |

                                        **Important:** Attributes used in the expression must be indexed in the catalog. Read more about [indexing catalogs](https://hub.synerise.com/docs/assets/catalogs/creating-catalogs#indexing-catalogs).
                                      nullable: true
                                      example: color==green;price=lt=100
                                discountedItemsCount:
                                  description: Number of items to apply the discount to.
                                  type: integer
                                  format: int32
                                  example: 1
                            cashbackSettings:
                              type: object
                              description: Settings for cashback mechanism
                              nullable: true
                              required:
                                - exchangeRate
                              properties:
                                exchangeRate:
                                  type: number
                                  minimum: 0.0001
                                  description: Defines how much currency corresponds to one point. For example, if the currency is PLN and exchangeRate is 2, then 1 point equals 2 PLN.
                                limits:
                                  type: object
                                  nullable: true
                                  description: Defines the limits on cashback usage
                                  properties:
                                    minPoints:
                                      type: integer
                                      nullable: true
                                      minimum: 1
                                      description: The minimum number of points required to spend for cashback. If null - there is no limit defined.
                                      example: 10
                                    maxPoints:
                                      type: integer
                                      nullable: true
                                      minimum: 1
                                      description: The maximum number of points allowed to spend for cashback. If null - there is no limit defined.
                                      example: 1000
                                    maxTransactionAmount:
                                      type: number
                                      nullable: true
                                      minimum: 0.01
                                      description: Maximum amount in local currency to redeem in a transaction. If null - there is no limit defined.
                                      example: 20
                                    maxTransactionPercentage:
                                      type: number
                                      nullable: true
                                      description: Defines how much (in percent) of the total transaction amount can be treated as cashback. If null - there is no limit defined.
                                      example: 50
                                      minimum: 0.01
                                      maximum: 100
                        discountValue:
                          type: number
                          description: How much discount to apply
                          default: 0
                          minimum: 0
                          maximum: 100
                        discountMode:
                          type: string
                          description: Promotion discount mode
                          enum:
                            - STATIC
                            - STEP
                          default: STATIC
                        discountModeDetails:
                          type: object
                          nullable: true
                          description: Step discount configuration (import limit — up to 5 steps).
                          required:
                            - discountUsageTrigger
                          properties:
                            steps:
                              type: array
                              minItems: 1
                              maxItems: 5
                              items:
                                required:
                                  - discountValue
                                  - usageThreshold
                                type: object
                                properties:
                                  discountValue:
                                    type: number
                                    description: Discount value in given step.
                                  usageThreshold:
                                    type: number
                                    description: Threshold after current step would apply.
                            discountUsageTrigger:
                              type: string
                              enum:
                                - TRANSACTION
                                - REDEEM
                              description: Describe after what action new steps would be applied.
                        preDiscountValue:
                          type: number
                          minimum: 0
                          nullable: true
                          default: 0
                          description: In single-item promotions, this is the price of the item before the discount. This is in regular units of currency. For example, if the currency is USD and `preDiscountValue` is set to 1.2, the price before discount is 1 dollar and 20 cents.
                        requireRedeemedPoints:
                          type: number
                          nullable: true
                          format: int32
                          description: How many loyalty points are needed to activate the promotion
                        headerName:
                          type: string
                          maxLength: 255
                          description: Name displayed in Synerise Web UI
                        headerDescription:
                          type: string
                          maxLength: 255
                          description: Description displayed in Synerise Web UI
                          nullable: true
                        name:
                          type: string
                          maxLength: 255
                          description: Promotion name displayed to viewers
                        headline:
                          type: string
                          nullable: true
                          maxLength: 255
                          description: Promotion headline displayed to viewers (import limit — 255 chars).
                        description:
                          type: string
                          maxLength: 2048
                          nullable: true
                          description: Details of the promotion displayed to viewers
                        images:
                          type: array
                          maxItems: 8
                          nullable: true
                          items:
                            required:
                              - url
                              - type
                            type: object
                            properties:
                              url:
                                description: Image or thumbnail source
                                type: string
                                example: https://www.snrcdn.net/upload/f2afa4d4d7af216196047d1f7f0613f22a50a8c8/default/origin/1537188683527-el-ipadpro.png
                              type:
                                type: string
                                enum:
                                  - image
                                  - thumbnail
                          description: Images and thumbnails for the promotion (import limit — 8 entries).
                        tags:
                          description: |
                            An array of tags (import limit — 20 entries).

                            **IMPORTANT:** To be able to use a tag for promotions, you must first assign the tag to a directory with `"type":"promotion"`. If the directory type does not exist, create it using [this endpoint](https://developers.synerise.com/AssetManagement/AssetManagement.html#operation/createDirectoryType). Then create a directory of that type and assign tags to it.
                          type: array
                          maxItems: 20
                          items:
                            type: object
                            properties:
                              hash:
                                type: string
                                description: Hash ID of the tag
                                example: 6f54671d-157f-4c4e-a577-11fac3111293
                          nullable: true
                        metric:
                          nullable: true
                          type: string
                          maxLength: 64
                          description: Currently unused
                        startAt:
                          type: string
                          nullable: true
                          format: date-time
                          description: Time when the promotion becomes available. Defaults to current time.
                        expireAt:
                          type: string
                          nullable: true
                          format: date-time
                          description: Time when the promotion ends for all profiles. Defaults to current time. Has to be greater than startAt
                        displayFrom:
                          type: string
                          nullable: true
                          description: Time when the promotion becomes displayable. Defaults to null.
                        displayTo:
                          type: string
                          nullable: true
                          description: Time when the promotion stops being displayed for users. Defaults to null. Has to be greater than displayFrom.
                        lastingTime:
                          type: integer
                          format: int32
                          nullable: true
                          description: Duration of the promotion in seconds. This countdown starts when the profile activates a promotion and is individual for each profile.
                          default: 0
                        params:
                          type: object
                          description: |
                            A JSON object with any custom parameters of type string, object, array.

                            Import limit — serialized JSON must not exceed 128 KB (131072 bytes).
                          nullable: true
                          additionalProperties: true
                        itemScope:
                          type: string
                          description: |-
                            The scope of of the promotion.
                            * LINE_ITEM is a promotion used for certain items in the basket
                            * BASKET is a promotion that applies to the entire basket
                          enum:
                            - LINE_ITEM
                            - BASKET
                          default: LINE_ITEM
                        minBasketValue:
                          type: number
                          nullable: true
                          default: null
                          minimum: 0
                          description: |
                            Minimal basket value required to trigger the application of the promotion. This is the basket value after calculating other promotions that apply to the items in the basket. 

                            `minBasketValue` must be lower than `maxBasketValue`.
                        maxBasketValue:
                          type: number
                          nullable: true
                          default: null
                          minimum: 0
                          description: |
                            
                            The maximum basket value to apply the promotion to. Any amount above the maximum is not discounted. This is the basket value after calculating other promotions that apply to the items in the basket.

                            `maxBasketValue` must be greater than `minBasketValue`

                            **Example:**<br/>
                            The maximum basket value is set to 500 USD. The discount is 10%. A basket's total is 700 USD. The discount is 50 USD.
                        catalog:
                          type: string
                          nullable: true
                          maxLength: 255
                          description: ID of the item catalog targeted by the promotion (import limit — 255 chars). Required when `catalogItemType` is `SELECTED` or `FILTERED`.
                        catalogItemType:
                          type: string
                          enum:
                            - ALL
                            - SELECTED
                            - FILTERED
                            - QUERY
                          description: |
                            
                            - If set to "ALL", define the catalog in the `catalog` field and set `catalogIndexItems` to null.

                            - If set to "SELECTED", define the catalog in the `catalog` field and provide a list of catalog items in `catalogIndexItems`.

                            - If set to "FILTERED", define the catalog in the `catalog` field and provide a list of catalog filter ids in `catalogFilterIds`.

                            - If set to "QUERY", define the catalog in the `catalog` field and provide an inline RSQL expression in `catalogFilterQuery`.
                          default: ALL
                          example: FILTERED
                        catalogIndexItems:
                          type: array
                          items:
                            type: string
                          nullable: true
                          maxItems: 50
                          description: Catalog items included in the promotion (import limit — 50 entries). Requires `catalog` to be defined.
                        catalogFilterIds:
                          type: array
                          items:
                            type: string
                          nullable: true
                          maxItems: 5
                          description: Catalog filter IDs for FILTERED targeting (import limit — 5 entries). Requires `catalog` to be defined.
                        catalogFilterQuery:
                          type: string
                          maxLength: 1024
                          description: |
                            
                            An RSQL expression that the Catalogs API resolves to matching catalog items when `catalogItemType` is set to `QUERY`.

                            This field is required when `catalogItemType` is set to `QUERY`. A catalog must also be defined. Otherwise, set this field to null.

                            **Structure**

                            An expression consists of one or more rules joined by:

                            - `;` — AND

                            - `,` — OR

                            RSQL expressions are case-insensitive.

                            **Attribute predicates**

                            | Operator | Type | Meaning | Example |
                            | --- | --- | --- | --- |
                            | `==` | string / number / boolean | Equals | `category==shampoo` |
                            | `!=` | string / number | Does not equal | `brand!=Nivea` |
                            | `=in=(a,b,…)` | string | Value is in the set | `sku=in=(SKU1,SKU2)` |
                            | `=out=(a,b,…)` | string | Value is not in the set | `brand=out=(Nivea,Dove)` |
                            | `=contains=` | string | Value contains the specified string | `brand=contains=nike` |
                            | `=startsWith=` | string | Value starts with the specified string | `brand=startsWith=nik` |
                            | `=endsWith=` | string | Value ends with the specified string | `brand=endsWith=ike` |
                            | `>` / `=gt=` | number | Greater than | `price>2` |
                            | `>=` / `=gte=` | number | Greater than or equal to | `price>=2` |
                            | `<` / `=lt=` | number | Less than | `price<2` |
                            | `<=` / `=lte=` | number | Less than or equal to | `price<=2` |

                            **Important:** Attributes used in the expression must be indexed in the catalog. Read more about [indexing catalogs](https://hub.synerise.com/docs/assets/catalogs/creating-catalogs#indexing-catalogs).
                          nullable: true
                          example: color==green;price=lt=100
                        excludeCatalog:
                          type: string
                          nullable: true
                          maxLength: 255
                          description: ID of the item catalog excluded from the promotion (import limit — 255 chars). Required when `excludeCatalogItemType` is `SELECTED` or `FILTERED`.
                        excludeCatalogItemType:
                          type: string
                          enum:
                            - ALL
                            - SELECTED
                            - FILTERED
                            - QUERY
                          description: |
                            
                            - If set to "ALL", define the catalog in the `excludeCatalog` field and set `excludeCatalogIndexItems` to null.

                            - If set to "SELECTED", define the catalog in the `excludeCatalog` field and provide a list of catalog items in `excludeCatalogIndexItems`.

                            - If set to "FILTERED", define the catalog in the `excludeCatalog` field and provide a list of catalog filter ids in `excludeCatalogFilterIds`.

                            - If set to "QUERY", define the catalog in the `excludeCatalog` field and provide an inline RSQL expression in `excludeCatalogFilterQuery`.
                          default: ALL
                          example: SELECTED
                        excludeCatalogIndexItems:
                          type: array
                          items:
                            type: string
                          nullable: true
                          maxItems: 50
                          description: Catalog items excluded from the promotion (import limit — 50 entries). Requires `excludeCatalog` to be defined.
                        excludeCatalogFilterIds:
                          type: array
                          items:
                            type: string
                          nullable: true
                          maxItems: 5
                          description: Catalog filter IDs for FILTERED exclusion (import limit — 5 entries). Requires `excludeCatalog` to be defined.
                        excludeCatalogFilterQuery:
                          type: string
                          maxLength: 1024
                          description: |
                            
                            'An inline RSQL expression resolved by Catalogs into the catalog items to exclude if `excludeCatalogItemType` is set to `QUERY`.

                            Required (and `excludeCatalog` must be defined) when `excludeCatalogItemType` is `QUERY`; otherwise set to null.'
                          nullable: true
                          example: brand==acme
                        storeCatalog:
                          type: string
                          nullable: true
                          minLength: 1
                          maxLength: 255
                          description: ID of the store catalog that the promotion applies to (import limit — 255 chars).
                        storeItemType:
                          type: string
                          enum:
                            - ALL
                            - SELECTED
                          description: Defines if the promotion is available for the entire store catalog or only certain stores (listed in `storeIds`).
                          default: ALL
                        storeIds:
                          type: array
                          maxItems: 500
                          items:
                            type: string
                          description: An array of stores from the store catalog where the promotion is available if `storeItemType` is set to `SELECTED` (import limit — 500 entries).
                          nullable: true
                        targetType:
                          type: string
                          description: If this field is set to "SEGMENT", you must provide a list of segments in `targetSegment`.
                          default: ALL
                          enum:
                            - ALL
                            - SEGMENT
                        targetSegment:
                          type: array
                          maxItems: 10
                          nullable: true
                          description: This field applies only when `targetType` is set to "SEGMENT" (import limit — 10 entries).
                          items:
                            type: string
                            description: ID of the segmentation of profiles that can redeem this promotion
                        price:
                          description: In single-item promotions, this is the price of the item in the smallest unit of currency. For example, if the currency is USD and `price` is 120, the price is 1 dollar and 20 cents.
                          type: integer
                          default: 0
                          minimum: 0
                          maximum: 2147483647
                        priority:
                          description: Defines the promotion's priority, used both for display order and to order candidate promotions when they are selected during handbill and checkout assignment. Values are ordered ascending, so a lower number means a higher priority and `1` is the highest. When the per-slot read limit or the AI request cap truncates the candidate list, the higher-priority (lower-numbered) promotions are the ones kept. Promotions that share the same priority have no further guaranteed ordering between them, so when a truncation boundary falls inside a group of equal priority it is not defined which of them are kept — assign distinct priorities to the promotions that must always win.
                          type: integer
                          minimum: 1
                          maximum: 500
                          default: 250
                        voucherPool:
                          type: object
                          description: Settings for assigning codes from a voucher pool when the promotion is activated. When this is used, a promotion can only be redeemed once per activation.
                          properties:
                            enabled:
                              type: boolean
                              default: false
                              description: Enables automatic assignment of codes from the pool when the promotion is activated.
                            uuid:
                              type: string
                              format: uuid
                              description: UUID of the voucher pool
                            transferable:
                              type: boolean
                              default: false
                              description: When `true`, the voucher can be redeemed by a different user than the one who activated the promotion.
        "207":
          description: Some items failed validation
          content:
            application/json:
              schema:
                type: object
                properties:
                  httpStatus:
                    allOf:
                      - type: number
                        description: HTTP status of the error
                        example: 500
                      - example: 207
                  errorCode:
                    type: string
                    description: Error code which helps identify the issue. See [API error reference](https://hub.synerise.com/api-reference/errors.html).
                    example: ERR-001
                  message:
                    type: string
                    description: Short description of the error
                    example: Internal Error
                  help:
                    type: string
                    nullable: true
                    description: Currently unused
                  data:
                    anyOf:
                      - title: Delete
                        type: array
                        description: Promotions correctly added to queue for deletion.
                        items:
                          type: object
                          properties:
                            code:
                              type: string
                              maxLength: 64
                              description: Unique code
                      - title: Import
                        type: array
                        description: Promotions with correct data, queued for import. If `discountMode` wasn't included in the request, it's set to `STATIC`. Other properties are only included if they were added to the request.
                        items:
                          type: object
                          description: |
                            Promotion payload accepted by the batch import endpoint. Applies SPD-2026-03 limits.

                            Cross-field validation (items violating these rules are rejected as `PromotionImportStatus` with `status: FAILED` on the `promotions-changes` topic):
                              - `name` and `headerName` MUST be non-empty when `visibilityStatus` is `HIDDEN` or `PUBLISH`.
                              - `catalog` is REQUIRED when `catalogItemType` is `SELECTED` or `FILTERED`.
                              - `excludeCatalog` is REQUIRED when `excludeCatalogItemType` is `SELECTED` or `FILTERED`.
                              - When `details.discountType.name` is `BOGO` and `itemScope` is `LINE_ITEM`, `discountType` MUST be one of `PERCENT`, `AMOUNT`, `EXACT_PRICE`, `DIGITAL_CASHBACK`.
                              - `expireAt` MUST be greater than `startAt`; `displayTo` MUST be greater than `displayFrom`; `maxBasketValue` MUST be greater than `minBasketValue`.
                          anyOf:
                            - required:
                                - uuid
                            - required:
                                - code
                          properties:
                            uuid:
                              type: string
                              description: Unique UUIDv4.
                            code:
                              type: string
                              maxLength: 64
                              description: Unique code
                            visibilityStatus:
                              type: string
                              description: Profile-oriented status of the promotion.
                              enum:
                                - DRAFT
                                - PUBLISH
                                - HIDDEN
                              default: DRAFT
                            type:
                              type: string
                              description: Promotion type
                              enum:
                                - MEMBERS_ONLY
                                - HANDBILL
                                - CUSTOM
                                - GENERAL
                              default: GENERAL
                            redeemLimitPerClient:
                              type: integer
                              description: Limit how many times a Profile can redeem this promotion.
                              default: 0
                              minimum: 0
                              maximum: 32767
                              nullable: true
                            redeemQuantityPerActivation:
                              type: integer
                              nullable: true
                              description: How many times per activation a multibuy promotion can be redeemed
                              minimum: 0
                              maximum: 8388607
                            redeemLimitGlobal:
                              type: integer
                              deprecated: true
                              format: int32
                              description: Limit the total of redemptions by all Profiles
                              default: 0
                              minimum: 0
                              maximum: 2147483647
                              nullable: true
                            redeemType:
                              type: string
                              description: Promotion redemption type
                              enum:
                                - FULL
                                - PARTIAL
                            autoRedeem:
                              type: boolean
                              nullable: true
                              description: If true, the promotion is automatically redeemed on activation.
                            activationLimitGlobalType:
                              type: string
                              nullable: true
                              default: LIFETIME
                              description: |-
                                Promotion activation limit type
                                * `LIFETIME` – No additional configuration required. The limit applies to the entire lifespan of the promotion. * `RELATIVE` – Requires specifying a relative time window (number of minutes from the current time).
                              enum:
                                - RELATIVE
                                - LIFETIME
                            activationLimitGlobalLimit:
                              type: integer
                              format: int32
                              description: Limit the total of activations by all Profiles within given time unit.
                              minimum: 1
                              maximum: 2147483647
                              nullable: true
                            activationLimitGlobalRelativeMinutes:
                              type: integer
                              format: int32
                              nullable: true
                              default: null
                              minimum: 1
                              maximum: 527040
                              description: Used only when `type` is `RELATIVE`. Defines how many minutes back from the current time the limit applies.
                            discountType:
                              type: string
                              description: The type of discount
                              enum:
                                - PERCENT
                                - POINTS
                                - AMOUNT
                                - NONE
                                - MULTIBUY
                                - 2_FOR_1
                                - EXACT_PRICE
                                - DIGITAL_CASHBACK
                              default: NONE
                            details:
                              type: object
                              description: |
                                Promotion details.

                                Import limit — serialized JSON must not exceed 128 KB (131072 bytes).
                              nullable: true
                              properties:
                                discountType:
                                  type: object
                                  description: Details that apply for specific discount type.
                                  required:
                                    - name
                                    - outerScope
                                    - requiredItemsCount
                                    - discountedItemsCount
                                  properties:
                                    name:
                                      type: string
                                      enum:
                                        - BOGO
                                      default: BOGO
                                    outerScope:
                                      type: boolean
                                      description: |
                                        This defines whether a defined promotion trigger for discount is based on different item scope.
                                        When set to
                                          * `false` it means items are from the same scope,
                                          * `true` it means items are from outer scope and `requiredItems` should be defined.
                                      default: false
                                      example: true
                                    requiredItemsCount:
                                      description: Number of items that should be purchased to meet the promotion condition.
                                      type: integer
                                      format: int32
                                      example: 2
                                    requiredItems:
                                      type: object
                                      description: Catalog items definition details
                                      required:
                                        - catalog
                                        - catalogItemType
                                      nullable: true
                                      properties:
                                        catalog:
                                          type: string
                                          description: ID of the item catalog that the promotion applies to
                                          nullable: true
                                          example: "221"
                                        catalogItemType:
                                          type: string
                                          enum:
                                            - ALL
                                            - SELECTED
                                            - FILTERED
                                            - QUERY
                                          description: |
                                            
                                            - If set to "ALL", define the catalog in the `catalog` field and set `catalogIndexItems` to null.

                                            - If set to "SELECTED", define the catalog in the `catalog` field and provide a list of catalog items in `catalogIndexItems`.

                                            - If set to "FILTERED", define the catalog in the `catalog` field and provide a list of catalog filter ids in `catalogFilterIds`.

                                            - If set to "QUERY", define the catalog in the `catalog` field and provide an inline RSQL expression in `catalogFilterQuery`.
                                          default: ALL
                                          example: FILTERED
                                        catalogIndexItems:
                                          type: array
                                          items:
                                            type: string
                                          description: |
                                            
                                            'An array of items from the catalog to be included in the promotion if `catalogItemType` is set to `SELECTED`.


                                            If `catalogItemType` is set to `ALL`, set `catalogIndexItems` to null.'
                                          nullable: true
                                          example: []
                                        catalogFilterIds:
                                          type: array
                                          items:
                                            type: string
                                          description: |
                                            
                                            'An array of catalog filter IDs to be executed to fetch catalog items if `catalogItemType` is set to `FILTERED`.


                                            If `catalogItemType` is set to `ALL`, set `catalogFilterIds` to null.'
                                          nullable: true
                                          example:
                                            - f978b20f-7156-40ed-99c2-3af62b76af12
                                        catalogFilterQuery:
                                          type: string
                                          maxLength: 1024
                                          description: |
                                            
                                            An RSQL expression that the Catalogs API resolves to matching catalog items when `catalogItemType` is set to `QUERY`.

                                            This field is required when `catalogItemType` is set to `QUERY`. A catalog must also be defined. Otherwise, set this field to null.

                                            **Structure**

                                            An expression consists of one or more rules joined by:

                                            - `;` — AND

                                            - `,` — OR

                                            RSQL expressions are case-insensitive.

                                            **Attribute predicates**

                                            | Operator | Type | Meaning | Example |
                                            | --- | --- | --- | --- |
                                            | `==` | string / number / boolean | Equals | `category==shampoo` |
                                            | `!=` | string / number | Does not equal | `brand!=Nivea` |
                                            | `=in=(a,b,…)` | string | Value is in the set | `sku=in=(SKU1,SKU2)` |
                                            | `=out=(a,b,…)` | string | Value is not in the set | `brand=out=(Nivea,Dove)` |
                                            | `=contains=` | string | Value contains the specified string | `brand=contains=nike` |
                                            | `=startsWith=` | string | Value starts with the specified string | `brand=startsWith=nik` |
                                            | `=endsWith=` | string | Value ends with the specified string | `brand=endsWith=ike` |
                                            | `>` / `=gt=` | number | Greater than | `price>2` |
                                            | `>=` / `=gte=` | number | Greater than or equal to | `price>=2` |
                                            | `<` / `=lt=` | number | Less than | `price<2` |
                                            | `<=` / `=lte=` | number | Less than or equal to | `price<=2` |

                                            **Important:** Attributes used in the expression must be indexed in the catalog. Read more about [indexing catalogs](https://hub.synerise.com/docs/assets/catalogs/creating-catalogs#indexing-catalogs).
                                          nullable: true
                                          example: color==green;price=lt=100
                                    discountedItemsCount:
                                      description: Number of items to apply the discount to.
                                      type: integer
                                      format: int32
                                      example: 1
                                cashbackSettings:
                                  type: object
                                  description: Settings for cashback mechanism
                                  nullable: true
                                  required:
                                    - exchangeRate
                                  properties:
                                    exchangeRate:
                                      type: number
                                      minimum: 0.0001
                                      description: Defines how much currency corresponds to one point. For example, if the currency is PLN and exchangeRate is 2, then 1 point equals 2 PLN.
                                    limits:
                                      type: object
                                      nullable: true
                                      description: Defines the limits on cashback usage
                                      properties:
                                        minPoints:
                                          type: integer
                                          nullable: true
                                          minimum: 1
                                          description: The minimum number of points required to spend for cashback. If null - there is no limit defined.
                                          example: 10
                                        maxPoints:
                                          type: integer
                                          nullable: true
                                          minimum: 1
                                          description: The maximum number of points allowed to spend for cashback. If null - there is no limit defined.
                                          example: 1000
                                        maxTransactionAmount:
                                          type: number
                                          nullable: true
                                          minimum: 0.01
                                          description: Maximum amount in local currency to redeem in a transaction. If null - there is no limit defined.
                                          example: 20
                                        maxTransactionPercentage:
                                          type: number
                                          nullable: true
                                          description: Defines how much (in percent) of the total transaction amount can be treated as cashback. If null - there is no limit defined.
                                          example: 50
                                          minimum: 0.01
                                          maximum: 100
                            discountValue:
                              type: number
                              description: How much discount to apply
                              default: 0
                              minimum: 0
                              maximum: 100
                            discountMode:
                              type: string
                              description: Promotion discount mode
                              enum:
                                - STATIC
                                - STEP
                              default: STATIC
                            discountModeDetails:
                              type: object
                              nullable: true
                              description: Step discount configuration (import limit — up to 5 steps).
                              required:
                                - discountUsageTrigger
                              properties:
                                steps:
                                  type: array
                                  minItems: 1
                                  maxItems: 5
                                  items:
                                    required:
                                      - discountValue
                                      - usageThreshold
                                    type: object
                                    properties:
                                      discountValue:
                                        type: number
                                        description: Discount value in given step.
                                      usageThreshold:
                                        type: number
                                        description: Threshold after current step would apply.
                                discountUsageTrigger:
                                  type: string
                                  enum:
                                    - TRANSACTION
                                    - REDEEM
                                  description: Describe after what action new steps would be applied.
                            preDiscountValue:
                              type: number
                              minimum: 0
                              nullable: true
                              default: 0
                              description: In single-item promotions, this is the price of the item before the discount. This is in regular units of currency. For example, if the currency is USD and `preDiscountValue` is set to 1.2, the price before discount is 1 dollar and 20 cents.
                            requireRedeemedPoints:
                              type: number
                              nullable: true
                              format: int32
                              description: How many loyalty points are needed to activate the promotion
                            headerName:
                              type: string
                              maxLength: 255
                              description: Name displayed in Synerise Web UI
                            headerDescription:
                              type: string
                              maxLength: 255
                              description: Description displayed in Synerise Web UI
                              nullable: true
                            name:
                              type: string
                              maxLength: 255
                              description: Promotion name displayed to viewers
                            headline:
                              type: string
                              nullable: true
                              maxLength: 255
                              description: Promotion headline displayed to viewers (import limit — 255 chars).
                            description:
                              type: string
                              maxLength: 2048
                              nullable: true
                              description: Details of the promotion displayed to viewers
                            images:
                              type: array
                              maxItems: 8
                              nullable: true
                              items:
                                required:
                                  - url
                                  - type
                                type: object
                                properties:
                                  url:
                                    description: Image or thumbnail source
                                    type: string
                                    example: https://www.snrcdn.net/upload/f2afa4d4d7af216196047d1f7f0613f22a50a8c8/default/origin/1537188683527-el-ipadpro.png
                                  type:
                                    type: string
                                    enum:
                                      - image
                                      - thumbnail
                              description: Images and thumbnails for the promotion (import limit — 8 entries).
                            tags:
                              description: |
                                An array of tags (import limit — 20 entries).

                                **IMPORTANT:** To be able to use a tag for promotions, you must first assign the tag to a directory with `"type":"promotion"`. If the directory type does not exist, create it using [this endpoint](https://developers.synerise.com/AssetManagement/AssetManagement.html#operation/createDirectoryType). Then create a directory of that type and assign tags to it.
                              type: array
                              maxItems: 20
                              items:
                                type: object
                                properties:
                                  hash:
                                    type: string
                                    description: Hash ID of the tag
                                    example: 6f54671d-157f-4c4e-a577-11fac3111293
                              nullable: true
                            metric:
                              nullable: true
                              type: string
                              maxLength: 64
                              description: Currently unused
                            startAt:
                              type: string
                              nullable: true
                              format: date-time
                              description: Time when the promotion becomes available. Defaults to current time.
                            expireAt:
                              type: string
                              nullable: true
                              format: date-time
                              description: Time when the promotion ends for all profiles. Defaults to current time. Has to be greater than startAt
                            displayFrom:
                              type: string
                              nullable: true
                              description: Time when the promotion becomes displayable. Defaults to null.
                            displayTo:
                              type: string
                              nullable: true
                              description: Time when the promotion stops being displayed for users. Defaults to null. Has to be greater than displayFrom.
                            lastingTime:
                              type: integer
                              format: int32
                              nullable: true
                              description: Duration of the promotion in seconds. This countdown starts when the profile activates a promotion and is individual for each profile.
                              default: 0
                            params:
                              type: object
                              description: |
                                A JSON object with any custom parameters of type string, object, array.

                                Import limit — serialized JSON must not exceed 128 KB (131072 bytes).
                              nullable: true
                              additionalProperties: true
                            itemScope:
                              type: string
                              description: |-
                                The scope of of the promotion.
                                * LINE_ITEM is a promotion used for certain items in the basket
                                * BASKET is a promotion that applies to the entire basket
                              enum:
                                - LINE_ITEM
                                - BASKET
                              default: LINE_ITEM
                            minBasketValue:
                              type: number
                              nullable: true
                              default: null
                              minimum: 0
                              description: |
                                Minimal basket value required to trigger the application of the promotion. This is the basket value after calculating other promotions that apply to the items in the basket. 

                                `minBasketValue` must be lower than `maxBasketValue`.
                            maxBasketValue:
                              type: number
                              nullable: true
                              default: null
                              minimum: 0
                              description: |
                                
                                The maximum basket value to apply the promotion to. Any amount above the maximum is not discounted. This is the basket value after calculating other promotions that apply to the items in the basket.

                                `maxBasketValue` must be greater than `minBasketValue`

                                **Example:**<br/>
                                The maximum basket value is set to 500 USD. The discount is 10%. A basket's total is 700 USD. The discount is 50 USD.
                            catalog:
                              type: string
                              nullable: true
                              maxLength: 255
                              description: ID of the item catalog targeted by the promotion (import limit — 255 chars). Required when `catalogItemType` is `SELECTED` or `FILTERED`.
                            catalogItemType:
                              type: string
                              enum:
                                - ALL
                                - SELECTED
                                - FILTERED
                                - QUERY
                              description: |
                                
                                - If set to "ALL", define the catalog in the `catalog` field and set `catalogIndexItems` to null.

                                - If set to "SELECTED", define the catalog in the `catalog` field and provide a list of catalog items in `catalogIndexItems`.

                                - If set to "FILTERED", define the catalog in the `catalog` field and provide a list of catalog filter ids in `catalogFilterIds`.

                                - If set to "QUERY", define the catalog in the `catalog` field and provide an inline RSQL expression in `catalogFilterQuery`.
                              default: ALL
                              example: FILTERED
                            catalogIndexItems:
                              type: array
                              items:
                                type: string
                              nullable: true
                              maxItems: 50
                              description: Catalog items included in the promotion (import limit — 50 entries). Requires `catalog` to be defined.
                            catalogFilterIds:
                              type: array
                              items:
                                type: string
                              nullable: true
                              maxItems: 5
                              description: Catalog filter IDs for FILTERED targeting (import limit — 5 entries). Requires `catalog` to be defined.
                            catalogFilterQuery:
                              type: string
                              maxLength: 1024
                              description: |
                                
                                An RSQL expression that the Catalogs API resolves to matching catalog items when `catalogItemType` is set to `QUERY`.

                                This field is required when `catalogItemType` is set to `QUERY`. A catalog must also be defined. Otherwise, set this field to null.

                                **Structure**

                                An expression consists of one or more rules joined by:

                                - `;` — AND

                                - `,` — OR

                                RSQL expressions are case-insensitive.

                                **Attribute predicates**

                                | Operator | Type | Meaning | Example |
                                | --- | --- | --- | --- |
                                | `==` | string / number / boolean | Equals | `category==shampoo` |
                                | `!=` | string / number | Does not equal | `brand!=Nivea` |
                                | `=in=(a,b,…)` | string | Value is in the set | `sku=in=(SKU1,SKU2)` |
                                | `=out=(a,b,…)` | string | Value is not in the set | `brand=out=(Nivea,Dove)` |
                                | `=contains=` | string | Value contains the specified string | `brand=contains=nike` |
                                | `=startsWith=` | string | Value starts with the specified string | `brand=startsWith=nik` |
                                | `=endsWith=` | string | Value ends with the specified string | `brand=endsWith=ike` |
                                | `>` / `=gt=` | number | Greater than | `price>2` |
                                | `>=` / `=gte=` | number | Greater than or equal to | `price>=2` |
                                | `<` / `=lt=` | number | Less than | `price<2` |
                                | `<=` / `=lte=` | number | Less than or equal to | `price<=2` |

                                **Important:** Attributes used in the expression must be indexed in the catalog. Read more about [indexing catalogs](https://hub.synerise.com/docs/assets/catalogs/creating-catalogs#indexing-catalogs).
                              nullable: true
                              example: color==green;price=lt=100
                            excludeCatalog:
                              type: string
                              nullable: true
                              maxLength: 255
                              description: ID of the item catalog excluded from the promotion (import limit — 255 chars). Required when `excludeCatalogItemType` is `SELECTED` or `FILTERED`.
                            excludeCatalogItemType:
                              type: string
                              enum:
                                - ALL
                                - SELECTED
                                - FILTERED
                                - QUERY
                              description: |
                                
                                - If set to "ALL", define the catalog in the `excludeCatalog` field and set `excludeCatalogIndexItems` to null.

                                - If set to "SELECTED", define the catalog in the `excludeCatalog` field and provide a list of catalog items in `excludeCatalogIndexItems`.

                                - If set to "FILTERED", define the catalog in the `excludeCatalog` field and provide a list of catalog filter ids in `excludeCatalogFilterIds`.

                                - If set to "QUERY", define the catalog in the `excludeCatalog` field and provide an inline RSQL expression in `excludeCatalogFilterQuery`.
                              default: ALL
                              example: SELECTED
                            excludeCatalogIndexItems:
                              type: array
                              items:
                                type: string
                              nullable: true
                              maxItems: 50
                              description: Catalog items excluded from the promotion (import limit — 50 entries). Requires `excludeCatalog` to be defined.
                            excludeCatalogFilterIds:
                              type: array
                              items:
                                type: string
                              nullable: true
                              maxItems: 5
                              description: Catalog filter IDs for FILTERED exclusion (import limit — 5 entries). Requires `excludeCatalog` to be defined.
                            excludeCatalogFilterQuery:
                              type: string
                              maxLength: 1024
                              description: |
                                
                                'An inline RSQL expression resolved by Catalogs into the catalog items to exclude if `excludeCatalogItemType` is set to `QUERY`.

                                Required (and `excludeCatalog` must be defined) when `excludeCatalogItemType` is `QUERY`; otherwise set to null.'
                              nullable: true
                              example: brand==acme
                            storeCatalog:
                              type: string
                              nullable: true
                              minLength: 1
                              maxLength: 255
                              description: ID of the store catalog that the promotion applies to (import limit — 255 chars).
                            storeItemType:
                              type: string
                              enum:
                                - ALL
                                - SELECTED
                              description: Defines if the promotion is available for the entire store catalog or only certain stores (listed in `storeIds`).
                              default: ALL
                            storeIds:
                              type: array
                              maxItems: 500
                              items:
                                type: string
                              description: An array of stores from the store catalog where the promotion is available if `storeItemType` is set to `SELECTED` (import limit — 500 entries).
                              nullable: true
                            targetType:
                              type: string
                              description: If this field is set to "SEGMENT", you must provide a list of segments in `targetSegment`.
                              default: ALL
                              enum:
                                - ALL
                                - SEGMENT
                            targetSegment:
                              type: array
                              maxItems: 10
                              nullable: true
                              description: This field applies only when `targetType` is set to "SEGMENT" (import limit — 10 entries).
                              items:
                                type: string
                                description: ID of the segmentation of profiles that can redeem this promotion
                            price:
                              description: In single-item promotions, this is the price of the item in the smallest unit of currency. For example, if the currency is USD and `price` is 120, the price is 1 dollar and 20 cents.
                              type: integer
                              default: 0
                              minimum: 0
                              maximum: 2147483647
                            priority:
                              description: Defines the promotion's priority, used both for display order and to order candidate promotions when they are selected during handbill and checkout assignment. Values are ordered ascending, so a lower number means a higher priority and `1` is the highest. When the per-slot read limit or the AI request cap truncates the candidate list, the higher-priority (lower-numbered) promotions are the ones kept. Promotions that share the same priority have no further guaranteed ordering between them, so when a truncation boundary falls inside a group of equal priority it is not defined which of them are kept — assign distinct priorities to the promotions that must always win.
                              type: integer
                              minimum: 1
                              maximum: 500
                              default: 250
                            voucherPool:
                              type: object
                              description: Settings for assigning codes from a voucher pool when the promotion is activated. When this is used, a promotion can only be redeemed once per activation.
                              properties:
                                enabled:
                                  type: boolean
                                  default: false
                                  description: Enables automatic assignment of codes from the pool when the promotion is activated.
                                uuid:
                                  type: string
                                  format: uuid
                                  description: UUID of the voucher pool
                                transferable:
                                  type: boolean
                                  default: false
                                  description: When `true`, the voucher can be redeemed by a different user than the one who activated the promotion.
                  errors:
                    type: array
                    description: Per-item failures. The position in the original `data[]` array is reported via `source.index`.
                    items:
                      type: object
                      properties:
                        source:
                          type: object
                          description: Information about the property that caused the problem
                          properties:
                            index:
                              type: integer
                              description: Zero-based index of the failing item in the request `data[]` array.
                        errorCode:
                          type: string
                          description: Error code which helps identify the issue. See [API error reference](https://hub.synerise.com/api-reference/errors.html).
                          example: ERR-001
                        message:
                          type: string
                          description: Short description of the error
                          example: Internal Error
                        help:
                          type: string
                          nullable: true
                          description: Currently unused
                        httpStatus:
                          type: number
                          description: HTTP status of the error
                          example: 500
                        errors:
                          type: array
                          nullable: true
                          description: "Per-field validation failures for this item. Present when the failure is a Joi body validation error (`errorCode: ERR-042`). Joi runs with `abortEarly: false`, so a single item may report multiple field violations."
                          items:
                            type: object
                            properties:
                              source:
                                type: object
                                properties:
                                  pointer:
                                    type: string
                                    description: JSON Pointer (RFC 6901) into the failing item, e.g. `/code`, `/discountModeDetails/steps/0/usageThreshold`.
                              errorCode:
                                type: string
                                description: Error code which helps identify the issue. See [API error reference](https://hub.synerise.com/api-reference/errors.html).
                                example: ERR-001
                              message:
                                type: string
                                description: Original Joi message for the field.
                              help:
                                type: string
                                nullable: true
                                description: Currently unused
                              httpStatus:
                                type: number
                                description: HTTP status of the error
                                example: 500
        "400":
          description: Request body invalid/malformed/missing elements
          content:
            application/json:
              schema:
                anyOf:
                  - type: object
                    title: JSON content issue
                    properties:
                      message:
                        type: string
                        description: Summary of the error
                      error:
                        description: Details of the error
                        anyOf:
                          - type: array
                            description: An array of objects with error details
                            items:
                              type: object
                              description: Details of an error
                              properties:
                                message:
                                  type: string
                                  description: Short description of the error
                                  example: Internal Error
                                additionalProperties:
                                  description: Additional information, if applicable
                          - type: string
                            description: Description of the error
                  - type: object
                    title: JSON structure issue
                    properties:
                      message:
                        type: string
                        description: Summary of the error
                      code:
                        type: string
                        description: String-type code of the error
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: integer
                    description: HTTP code of the problem
                  error:
                    type: string
                    description: Summary of the error
                  message:
                    type: string
                    description: Error details
                  timestamp:
                    type: string
                    description: Time when the error occurred
        "403":
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: integer
                    description: HTTP code of the problem
                  error:
                    type: string
                    description: Summary of the error
                  message:
                    type: string
                    description: Error details
                  timestamp:
                    type: string
                    description: Time when the error occurred
      deprecated: false
      security:
        - JWT: []
      x-snr-doc-urls:
        - /api-reference/loyalty-and-engagement#tag/Promotions/operation/BatchImportPromotions
      x-codeSamples:
        - lang: cURL
          label: cURL
          source: |-
            curl --request POST \
              --url https://api.synerise.com/v4/promotions/v2/promotion/batch \
              --header 'Authorization: Bearer REPLACE_BEARER_TOKEN' \
              --header 'content-type: application/json' \
              --data '{"data":[{"uuid":"string","code":"string","visibilityStatus":"DRAFT","type":"MEMBERS_ONLY","redeemLimitPerClient":0,"redeemQuantityPerActivation":8388607,"redeemLimitGlobal":0,"redeemType":"FULL","autoRedeem":true,"activationLimitGlobalType":"RELATIVE","activationLimitGlobalLimit":1,"activationLimitGlobalRelativeMinutes":null,"discountType":"PERCENT","details":{"discountType":{"name":"BOGO","outerScope":true,"requiredItemsCount":2,"requiredItems":{"catalog":"221","catalogItemType":"FILTERED","catalogIndexItems":[],"catalogFilterIds":["f978b20f-7156-40ed-99c2-3af62b76af12"],"catalogFilterQuery":"color==green;price=lt=100"},"discountedItemsCount":1},"cashbackSettings":{"exchangeRate":0.0001,"limits":{"minPoints":10,"maxPoints":1000,"maxTransactionAmount":20,"maxTransactionPercentage":50}}},"discountValue":0,"discountMode":"STATIC","discountModeDetails":{"steps":[{"discountValue":0,"usageThreshold":0}],"discountUsageTrigger":"TRANSACTION"},"preDiscountValue":0,"requireRedeemedPoints":0,"headerName":"string","headerDescription":"string","name":"string","headline":"string","description":"string","images":[{"url":"https://www.snrcdn.net/upload/f2afa4d4d7af216196047d1f7f0613f22a50a8c8/default/origin/1537188683527-el-ipadpro.png","type":"image"}],"tags":[{"hash":"6f54671d-157f-4c4e-a577-11fac3111293"}],"metric":"string","startAt":"2019-08-24T14:15:22Z","expireAt":"2019-08-24T14:15:22Z","displayFrom":"string","displayTo":"string","lastingTime":0,"params":{},"itemScope":"LINE_ITEM","minBasketValue":null,"maxBasketValue":null,"catalog":"string","catalogItemType":"FILTERED","catalogIndexItems":["string"],"catalogFilterIds":["string"],"catalogFilterQuery":"color==green;price=lt=100","excludeCatalog":"string","excludeCatalogItemType":"SELECTED","excludeCatalogIndexItems":["string"],"excludeCatalogFilterIds":["string"],"excludeCatalogFilterQuery":"brand==acme","storeCatalog":"string","storeItemType":"ALL","storeIds":["string"],"targetType":"ALL","targetSegment":["string"],"price":0,"priority":250,"voucherPool":{"enabled":false,"uuid":"095be615-a8ad-4c33-8e9c-c7612fbf6c9f","transferable":false}}],"extra":{"importHash":"string"}}'
        - lang: Python
          label: Python
          source: |-
            import http.client

            conn = http.client.HTTPSConnection("api.synerise.com")

            payload = "{\"data\":[{\"uuid\":\"string\",\"code\":\"string\",\"visibilityStatus\":\"DRAFT\",\"type\":\"MEMBERS_ONLY\",\"redeemLimitPerClient\":0,\"redeemQuantityPerActivation\":8388607,\"redeemLimitGlobal\":0,\"redeemType\":\"FULL\",\"autoRedeem\":true,\"activationLimitGlobalType\":\"RELATIVE\",\"activationLimitGlobalLimit\":1,\"activationLimitGlobalRelativeMinutes\":null,\"discountType\":\"PERCENT\",\"details\":{\"discountType\":{\"name\":\"BOGO\",\"outerScope\":true,\"requiredItemsCount\":2,\"requiredItems\":{\"catalog\":\"221\",\"catalogItemType\":\"FILTERED\",\"catalogIndexItems\":[],\"catalogFilterIds\":[\"f978b20f-7156-40ed-99c2-3af62b76af12\"],\"catalogFilterQuery\":\"color==green;price=lt=100\"},\"discountedItemsCount\":1},\"cashbackSettings\":{\"exchangeRate\":0.0001,\"limits\":{\"minPoints\":10,\"maxPoints\":1000,\"maxTransactionAmount\":20,\"maxTransactionPercentage\":50}}},\"discountValue\":0,\"discountMode\":\"STATIC\",\"discountModeDetails\":{\"steps\":[{\"discountValue\":0,\"usageThreshold\":0}],\"discountUsageTrigger\":\"TRANSACTION\"},\"preDiscountValue\":0,\"requireRedeemedPoints\":0,\"headerName\":\"string\",\"headerDescription\":\"string\",\"name\":\"string\",\"headline\":\"string\",\"description\":\"string\",\"images\":[{\"url\":\"https://www.snrcdn.net/upload/f2afa4d4d7af216196047d1f7f0613f22a50a8c8/default/origin/1537188683527-el-ipadpro.png\",\"type\":\"image\"}],\"tags\":[{\"hash\":\"6f54671d-157f-4c4e-a577-11fac3111293\"}],\"metric\":\"string\",\"startAt\":\"2019-08-24T14:15:22Z\",\"expireAt\":\"2019-08-24T14:15:22Z\",\"displayFrom\":\"string\",\"displayTo\":\"string\",\"lastingTime\":0,\"params\":{},\"itemScope\":\"LINE_ITEM\",\"minBasketValue\":null,\"maxBasketValue\":null,\"catalog\":\"string\",\"catalogItemType\":\"FILTERED\",\"catalogIndexItems\":[\"string\"],\"catalogFilterIds\":[\"string\"],\"catalogFilterQuery\":\"color==green;price=lt=100\",\"excludeCatalog\":\"string\",\"excludeCatalogItemType\":\"SELECTED\",\"excludeCatalogIndexItems\":[\"string\"],\"excludeCatalogFilterIds\":[\"string\"],\"excludeCatalogFilterQuery\":\"brand==acme\",\"storeCatalog\":\"string\",\"storeItemType\":\"ALL\",\"storeIds\":[\"string\"],\"targetType\":\"ALL\",\"targetSegment\":[\"string\"],\"price\":0,\"priority\":250,\"voucherPool\":{\"enabled\":false,\"uuid\":\"095be615-a8ad-4c33-8e9c-c7612fbf6c9f\",\"transferable\":false}}],\"extra\":{\"importHash\":\"string\"}}"

            headers = {
                'Authorization': "Bearer REPLACE_BEARER_TOKEN",
                'content-type': "application/json"
                }

            conn.request("POST", "/v4/promotions/v2/promotion/batch", payload, headers)

            res = conn.getresponse()
            data = res.read()

            print(data.decode("utf-8"))
        - lang: JavaScript
          label: JavaScript
          source: |-
            const data = JSON.stringify({
              "data": [
                {
                  "uuid": "string",
                  "code": "string",
                  "visibilityStatus": "DRAFT",
                  "type": "MEMBERS_ONLY",
                  "redeemLimitPerClient": 0,
                  "redeemQuantityPerActivation": 8388607,
                  "redeemLimitGlobal": 0,
                  "redeemType": "FULL",
                  "autoRedeem": true,
                  "activationLimitGlobalType": "RELATIVE",
                  "activationLimitGlobalLimit": 1,
                  "activationLimitGlobalRelativeMinutes": null,
                  "discountType": "PERCENT",
                  "details": {
                    "discountType": {
                      "name": "BOGO",
                      "outerScope": true,
                      "requiredItemsCount": 2,
                      "requiredItems": {
                        "catalog": "221",
                        "catalogItemType": "FILTERED",
                        "catalogIndexItems": [],
                        "catalogFilterIds": [
                          "f978b20f-7156-40ed-99c2-3af62b76af12"
                        ],
                        "catalogFilterQuery": "color==green;price=lt=100"
                      },
                      "discountedItemsCount": 1
                    },
                    "cashbackSettings": {
                      "exchangeRate": 0.0001,
                      "limits": {
                        "minPoints": 10,
                        "maxPoints": 1000,
                        "maxTransactionAmount": 20,
                        "maxTransactionPercentage": 50
                      }
                    }
                  },
                  "discountValue": 0,
                  "discountMode": "STATIC",
                  "discountModeDetails": {
                    "steps": [
                      {
                        "discountValue": 0,
                        "usageThreshold": 0
                      }
                    ],
                    "discountUsageTrigger": "TRANSACTION"
                  },
                  "preDiscountValue": 0,
                  "requireRedeemedPoints": 0,
                  "headerName": "string",
                  "headerDescription": "string",
                  "name": "string",
                  "headline": "string",
                  "description": "string",
                  "images": [
                    {
                      "url": "https://www.snrcdn.net/upload/f2afa4d4d7af216196047d1f7f0613f22a50a8c8/default/origin/1537188683527-el-ipadpro.png",
                      "type": "image"
                    }
                  ],
                  "tags": [
                    {
                      "hash": "6f54671d-157f-4c4e-a577-11fac3111293"
                    }
                  ],
                  "metric": "string",
                  "startAt": "2019-08-24T14:15:22Z",
                  "expireAt": "2019-08-24T14:15:22Z",
                  "displayFrom": "string",
                  "displayTo": "string",
                  "lastingTime": 0,
                  "params": {},
                  "itemScope": "LINE_ITEM",
                  "minBasketValue": null,
                  "maxBasketValue": null,
                  "catalog": "string",
                  "catalogItemType": "FILTERED",
                  "catalogIndexItems": [
                    "string"
                  ],
                  "catalogFilterIds": [
                    "string"
                  ],
                  "catalogFilterQuery": "color==green;price=lt=100",
                  "excludeCatalog": "string",
                  "excludeCatalogItemType": "SELECTED",
                  "excludeCatalogIndexItems": [
                    "string"
                  ],
                  "excludeCatalogFilterIds": [
                    "string"
                  ],
                  "excludeCatalogFilterQuery": "brand==acme",
                  "storeCatalog": "string",
                  "storeItemType": "ALL",
                  "storeIds": [
                    "string"
                  ],
                  "targetType": "ALL",
                  "targetSegment": [
                    "string"
                  ],
                  "price": 0,
                  "priority": 250,
                  "voucherPool": {
                    "enabled": false,
                    "uuid": "095be615-a8ad-4c33-8e9c-c7612fbf6c9f",
                    "transferable": false
                  }
                }
              ],
              "extra": {
                "importHash": "string"
              }
            });

            const xhr = new XMLHttpRequest();
            xhr.withCredentials = true;

            xhr.addEventListener("readystatechange", function () {
              if (this.readyState === this.DONE) {
                console.log(this.responseText);
              }
            });

            xhr.open("POST", "https://api.synerise.com/v4/promotions/v2/promotion/batch");
            xhr.setRequestHeader("Authorization", "Bearer REPLACE_BEARER_TOKEN");
            xhr.setRequestHeader("content-type", "application/json");

            xhr.send(data);
        - lang: Node.js
          label: Node.js
          source: |-
            const http = require("https");

            const options = {
              "method": "POST",
              "hostname": "api.synerise.com",
              "port": null,
              "path": "/v4/promotions/v2/promotion/batch",
              "headers": {
                "Authorization": "Bearer REPLACE_BEARER_TOKEN",
                "content-type": "application/json"
              }
            };

            const req = http.request(options, function (res) {
              const chunks = [];

              res.on("data", function (chunk) {
                chunks.push(chunk);
              });

              res.on("end", function () {
                const body = Buffer.concat(chunks);
                console.log(body.toString());
              });
            });

            req.write(JSON.stringify({
              data: [
                {
                  uuid: 'string',
                  code: 'string',
                  visibilityStatus: 'DRAFT',
                  type: 'MEMBERS_ONLY',
                  redeemLimitPerClient: 0,
                  redeemQuantityPerActivation: 8388607,
                  redeemLimitGlobal: 0,
                  redeemType: 'FULL',
                  autoRedeem: true,
                  activationLimitGlobalType: 'RELATIVE',
                  activationLimitGlobalLimit: 1,
                  activationLimitGlobalRelativeMinutes: null,
                  discountType: 'PERCENT',
                  details: {
                    discountType: {
                      name: 'BOGO',
                      outerScope: true,
                      requiredItemsCount: 2,
                      requiredItems: {
                        catalog: '221',
                        catalogItemType: 'FILTERED',
                        catalogIndexItems: [],
                        catalogFilterIds: ['f978b20f-7156-40ed-99c2-3af62b76af12'],
                        catalogFilterQuery: 'color==green;price=lt=100'
                      },
                      discountedItemsCount: 1
                    },
                    cashbackSettings: {
                      exchangeRate: 0.0001,
                      limits: {
                        minPoints: 10,
                        maxPoints: 1000,
                        maxTransactionAmount: 20,
                        maxTransactionPercentage: 50
                      }
                    }
                  },
                  discountValue: 0,
                  discountMode: 'STATIC',
                  discountModeDetails: {
                    steps: [{discountValue: 0, usageThreshold: 0}],
                    discountUsageTrigger: 'TRANSACTION'
                  },
                  preDiscountValue: 0,
                  requireRedeemedPoints: 0,
                  headerName: 'string',
                  headerDescription: 'string',
                  name: 'string',
                  headline: 'string',
                  description: 'string',
                  images: [
                    {
                      url: 'https://www.snrcdn.net/upload/f2afa4d4d7af216196047d1f7f0613f22a50a8c8/default/origin/1537188683527-el-ipadpro.png',
                      type: 'image'
                    }
                  ],
                  tags: [{hash: '6f54671d-157f-4c4e-a577-11fac3111293'}],
                  metric: 'string',
                  startAt: '2019-08-24T14:15:22Z',
                  expireAt: '2019-08-24T14:15:22Z',
                  displayFrom: 'string',
                  displayTo: 'string',
                  lastingTime: 0,
                  params: {},
                  itemScope: 'LINE_ITEM',
                  minBasketValue: null,
                  maxBasketValue: null,
                  catalog: 'string',
                  catalogItemType: 'FILTERED',
                  catalogIndexItems: ['string'],
                  catalogFilterIds: ['string'],
                  catalogFilterQuery: 'color==green;price=lt=100',
                  excludeCatalog: 'string',
                  excludeCatalogItemType: 'SELECTED',
                  excludeCatalogIndexItems: ['string'],
                  excludeCatalogFilterIds: ['string'],
                  excludeCatalogFilterQuery: 'brand==acme',
                  storeCatalog: 'string',
                  storeItemType: 'ALL',
                  storeIds: ['string'],
                  targetType: 'ALL',
                  targetSegment: ['string'],
                  price: 0,
                  priority: 250,
                  voucherPool: {
                    enabled: false,
                    uuid: '095be615-a8ad-4c33-8e9c-c7612fbf6c9f',
                    transferable: false
                  }
                }
              ],
              extra: {importHash: 'string'}
            }));
            req.end();
        - lang: PHP
          label: PHP
          source: |-
            <?php

            $request = new HttpRequest();
            $request->setUrl('https://api.synerise.com/v4/promotions/v2/promotion/batch');
            $request->setMethod(HTTP_METH_POST);

            $request->setHeaders([
              'Authorization' => 'Bearer REPLACE_BEARER_TOKEN',
              'content-type' => 'application/json'
            ]);

            $request->setBody('{"data":[{"uuid":"string","code":"string","visibilityStatus":"DRAFT","type":"MEMBERS_ONLY","redeemLimitPerClient":0,"redeemQuantityPerActivation":8388607,"redeemLimitGlobal":0,"redeemType":"FULL","autoRedeem":true,"activationLimitGlobalType":"RELATIVE","activationLimitGlobalLimit":1,"activationLimitGlobalRelativeMinutes":null,"discountType":"PERCENT","details":{"discountType":{"name":"BOGO","outerScope":true,"requiredItemsCount":2,"requiredItems":{"catalog":"221","catalogItemType":"FILTERED","catalogIndexItems":[],"catalogFilterIds":["f978b20f-7156-40ed-99c2-3af62b76af12"],"catalogFilterQuery":"color==green;price=lt=100"},"discountedItemsCount":1},"cashbackSettings":{"exchangeRate":0.0001,"limits":{"minPoints":10,"maxPoints":1000,"maxTransactionAmount":20,"maxTransactionPercentage":50}}},"discountValue":0,"discountMode":"STATIC","discountModeDetails":{"steps":[{"discountValue":0,"usageThreshold":0}],"discountUsageTrigger":"TRANSACTION"},"preDiscountValue":0,"requireRedeemedPoints":0,"headerName":"string","headerDescription":"string","name":"string","headline":"string","description":"string","images":[{"url":"https://www.snrcdn.net/upload/f2afa4d4d7af216196047d1f7f0613f22a50a8c8/default/origin/1537188683527-el-ipadpro.png","type":"image"}],"tags":[{"hash":"6f54671d-157f-4c4e-a577-11fac3111293"}],"metric":"string","startAt":"2019-08-24T14:15:22Z","expireAt":"2019-08-24T14:15:22Z","displayFrom":"string","displayTo":"string","lastingTime":0,"params":{},"itemScope":"LINE_ITEM","minBasketValue":null,"maxBasketValue":null,"catalog":"string","catalogItemType":"FILTERED","catalogIndexItems":["string"],"catalogFilterIds":["string"],"catalogFilterQuery":"color==green;price=lt=100","excludeCatalog":"string","excludeCatalogItemType":"SELECTED","excludeCatalogIndexItems":["string"],"excludeCatalogFilterIds":["string"],"excludeCatalogFilterQuery":"brand==acme","storeCatalog":"string","storeItemType":"ALL","storeIds":["string"],"targetType":"ALL","targetSegment":["string"],"price":0,"priority":250,"voucherPool":{"enabled":false,"uuid":"095be615-a8ad-4c33-8e9c-c7612fbf6c9f","transferable":false}}],"extra":{"importHash":"string"}}');

            try {
              $response = $request->send();

              echo $response->getBody();
            } catch (HttpException $ex) {
              echo $ex;
            }
        - lang: Java
          label: Java
          source: |-
            HttpResponse<String> response = Unirest.post("https://api.synerise.com/v4/promotions/v2/promotion/batch")
              .header("Authorization", "Bearer REPLACE_BEARER_TOKEN")
              .header("content-type", "application/json")
              .body("{\"data\":[{\"uuid\":\"string\",\"code\":\"string\",\"visibilityStatus\":\"DRAFT\",\"type\":\"MEMBERS_ONLY\",\"redeemLimitPerClient\":0,\"redeemQuantityPerActivation\":8388607,\"redeemLimitGlobal\":0,\"redeemType\":\"FULL\",\"autoRedeem\":true,\"activationLimitGlobalType\":\"RELATIVE\",\"activationLimitGlobalLimit\":1,\"activationLimitGlobalRelativeMinutes\":null,\"discountType\":\"PERCENT\",\"details\":{\"discountType\":{\"name\":\"BOGO\",\"outerScope\":true,\"requiredItemsCount\":2,\"requiredItems\":{\"catalog\":\"221\",\"catalogItemType\":\"FILTERED\",\"catalogIndexItems\":[],\"catalogFilterIds\":[\"f978b20f-7156-40ed-99c2-3af62b76af12\"],\"catalogFilterQuery\":\"color==green;price=lt=100\"},\"discountedItemsCount\":1},\"cashbackSettings\":{\"exchangeRate\":0.0001,\"limits\":{\"minPoints\":10,\"maxPoints\":1000,\"maxTransactionAmount\":20,\"maxTransactionPercentage\":50}}},\"discountValue\":0,\"discountMode\":\"STATIC\",\"discountModeDetails\":{\"steps\":[{\"discountValue\":0,\"usageThreshold\":0}],\"discountUsageTrigger\":\"TRANSACTION\"},\"preDiscountValue\":0,\"requireRedeemedPoints\":0,\"headerName\":\"string\",\"headerDescription\":\"string\",\"name\":\"string\",\"headline\":\"string\",\"description\":\"string\",\"images\":[{\"url\":\"https://www.snrcdn.net/upload/f2afa4d4d7af216196047d1f7f0613f22a50a8c8/default/origin/1537188683527-el-ipadpro.png\",\"type\":\"image\"}],\"tags\":[{\"hash\":\"6f54671d-157f-4c4e-a577-11fac3111293\"}],\"metric\":\"string\",\"startAt\":\"2019-08-24T14:15:22Z\",\"expireAt\":\"2019-08-24T14:15:22Z\",\"displayFrom\":\"string\",\"displayTo\":\"string\",\"lastingTime\":0,\"params\":{},\"itemScope\":\"LINE_ITEM\",\"minBasketValue\":null,\"maxBasketValue\":null,\"catalog\":\"string\",\"catalogItemType\":\"FILTERED\",\"catalogIndexItems\":[\"string\"],\"catalogFilterIds\":[\"string\"],\"catalogFilterQuery\":\"color==green;price=lt=100\",\"excludeCatalog\":\"string\",\"excludeCatalogItemType\":\"SELECTED\",\"excludeCatalogIndexItems\":[\"string\"],\"excludeCatalogFilterIds\":[\"string\"],\"excludeCatalogFilterQuery\":\"brand==acme\",\"storeCatalog\":\"string\",\"storeItemType\":\"ALL\",\"storeIds\":[\"string\"],\"targetType\":\"ALL\",\"targetSegment\":[\"string\"],\"price\":0,\"priority\":250,\"voucherPool\":{\"enabled\":false,\"uuid\":\"095be615-a8ad-4c33-8e9c-c7612fbf6c9f\",\"transferable\":false}}],\"extra\":{\"importHash\":\"string\"}}")
              .asString();
servers:
  - description: Microsoft Azure EU
    url: https://api.synerise.com
  - description: Microsoft Azure USA
    url: https://api.azu.synerise.com
  - description: Google Cloud Platform
    url: https://api.geb.synerise.com
tags:
  - name: Promotions
components:
  securitySchemes:
    JWT:
      type: http
      scheme: bearer
      description: |-
        JWT Bearer token. The header looks like this: `Bearer {JWT}`

        Remember to include the space between 'Bearer' and the token.

        Generate a token via the **Authorization** endpoints.
```
