> ## Documentation Index
> Fetch the complete documentation index at: https://developers.criteo.com/llms.txt
> Use this file to discover all available pages before exploring further.

# High-Latency Product Performance Report

export const EndpointBadge = ({method = "GET", children}) => {
  const METHOD_STYLES = {
    GET: {
      bg: "mint-bg-[#2AB673]"
    },
    POST: {
      bg: "mint-bg-[#3064E3]"
    },
    PUT: {
      bg: "mint-bg-[#C28C30]"
    },
    PATCH: {
      bg: "mint-bg-[#DA622B]"
    },
    DELETE: {
      bg: "mint-bg-[#CB3A32]"
    },
    API: {
      bg: "mint-bg-black"
    }
  };
  const key = method.toUpperCase();
  const styles = METHOD_STYLES[key] ?? METHOD_STYLES.API;
  return <div className="relative mt-7">
      <span className={`absolute -top-2 -left-2 z-10 ${styles.bg} text-white px-2.5 py-0.5 rounded-full text-xs font-bold tracking-wide`}>
        {key}
      </span>
      {children}
    </div>;
};

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.

<Warning>
  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.
</Warning>

***

## 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:

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

<EndpointBadge method="post">
  ```http theme={null}
  https://api.criteo.com/{version}/marketing-solutions/report/products/export
  ```
</EndpointBadge>

**Sample request**

```json theme={null}
{
  "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**

```json theme={null}
{
  "data": {
    "type": "ProductReportJobStatus",
    "attributes": {
      "exportId": "e0893b6b-be25-477f-9ca3-e6e8c8ec9e30",
      "status": "Pending"
    }
  }
}
```

<Info>
  If the exact same request was generated recently and is still available in cache, the response may already return `"status": "Done"`.
</Info>

***

## Step 2. Poll for Job Completion

<EndpointBadge method="get">
  ```http theme={null}
  https://api.criteo.com/{version}/marketing-solutions/report-jobs/{reportId}
  ```
</EndpointBadge>

Poll this endpoint until `status` becomes `Done` before attempting to download the file.

**Sample response**

```json theme={null}
{
  "data": {
    "type": "ProductReportJobStatus",
    "attributes": {
      "exportId": "e0893b6b-be25-477f-9ca3-e6e8c8ec9e30",
      "status": "Done",
      "message": "Export is ready for download."
    }
  }
}
```

***

## Step 3. Download the Report

<EndpointBadge method="get">
  ```http theme={null}
  https://api.criteo.com/{version}/marketing-solutions/report/products/{reportId}
  ```
</EndpointBadge>

The response body is the raw file content rather than a JSON envelope.

**CSV output**

```csv theme={null}
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**

```json theme={null}
{
  "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.                                                |

<Info>
  The current Preview OAS models the returned job identifier as `exportId`. Use this value as `{reportId}` when calling the status and download endpoints.
</Info>
