---
title: "Update promotions"
method: PATCH
path: "/ad_accounts/{ad_account_id}/promotions"
tags: ["promotions"]
---

# Update promotions

`PATCH /ad_accounts/{ad_account_id}/promotions`

## Request

- Base URL: `https://api.pinterest.com/v5`
- URL: `https://api.pinterest.com/v5/ad_accounts/{ad_account_id}/promotions`
- Auth: OAuth 2
  - Authorization code: `https://www.pinterest.com/oauth/`
  - Token URL: `https://api.pinterest.com/v5/oauth/token` scopes: `ads:write`
- TypeScript: <https://skmtc.dev/pinterest/apis/pinterest-rest-api/docs/ad_accounts/:ad_account_id/promotions/patch.ts> (a function with typed inputs; its response is checked against the schema)

Update multiple promotions.

## Path parameters

- `ad_account_id` string, required

## Request body

- PromotionBatchUpdate[]: List of promotion data updates keyed on promotion id.
  - `discount_status` 'OTHER' | 'ACTIVE' | 'PAUSED' | 'SCHEDULED' | 'EXPIRED': Discount status based on the current time and start and end time of discount
  - `end_time` integer: Promotion end time. Unix timestamp in seconds. Independent of campaign end time.
  - `external_id` string: Platform-specific ID for this promotion. Will be null for promotions first created within Pinterest.
  - `id` string, required: Promotion ID
  - `platform_type` string: The source integration platform used when creating the promotion. Currently supported values are 'DEFAULT' and 'SHOPIFY'.
  - `promotion_code` string: Code that can be used to redeem a promotion.
  - `promotion_custom_id` string: An optional field for user defined promotion ID for this promotion. Will copy from Pinterest system generated ID if user did not provide one.
  - `promotion_title` string: Internal name for the promotion.
  - `promotion_type` 'VARIABLE' | 'SITEWIDE' | 'CHECKOUT' | 'SAVE_X_ON_Y' | 'BUY_X_GET_Y' | 'SPEND_X_SAVE_Y' | 'FREE_SHIPPING' | 'FREE_SHIPPING_MINIMUM' | 'FREE_SHIPPING_WITH_DISCOUNT' | 'SITEWIDE_IN_STORES' | 'EXTRA_PERCENT_OFF' | 'GIFT_WITH_PURCHASE' | 'GIFT_WITH_PURCHASE_MINIMUM' | 'FIXED' | 'PERCENT_OFF_CLEARANCE' | 'X_OFF_Y' | 'GIFT_WITH_FIRST_PURCHASE' | 'BUY_X_GET_ONE_FREE' | 'CASH_BACK' | 'POINTS_ON_ALL_PURCHASES' | 'BONUS' | 'POINTS_WITH_PURCHASE' | 'CUSTOM': Determines the displayed promotion text along with what parameters (if any) are needed to complete the template.
  - `start_time` integer: Promotion start time. Unix timestamp in seconds. Independent of campaign start time.
  - `template_values` PromotionTemplateValue[]: List of values to be inserted in the promotion type-specific template.
    - `amount` number: Numeric value.
    - `currency_code` 'UNK' | 'USD' | 'GBP' | 'CAD' | 'EUR' | 'AUD' | 'NZD' | 'SEK' | 'ILS' | 'CHF' | 'HKD' | 'JPY' | 'SGD' | 'KRW' | 'NOK' | 'DKK' | 'PLN' | 'RON' | 'HUF' | 'CZK' | 'BRL' | 'MXN' | 'ARS' | 'CLP' | 'COP' | 'INR' | 'TRY': Currency Codes from ISO 4217
    - `custom_text` string: Custom text.
    - `percent` number: Percent value.

## Response `200`

The request has succeeded.

