Product feeds
Integration summary
- Base URL:
https://{{url}}/whatsapp-bsp-admin-ext-endpoint-ws/services- Token: admin token, in the
Authorization: Bearer {{admin-token}}header (how to generate it)- Endpoints on this page:
POST /v1/catalog/{{waba_id}}/{{catalog_id}}/product_feeds: Schedule product upload from fileGET /v1/catalog/{{waba_id}}/{{catalog_id}}/{{product_feed_id}}/uploads: List product feed uploadsGET /v1/catalog/{{waba_id}}/{{catalog_id}}/{{product_feed_id}}/{{upload_session_id}}/errors: Get upload errorsPOST /v1/catalog/{{waba_id}}/{{catalog_id}}/{{product_feed_id}}/{{upload_session_id}}/error_report: Request error reportGET /v1/catalog/{{waba_id}}/{{catalog_id}}/{{product_feed_id}}/{{upload_session_id}}/errors/download: Download error report
Schedule periodic product uploads from a file (product feed), list its uploads, and review or download the errors of each upload. If the request succeeds, every service returns HTTP 200.
Schedule product upload from file
Creates a product feed: Meta periodically downloads a product file from a URL and processes it on the schedule you set.
- With
schedule, the file replaces the catalog's contents: products in the file are created or updated, and products missing from it are deleted. - With
update_schedule, products in the file are only created or updated. - With
override_type, the file contains localized information (language, country, or both) for products that already exist in the catalog.
Request
Schedule product upload from file request:
| URL | https://{{url}}/whatsapp-bsp-admin-ext-endpoint-ws/services/v1/catalog/{{waba_id}}/{{catalog_id}}/product_feeds |
| Method | POST |
| Type | application/json |
Headers
Schedule product upload from file headers:
| Name | Description | Type | Requirements |
|---|---|---|---|
| Content-Type | application/json | String | Required |
| Authorization | Admin token. See Generate authentication token. | String | Required |
Parameters
Schedule product upload from file parameters:
| Name | Description | Type | Requirements |
|---|---|---|---|
| waba_id | WhatsApp Business Account ID. | String | Required |
| catalog_id | Catalog ID. | String | Required |
Body
Schedule product upload from file body fields:
| Name | Description | Type | Requirements |
|---|---|---|---|
| name | Descriptive name for the product feed. | String | Required |
| schedule | Schedule for replacing the catalog's contents with the file. | Schedule object | Conditional. Required if you don't send update_schedule. |
| update_schedule | Schedule for creating or updating products from the file. | Schedule object | Conditional. Required if you don't send schedule. |
| override_type | Type of localized information in the file. Possible values:
| String | Optional. Only for files with localized information. |
Schedule object
Used in both schedule and update_schedule.
| Name | Description | Type | Requirements |
|---|---|---|---|
| interval | How often the file is processed. Possible values:
| String | Required |
| url | URL of the product file. | String | Required |
| hour | Hour the file is processed, from 0 to 23. | String | Optional |
| minute | Minute the file is processed, from 0 to 59. | String | Optional |
| day_of_week | Day the file is processed. Possible values:
| String | Optional. Used with interval WEEKLY. |
| timezone | Time zone for the schedule, for example, America/Mexico_City. | String | Optional |
| username | Username to download the file, if the URL requires credentials. | String | Optional |
| password | Password to download the file, if the URL requires credentials. | String | Optional |
Example
Complete Schedule product upload from file example:
Replace the catalog's contents once a day:
curl --location 'https://{{url}}/whatsapp-bsp-admin-ext-endpoint-ws/services/v1/catalog/{{waba_id}}/{{catalog_id}}/product_feeds' \--header 'Content-Type: application/json' \--header 'Authorization: Bearer {{admin-token}}' \--data '{"name": "Products_daily_replace","schedule": {"interval": "DAILY","url": "https://www.example.com/feeds/products.csv","hour": "13","minute": "5","timezone": "America/Mexico_City"}}'
Create or update products every hour:
curl --location 'https://{{url}}/whatsapp-bsp-admin-ext-endpoint-ws/services/v1/catalog/{{waba_id}}/{{catalog_id}}/product_feeds' \--header 'Content-Type: application/json' \--header 'Authorization: Bearer {{admin-token}}' \--data '{"name": "Products_hourly_update","update_schedule": {"interval": "HOURLY","url": "https://www.example.com/feeds/products-updates.csv","minute": "10","timezone": "America/Mexico_City"}}'
Load localized information by language and country:
curl --location 'https://{{url}}/whatsapp-bsp-admin-ext-endpoint-ws/services/v1/catalog/{{waba_id}}/{{catalog_id}}/product_feeds' \--header 'Content-Type: application/json' \--header 'Authorization: Bearer {{admin-token}}' \--data '{"name": "Products_localized_daily","override_type": "language_and_country","schedule": {"interval": "DAILY","url": "https://www.example.com/feeds/products-localized.csv","hour": "14","timezone": "America/Mexico_City"}}'
Response
Schedule product upload from file response:
| Name | Description | Type |
|---|---|---|
| id | ID of the new product feed. | String |
{"id": "987654321098765"}
List product feed uploads
Returns the uploads (upload sessions) of a product feed, sorted by start time.
Request
List product feed uploads request:
| URL | https://{{url}}/whatsapp-bsp-admin-ext-endpoint-ws/services/v1/catalog/{{waba_id}}/{{catalog_id}}/{{product_feed_id}}/uploads |
| Method | GET |
Headers
List product feed uploads headers:
| Name | Description | Type | Requirements |
|---|---|---|---|
| Authorization | Admin token. See Generate authentication token. | String | Required |
Parameters
List product feed uploads parameters:
| Name | Description | Type | Requirements |
|---|---|---|---|
| waba_id | WhatsApp Business Account ID. | String | Required |
| catalog_id | Catalog ID. | String | Required |
| product_feed_id | ID returned by the Schedule product upload from file service. | String | Required |
Example
Complete List product feed uploads example:
curl --location 'https://{{url}}/whatsapp-bsp-admin-ext-endpoint-ws/services/v1/catalog/{{waba_id}}/{{catalog_id}}/{{product_feed_id}}/uploads' \--header 'Authorization: Bearer {{admin-token}}'
Response
List product feed uploads response:
The service returns a list of uploads.
| Name | Description | Type |
|---|---|---|
| id | Upload (upload session) ID. | String |
| startTime | Date and time the upload started. | String |
| endTime | Date and time the upload ended. | String |
[{"id": "112233445566778","startTime": "2026-11-02T18:53:25+0000","endTime": "2026-11-02T19:00:34+0000"},{"id": "112233445566779","startTime": "2026-11-03T18:50:48+0000","endTime": "2026-11-03T19:00:24+0000"}]
Get upload errors
Returns the errors Meta found while processing a product feed upload.
Request
Get upload errors request:
| URL | https://{{url}}/whatsapp-bsp-admin-ext-endpoint-ws/services/v1/catalog/{{waba_id}}/{{catalog_id}}/{{product_feed_id}}/{{upload_session_id}}/errors |
| Method | GET |
Headers
Get upload errors headers:
| Name | Description | Type | Requirements |
|---|---|---|---|
| Authorization | Admin token. See Generate authentication token. | String | Required |
Parameters
Get upload errors parameters:
| Name | Description | Type | Requirements |
|---|---|---|---|
| waba_id | WhatsApp Business Account ID. | String | Required |
| catalog_id | Catalog ID. | String | Required |
| product_feed_id | Product feed ID. | String | Required |
| upload_session_id | Upload ID, returned by the List product feed uploads service. | String | Required |
Example
Complete Get upload errors example:
curl --location 'https://{{url}}/whatsapp-bsp-admin-ext-endpoint-ws/services/v1/catalog/{{waba_id}}/{{catalog_id}}/{{product_feed_id}}/{{upload_session_id}}/errors' \--header 'Authorization: Bearer {{admin-token}}'
Response
Get upload errors response:
Upload error object
| Name | Description | Type |
|---|---|---|
| id | Error ID. | String |
| summary | Error summary. | String |
| description | Detailed error description. | String |
| severity | Error severity, for example, fatal or warning. | String |
| affected_surfaces | Channels affected by the error. | List of String |
| samples | Sample rows from the file that have the error. | Object |
Samples object
Sample object
| Name | Description | Type |
|---|---|---|
| id | Row ID. | String |
| row_number | Row number in the file. | Number |
| retailer_id | The product's retailer_id. | String |
Paging object
| Name | Description | Type | Requirements |
|---|---|---|---|
| cursors | before and after cursors used to paginate results. | Object | Optional |
| next | URL to fetch the next page of results. | String | Optional |
| previous | URL to fetch the previous page of results. | String | Optional |
{"data": [{"id": "556677889900112","summary": "Missing price","description": "Add a price to your products.","severity": "fatal","affected_surfaces": ["Dynamic Ads","Shops"],"samples": {"data": [{"id": "556677889900113","row_number": 3,"retailer_id": "ENGLISH_COURSE_004"}]}}],"paging": {"cursors": {"before": "QVFIUjExampleBefore","after": "QVFIUjExampleAfter"}}}
Request error report
Asks Meta to generate a file with an upload's errors. When it's ready, download it with the Download error report service.
Request
Request error report request:
| URL | https://{{url}}/whatsapp-bsp-admin-ext-endpoint-ws/services/v1/catalog/{{waba_id}}/{{catalog_id}}/{{product_feed_id}}/{{upload_session_id}}/error_report |
| Method | POST |
Headers
Request error report headers:
| Name | Description | Type | Requirements |
|---|---|---|---|
| Authorization | Admin token. See Generate authentication token. | String | Required |
Parameters
Request error report parameters:
| Name | Description | Type | Requirements |
|---|---|---|---|
| waba_id | WhatsApp Business Account ID. | String | Required |
| catalog_id | Catalog ID. | String | Required |
| product_feed_id | Product feed ID. | String | Required |
| upload_session_id | Upload ID. | String | Required |
Example
Complete Request error report example:
curl --location --request POST 'https://{{url}}/whatsapp-bsp-admin-ext-endpoint-ws/services/v1/catalog/{{waba_id}}/{{catalog_id}}/{{product_feed_id}}/{{upload_session_id}}/error_report' \--header 'Authorization: Bearer {{admin-token}}'
Response
Request error report response:
| Name | Description | Type |
|---|---|---|
| success | Whether the request was accepted. | Boolean |
{"success": true}
Download error report
Returns the status of an upload's error report and, once it's generated, the URL to download it.
Request
Download error report request:
| URL | https://{{url}}/whatsapp-bsp-admin-ext-endpoint-ws/services/v1/catalog/{{waba_id}}/{{catalog_id}}/{{product_feed_id}}/{{upload_session_id}}/errors/download |
| Method | GET |
Headers
Download error report headers:
| Name | Description | Type | Requirements |
|---|---|---|---|
| Authorization | Admin token. See Generate authentication token. | String | Required |
Parameters
Download error report parameters:
| Name | Description | Type | Requirements |
|---|---|---|---|
| waba_id | WhatsApp Business Account ID. | String | Required |
| catalog_id | Catalog ID. | String | Required |
| product_feed_id | Product feed ID. | String | Required |
| upload_session_id | Upload ID. | String | Required |
Example
Complete Download error report example:
curl --location 'https://{{url}}/whatsapp-bsp-admin-ext-endpoint-ws/services/v1/catalog/{{waba_id}}/{{catalog_id}}/{{product_feed_id}}/{{upload_session_id}}/errors/download' \--header 'Authorization: Bearer {{admin-token}}'
Response
Download error report response:
| Name | Description | Type |
|---|---|---|
| id | Upload ID. | String |
| errorReport | Status of the error report. | Object |
Error report object
| Name | Description | Type |
|---|---|---|
| reportStatus | Report status. Possible values:
| String |
| fileHandle | URL to download the error file. Only included when the report is ready. | String |
Report ready:
{"id": "112233445566778","errorReport": {"reportStatus": "WRITE_FINISHED","fileHandle": "https://www.example.com/reports/upload-errors-112233445566778.csv"}}
Report not requested:
{"id": "112233445566779","errorReport": {"reportStatus": "NOT_REQUESTED"}}
