---
title: "Create/update ad entities in bulk"
method: POST
path: "/ad_accounts/{ad_account_id}/bulk/upsert"
tags: ["bulk"]
---

# Create/update ad entities in bulk

`POST /ad_accounts/{ad_account_id}/bulk/upsert`

Either create or update any combination of campaigns, ad groups, product groups, ads, keywords, schedules, or labels.
Note that this request will be processed asynchronously; the response will include a <code>request_id</code>
that can be used to obtain the status of the request.

## Path parameters

- `ad_account_id` string, required

## Request body

- BulkUpsertRequest — Two set of objects to be managed asyncronusly by bulk. One for creations, one for modifications.
  - `create` BulkUpsertRequestCreate — Request for creation of entities in bulk.
    - `ad_groups` AdGroupCreateRequest[]
      - `auto_targeting_enabled` boolean — Enable auto-targeting for ad group. Default value is True. Also known as <a href="https://help.pinterest.com/en/business/article/performance-plus-targeting" target="_blank">"Pinterest Performance+ targeting"</a>.
      - `bid_multiplier` number — <a href="/docs/getting-started/using-beta-and-restricted-features/" target="blank>Open beta</a> Bid multiplier for ad group. This value is a double between 0.1 and 10.0. Enter 0 to remove the bid multiplier. - Make sure the `bid_strategy` type for your ad group is set to `AUTOMATIC_BID`. - Not currently supported for <a href="/docs/api-features/pinterest-performance-plus-setup/" target="blank">Pinterest Performance+ campaigns</a>.
      - `budget_type` 'DAILY' | 'LIFETIME' | 'CBO_ADGROUP' — Budget type. If DAILY, an ad group's daily spend will not exceed the budget parameter value. If LIFETIME, the end_time parameter is **REQUIRED**, and the ad group spend is spread evenly between the ad group `start_time` and `end_time` range. A CBO campaign automatically generates ad group budgets from its campaign budget to maximize campaign outcome. For CBO campaigns, only "CBO_ADGROUP" is allowed. For WEB_SESSIONS campaigns, only "LIFETIME" is allowed. For update, only draft ad groups may update budget type.
      - `pacing_delivery_type` 'STANDARD' | 'ACCELERATED' — Ad group pacing delivery type. With ACCELERATED, an ad group budget is spent as fast as possible. With STANDARD, an ad group budget is spent smoothly over a day. When using CBO, only the STANDARD pacing delivery type is allowed.
    - `ads` AdCreateRequest[]
      - `ad_group_id` string, required — ID of the ad group that contains the ad.
      - `android_deep_link` string, nullable — Deep link URL for Android devices.
      - `carousel_android_deep_links` string[], nullable — Comma-separated deep links for the carousel pin on Android.
      - `carousel_destination_urls` string[], nullable — Comma-separated destination URLs for the carousel pin to promote.
      - `carousel_ios_deep_links` string[], nullable — Comma-separated deep links for the carousel pin on iOS.
      - `click_tracking_url` string, nullable — Tracking url for the ad clicks.
      - `creative_type` 'REGULAR' | 'VIDEO' | 'SHOPPING' | 'CAROUSEL' | 'MAX_VIDEO' | 'SHOP_THE_PIN' | 'COLLECTION' | 'IDEA' | 'SHOWCASE' | 'QUIZ' | 'COLLAGE' | 'MAX_WIDTH_REGULAR_COLLECTION' | 'MAX_WIDTH_VIDEO_COLLECTION' | 'APP', required — Ad creative type enum. **Note:** SHOP_THE_PIN has been deprecated. Please use COLLECTION instead.
      - `customizable_cta_type` 'GET_OFFER' | 'LEARN_MORE' | 'ORDER_NOW' | 'SHOP_NOW' | 'SIGN_UP' | 'SUBSCRIBE' | 'BUY_NOW' | 'CONTACT_US' | 'GET_QUOTE' | 'VISIT_SITE' | 'APPLY_NOW' | 'BOOK_NOW' | 'REQUEST_DEMO' | 'REGISTER_NOW' | 'FIND_A_DEALER' | 'ADD_TO_CART' | 'WATCH_NOW' | 'READ_MORE' | 'BUY_TICKETS' | 'DONATE_NOW' | 'DOWNLOAD' | 'EXPLORE_MORE' | 'FIND_A_LOCATION' | 'FIND_RETAILERS' | 'GET_DEAL' | 'GET_RECIPE' | 'GET_SHOWTIMES' | 'ON_SALE' | 'PLAY_GAME' | 'TRY_IT' | 'TAKE_A_PEEK' | 'null', nullable — Select a call to action (CTA) to display below your ad. Available only for ads with direct links enabled. CTA options for consideration and conversion campaigns are LEARN_MORE, SHOP_NOW, BOOK_NOW, SIGN_UP, VISIT_SITE, BUY_NOW, GET_OFFER, ORDER_NOW, ADD_TO_CART (for conversion campaigns with add to cart conversion events only)
      - `destination_url` string, nullable — Destination URL.
      - `disclosure_type` 'NO_DISCLOSURE' | 'PRESCRIBING_INFORMATION' | 'PRESCRIBING_INFORMATION_BOX_WARNING' | 'IMPORTANT_SAFETY_INFO' | 'MED_GUIDE' | 'PATIENT_INFORMATION' | 'null', nullable — Type of information in the page referenced by `disclosure_url`, provided either by the Food and Drug Administration (FDA) or the manufacturer.
      - `disclosure_url` string, nullable — URL for a page that provides disclosures about a pharmaceutical product, such as potential side effects. Make sure the URL takes the user directly to the disclosure content and the referenced site is secure.
      - `grid_click_type` 'CLOSEUP' | 'DIRECT_TO_DESTINATION', nullable — Where a user is taken after clicking on an ad in grid. **Note:** This parameter is read-only and is set to `DIRECT_TO_DESTINATION` by default for direct links supported ads. `grid_click_type` values provided will be ignored.
      - `ios_deep_link` string, nullable — Deep link URL for iOS devices.
      - `is_carting` boolean — Is the ad a carting/WTB ad?
      - `is_pin_deleted` boolean — Is original pin deleted?
      - `is_removable` boolean — Is pin repinnable?
      - `lead_form_id` string, nullable — Lead form ID for lead ad generation.
      - `name` string, nullable — Name of the ad - 255 chars max.
      - `pin_id` string, required — Pin ID.
      - `quiz_pin_data` QuizPinData, nullable — This field includes all quiz data including questions, options, and results.
        - `questions` QuizPinQuestion[]
          - `options` QuizPinOption[]
            - `id` number
            - `text` string
          - `question_id` number
          - `question_text` string
        - `results` QuizPinResult[]
          - `android_deep_link` string
          - `destination_url` string
          - `ios_deep_link` string
          - `organic_pin_id` string
          - `result_id` number
        - `tie_breaker_custom_result` QuizPinResult, nullable — The result, and link out, based on the user’s choice.
          - `android_deep_link` string
          - `destination_url` string
          - `ios_deep_link` string
          - `organic_pin_id` string
          - `result_id` number
        - `tie_breaker_type` 'RANDOM' | 'CUSTOM' — Quiz ad tie breaker type, default is RANDOM
      - `status` 'ACTIVE' | 'PAUSED' | 'ARCHIVED' | 'DRAFT' | 'DELETED_DRAFT' — Entity status
      - `tracking_urls` TrackingUrls, nullable — Third-party tracking URLs. Up to three tracking URLs - with a max length of 2,000 - are supported for each event type. Tracking URLs set at the ad group or ad level can override those set at the campaign level. For more information, see [Third-party and dynamic tracking](https://help.pinterest.com/en/business/article/third-party-and-dynamic-tracking).
        - `audience_verification` string[]
        - `buyable_button` string[]
        - `click` string[]
        - `engagement` string[]
        - `impression` string[]
      - `view_tracking_url` string, nullable — Tracking URL for ad impressions.
    - `campaigns` CampaignCreateRequest[]
      - `bid_options` CampaignBidOptionsCreate, nullable — Object describing the campaign level bid multipliers for create operations.
        - `age_bucket_multipliers` AgeBucketMultipliers, nullable — This represents a mapping from age bucket to a bid price adjustment. Multiplier values must be between 0 and 10. A value of 10 represents a 900% increase in bid price (from $1 to $10 for example). A value of 0 will stop distribution for this item on the specified age bucket in `MAX_BID` ad groups in `CATALOG_SALES` campaigns. All age bucket multipliers must be set at the same time. If a multiplier is not provided it is assumed to be 1 (no bid adjustment).
          - `AGE_BUCKET` '18-24' | '19+' | '20+' | '21+' | '25-34' | '35-44' | '45-49' | '50-54' | '55-64' | '65+'
        - `app_type_multipliers` AppTypeMultipliers, nullable — This represents a mapping from app type targeting criteria to a bid price adjustment. Multiplier values must be between 0 and 10. A value of 10 represents a 900% increase in bid price (from $1 to $10 for example). A value of 0 will stop distribution for this item on the specified app type in `MAX_BID` ad groups in `CATALOG_SALES` campaigns. All app type multipliers must be set at the same time. If a multiplier is not provided it is assumed to be 1 (no bid adjustment).
          - `APP_TYPE` 'android_mobile' | 'android_tablet' | 'ipad' | 'iphone' | 'web' | 'web_mobile'
        - `audience_multipliers` CampaignAudienceMultipliers — This represents a mapping from Audience ID to a bid price adjustment. Multiplier values must be between 0 and 10. A value of 10 represents a 900% increase in bid price (from $1 to $10 for example). A value of 0 will stop distribution for this item on the specified audience in `MAX_BID` ad groups in `CATALOG_SALES` campaigns. All audience multipliers must be set at the same time. If a multiplier is not provided it is assumed to be 1 (no bid adjustment).
          - `AUDIENCE_ID` string — Audience ID for the multiplier.
        - `freq_bid_multiplier_time_window` 'WEEK' | 'MONTH' | 'null', nullable — The time window for frequency bid multipliers.
        - `frequency_multipliers` FrequencyMultipliers, nullable — This represents a mapping from impression count to a bid price adjustment for frequency-based bidding. Keys are impression counts (0-10) representing how many times a user has seen the ad. Multiplier values must be between 0 and 10. A value of 10 represents a 900% increase in bid price. A value of 0 will stop distribution for this impression count. If a multiplier is not provided it is assumed to be 1 (no bid adjustment).
          - `IMPRESSION_COUNT` string — Impression count identifier.
        - `gender_multipliers` GenderMultipliers, nullable — This represents a mapping from gender targeting criteria to a bid price adjustment. Multiplier values must be between 0 and 10. A value of 10 represents a 900% increase in bid price (from $1 to $10 for example). A value of 0 will stop distribution for this item on the specified gender in `MAX_BID` ad groups in `CATALOG_SALES` campaigns. All gender multipliers must be set at the same time. If a multiplier is not provided it is assumed to be 1 (no bid adjustment).
          - `GENDER` 'unknown' | 'male' | 'female'
        - `placement_multipliers` PlacementMultipliers, nullable — This represents a mapping from placement to a bid price adjustment. Multiplier values must be between 0 and 10. A value of 10 represents a 900% increase in bid price (from $1 to $10 for example). A value of 0 will stop distribution for this item on the specified placement in `MAX_BID` ad groups in `CATALOG_SALES` campaigns. All placement multipliers must be set at the same time. If a multiplier is not provided it is assumed to be 1 (no bid adjustment).
          - `PLACEMENT` 'SEARCH' | 'BROWSE' | 'RELATED_PINS' — Placement type for bid multiplier targeting.
      - `intended_promotion_type` 'LEGACY' | 'STANDARD_AD' | 'CATALOG' — Specifies the intended promotion type for the campaign. Note: This field is immutable unless the campaign is in draft status. **STANDARD_AD** - For ads derived from Pins. - Supported for all objective types except for current CATALOG\_SALES and WEB\_CONVERSION, which are being deprecated. - For simplified objective types. **CATALOG** - For creating product group promotions. - Supported for CONSIDERATION and SALES objective types. - For simplified objective types. **LEGACY** - Intended only for maintaining backward compatibility. - Must be used for CATALOG\_SALES and WEB\_CONVERSION. - Supported for CATALOG\_SALES and WEB\_CONVERSION objective types. **If you do not provide this parameter, the default is:** - LEGACY for CATALOG\_SALES and WEB\_CONVERSION - STANDARD_AD for other objective types
      - `is_automated_campaign` boolean, nullable — Note: This field is immutable unless the campaign is in draft status. Specifies whether the campaign was created in the automated campaign flow. When using Automated Campaigns, a daily spend cap must be set, and Pinterest Performance+ may not be used. The following objective types are supported: - CONSIDERATION - WEB\_CONVERSION - SALES - CATALOG\_SALES
      - `is_campaign_budget_optimization` boolean, nullable — Note: This field is immutable unless the campaign is in draft status. Determines if a campaign automatically generates ad-group level budgets given a campaign budget to maximize campaign outcome. When using campaign budgets with a lifetime spend cap, the end time must be provided.
      - `is_flexible_daily_budgets` boolean, nullable — Determine if a campaign has setup for flexible daily budgets, also known as "Pinterest Performance+ budgets". Flexible daily budgets are only supported for campaign budget optimization with a daily spend cap, and not a lifetime spend cap.
      - `is_ltv_optimized` boolean — Specifies whether the campaign is optimized for Lifetime Value (LTV). Only available for eligible advertisers.
      - `is_performance_plus` boolean — Enable Pinterest Performance+ for your campaign. To learn more, see <a href="https://developers.pinterest.com/docs/api-features/pinterest-performance-plus-setup/">Pinterest Performance+ Setup</a>.
      - `is_top_of_search` boolean — <a href="/docs/getting-started/using-beta-and-restricted-features/" target="blank" target="blank">Restricted</a> Have your ads and content appear at the top of search result lists in Pinterest. You can only use this feature with the following objectives: `CONSIDERATION` `WEB_CONVERSION` `CATALOG_SALES` You cannot use this feature with Pinterest Performance+ or Premiere Spotlight enabled. You cannot change your `true` or `false` selection of this campaign if you <a href="https://developer.pinterest.com/docs/api/v5/campaigns-update" target="blank">update it</a>.
      - `objective_type` 'AWARENESS' | 'CONSIDERATION' | 'WEB_CONVERSION' | 'CATALOG_SALES' | 'VIDEO_COMPLETION' | 'SALES' | 'APP_INSTALL' | 'CTV_CONSIDERATION', required — Advertiser campaign objective type. You can only update objectives for draft campaigns. `CTV_CONSIDERATION` is in BETA. `WEB_SESSIONS` and `VIDEO_VIEW` objectives are deprecated. We recommend using `VIDEO_COMPLETION` as an alternative for the latter.
      - `status` 'ACTIVE' | 'PAUSED' | 'ARCHIVED' | 'DRAFT' | 'DELETED_DRAFT' — Entity status
    - `catalog_product_groups` BulkUpsertRequestCreateCatalogProductGroupsItems[]
      - union
        - CatalogsProductGroupCreateRequest — Request object for creating a product group.
          - `description` string, nullable
          - `feed_id` string, required — Catalog Feed id pertaining to the catalog product group.
          - `filters` union, required — Object holding a group of filters for request on catalog product group. This is a distinct schema. It is not possible to create or update a Product Group with empty filters. But some automatically generated Product Groups might have empty filters.
            - CatalogsProductGroupFiltersRequestAnyOfItems0
              - …
            - CatalogsProductGroupFiltersRequestAnyOfItems1
              - …
          - `is_featured` boolean — boolean indicator of whether the product group is being featured or not
          - `name` string, required
        - union — Request object for creating a catalog based product group.
          - object — Request object for creating a product group.
            - `catalog_id` string, required
            - `catalog_type` 'RETAIL', required — Retail catalog based product group is available only for selected partners at the moment. If you are not eligible, please use feed based one.
            - `country` 'AD' | 'AE' | 'AF' | 'AG' | 'AI' | 'AL' | 'AM' | 'AO' | 'AQ' | 'AR' | 'AS' | 'AT' | 'AU' | 'AW' | 'AX' | 'AZ' | 'BA' | 'BB' | 'BD' | 'BE' | 'BF' | 'BG' | 'BH' | 'BI' | 'BJ' | 'BL' | 'BM' | 'BN' | 'BO' | 'BQ' | 'BR' | 'BS' | 'BT' | 'BV' | 'BW' | 'BY' | 'BZ' | 'CA' | 'CC' | 'CD' | 'CF' | 'CG' | 'CH' | 'CI' | 'CK' | 'CL' | 'CM' | 'CN' | 'CO' | 'CR' | 'CU' | 'CV' | 'CW' | 'CX' | 'CY' | 'CZ' | 'DE' | 'DJ' | 'DK' | 'DM' | 'DO' | 'DZ' | 'EC' | 'EE' | 'EG' | 'EH' | 'ER' | 'ES' | 'ET' | 'FI' | 'FJ' | 'FK' | 'FM' | 'FO' | 'FR' | 'GA' | 'GB' | 'GD' | 'GE' | 'GF' | 'GG' | 'GH' | 'GI' | 'GL' | 'GM' | 'GN' | 'GP' | 'GQ' | 'GR' | 'GS' | 'GT' | 'GU' | 'GW' | 'GY' | 'HK' | 'HM' | 'HN' | 'HR' | 'HT' | 'HU' | 'ID' | 'IE' | 'IL' | 'IM' | 'IN' | 'IO' | 'IQ' | 'IR' | 'IS' | 'IT' | 'JE' | 'JM' | 'JO' | 'JP' | 'KE' | 'KG' | 'KH' | 'KI' | 'KM' | 'KN' | 'KR' | 'KW' | 'KY' | 'KZ' | 'LA' | 'LB' | 'LC' | 'LI' | 'LK' | 'LR' | 'LS' | 'LT' | 'LU' | 'LV' | 'LY' | 'MA' | 'MC' | 'MD' | 'ME' | 'MF' | 'MG' | 'MH' | 'MK' | 'ML' | 'MM' | 'MN' | 'MO' | 'MP' | 'MQ' | 'MR' | 'MS' | 'MT' | 'MU' | 'MV' | 'MW' | 'MX' | 'MY' | 'MZ' | 'NA' | 'NC' | 'NE' | 'NF' | 'NG' | 'NI' | 'NL' | 'NO' | 'NP' | 'NR' | 'NU' | 'NZ' | 'OM' | 'PA' | 'PE' | 'PF' | 'PG' | 'PH' | 'PK' | 'PL' | 'PM' | 'PN' | 'PR' | 'PS' | 'PT' | 'PW' | 'PY' | 'QA' | 'RE' | 'RO' | 'RS' | 'RU' | 'RW' | 'SA' | 'SB' | 'SC' | 'SD' | 'SE' | 'SG' | 'SH' | 'SI' | 'SJ' | 'SK' | 'SL' | 'SM' | 'SN' | 'SO' | 'SR' | 'SS' | 'ST' | 'SV' | 'SX' | 'SY' | 'SZ' | 'TC' | 'TD' | 'TF' | 'TG' | 'TH' | 'TJ' | 'TK' | 'TL' | 'TM' | 'TN' | 'TO' | 'TR' | 'TT' | 'TV' | 'TW' | 'TZ' | 'UA' | 'UG' | 'UM' | 'US' | 'UY' | 'UZ' | 'VA' | 'VC' | 'VE' | 'VG' | 'VI' | 'VN' | 'VU' | 'WF' | 'WS' | 'YE' | 'YT' | 'ZA' | 'ZM' | 'ZW' — Country ID from ISO 3166-1 alpha-2.
            - `description` string, nullable
            - `filters` union, required — Object holding a group of filters for request on catalog product group. This is a distinct schema. It is not possible to create or update a Product Group with empty filters. But some automatically generated Product Groups might have empty filters.
              - …
            - `locale` 'af-ZA' | 'ar-SA' | 'bg-BG' | 'bn-IN' | 'cs-CZ' | 'da-DK' | 'de' | 'el-GR' | 'en-AU' | 'en-CA' | 'en-GB' | 'en-IN' | 'en-US' | 'es-419' | 'es-AR' | 'es-ES' | 'es-MX' | 'fi-FI' | 'fr' | 'fr-CA' | 'he-IL' | 'hi-IN' | 'hr-HR' | 'hu-HU' | 'id-ID' | 'it' | 'ja' | 'ko-KR' | 'ms-MY' | 'nb-NO' | 'nl' | 'pl-PL' | 'pt-BR' | 'pt-PT' | 'ro-RO' | 'ru-RU' | 'sk-SK' | 'sv-SE' | 'te-IN' | 'th-TH' | 'tl-PH' | 'tr' | 'uk-UA' | 'vi-VN' | 'zh-CN' | 'zh-TW'
            - `name` string, required
          - object — Request object for creating a hotel product group.
            - `catalog_id` string, required
            - `catalog_type` 'HOTEL', required
            - `description` string, nullable
            - `filters` union, required — Object holding a group of filters for a hotel product group
              - …
            - `name` string, required
          - object — Request object for creating a creative assets product group.
            - `catalog_id` string, required
            - `catalog_type` 'CREATIVE_ASSETS', required
            - `description` string, nullable
            - `filters` union, required — Object holding a group of filters for a creative assets product group
              - …
            - `name` string, required
    - `keywords` KeywordsRequest[]
      - `keywords` KeywordsCommon[], required — Keyword JSON array. Each array element has 3 fields
        - `bid` integer, nullable — </p><strong>Note:</strong> bid field has been deprecated. Input will not be set and field will return null. Keyword custom bid in microcurrency - null if inherited from parent ad group.
        - `match_type` 'BROAD' | 'PHRASE' | 'EXACT' | 'EXACT_NEGATIVE' | 'PHRASE_NEGATIVE' | 'null', nullable, required — Keyword match type
        - `value` string, required — Keyword value (120 chars max).
      - `parent_id` string, required — Keyword parent entity ID (advertiser, campaign, ad group).
    - `labels` LabelBulkCreateRequest[]
      - `labels` LabelCreateItem[], required — Labels that you are applying to the campaign.
        - `label_type` 'BRAND' | 'CUSTOM', required — Label type values.
        - `value` string, required — Label name. 100-character limit.
      - `parent_id` string, required — Unique identifier of the asset you are labelling. Currently, you can only label campaigns.
    - `product_groups` ProductGroupPromotionCreateRequest[]
      - `ad_group_id` string, required — ID of the Ad Group the Product Group Promotion belongs to.
      - `product_group_promotion` ProductGroupPromotion[], required
        - `ad_group_id` string — ID of the ad group the product group belongs to.
        - `bid_in_micro_currency` integer — The bid in micro currency.
        - `catalog_product_group_id` string — ID of the catalogs product group that this product group promotion references (required for create operations)
        - `catalog_product_group_name` string — Catalogs product group name
        - `collections_header_type` 'SHOP_THIS_COLLECTION' | 'EXPLORE_THIS_COLLECTION' | 'NO_HEADER' | 'ON_SALE' | 'GET_DEAL' | 'null', nullable — Collections ad header type
        - `collections_hero_destination_url` string, nullable — Collections Hero Destination Url
        - `collections_hero_pin_id` string, nullable — Hero Pin ID if this PG is promoted as a Collection
        - `creative_type` 'REGULAR' | 'VIDEO' | 'SHOPPING' | 'CAROUSEL' | 'MAX_VIDEO' | 'SHOP_THE_PIN' | 'COLLECTION' | 'IDEA' | 'SHOWCASE' | 'QUIZ' | 'COLLAGE' | 'MAX_WIDTH_REGULAR_COLLECTION' | 'MAX_WIDTH_VIDEO_COLLECTION' | 'APP' — Ad creative type enum. **Note:** SHOP_THE_PIN has been deprecated. Please use COLLECTION instead.
        - `customizable_cta_type` 'GET_OFFER' | 'LEARN_MORE' | 'ORDER_NOW' | 'SHOP_NOW' | 'SIGN_UP' | 'SUBSCRIBE' | 'BUY_NOW' | 'CONTACT_US' | 'GET_QUOTE' | 'VISIT_SITE' | 'APPLY_NOW' | 'BOOK_NOW' | 'REGISTER_NOW' | 'FIND_A_DEALER' | 'WATCH_NOW' | 'READ_MORE' | 'BUY_TICKETS' | 'DONATE_NOW' | 'DOWNLOAD' | 'EXPLORE_MORE' | 'FIND_A_LOCATION' | 'GET_DEAL' | 'GET_RECIPE' | 'GET_SHOWTIMES' | 'ON_SALE' | 'PLAY_GAME' | 'TRY_IT' | 'BUY_ONLINE_PICKUP_IN_STORE' | 'SHOP_ON_ADVERTISER' | 'SHOP_THE_COLLECTION' | 'GET_IT_NOW' | 'TAKE_A_PEEK' | 'TAKE_A_CLOSER_LOOK' — Select a call to action (CTA) to display below your ad. CTA options for catalog sales campaigns are SHOP_NOW, BOOK_NOW, ON_SALE, GET_DEAL, BUY_ONLINE_PICKUP_IN_STORE
        - `definition` string — The full product group definition path
        - `grid_click_type` 'CLOSEUP' | 'DIRECT_TO_DESTINATION', nullable — Where a user is taken after clicking on an ad in grid. **Note:** This parameter is read-only and is set to `DIRECT_TO_DESTINATION` by default for direct links supported ads. `grid_click_type` values provided will be ignored.
        - `id` string — ID of the product group promotion (required for update operations).
        - `included` boolean — True if the group is BIDDABLE, false if it should be EXCLUDED from serving ads.
        - `is_generate_background` boolean, nullable — Enable generate backgrounds for the product group, default value is FALSE. When enabled, Pinterest will use generative AI to apply backgrounds for your product images that help drive user inspiration and engagement.
        - `is_image_auto_resizing` boolean, nullable — Set to `TRUE` to automatically resize your product images with generative AI. This ensures that images have optimal appearance for better performance.
        - `is_mdl` boolean — If set to true products promoted in this product group will use the Mobile Deep Link specified in your catalog
        - `parent_id` string — The parent Product Group ID of this Product Group
        - `preferred_media_type` 'VIDEO' | 'IMAGE' | 'null', nullable — Select whether to promote the image or video pin by default for items in the promoted product group. If selecting IMAGE, image will be promoted for all ads in the product group, and when selecting VIDEO, video will be promoted when present, otherwise fall back to image. This is applicable for standard shopping ads only.
        - `relative_definition` string — The definition of the product group, relative to its parent - an attribute name/value pair
        - `selected_image_tag` string, nullable — The ad image tag selected for the product group promotion.
        - `selected_video_tag` string, nullable — The ad video tag selected for the product group promotion.
        - `slideshow_collections_description` string, nullable — Slideshow Collections Description
        - `slideshow_collections_title` string, nullable — Slideshow Collections Title
        - `status` 'ACTIVE' | 'PAUSED' | 'ARCHIVED' | 'DRAFT' | 'DELETED_DRAFT' — Entity status
        - `tracking_url` string — Tracking template for proudct group promotions. 4000 limit
    - `schedules` ScheduleCreateRequest[]
      - `entity_id` string, required
      - `entity_type` string, required — Entity type
  - `update` BulkUpsertRequestUpdate — Request for creation of entities in bulk.
    - `ad_groups` AdGroupUpdateRequest[]
      - `bid_multiplier` number — <a href="/docs/getting-started/using-beta-and-restricted-features/" target="blank>Open beta</a> Bid multiplier for ad group. This value is a double between 0.1 and 10.0. Enter 0 to remove the bid multiplier. - Make sure the `bid_strategy` type for your ad group is set to `AUTOMATIC_BID`. - Not currently supported for <a href="/docs/api-features/pinterest-performance-plus-setup/" target="blank">Pinterest Performance+ campaigns</a>.
      - `id` string, required — Ad group ID.
      - `targeting_spec_operations` TargetingSpecOperations[] — <div>Targeting spec operations define modifications to apply to the targeting spec.</div> <br /> <div><strong>NOTE:</strong> The <code>targeting_spec</code> and <code>targeting_spec_operations</code> cannot be sent at the same time.</div> <br /> <div>The supported operations are:</div> <ul> <li><code>SET</code>: sets the field with the given values. If value is set to <code>null</code>, the field will be removed.</li> <li><code>ADD</code>: adds the given values to the field.</li> <li><code>REMOVE</code>: removes the given values from the field.</li> </ul> <div>Note the following:</div> <ul> <li>Same items are not added and removed at the same time.</li> <li>For a given field, only <code>ADD</code>/<code>REMOVE</code> or <code>SET</code> operations are allowed, not a mix of them.</li> <li>Only one SET operation is allowed for a given field.</li> <li>The <code>AGE_BUCKET</code>, <code>MAXIMUM_AGE</code>, <code>MINIMUM_AGE</code> and <code>SHOPPING_RETARGETING</code> fields only support the <code>SET</code> operation.</li> </ul>
        - union
          - object
            - `field` 'AUDIENCE_EXCLUDE', required
            - `operation` 'SET' | 'ADD' | 'REMOVE', required
            - `values` string[], required
          - object
            - `field` 'AUDIENCE_INCLUDE', required
            - `operation` 'SET' | 'ADD' | 'REMOVE', required
            - `values` string[], required
          - object
            - `field` 'GEO', required
            - `operation` 'SET' | 'ADD' | 'REMOVE', required
            - `values` string[], required
          - object
            - `field` 'GEO_EXCLUDE', required
            - `operation` 'SET' | 'ADD' | 'REMOVE', required
            - `values` string[], required
          - object
            - `field` 'INTEREST', required
            - `operation` 'SET' | 'ADD' | 'REMOVE', required
            - `values` string[], required
          - object
            - `field` 'LOCATION', required
            - `operation` 'SET' | 'ADD' | 'REMOVE', required
            - `values` string[], required
          - object
            - `field` 'LOCATION_EXCLUDE', required
            - `operation` 'SET' | 'ADD' | 'REMOVE', required
            - `values` string[], required
          - object
            - `field` 'LOCALE', required
            - `operation` 'SET' | 'ADD' | 'REMOVE', required
            - `values` string[], required
          - object
            - `field` 'APPTYPE', required
            - `operation` 'SET' | 'ADD' | 'REMOVE', required
            - `values` TargetingSpecAppType[], required
          - object
            - `field` 'GENDER', required
            - `operation` 'SET' | 'ADD' | 'REMOVE', required
            - `values` TargetingSpecGender[], required
          - object
            - `field` 'AGE_BUCKET', required
            - `operation` 'SET', required
            - `values` TargetingSpecAgeBucket[], required
          - object
            - `field` 'SHOPPING_RETARGETING', required
            - `operation` 'SET', required
            - `values` TargetingSpecShoppingRetargeting[], required
              - …
          - object
            - `field` 'MAXIMUM_AGE', required
            - `operation` 'SET', required
            - `value` string, nullable, required
          - object
            - `field` 'MINIMUM_AGE', required
            - `operation` 'SET', required
            - `value` string, nullable, required
    - `ads` AdUpdateRequest[]
      - `id` string, required — The ID of this ad.
      - `pin_id` string, nullable — Pin ID. This field may only be updated for draft ads.
    - `campaigns` CampaignUpdateRequest[]
      - `bid_options` CampaignBidOptionsUpdate, nullable — Object describing an update to the campaign level bid multipliers.
        - `age_bucket_multipliers` AgeBucketMultipliers, nullable — This represents a mapping from age bucket to a bid price adjustment. Multiplier values must be between 0 and 10. A value of 10 represents a 900% increase in bid price (from $1 to $10 for example). A value of 0 will stop distribution for this item on the specified age bucket in `MAX_BID` ad groups in `CATALOG_SALES` campaigns. All age bucket multipliers must be set at the same time. If a multiplier is not provided it is assumed to be 1 (no bid adjustment).
          - `AGE_BUCKET` '18-24' | '19+' | '20+' | '21+' | '25-34' | '35-44' | '45-49' | '50-54' | '55-64' | '65+'
        - `app_type_multipliers` AppTypeMultipliers, nullable — This represents a mapping from app type targeting criteria to a bid price adjustment. Multiplier values must be between 0 and 10. A value of 10 represents a 900% increase in bid price (from $1 to $10 for example). A value of 0 will stop distribution for this item on the specified app type in `MAX_BID` ad groups in `CATALOG_SALES` campaigns. All app type multipliers must be set at the same time. If a multiplier is not provided it is assumed to be 1 (no bid adjustment).
          - `APP_TYPE` 'android_mobile' | 'android_tablet' | 'ipad' | 'iphone' | 'web' | 'web_mobile'
        - `audience_multipliers` CampaignAudienceMultipliers — This represents a mapping from Audience ID to a bid price adjustment. Multiplier values must be between 0 and 10. A value of 10 represents a 900% increase in bid price (from $1 to $10 for example). A value of 0 will stop distribution for this item on the specified audience in `MAX_BID` ad groups in `CATALOG_SALES` campaigns. All audience multipliers must be set at the same time. If a multiplier is not provided it is assumed to be 1 (no bid adjustment).
          - `AUDIENCE_ID` string — Audience ID for the multiplier.
        - `freq_bid_multiplier_time_window` 'WEEK' | 'MONTH' | 'null', nullable — The time window for frequency bid multipliers.
        - `frequency_multipliers` FrequencyMultipliers, nullable — This represents a mapping from impression count to a bid price adjustment for frequency-based bidding. Keys are impression counts (0-10) representing how many times a user has seen the ad. Multiplier values must be between 0 and 10. A value of 10 represents a 900% increase in bid price. A value of 0 will stop distribution for this impression count. If a multiplier is not provided it is assumed to be 1 (no bid adjustment).
          - `IMPRESSION_COUNT` string — Impression count identifier.
        - `gender_multipliers` GenderMultipliers, nullable — This represents a mapping from gender targeting criteria to a bid price adjustment. Multiplier values must be between 0 and 10. A value of 10 represents a 900% increase in bid price (from $1 to $10 for example). A value of 0 will stop distribution for this item on the specified gender in `MAX_BID` ad groups in `CATALOG_SALES` campaigns. All gender multipliers must be set at the same time. If a multiplier is not provided it is assumed to be 1 (no bid adjustment).
          - `GENDER` 'unknown' | 'male' | 'female'
        - `placement_multipliers` PlacementMultipliers, nullable — This represents a mapping from placement to a bid price adjustment. Multiplier values must be between 0 and 10. A value of 10 represents a 900% increase in bid price (from $1 to $10 for example). A value of 0 will stop distribution for this item on the specified placement in `MAX_BID` ad groups in `CATALOG_SALES` campaigns. All placement multipliers must be set at the same time. If a multiplier is not provided it is assumed to be 1 (no bid adjustment).
          - `PLACEMENT` 'SEARCH' | 'BROWSE' | 'RELATED_PINS' — Placement type for bid multiplier targeting.
        - `update_mask` CampaignBidOptionsUpdateMaskItems[], required — List of fields to update. Only the fields in the list will be updated.
      - `intended_promotion_type` 'LEGACY' | 'STANDARD_AD' | 'CATALOG' — Specifies the intended promotion type for the campaign. Note: This field is immutable unless the campaign is in draft status. **STANDARD_AD** - For ads derived from Pins. - Supported for all objective types except for current CATALOG\_SALES and WEB\_CONVERSION, which are being deprecated. - For simplified objective types. **CATALOG** - For creating product group promotions. - Supported for CONSIDERATION and SALES objective types. - For simplified objective types. **LEGACY** - Intended only for maintaining backward compatibility. - Must be used for CATALOG\_SALES and WEB\_CONVERSION. - Supported for CATALOG\_SALES and WEB\_CONVERSION objective types. **If you do not provide this parameter, the default is:** - LEGACY for CATALOG\_SALES and WEB\_CONVERSION - STANDARD_AD for other objective types
      - `is_ltv_optimized` boolean — Specifies whether the campaign is optimized for Lifetime Value (LTV). Only available for eligible advertisers.
      - `is_performance_plus` boolean — Enable Pinterest Performance+ for your campaign. To learn more, see <a href="https://developers.pinterest.com/docs/api-features/pinterest-performance-plus-setup/">Pinterest Performance+ Setup</a>. This field is immutable, except only for campaigns in draft status which may update this field.
      - `is_top_of_search` boolean — Enable Top Of Search for your campaign. This field is immutable, except only for campaigns in draft status which may update this field.
      - `objective_type` 'AWARENESS' | 'CONSIDERATION' | 'WEB_CONVERSION' | 'CATALOG_SALES' | 'VIDEO_COMPLETION' | 'SALES' | 'APP_INSTALL' | 'CTV_CONSIDERATION' — Advertiser campaign objective type. You can only update objectives for draft campaigns. `CTV_CONSIDERATION` is in BETA. `WEB_SESSIONS` and `VIDEO_VIEW` objectives are deprecated. We recommend using `VIDEO_COMPLETION` as an alternative for the latter.
    - `catalog_product_groups` BulkUpsertRequestUpdateCatalogProductGroupsItems[]
      - union
        - CatalogsProductGroupUpdateRequest — Request object for updating a product group.
          - `description` string, nullable
          - `filters` union — Object holding a group of filters for request on catalog product group. This is a distinct schema. It is not possible to create or update a Product Group with empty filters. But some automatically generated Product Groups might have empty filters.
            - CatalogsProductGroupFiltersRequestAnyOfItems0
              - …
            - CatalogsProductGroupFiltersRequestAnyOfItems1
              - …
          - `is_featured` boolean — boolean indicator of whether the product group is being featured or not
          - `name` string
        - union — Request object for updating a catalog based product group.
          - object — Request object for updating a retail product group.
            - `catalog_type` 'RETAIL' — Retail catalog based product group is available only for selected partners at the moment. If you are not eligible, please use feed based one.
            - `country` 'AD' | 'AE' | 'AF' | 'AG' | 'AI' | 'AL' | 'AM' | 'AO' | 'AQ' | 'AR' | 'AS' | 'AT' | 'AU' | 'AW' | 'AX' | 'AZ' | 'BA' | 'BB' | 'BD' | 'BE' | 'BF' | 'BG' | 'BH' | 'BI' | 'BJ' | 'BL' | 'BM' | 'BN' | 'BO' | 'BQ' | 'BR' | 'BS' | 'BT' | 'BV' | 'BW' | 'BY' | 'BZ' | 'CA' | 'CC' | 'CD' | 'CF' | 'CG' | 'CH' | 'CI' | 'CK' | 'CL' | 'CM' | 'CN' | 'CO' | 'CR' | 'CU' | 'CV' | 'CW' | 'CX' | 'CY' | 'CZ' | 'DE' | 'DJ' | 'DK' | 'DM' | 'DO' | 'DZ' | 'EC' | 'EE' | 'EG' | 'EH' | 'ER' | 'ES' | 'ET' | 'FI' | 'FJ' | 'FK' | 'FM' | 'FO' | 'FR' | 'GA' | 'GB' | 'GD' | 'GE' | 'GF' | 'GG' | 'GH' | 'GI' | 'GL' | 'GM' | 'GN' | 'GP' | 'GQ' | 'GR' | 'GS' | 'GT' | 'GU' | 'GW' | 'GY' | 'HK' | 'HM' | 'HN' | 'HR' | 'HT' | 'HU' | 'ID' | 'IE' | 'IL' | 'IM' | 'IN' | 'IO' | 'IQ' | 'IR' | 'IS' | 'IT' | 'JE' | 'JM' | 'JO' | 'JP' | 'KE' | 'KG' | 'KH' | 'KI' | 'KM' | 'KN' | 'KR' | 'KW' | 'KY' | 'KZ' | 'LA' | 'LB' | 'LC' | 'LI' | 'LK' | 'LR' | 'LS' | 'LT' | 'LU' | 'LV' | 'LY' | 'MA' | 'MC' | 'MD' | 'ME' | 'MF' | 'MG' | 'MH' | 'MK' | 'ML' | 'MM' | 'MN' | 'MO' | 'MP' | 'MQ' | 'MR' | 'MS' | 'MT' | 'MU' | 'MV' | 'MW' | 'MX' | 'MY' | 'MZ' | 'NA' | 'NC' | 'NE' | 'NF' | 'NG' | 'NI' | 'NL' | 'NO' | 'NP' | 'NR' | 'NU' | 'NZ' | 'OM' | 'PA' | 'PE' | 'PF' | 'PG' | 'PH' | 'PK' | 'PL' | 'PM' | 'PN' | 'PR' | 'PS' | 'PT' | 'PW' | 'PY' | 'QA' | 'RE' | 'RO' | 'RS' | 'RU' | 'RW' | 'SA' | 'SB' | 'SC' | 'SD' | 'SE' | 'SG' | 'SH' | 'SI' | 'SJ' | 'SK' | 'SL' | 'SM' | 'SN' | 'SO' | 'SR' | 'SS' | 'ST' | 'SV' | 'SX' | 'SY' | 'SZ' | 'TC' | 'TD' | 'TF' | 'TG' | 'TH' | 'TJ' | 'TK' | 'TL' | 'TM' | 'TN' | 'TO' | 'TR' | 'TT' | 'TV' | 'TW' | 'TZ' | 'UA' | 'UG' | 'UM' | 'US' | 'UY' | 'UZ' | 'VA' | 'VC' | 'VE' | 'VG' | 'VI' | 'VN' | 'VU' | 'WF' | 'WS' | 'YE' | 'YT' | 'ZA' | 'ZM' | 'ZW' — Country ID from ISO 3166-1 alpha-2.
            - `description` string, nullable
            - `filters` union — Object holding a group of filters for request on catalog product group. This is a distinct schema. It is not possible to create or update a Product Group with empty filters. But some automatically generated Product Groups might have empty filters.
              - …
            - `locale` 'af-ZA' | 'ar-SA' | 'bg-BG' | 'bn-IN' | 'cs-CZ' | 'da-DK' | 'de' | 'el-GR' | 'en-AU' | 'en-CA' | 'en-GB' | 'en-IN' | 'en-US' | 'es-419' | 'es-AR' | 'es-ES' | 'es-MX' | 'fi-FI' | 'fr' | 'fr-CA' | 'he-IL' | 'hi-IN' | 'hr-HR' | 'hu-HU' | 'id-ID' | 'it' | 'ja' | 'ko-KR' | 'ms-MY' | 'nb-NO' | 'nl' | 'pl-PL' | 'pt-BR' | 'pt-PT' | 'ro-RO' | 'ru-RU' | 'sk-SK' | 'sv-SE' | 'te-IN' | 'th-TH' | 'tl-PH' | 'tr' | 'uk-UA' | 'vi-VN' | 'zh-CN' | 'zh-TW'
            - `name` string — Name of catalog product group
          - object — Request object for updating a hotel product group.
            - `catalog_type` 'HOTEL'
            - `description` string, nullable
            - `filters` union — Object holding a group of filters for a hotel product group
              - …
            - `name` string — Name of catalog product group
          - object — Request object for updating a creative assets product group.
            - `catalog_type` 'CREATIVE_ASSETS'
            - `description` string, nullable
            - `filters` union — Object holding a group of filters for a creative assets product group
              - …
            - `name` string — Name of catalog product group
    - `keywords` KeywordUpdateGenerated[]
      - `archived` boolean — Is keyword archived?
      - `bid` integer, nullable — </p><strong>Note:</strong> bid field has been deprecated. Input will not be set and field will return null. Keyword custom bid in microcurrency - null if inherited from parent ad group.
      - `id` string, required — Keyword ID.
    - `labels` LabelBulkUpdateRequest[]
      - `id` string, required — Label ID.
      - `parent_id` string, required — Unique identifier of the asset you are labelling. Currently, you can only label campaigns.
      - `status` 'ARCHIVED', required — Set status to `ARCHIVED` to remove the label from the parent entity.
    - `product_groups` ProductGroupPromotionUpdateRequest[]
      - `ad_group_id` string, required — ID of the ad group the product group belongs to.
      - `product_group_promotion` ProductGroupPromotion[], required
        - `ad_group_id` string — ID of the ad group the product group belongs to.
        - `bid_in_micro_currency` integer — The bid in micro currency.
        - `catalog_product_group_id` string — ID of the catalogs product group that this product group promotion references (required for create operations)
        - `catalog_product_group_name` string — Catalogs product group name
        - `collections_header_type` 'SHOP_THIS_COLLECTION' | 'EXPLORE_THIS_COLLECTION' | 'NO_HEADER' | 'ON_SALE' | 'GET_DEAL' | 'null', nullable — Collections ad header type
        - `collections_hero_destination_url` string, nullable — Collections Hero Destination Url
        - `collections_hero_pin_id` string, nullable — Hero Pin ID if this PG is promoted as a Collection
        - `creative_type` 'REGULAR' | 'VIDEO' | 'SHOPPING' | 'CAROUSEL' | 'MAX_VIDEO' | 'SHOP_THE_PIN' | 'COLLECTION' | 'IDEA' | 'SHOWCASE' | 'QUIZ' | 'COLLAGE' | 'MAX_WIDTH_REGULAR_COLLECTION' | 'MAX_WIDTH_VIDEO_COLLECTION' | 'APP' — Ad creative type enum. **Note:** SHOP_THE_PIN has been deprecated. Please use COLLECTION instead.
        - `customizable_cta_type` 'GET_OFFER' | 'LEARN_MORE' | 'ORDER_NOW' | 'SHOP_NOW' | 'SIGN_UP' | 'SUBSCRIBE' | 'BUY_NOW' | 'CONTACT_US' | 'GET_QUOTE' | 'VISIT_SITE' | 'APPLY_NOW' | 'BOOK_NOW' | 'REGISTER_NOW' | 'FIND_A_DEALER' | 'WATCH_NOW' | 'READ_MORE' | 'BUY_TICKETS' | 'DONATE_NOW' | 'DOWNLOAD' | 'EXPLORE_MORE' | 'FIND_A_LOCATION' | 'GET_DEAL' | 'GET_RECIPE' | 'GET_SHOWTIMES' | 'ON_SALE' | 'PLAY_GAME' | 'TRY_IT' | 'BUY_ONLINE_PICKUP_IN_STORE' | 'SHOP_ON_ADVERTISER' | 'SHOP_THE_COLLECTION' | 'GET_IT_NOW' | 'TAKE_A_PEEK' | 'TAKE_A_CLOSER_LOOK' — Select a call to action (CTA) to display below your ad. CTA options for catalog sales campaigns are SHOP_NOW, BOOK_NOW, ON_SALE, GET_DEAL, BUY_ONLINE_PICKUP_IN_STORE
        - `definition` string — The full product group definition path
        - `grid_click_type` 'CLOSEUP' | 'DIRECT_TO_DESTINATION', nullable — Where a user is taken after clicking on an ad in grid. **Note:** This parameter is read-only and is set to `DIRECT_TO_DESTINATION` by default for direct links supported ads. `grid_click_type` values provided will be ignored.
        - `id` string — ID of the product group promotion (required for update operations).
        - `included` boolean — True if the group is BIDDABLE, false if it should be EXCLUDED from serving ads.
        - `is_generate_background` boolean, nullable — Enable generate backgrounds for the product group, default value is FALSE. When enabled, Pinterest will use generative AI to apply backgrounds for your product images that help drive user inspiration and engagement.
        - `is_image_auto_resizing` boolean, nullable — Set to `TRUE` to automatically resize your product images with generative AI. This ensures that images have optimal appearance for better performance.
        - `is_mdl` boolean — If set to true products promoted in this product group will use the Mobile Deep Link specified in your catalog
        - `parent_id` string — The parent Product Group ID of this Product Group
        - `preferred_media_type` 'VIDEO' | 'IMAGE' | 'null', nullable — Select whether to promote the image or video pin by default for items in the promoted product group. If selecting IMAGE, image will be promoted for all ads in the product group, and when selecting VIDEO, video will be promoted when present, otherwise fall back to image. This is applicable for standard shopping ads only.
        - `relative_definition` string — The definition of the product group, relative to its parent - an attribute name/value pair
        - `selected_image_tag` string, nullable — The ad image tag selected for the product group promotion.
        - `selected_video_tag` string, nullable — The ad video tag selected for the product group promotion.
        - `slideshow_collections_description` string, nullable — Slideshow Collections Description
        - `slideshow_collections_title` string, nullable — Slideshow Collections Title
        - `status` 'ACTIVE' | 'PAUSED' | 'ARCHIVED' | 'DRAFT' | 'DELETED_DRAFT' — Entity status
        - `tracking_url` string — Tracking template for proudct group promotions. 4000 limit
    - `schedules` ScheduleUpdateRequest[]
      - `entity_id` string
      - `entity_type` string — Entity type
      - `id` string, required — Schedule ID.

## Response `200`

The request has succeeded.

- BulkUpsertResponse — ID of the bulk request.
  - `request_id` string

## Other responses

- `default` — Unexpected error

---

[API](https://skmtc.net/pinterest/apis/pinterest-rest-api.md) · [All operations](https://skmtc.net/pinterest/apis/pinterest-rest-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/pinterest/pinterest-rest-api/revisions/b698c180678a/schema)