- PromotionsResponse
  - `promotions` PromotionArrayElement[]
    - `data` Promotion
      - `ad_account_id` string, required: The Ad Account ID that this promotion belongs to.
      - `discount_status` 'OTHER' | 'ACTIVE' | 'PAUSED' | 'SCHEDULED' | 'EXPIRED': Discount status based on the current time and start and end time of discount
      - `end_time` integer: Promotion end time. Unix timestamp in seconds. Independent of campaign end time.
      - `external_id` string: Platform-specific ID for this promotion. Will be null for promotions first created within Pinterest.
      - `id` string, required: Promotion ID
      - `platform_type` string: The source integration platform used when creating the promotion. Currently supported values are 'DEFAULT' and 'SHOPIFY'.
      - `promotion_code` string: Code that can be used to redeem a promotion.
      - `promotion_custom_id` string: An optional field for user defined promotion ID for this promotion. Will copy from Pinterest system generated ID if user did not provide one.
      - `promotion_title` string, required: Internal name for the promotion.
      - `promotion_type` 'VARIABLE' | 'SITEWIDE' | 'CHECKOUT' | 'SAVE_X_ON_Y' | 'BUY_X_GET_Y' | 'SPEND_X_SAVE_Y' | 'FREE_SHIPPING' | 'FREE_SHIPPING_MINIMUM' | 'FREE_SHIPPING_WITH_DISCOUNT' | 'SITEWIDE_IN_STORES' | 'EXTRA_PERCENT_OFF' | 'GIFT_WITH_PURCHASE' | 'GIFT_WITH_PURCHASE_MINIMUM' | 'FIXED' | 'PERCENT_OFF_CLEARANCE' | 'X_OFF_Y' | 'GIFT_WITH_FIRST_PURCHASE' | 'BUY_X_GET_ONE_FREE' | 'CASH_BACK' | 'POINTS_ON_ALL_PURCHASES' | 'BONUS' | 'POINTS_WITH_PURCHASE' | 'CUSTOM', required: Determines the displayed promotion text along with what parameters (if any) are needed to complete the template.
      - `start_time` integer: Promotion start time. Unix timestamp in seconds. Independent of campaign start time.
      - `status` 'ACTIVE' | 'PAUSED' | 'ARCHIVED' | 'DRAFT' | 'DELETED_DRAFT': Entity status
      - `template_values` PromotionTemplateValue[]: List of values to be inserted in the promotion type-specific template.
        - `amount` number: Numeric value.
        - `currency_code` 'UNK' | 'USD' | 'GBP' | 'CAD' | 'EUR' | 'AUD' | 'NZD' | 'SEK' | 'ILS' | 'CHF' | 'HKD' | 'JPY' | 'SGD' | 'KRW' | 'NOK' | 'DKK' | 'PLN' | 'RON' | 'HUF' | 'CZK' | 'BRL' | 'MXN' | 'ARS' | 'CLP' | 'COP' | 'INR' | 'TRY': Currency Codes from ISO 4217
        - `custom_text` string: Custom text.
        - `percent` number: Percent value.
    - `exception` Exception
      - `code` integer
      - `message` string, required

## Other responses

- `400`: The request could not be understood by the server due to unexpected data.
- `401`: Authentication is required and has either failed or not been provided.
- `403`: The request was valid, but the server is refusing action. The user might not have the necessary permissions for a resource.
- `404`: The requested resource could not be found on this server.
- `429`: The user has sent too many requests in a given amount of time and is being rate limited.
- `default`: An unexpected error response.

## Changes

- **2026-06-04** (v5) `b698c180678a`: 1 breaking, 1 warning, 29 info
  - added the new required request property `items/id`
  - removed `#/components/schemas/PromotionCommon, subschema #2` from the `items/` request property `allOf` list
  - added the new optional request property `items/discount_status`
  - added the new optional request property `items/end_time`
  - …27 more
- **2025-08-12** (v5) `8fb7ab040159`: 1 warning, 3 info
  - added the new `CUSTOM` enum value to the `promotions/items/data/allOf[subschema #1: Promotion]/promotion_type` response property for the response status `200`
  - added the new optional request property `items/allOf[subschema #1: Promotion]/template_values/items/custom_text`
  - added the new `CUSTOM` enum value to the request property `items/allOf[subschema #1: Promotion]/promotion_type`
  - added the optional property `promotions/items/data/allOf[subschema #1: Promotion]/template_values/items/custom_text` to the response with the `200` status
- **2025-07-16** (v5) `43134ca41f18`: 2 info
  - added the new optional request property `items/allOf[subschema #1: Promotion]/promotion_custom_id`
  - added the optional property `promotions/items/data/allOf[subschema #1: Promotion]/promotion_custom_id` to the response with the `200` status
- **2025-04-04** (v5) `10f9eba4ad97`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/pinterest/apis/pinterest-rest-api/changes/ad_accounts/:ad_account_id/promotions/patch.md)

---

[API](https://skmtc.dev/pinterest/apis/pinterest-rest-api.md) - [All operations](https://skmtc.dev/pinterest/apis/pinterest-rest-api/llms.txt) - [OpenAPI document](https://skmtc.dev/pinterest/apis/pinterest-rest-api/revisions/b698c180678a?raw)
