Modify catalog items in batch Batching modifications to catalog items helps save time and resources. You can use different methods for managing catalog items:
Set up a static
feed , uploading batch data on a scheduled basis, which works well for smaller catalogs that do not change as frequently.
Use the Pinterest API to make real-time programmatic changes, which works well for large, more dynamic catalogs.
Combine these methods, using a feed for regular, bulk changes and the API for attributes that change frequently throughout the day, such as price or availability.
How batch requests work with the API When you submit a batch request, the endpoint returns a status and a for tracking purposes, whether the request has completed, failed, or is still in progress. Use for all batching actions. Make sure you have business access to any catalog you want to see or modify. Make sure you have business access to any catalog you want to see or modify. Select an operation type
Set the parameter to a value that supports what you want to do: Batch operations Operation Action Notes Available with feed? Add new items. No Change attributes for existing items. Yes Remove items, including Pins and metadata. Removes all merchant data from the existing item. Yes Add or change items. Use if you are uncertain whether certain items exist.
You must include all attributes in the API request, even if you are only modifying a subset.
No
Working with different catalog types Data requirements for batch modifications vary depending on the type of catalog you are modifying:
Catalog types Catalog type Use case Retail businesses manage and promote product inventory, creating product Pins for shopping ads. Hotel businesses manage room inventory and promote their offerings. Businesses manage creative content for use in various advertising formats.
See the endpoint for the full set of requirements for each catalog type.
Try out batch operations in Sandbox Use the Sandbox to try running batch operations in a non-production environment. This enables you to understand how API calls are structured and proactively address any issues with batch modifications before you run these operations for a catalog in production.
How Sandbox differs from production As you test batching operations in Sandbox, be aware of certain limitations and differences from the production environment:
To use Sandbox, you need a Sandbox access token, which is different from the OAuth token you use to call endpoints in production. See
Step 1 below.
The structure of API calls in Sandbox is identical to those in production, except that every Sandbox endpoint path includes
in the URL, as in the following example:
https://api-sandbox.pinterest.com/v5/catalogs/items/batch
Any catalogs you create in Sandbox do not transfer to production, so you will need to create new catalogs in production. You can use the exact same code, except for removing
from the endpoint URL paths.
Data updates in Sandbox do not occur on a regular basis as they do in production. Your
product count and product lists by product group calls may not not always return accurate, up-to-date results. Make sure to test these product group endpoints in production.
See the Sandbox guide to understand all capabilities and limitations.
Step 1: Get your Sandbox token Mint a Sandbox token.
Step 2. Test your Sandbox token Make a call with the token, such as to . curl --location 'https://api-sandbox.pinterest.com/v5/catalogs' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer <sandbox_token>'
If your token is valid, the endpoint returns an empty array, which is normal for a successful request if you have not created any catalogs in Sandbox: {
"items": [],
"bookmark": null
}
If your token is not valid, the endpoint returns an authentication error:
{
"code": 2,
"message": "Authentication failed.",
"status": "failure"
}
If your token appears to be invalid, take the following steps to troubleshoot:
Step 3: Create new batch items Remember to insert in the request URL. Remember to insert in the request URL. Use the following example to help you structure your own request. Insert your own values for identifying items.
curl --location 'https://api-sandbox.pinterest.com/v5/catalogs/items/batch' \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer <sandbox_token>' \
--data '{
"catalog_type": "RETAIL",
"country": "US",
"language": "EN",
"items": [
{
"item_id": "TestSandbox",
"operation": "CREATE",
"attributes": {
"image_link": [
"https://picsum.photos/200/300"
],
"availability": "in stock",
"description": "A test item for the sandbox",
"id": "TestSandbox",
"item_group_id": "TestItems",
"link": "https://www.example.com/sandbox/item",
"price": "24.99 USD",
"sale_price":"34.99 USD",
"title": "Test sandbox item"
}
}
]
}
Note the in the response, which you will use to monitor the status of the request. {
"status": "PROCESSING",
"items": [
{
"warnings": [],
"status": "PROCESSING",
"item_id": "TestSandbox",
"errors": []
}
],
"created_time": "2025-06-26T00:21:55",
"catalog_type": "RETAIL",
"batch_id": "2998436505105896960",
"completed_time": null
}
Step 4: Check batch completion status Verify that the batch request is successful and see whether individual items are being ingested.
Make sure to include in the request. Otherwise, you will see errors, such as . Make sure to include in the request. Otherwise, you will see errors, such as . curl --location 'https://api-sandbox.pinterest.com/v5/catalogs/items/batch/2998436505105896960 \
--header 'Accept: application/json' \
--header 'Authorization: Bearer <Sandbox_Token>'
Note the warning about the sale price.
{
"status": "PROCESSING",
"items": [
{
"warnings": [],
"status": "PROCESSING",
"item_id": "TestSandbox",
"errors": [
{
"attribute": "ITEM",
"message": "Sale price cannot be higher than the product price.",
"code": 1008
}
]
}
],
"created_time": "2025-06-26T00:21:56",
"catalog_type": "RETAIL",
"batch_id": "2998436505105896960",
"completed_time": null
}
Step 5: Confirm newly created items After confirming that the batch creation has completed successfully, ensure that your new item has been
uploaded correctly in the Sandbox environment.
curl --location --request GET 'https://api-sandbox.pinterest.com/catalogs/items/batch/{batch_id}?' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <sandbox_token>' \
Note that status of the batch request is , but an individual item failed to be ingested. {
"status": "COMPLETED",
"items": [
{
"warnings": [],
"status": "FAILURE",
"item_id": "TestSandbox",
"errors": [
{
"attribute": "ITEM",
"message": "Sale price cannot be higher than the product price.",
"code": 1008
}
]
}
],
"created_time": "2025-06-26T00:21:56",
"catalog_type": "RETAIL",
"batch_id": "2998436505105896960",
"completed_time": null
}
See this section for examples of correct batch operation requests and those with mistakes.
Statuses for requests and items in the requests The response to each batch request includes a and for the overall API request itself: Status of overall request Request status Description Ingestion of the entire batch is happening asynchronously. The endpoint did not ingest any items in the batch request because of an error or issue with the request itself. The ingestion process completed, and at least one item in the batch was ingested successfully.
The response also returns a for each each individual item included in the batch: Status of individual items Item status Description Ingestion of the entire batch is happening asynchronously. The endpoint did not ingest any items in the batch request because of an error or issue with the request itself. The item was ingested successfully.
An ingested item may return a that identifies an issue with its data that did not prevent ingestion but should be corrected for the quality of the catalog.
The entire batch request may complete or continue processing even though individual items failed and were not ingested.
The entire batch request may complete or continue processing even though individual items failed and were not ingested.
You can use the or operation without a feed. The payloads are identical. In the following example, the operation is used. {
"catalog_type": "RETAIL",
"country": "US",
"language": "en-US",
"items": [
{
"item_id": "ds0294-s",
"operation": "UPSERT",
"attributes": {
"image_link": ["https://dummyimage.com/600x400/fff/000&text=DS0294"],
"availability": "in stock",
"condition": "new",
"title": "denim shirt",
"description": "Casual fit denim shirt made with the finest quality Japanese denim.",
"gender": "unisex",
"google_product_category": "Apparel & Accessories > Clothing > Shirts & Tops",
"link": "https://www.example.com/denim-shirt-0294",
"material": "cotton",
"price": "24.99 USD",
"sale_price": "14.99 USD"
}
}
]
}
Response with no failures {
"catalog_type": "RETAIL",
"status": "PROCESSING",
"created_time": "2024-05-31T20:47:59",
"items": [
{
"status": "PROCESSING",
"warnings": [],
"item_id": "ds0294-s",
"errors": []
}
],
"batch_id": "3443545534656",
"completed_time": null
}
This example includes errors or omissions that result in warning or failure, as seen in the response (Note the missing field for ). {
"catalog_type": "RETAIL",
"country": "US",
"language": "en-US",
"items": [
{
"item_id": "ds0294-s",
"operation": "CREATE",
"attributes": {
"image_link": ["https://scene.example.com/image/image.jpg"],
"availability": "in stock",
"condition": "new",
"title": "denim shirt",
"description": "Casual fit denim shirt made with the finest quality Japanese denim.",
"gender": "unisex",
"google_product_category": "Apparel & Accessories > Clothing > Shirts & Tops",
"link": "https://www.example.com/denim-shirt-0294",
"material": "cotton",
"price": "24.99 USD",
"sale_price": "14.99 USD"
}
},
{
"item_id": "ds0294-m",
"operation": "CREATE",
"attributes": {
"image_link": ["https://scene.example.com/image/image.jpg"],
"availability": "in stock",
"condition": "new",
"title": "denim shirt",
"description": "Casual fit denim shirt made with the finest quality Japanese denim.",
"gender": "unisex",
"google_product_category": "Apparel & Accessories > Clothing > Shirts & Tops",
"link": "https://www.example.com/denim-shirt-0294",
"material": "cotton",
"price": "24.99 USD",
"sale_price": "34.99 USD"
}
},
{
"item_id": "ds0294-l",
"operation": "CREATE",
"attributes": {
"image_link": ["https://scene.example.com/image/image.jpg"],
"availability": "in stock",
"condition": "new",
"title": "denim shirt",
"description": "Casual fit denim shirt made with the finest quality Japanese denim.",
"gender": "unisex",
"google_product_category": "Apparel & Accessories > Clothing > Shirts & Tops",
"link": "https://www.example.com/denim-shirt-0294",
"material": "cotton"
}
}
]
}
Response with warnings and failures This response identifies warnings and failures for individual items, even though the status of the overall request is : For
the sale price is higher than the regular price. The item is accepted with a warning.
failed because of a missing required field.
failed because the item already exists.
{
"catalog_type": "RETAIL",
"created_time": "2024-05-31T16:24:32",
"batch_id": "6924628462946",
"items": [
{
"errors": [
{
"attribute": "ITEM_ID",
"code": 99,
"message": "Item already exists."
}
],
"status": "FAILURE",
"warnings": [],
"item_id": "ds0294-s"
},
{
"errors": [],
"status": "PROCESSING",
"warnings": [
{
"attribute": "SALE_PRICE",
"code": 188,
"message": "Sale price cannot be higher than the product price."
}
],
"item_id": "ds0294-m"
},
{
"errors": [
{
"attribute": "PRICE",
"code": 151,
"message": "Price is missing from product metadata. Check that you are correctly sending a price of the form: <number> <currency>. Examples of valid prices include '1.00USD' and '1.00 USD'. Do not include any currency symbols. "
}
],
"status": "FAILURE",
"warnings": [],
"item_id": "ds0294-l"
}
],
"status": "PROCESSING",
"completed_time": null
}
The operation deletes the item across all data sources, or feeds.
{
"country": "US",
"language": "EN",
"catalog_type": "RETAIL",
"items": [
{
"operation": "DELETE",
"item_id": "ds0294-l"
}
]
}
Response with no failures or warnings {
"catalog_type": "RETAIL",
"status": "PROCESSING",
"created_time": "2025-05-01T20:47:59",
"items": [
{
"status": "PROCESSING",
"warnings": [],
"item_id": "ds0294-s",
"errors": []
}
],
"batch_id": "3443545534658",
"completed_time": null
}
Update items using UPDATE operation With the operation, you can modify specific attributes while leaving other attributes unchanged. Use the optional parameter to specify the optional attributes you want to unset. If you include an attribute in the but omit it from the request payload, it may be set to . {
"country": "US",
"language": "EN",
"catalog_type": "RETAIL",
"items": [
{
"operation": "UPDATE",
"item_id": "ds0294-m",
"update_mask": ["availability", "price", "custom_label_0"],
"attributes": {
"availability": "IN STOCK",
"price": "100 USD"
}
},
{
"operation": "UPDATE",
"item_id": "ds0294-l",
"update_mask": ["availability", "price", "custom_label_1"],
"attributes": {
"availability": "IN STOCK",
"price": "100 USD"
}
}
]
}
Response with no failures
{
"catalog_type": "RETAIL",
"created_time": "2024-05-31T16:06:40",
"batch_id": "484737473748334",
"items": [
{
"errors": [],
"status": "PROCESSING",
"warnings": [],
"item_id": "ds0294-m"
},
{
"errors": [],
"status": "PROCESSING",
"warnings": [],
"item_id": "ds0294-l"
}
],
"status": "PROCESSING",
"completed_time": null
}
Create or update items using UPSERT With the operation. you can create and update items in the same batch request. You must include all attributes in the API request, even if you are only modifying a subset.
This request is to create or update three items, , and . {
"catalog_type": "RETAIL",
"country": "US",
"language": "en-US",
"items": [
{
"item_id": "ds0294-s",
"operation": "UPSERT",
"attributes": {
"image_link": ["https://scene.example.com/image/image.jpg"],
"availability": "in stock",
"condition": "new",
"title": "denim shirt",
"description": "Casual fit denim shirt made with the finest quality Japanese denim.",
"gender": "unisex",
"google_product_category": "Apparel & Accessories > Clothing > Shirts & Tops",
"link": "https://www.example.com/denim-shirt-0294",
"material": "cotton",
"price": "24.99 USD",
"sale_price": "14.99 USD"
}
},
{
"item_id": "ds0294-m",
"operation": "UPSERT",
"attributes": {
"image_link": ["https://scene.example.com/image/image.jpg"],
"availability": "in stock",
"condition": "new",
"title": "denim shirt",
"description": "Casual fit denim shirt made with the finest quality Japanese denim.",
"gender": "unisex",
"google_product_category": "Apparel & Accessories > Clothing > Shirts & Tops",
"link": "https://www.example.com/denim-shirt-0294",
"material": "cotton",
"price": "24.99 USD",
"sale_price": "14.99 USD"
}
},
{
"item_id": "ds0294-l",
"operation": "UPSERT",
"attributes": {
"item_group_id": "DS0294",
"image_link": ["https://scene.example.com/image/image.jpg"],
"availability": "in stock",
"condition": "new",
"title": "denim shirt",
"description": "Casual fit denim shirt made with the finest quality Japanese denim.",
"gender": "unisex",
"google_product_category": "Apparel & Accessories > Clothing > Shirts & Tops",
"link": "https://www.example.com/denim-shirt-0294",
"material": "cotton",
"price": "26.99 USD",
"sale_price": "14.99 USD"
}
}
]
}
Response with no failures The items and are accepted as updates, because they already exist. is accepted as a created item. {
"catalog_type": "RETAIL",
"created_time": "2024-05-31T16:34:52",
"batch_id": "3234535535353",
"items": [
{
"errors": [],
"status": "PROCESSING",
"warnings": [],
"item_id": "ds0294-s"
},
{
"errors": [],
"status": "PROCESSING",
"warnings": [],
"item_id": "ds0294-m"
},
{
"errors": [],
"status": "PROCESSING",
"warnings": [],
"item_id": "ds0294-l"
}
],
"status": "PROCESSING",
"completed_time": null
}
In this example, and include all required data, but is missing the required field. {
"catalog_type": "RETAIL",
"country": "US",
"language": "en-US",
"items": [
{
"item_id": "ds0294-s",
"operation": "UPSERT",
"attributes": {
"image_link": ["https://scene.example.com/image/image.jpg"],
"availability": "in stock",
"condition": "new",
"title": "denim shirt",
"description": "Casual fit denim shirt made with the finest quality Japanese denim.",
"gender": "unisex",
"google_product_category": "Apparel & Accessories > Clothing > Shirts & Tops",
"link": "https://www.example.com/denim-shirt-0294",
"material": "cotton",
"price": "24.99 USD",
"sale_price": "14.99 USD"
}
},
{
"item_id": "ds0294-m",
"operation": "RETAIL",
"attributes": {
"image_link": ["https://scene.example.com/image/image.jpg"],
"availability": "in stock",
"condition": "new",
"title": "denim shirt",
"description": "Casual fit denim shirt made with the finest quality Japanese denim.",
"gender": "unisex",
"google_product_category": "Apparel & Accessories > Clothing > Shirts & Tops",
"link": "https://www.example.com/denim-shirt-0294",
"material": "cotton",
"price": "24.99 USD",
"sale_price": "14.99 USD"
}
},
{
"item_id": "ds0294-l",
"operation": "RETAIL",
"attributes": {
"image_link": ["https://scene.example.com/image/image.jpg"],
"availability": "in stock",
"condition": "new",
"title": "denim shirt",
"description": "Casual fit denim shirt made with the finest quality Japanese denim.",
"gender": "unisex",
"google_product_category": "Apparel & Accessories > Clothing > Shirts & Tops",
"link": "https://www.example.com/denim-shirt-0294",
"material": "cotton"
}
}
]
}
Response with one item failure For the preceding request, is accepted as a new item, is accepted as an updated item. is rejected because of the missing field. Because at least one was accepted, the endpoint returns a . {
"catalog_type": "RETAIL",
"created_time": "2024-05-31T16:44:07",
"batch_id": "b3521697762511549164",
"items": [
{
"errors": [],
"status": "PROCESSING",
"warnings": [],
"item_id": "ds0294-s"
},
{
"errors": [],
"status": "PROCESSING",
"warnings": [],
"item_id": "ds0294-m"
},
{
"errors": [
{
"attribute": "PRICE",
"code": 151,
"message": "Price is missing from product metadata. Check that you are correctly sending a price of the form: <number> <currency>. Examples of valid prices include '1.00USD' and '1.00 USD'. Do not include any currency symbols. "
}
],
"status": "FAILURE",
"warnings": [],
"item_id": "ds0294-l"
}
],
"status": "PROCESSING",
"completed_time": null
}
Create or upsert items with video links You can enhance your catalogs with video, using the parameter with or operations. Video link processing is asynchronous and may take a few days to complete.
Video link processing is asynchronous and may take a few days to complete.
Request with a video link Except for including a video link for an item, this request is structurally identical to any other. {
"catalog_type": "RETAIL",
"country": "US",
"language": "af-ZA",
"items": [
{
"item_id": "ds0294-m",
"operation": "CREATE",
"attributes": {
"additional_image_link": [
"https://scene.example.com/image/image_v2.jpg",
"https://scene.example.com/image/image_v3.jpg"
],
"image_link": ["https://scene.example.com/image/image.jpg"],
"video_link": "https://www.example.com/cat/womens-clothing/denim-shirt-0294.mp4",
"ad_link": "https://www.example.com/cat/denim-shirt/item012?utm_source=Pinterest"
}
}
]
}
Monitor status of batch requests Use the returned for an in-progress request to check on its status .
Response with batch still processing In this example, the status of the overall request is , and only partial data is available, including any errors or warnings related to listed items. {
"catalog_type": "RETAIL",
"created_time": "2024-05-31T16:47:33",
"batch_id": "4346544433535",
"items": [
{
"errors": [],
"status": "PROCESSING",
"warnings": [],
"item_id": "ds0294-s"
},
{
"errors": [],
"status": "PROCESSING",
"warnings": [],
"item_id": "ds0294-m"
}
],
"status": "PROCESSING",
"completed_time": null
}
Response with batch processing complete In this example, the status of the overall request is . The first item was accepted and has a status of while the second has a status of . {
"items": [
{
"warnings": [],
"errors": [],
"status": "SUCCESS",
"item_id": "ds0294-s"
},
{
"warnings": [],
"errors": [
{
"attribute": "IMAGE_LINK",
"message": "Your item doesn't meet Pinterest's merchant guidelines, so it will not be published",
"code": 4042
}
],
"status": "FAILURE",
"item_id": "ds0294-m"
}
],
"batch_id": "34534534543443",
"created_time": "2024-06-05T15:23:31",
"status": "COMPLETED",
"catalog_type": "RETAIL",
"completed_time": "2024-06-05T15:23:57"
}
Use the operation with your request to the endpoint to create a new item or update an existing one. This request is to upsert, create or update, three items, ds0294-s, ds0294-m, and ds0294-l.
Confirm status of a batch request Use to get the status of a batch request. Sample response: Batch still processing
In this example, the request has not finished processing, and therefore only partial data is available.
The status for the batch is
, and any errors or warnings identified for a specific item are shown in the items list.
Call this endpoint to see information about specific items in a catalog.
This request example includes two catalog items.
{
"country": "US",
"language": "en-US",
"filters": {
"catalog_type": "RETAIL",
"catalog_id": "string",
"item_ids": ["ds0294-m", "ds0294-l"]
}
}
The endpoint returns all available information about each item in the request.
{
"items": [
{
"attributes": {
"catalog_type": "RETAIL",
"item_id": "ds0294-m",
"last_updated_time": 1717170879833,
"free_shipping_label": false,
"gender": "UNISEX",
"price": "24.99 USD",
"sale_price": "14.99 USD",
"availability": "IN_STOCK",
"condition": "NEW",
"item_group_id": "DS0294",
"title": "denim shirt",
"description": "Casual fit denim shirt made with the finest quality Japanese denim.",
"image_link": ["https://scene.example.com/image/image.jpg"],
"additional_image_link": [],
"google_product_category": "Apparel & Accessories > Clothing > Shirts & Tops",
"variant_names": ["size"],
"variant_values": ["M"],
"link": "https://www.example.com/denim-shirt-0294",
"material": "cotton"
},
"pins": [
{
"link": "https://www.example.com/denim-shirt-0294",
"id": "123456",
"title": "denim shirt",
"is_owner": true,
"has_been_promoted": false,
"is_standard": true,
"board_id": "9999",
"note": "",
"media": {
"media_type": "image",
"images": {
"150x150": {
"width": 150,
"height": 150,
"url": "https://i.pinimg.com/150x150/20/abc.jpg"
},
"400x300": {
"width": 400,
"height": 300,
"url": "https://i.pinimg.com/400x300/20/def.jpg"
},
"600x": {
"width": 564,
"height": 376,
"url": "https://i.pinimg.com/564x/20/ghi.jpg"
},
"1200x": {
"width": 600,
"height": 400,
"url": "https://i.pinimg.com/1200x/20/jfl.jpg"
}
}
},
"product_tags": [],
"created_at": "2024-05-31T15:55:29",
"description": "Casual fit denim shirt made with the finest quality Japanese denim."
}
]
},
{
"attributes": {
"catalog_type": "RETAIL",
"item_id": "ds0294-l",
"last_updated_time": 1717170879834,
"free_shipping_label": false,
"gender": "UNISEX",
"price": "26.99 USD",
"sale_price": "14.99 USD",
"availability": "IN_STOCK",
"condition": "NEW",
"item_group_id": "DS0294",
"title": "denim shirt",
"description": "Casual fit denim shirt made with the finest quality Japanese denim.",
"image_link": ["https://scene.example.com/image/image.jpg"],
"additional_image_link": [],
"google_product_category": "Apparel & Accessories > Clothing > Shirts & Tops",
"variant_names": ["size"],
"variant_values": ["L"],
"link": "https://www.example.com/denim-shirt-0294",
"material": "cotton"
},
"pins": [
{
"link": "https://www.example.com/denim-shirt-0294",
"id": "123456",
"title": "denim shirt",
"is_owner": true,
"has_been_promoted": false,
"is_standard": true,
"board_id": "9999",
"note": "",
"media": {
"media_type": "image",
"images": {
"150x150": {
"width": 150,
"height": 150,
"url": "https://i.pinimg.com/150x150/20/abc.jpg"
},
"400x300": {
"width": 400,
"height": 300,
"url": "https://i.pinimg.com/400x300/20/def.jpg"
},
"600x": {
"width": 564,
"height": 376,
"url": "https://i.pinimg.com/564x/20/ghi.jpg"
},
"1200x": {
"width": 600,
"height": 400,
"url": "https://i.pinimg.com/1200x/20/jfl.jpg"
}
}
},
"product_tags": [],
"created_at": "2024-05-31T15:55:29",
"description": "Casual fit denim shirt made with the finest quality Japanese denim."
}
]
}
]
}
Batch errors Code Description Helpful action Not authenticated to post catalogs items
Use the Token Debugger to make sure your access token includes the scopes and . Not authorized to post catalogs items
Make sure you have business access to the catalog if it is owned by another person or business. Invalid request parameters.
Read the information in the response for item associated with the error and make any corrections.