# Create or update a promotion

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

## 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/promotion/create-or-update:
    post:
      tags:
        - Promotions
      summary: Create or update a promotion
      description: |
        You can use this endpoint to create a new promotion or update an existing one that matches the UUID or promotion code that you send.


        When updating an existing promotion include only the fields that you want to change. Inserting a null value overwrites an existing value.

        ---

        **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 permissions required (at least one):** `PROMOTIONS_PROMOTIONS_CREATE`, `PROMOTIONS_PROMOTIONS_UPDATE`

        **User role permission required:** `campaigns_promotions: create`
      operationId: CreateOrUpdateAPromotion
      requestBody:
        description: ""
        content:
          application/json:
            schema:
              type: object
              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
                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
                  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
                  properties:
                    steps:
                      type: array
                      nullable: false
                      minItems: 1
                      maxItems: 5
                      items:
                        required:
                          - discountValue
                          - usageThreshold
                        type: object
                        properties:
                          discountValue:
                            description: Discount value in given step
                            type: number
                          usageThreshold:
                            description: Threshold after current step would apply
                            type: number
                    discountUsageTrigger:
                      type: string
                      enum:
                        - TRANSACTION
                        - REDEEM
                      nullable: false
                      description: Describe after what action new steps would be applied
                  nullable: true
                  description: 'Applies only when `"discountMode": "STEP"`.'
                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
                  description: Promotion headline displayed to viewers
                description:
                  type: string
                  maxLength: 2048
                  nullable: true
                  description: Details of the promotion displayed to viewers
                images:
                  type: array
                  nullable: true
                  items:
                    required:
                      - url
                      - type
                    type: object
                    properties:
                      url:
                        description: Image or thumbnail source. Must be an absolute HTTP/HTTPS URL.
                        type: string
                        format: uri
                        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
                tags:
                  description: |
                    An array of tags.

                    **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
                  items:
                    type: object
                    properties:
                      hash:
                        type: string
                        description: Hash ID of the tag
                        example: 6f54671d-157f-4c4e-a577-11fac3111293
                  nullable: true
                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.
                  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
                  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
                excludeCatalog:
                  type: string
                  description: ID of the item catalog that the promotion should exclude
                  nullable: true
                  example:
                    - "311"
                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
                  description: |
                    
                    'An array of items from the catalog to be excluded in the promotion if `excludeCatalogItemType` is set to `SELECTED`.


                    If `excludeCatalogItemType` is set to `ALL`, set `excludeCatalogIndexItems` to null.'
                  nullable: true
                  example:
                    - "29727276"
                excludeCatalogFilterIds:
                  type: array
                  items:
                    type: string
                  description: |
                    
                    'An array of catalog filter IDs to be executed to fetch catalog items to exclude if `excludeCatalogItemType` is set to `FILTERED`.


                    If `excludeCatalogItemType` is set to `ALL`, set `excludeCatalogFilterIds` to null.'
                  nullable: true
                  example: []
                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
                  description: ID of the store catalog that the promotion applies to
                  nullable: true
                  minLength: 1
                  maxLength: 255
                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
                  items:
                    type: string
                  description: An array of stores from the store catalog where the promotion is available if `storeItemType` is set to `SELECTED`
                  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
                  nullable: true
                  description: This field applies only when `targetType` is set to "SEGMENT".
                  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.
                importHash:
                  type: string
                  format: uuid
                  nullable: true
                  description: Hash of the import
        required: true
      responses:
        "200":
          description: Promotion updated
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: Status of the operation
        "201":
          description: Promotion created
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: Status of the operation
        "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/CreateOrUpdateAPromotion
      x-codeSamples:
        - lang: cURL
          label: cURL
          source: |-
            curl --request POST \
              --url https://api.synerise.com/v4/promotions/promotion/create-or-update \
              --header 'Authorization: Bearer REPLACE_BEARER_TOKEN' \
              --header 'content-type: application/json' \
              --data '{"uuid":"string","code":"string","visibilityStatus":"DRAFT","type":"MEMBERS_ONLY","redeemLimitPerClient":0,"redeemQuantityPerActivation":8388607,"redeemLimitGlobal":0,"redeemType":"FULL","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"}],"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":"221","catalogItemType":"FILTERED","catalogIndexItems":[],"catalogFilterIds":["f978b20f-7156-40ed-99c2-3af62b76af12"],"catalogFilterQuery":"color==green;price=lt=100","excludeCatalog":["311"],"excludeCatalogItemType":"SELECTED","excludeCatalogIndexItems":["29727276"],"excludeCatalogFilterIds":[],"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},"importHash":"ced8a4ad-6d6e-48ca-a663-3fb07e6216a9"}'
        - lang: Python
          label: Python
          source: |-
            import http.client

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

            payload = "{\"uuid\":\"string\",\"code\":\"string\",\"visibilityStatus\":\"DRAFT\",\"type\":\"MEMBERS_ONLY\",\"redeemLimitPerClient\":0,\"redeemQuantityPerActivation\":8388607,\"redeemLimitGlobal\":0,\"redeemType\":\"FULL\",\"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\"}],\"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\":\"221\",\"catalogItemType\":\"FILTERED\",\"catalogIndexItems\":[],\"catalogFilterIds\":[\"f978b20f-7156-40ed-99c2-3af62b76af12\"],\"catalogFilterQuery\":\"color==green;price=lt=100\",\"excludeCatalog\":[\"311\"],\"excludeCatalogItemType\":\"SELECTED\",\"excludeCatalogIndexItems\":[\"29727276\"],\"excludeCatalogFilterIds\":[],\"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},\"importHash\":\"ced8a4ad-6d6e-48ca-a663-3fb07e6216a9\"}"

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

            conn.request("POST", "/v4/promotions/promotion/create-or-update", payload, headers)

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

            print(data.decode("utf-8"))
        - lang: JavaScript
          label: JavaScript
          source: |-
            const data = JSON.stringify({
              "uuid": "string",
              "code": "string",
              "visibilityStatus": "DRAFT",
              "type": "MEMBERS_ONLY",
              "redeemLimitPerClient": 0,
              "redeemQuantityPerActivation": 8388607,
              "redeemLimitGlobal": 0,
              "redeemType": "FULL",
              "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"
                }
              ],
              "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": "221",
              "catalogItemType": "FILTERED",
              "catalogIndexItems": [],
              "catalogFilterIds": [
                "f978b20f-7156-40ed-99c2-3af62b76af12"
              ],
              "catalogFilterQuery": "color==green;price=lt=100",
              "excludeCatalog": [
                "311"
              ],
              "excludeCatalogItemType": "SELECTED",
              "excludeCatalogIndexItems": [
                "29727276"
              ],
              "excludeCatalogFilterIds": [],
              "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
              },
              "importHash": "ced8a4ad-6d6e-48ca-a663-3fb07e6216a9"
            });

            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/promotion/create-or-update");
            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/promotion/create-or-update",
              "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({
              uuid: 'string',
              code: 'string',
              visibilityStatus: 'DRAFT',
              type: 'MEMBERS_ONLY',
              redeemLimitPerClient: 0,
              redeemQuantityPerActivation: 8388607,
              redeemLimitGlobal: 0,
              redeemType: 'FULL',
              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'}],
              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: '221',
              catalogItemType: 'FILTERED',
              catalogIndexItems: [],
              catalogFilterIds: ['f978b20f-7156-40ed-99c2-3af62b76af12'],
              catalogFilterQuery: 'color==green;price=lt=100',
              excludeCatalog: ['311'],
              excludeCatalogItemType: 'SELECTED',
              excludeCatalogIndexItems: ['29727276'],
              excludeCatalogFilterIds: [],
              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
              },
              importHash: 'ced8a4ad-6d6e-48ca-a663-3fb07e6216a9'
            }));
            req.end();
        - lang: PHP
          label: PHP
          source: |-
            <?php

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

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

            $request->setBody('{"uuid":"string","code":"string","visibilityStatus":"DRAFT","type":"MEMBERS_ONLY","redeemLimitPerClient":0,"redeemQuantityPerActivation":8388607,"redeemLimitGlobal":0,"redeemType":"FULL","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"}],"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":"221","catalogItemType":"FILTERED","catalogIndexItems":[],"catalogFilterIds":["f978b20f-7156-40ed-99c2-3af62b76af12"],"catalogFilterQuery":"color==green;price=lt=100","excludeCatalog":["311"],"excludeCatalogItemType":"SELECTED","excludeCatalogIndexItems":["29727276"],"excludeCatalogFilterIds":[],"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},"importHash":"ced8a4ad-6d6e-48ca-a663-3fb07e6216a9"}');

            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/promotion/create-or-update")
              .header("Authorization", "Bearer REPLACE_BEARER_TOKEN")
              .header("content-type", "application/json")
              .body("{\"uuid\":\"string\",\"code\":\"string\",\"visibilityStatus\":\"DRAFT\",\"type\":\"MEMBERS_ONLY\",\"redeemLimitPerClient\":0,\"redeemQuantityPerActivation\":8388607,\"redeemLimitGlobal\":0,\"redeemType\":\"FULL\",\"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\"}],\"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\":\"221\",\"catalogItemType\":\"FILTERED\",\"catalogIndexItems\":[],\"catalogFilterIds\":[\"f978b20f-7156-40ed-99c2-3af62b76af12\"],\"catalogFilterQuery\":\"color==green;price=lt=100\",\"excludeCatalog\":[\"311\"],\"excludeCatalogItemType\":\"SELECTED\",\"excludeCatalogIndexItems\":[\"29727276\"],\"excludeCatalogFilterIds\":[],\"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},\"importHash\":\"ced8a4ad-6d6e-48ca-a663-3fb07e6216a9\"}")
              .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.
```
