Skip to main content
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

VerbEndpointDescription
POST/marketing-solutions/report/products/exportCreates 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

AttributeTypeDescription
advertiserIds *array[string]The list of advertiser account IDs. Up to 5 values.
startDate *timestampStart of the reporting interval in UTC. ISO 8601 date-time, e.g. 2026-03-09T00:00:00Z.
endDatetimestampEnd of the reporting interval in UTC. ISO 8601 date-time. Defaults to current time if omitted. Nullable.
campaignIdsarray[string]Optional filter on campaign IDs. Up to 500 values. Nullable.
sellerIdsarray[string]Optional filter on seller IDs. Up to 500 values. Nullable.
adSetIdsarray[string]Optional filter on ad set IDs. Nullable.
dimensionsarray[enum]Dimensions used to aggregate the export rows. Values: AdvertiserId, PartnerId, CampaignId, AdSetId, ProductId, SellerId. Nullable.
metricsarray[enum]Metrics included in the export. Values: Clicks, Ctr, Visits, Sales, Cost, Revenue, Displays. Nullable.
fileFormatstringOutput file format. Values: csv, json. Default: csv. Nullable.
currencystringCurrency applied to monetary metrics. ISO 4217 code, e.g. EUR, USD. Default: EUR. Nullable.
timezonestringTime zone used for the report. IANA identifier, e.g. UTC, Europe/Paris. Default: UTC. Nullable.
(*) Required

Report Job Status Attributes

AttributeTypeDescription
exportIdstringUnique identifier of the export job. Use this value as {reportId} when polling status or downloading the file.
statusenumCurrent export status: Unknown, Pending, Done, Failure, Expired.
messagestringOptional informational message about the current job state.

Workflow

This API follows a three-step asynchronous flow:
  1. Create an export job.
  2. Poll the job status until it is Done.
  3. 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

CodeTitleDetail
200SuccessExport job created, job status returned, or file downloaded successfully.
400Invalid query definitionMissing required fields, malformed dates, unsupported dimensions or metrics, invalid time zone, or invalid identifier lists.
401Authentication failedThe access token is missing, invalid, or expired.
403Missing scope or inaccessible dataThe caller does not have MarketingSolutions_Analytics_Read, or does not have access to the requested advertisers.
403Export job not foundThe requested reportId does not exist, has expired, or cannot be accessed by the caller.
500Internal server errorThe 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.