| What you need | Why you need it | How to get it |
OAuth token with ads:readads:write | These ads scopes are required for the Pinterest API endpoints you will call. | Set up your OAuth token and learn about scopes. |
| Access to the dynamic titles feature | For this feature, you need explicit access. | Contact your Pinterest representative if you have not already been granted access. |
| Catalog shopping campaign with at least one ad group | If creating a new product group promotion, you will need to reference a parent ad group in a
catalog shopping campaign. | Create campaigns and ad groups. |
| Pinterest advertiser account | For you to interact with any tools/endpoints related to campaigns, ad groups, and ads, your
OAuth token must be related to a Pinterest advertiser ID. | Learn how to create an advertiser account. |
| Parameter | Description |
|---|---|
ad_account_idstring Required | Identify the account that owns the product group promotion. |
product_group_promotion.is_dynamic_titlesboolean Optional but necessary for this use case | Set to true |
product_group_promotion.dynamic_titles_approval_typestring Optional but necessary for this use case | Set to MANUALSet to AUTOMATIC |
product_group_promotion.ad_group_idstring Required | Identify the parent ad group for the product group promotion. |
curl --request POST \ --url https://api.pinterest.com/v5/ad_accounts/123456789012/product_group_promotions \ --header 'authorization: Bearer pina_ABCD1234...' \ --header 'content-type: application/json' \ --data '{ "ad_group_id": "2680090195657", "product_group_promotion": [ { "catalog_product_group_id": "4672956004260", "catalog_product_group_name": "Most Popular", "creative_type": "SHOPPING", "grid_click_type": "DIRECT_TO_DESTINATION", "status": "ACTIVE", "is_image_auto_resizing": false, "is_generate_background": false, "is_dynamic_titles": true, "dynamic_titles_approval_type": "MANUAL" } ] }'
{ "items": [ { "data": { "id": "4260609797873", "ad_group_id": "2680090493150", "creative_type": "SHOPPING", "status": "ACTIVE", "collections_header_type": null, "collections_hero_destination_url": null, "collections_hero_pin_id": null, "slideshow_collections_description": null, "slideshow_collections_title": null, "is_generate_background": false, "selected_image_tag": null, "selected_video_tag": null, "preferred_media_type": null, "is_image_auto_resizing": false, "bid_in_micro_currency": 0, "catalog_product_group_id": "4672956004260", "catalog_id": "4854522508133", "catalog_type": "RETAIL", "catalog_product_group_name": "Most Popular", "customizable_cta_type": "SHOP_NOW", "definition": "*/", "grid_click_type": "DIRECT_TO_DESTINATION", "is_mdl": false, "parent_id": "2680090493150", "relative_definition": "*/", "hide_installment_price": true, "is_dynamic_titles": true, "dynamic_titles_approval_type": "MANUAL" } } ] }
GET /v5/ad_accounts/123456789012/ad_groups/1099511703602/dynamic_titles/status
| Field | Description |
|---|---|
is_readyboolean | Whether the .csv list of titles is available for download and review. |
generated_countinteger | Total number of generated titles. Note that some products may have multiple title variants. |
reviewed_countinteger | Total number of validated approvals and rejections of dynamic titles. This field shows 00 |
{ "is_ready": true, "generated_count": 987, "reviewed_count": 456 }
GET /v5/ad_accounts/123456789012/ad_groups/1099511703602/dynamic_titles/csv
| Field | Description |
|---|---|
download_urlstring | Presigned AWS S3 URL for the review CSV; valid for one hour. |
{ "download_url": "https://s3.amazonaws.com/bucket/dynamic_titles/review.csv?AWSAccessKeyId=..." }
GETGET https://s3.amazonaws.com/bucket/dynamic_titles/review.csv?AWSAccessKeyId=...

GET /v5/ad_accounts/123456789012/ad_groups/1099511703602/dynamic_titles/uploads
| Field | Description |
|---|---|
upload_urlstring | Presigned AWS S3 URL for uploading the reviewed .csv file The URL is valid for one hour. |
request_idstring | Upload session's unique identifier that must be passed to the endpoint for processing the reviewed .csv file. |
existing_file_namestring | Indicates whether a previously reviewed CSV exists for the affected ad group. |
{ "upload_url": "https://s3.amazonaws.com/bucket/dynamic_titles/candidate.csv?AWSAccessKeyId=...", "request_id": "549755814107-1099511703602-1714300000-abc123", "existing_filename": null }
PUTreviewed.csvcurl -X PUT "https://pinterest-waterloo.s3.amazonaws.com/..." \ -H "Content-Type: text/csv" \ --upload-file /path/to/reviewed.csv
ETagPOST /v5/ad_accounts/123456789012/ad_groups/1099511703602/dynamic_titles { "request_id": "549755814107-1099511703602-1714300000-abc123" }
| Field | Description |
|---|---|
statusstring | Validation status of SUCCESS |
errorsarray of objects | Container for any reviewed titles that failed validation. |
errors.row_numberinteger | The row in the .csv file containing a title review that failed validation. |
errors.error_typestring | Description of the validation failure. |
SUCCESSerrors{ "status": "SUCCESS", "errors": [] }
errors{ "errors": [ { "row_number": 15, "error_type": "ROW_VALIDATION_FAILED" } ] }
GET /v5/ad_accounts/123456789012/ad_groups/1099511703602/dynamic_titles/status
| Field | Description |
|---|---|
is_readyboolean | Whether the .csv list of titles is available for download and review. |
errorsarray of objects | Container for any reviewed titles that failed validation. |
generated_countinteger | Total number of generated titles. Note that some products may have multiple title variants. |
reviewed_countinteger | Total number of validated approvals and rejections of dynamic titles. Approved titles are published within 24 hours. |