The High-Latency Product Performance Report lets you generate large product-level performance exports asynchronously for Marketing Solutions. Use it when you need a CSV or JSON extract that would be too large or too slow for a synchronous reporting endpoint.
This API is available on the preview channel of the Public API and requires the MarketingSolutions_Analytics_Read scope.
The report endpoints are subject to specific rate limits. This API is designed for higher-latency, larger-volume product reporting — not for many small synchronous queries.
Endpoints
| Verb | Endpoint | Description |
|---|
POST | /marketing-solutions/report/products/export | Creates an asynchronous product performance export job. |
GET | /marketing-solutions/report-jobs/{reportId} | Returns the current status of an export job. |
GET | /marketing-solutions/report/products/{reportId} | Downloads the generated report file once the job is ready. |
Report Request Attributes
| Attribute | Type | Description |
|---|
advertiserIds * | array[string] | The list of advertiser account IDs. Up to 5 values. |
startDate * | timestamp | Start of the reporting interval in UTC. ISO 8601 date-time, e.g. 2026-03-09T00:00:00Z. |
endDate | timestamp | End of the reporting interval in UTC. ISO 8601 date-time. Defaults to current time if omitted. Nullable. |
campaignIds | array[string] | Optional filter on campaign IDs. Up to 500 values. Nullable. |
sellerIds | array[string] | Optional filter on seller IDs. Up to 500 values. Nullable. |
adSetIds | array[string] | Optional filter on ad set IDs. Nullable. |
dimensions | array[enum] | Dimensions used to aggregate the export rows. Values: AdvertiserId, PartnerId, CampaignId, AdSetId, ProductId, SellerId. Nullable. |
metrics | array[enum] | Metrics included in the export. Values: Clicks, Ctr, Visits, Sales, Cost, Revenue, Displays. Nullable. |
fileFormat | string | Output file format. Values: csv, json. Default: csv. Nullable. |
currency | string | Currency applied to monetary metrics. ISO 4217 code, e.g. EUR, USD. Default: EUR. Nullable. |
timezone | string | Time zone used for the report. IANA identifier, e.g. UTC, Europe/Paris. Default: UTC. Nullable. |
(*) Required
Report Job Status Attributes
| Attribute | Type | Description |
|---|
exportId | string | Unique identifier of the export job. Use this value as {reportId} when polling status or downloading the file. |
status | enum | Current export status: Unknown, Pending, Done, Failure, Expired. |
message | string | Optional informational message about the current job state. |
Workflow
This API follows a three-step asynchronous flow:
- Create an export job.
- Poll the job status until it is
Done.
- Download the generated file.
Step 1. Create a Product Report Export Job
Sample request
{
"data": {
"type": "ProductReportJob",
"attributes": {
"fileFormat": "csv",
"advertiserIds": ["2914", "3140"],
"campaignIds": ["106509", "184675", "469000"],
"sellerIds": ["501", "917"],
"dimensions": ["AdvertiserId", "CampaignId", "SellerId", "ProductId"],
"metrics": ["Clicks", "Displays", "Visits", "Sales", "Revenue"],
"startDate": "2026-03-09T00:00:00Z",
"endDate": "2026-03-09T23:59:59Z",
"currency": "EUR",
"timezone": "UTC"
}
}
}
Sample response
{
"data": {
"type": "ProductReportJobStatus",
"attributes": {
"exportId": "e0893b6b-be25-477f-9ca3-e6e8c8ec9e30",
"status": "Pending"
}
}
}
If the exact same request was generated recently and is still available in cache, the response may already return "status": "Done".
Step 2. Poll for Job Completion
Poll this endpoint until status becomes Done before attempting to download the file.
Sample response
{
"data": {
"type": "ProductReportJobStatus",
"attributes": {
"exportId": "e0893b6b-be25-477f-9ca3-e6e8c8ec9e30",
"status": "Done",
"message": "Export is ready for download."
}
}
}
Step 3. Download the Report
The response body is the raw file content rather than a JSON envelope.
CSV output
advertiserId,partnerId,campaignId,sellerId,productId,adSetId,clicks,displays,visits,sales,revenue
2914,3869,106509,501,847392011,1048444253,12,340,95,4,45.12
2914,3869,106509,501,293847561,1048444253,3,120,28,1,9.80
3140,3347,184675,917,619283745,22319898,7,210,60,2,28.40
JSON output
{
"data": [
[2914, 3869, 106509, 501, 847392011, 1048444253, 12, 340, 95, 4, 45.12],
[2914, 3869, 106509, 501, 293847561, 1048444253, 3, 120, 28, 1, 9.80],
[3140, 3347, 184675, 917, 619283745, 22319898, 7, 210, 60, 2, 28.40]
],
"metadata": {
"columns": [
"advertiserId", "partnerId", "campaignId", "sellerId",
"productId", "adSetId", "clicks", "displays",
"visits", "sales", "revenue"
],
"rows": 3
}
}
HTTP Status Codes
| Code | Title | Detail |
|---|
200 | Success | Export job created, job status returned, or file downloaded successfully. |
400 | Invalid query definition | Missing required fields, malformed dates, unsupported dimensions or metrics, invalid time zone, or invalid identifier lists. |
401 | Authentication failed | The access token is missing, invalid, or expired. |
403 | Missing scope or inaccessible data | The caller does not have MarketingSolutions_Analytics_Read, or does not have access to the requested advertisers. |
403 | Export job not found | The requested reportId does not exist, has expired, or cannot be accessed by the caller. |
500 | Internal server error | The export request could not be completed due to an unexpected backend issue. |
The current Preview OAS models the returned job identifier as exportId. Use this value as {reportId} when calling the status and download endpoints.