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

# DSP Analytics Endpoints

> Setup your endpoints, view report attributes, and examples of requests

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>;
};

## Endpoints

Four separate endpoints support requests to create campaign and line item reports and retrieve the report data and status.

<table>
  <thead>
    <tr>
      <th>
        <p>
          Verb
        </p>
      </th>

      <th>
        <p>
          Endpoint
        </p>
      </th>

      <th>
        <p>
          Description
        </p>
      </th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>
        <p>
          <b>
            POST
          </b>
        </p>
      </td>

      <td>
        <p>
          <code>
            /reports/campaigns
          </code>
        </p>
      </td>

      <td>
        <p>
          Create a Campaign report request
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <b>
            POST
          </b>
        </p>
      </td>

      <td>
        <p>
          <code>
            /reports/line-items
          </code>
        </p>
      </td>

      <td>
        <p>
          Create a Line Item report request
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <b>
            GET
          </b>
        </p>
      </td>

      <td>
        <p>
          <code>
            /reports/\{reportId}/status
          </code>
        </p>
      </td>

      <td>
        <p>
          Get status of a specific report
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <b>
            GET
          </b>
        </p>
      </td>

      <td>
        <p>
          <code>
            /reports/\{reportId}/output
          </code>
        </p>
      </td>

      <td>
        <p>
          Download output of a specific report
        </p>
      </td>
    </tr>
  </tbody>
</table>

***

## Report Request Attributes

<table>
  <thead>
    <tr>
      <th>
        <p>
          Attribute
        </p>
      </th>

      <th>
        <p>
          Data Type
        </p>
      </th>

      <th>
        <p>
          Description
        </p>
      </th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>
        <p>
          <code>
            id
          </code>

          /

          <code>
            ids
          </code>

          <span>\*</span>
        </p>
      </td>

      <td>
        <p>
          string /
        </p>

        <p>
          list

          <code>
            \<string>
          </code>
        </p>
      </td>

      <td>
        <p>
          Campaign or Line Item ID(s) of the desired report
        </p>

        <p>
          Examples:
        </p>

        <p>
          <code>
            id: "12345"
          </code>
        </p>

        <p>
          <code>
            ids: \["12345", "67890"]
          </code>
        </p>

        <p>
          Accepted values: single or list of string/int64 (max 50 ids per call)
        </p>

        <p>
          Writeable? N / Nullable? N
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            reportType
          </code>
        </p>
      </td>

      <td>
        <p>
          enum
        </p>
      </td>

      <td>
        <p>
          Report types are pre-packaged reports that allow the specification of the report breakdown. See

          <a href="/retail-media/v2025.10/docs/report-types">
            Report Types
          </a>

          for more details about each of them.
        </p>

        <p>
          <b>
            Note:
          </b>

          when

          <code>
            metrics
          </code>

          and

          <code>
            dimensions
          </code>

          are used,

          <code>
            reportType
          </code>

          is ignored.
        </p>

        <p>
          Accepted values: refer to

          <a href="/retail-media/v2025.10/docs/report-types">
            Report Types
          </a>

          page for a complete list of available values
        </p>

        <p>
          Writeable? N / Nullable? N
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            dimensions
          </code>
        </p>
      </td>

      <td>
        <p>
          list

          <code>
            \<enum>
          </code>
        </p>
      </td>

      <td>
        <p>
          Dimension attributes desired for metrics breakdown for the custom report of the campaign(s) / line item(s).
        </p>

        <p>
          <b>
            Note:
          </b>

          when

          <code>
            metrics
          </code>

          and

          <code>
            dimensions
          </code>

          are used,

          <code>
            reportType
          </code>

          is automatically ignored
        </p>

        <p>
          Accepted values: refer to

          <a href="/retail-media/v2025.10/docs/metrics-and-dimensions">
            Metrics and Dimensions
          </a>

          page for a complete list of available values
        </p>

        <p>
          Writeable? N / Nullable? N
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            metrics
          </code>
        </p>
      </td>

      <td>
        <p>
          list

          <code>
            \<enum>
          </code>
        </p>
      </td>

      <td>
        <p>
          Quantitative metrics desired in the custom report of the campaign(s) / line item(s).
        </p>

        <p>
          <b>
            Note:
          </b>
        </p>

        <ul>
          <li>
            when

            <code>
              metrics
            </code>

            and

            <code>
              dimensions
            </code>

            are used, the

            <code>
              reportType
            </code>

            is automatically ignored
          </li>

          <li>
            when including

            <code>
              winRate
            </code>

            metric, it is required to either define

            <code>
              campaignType
            </code>

            as

            <code>
              sponsoredProducts
            </code>

            or include

            <code>
              campaignTypeName
            </code>

            in the list of dimensions
          </li>
        </ul>

        <p>
          Accepted values: refer to

          <a href="/retail-media/v2025.10/docs/metrics-and-dimensions">
            Metrics and Dimensions
          </a>

          page for a complete list of available values
        </p>

        <p>
          Writeable? N / Nullable? N
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            startDate
          </code>

          <span>\*</span>
        </p>
      </td>

      <td>
        <p>
          date
        </p>
      </td>

      <td>
        <p>
          Start date to report (inclusive)
        </p>

        <p>
          Accepted values:

          <code>
            YYYY-MM-DD
          </code>
        </p>

        <p>
          Writeable? N / Nullable? N
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            endDate
          </code>

          <span>\*</span>
        </p>
      </td>

      <td>
        <p>
          date
        </p>
      </td>

      <td>
        <p>
          End date to report (inclusive)
        </p>

        <p>
          Accepted values:

          <code>
            YYYY-MM-DD
          </code>
        </p>

        <p>
          Writeable? N / Nullable? N
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            campaignType
          </code>
        </p>
      </td>

      <td>
        <p>
          enum
        </p>
      </td>

      <td>
        <p>
          <a href="/retail-media/v2025.10/docs/campaign">
            Campaign
          </a>

          type
        </p>

        <p>
          Accepted values:

          <code>
            sponsoredProducts
          </code>

          ,

          <code>
            onSiteDisplays
          </code>
        </p>

        <p>
          Writeable? N / Nullable? N
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            timeZone
          </code>
        </p>
      </td>

      <td>
        <p>
          string
        </p>
      </td>

      <td>
        <p>
          Time zone to consider in the report
        </p>

        <p>
          Accepted values:

          <a href="https://www.iana.org/time-zones">
            IANA (TZ database)
          </a>

          time zones (example:

          <code>
            America/New\_York
          </code>

          ,

          <code>
            Europe/Paris
          </code>

          ,

          <code>
            Asia/Tokyo
          </code>

          ,

          <code>
            UTC
          </code>

          )
        </p>

        <p>
          Writeable? N / Nullable? Y
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            clickAttributionWindow
          </code>
        </p>
      </td>

      <td>
        <p>
          enum
        </p>
      </td>

      <td>
        <p>
          The post-click attribution window, defined as the maximum number of days considered between a click and a conversion for attribution; conversions are attributed to the date of conversion, not the date of click; defaults to campaign settings if omitted; must be specified if

          <code>
            viewAttributionWindow
          </code>

          is one of the accepted values.
        </p>

        <p>
          The post-click attribution window, defined as the maximum number of days considered between a click and a conversion for attribution; conversions are attributed to the date of conversion, not the date of click.
        </p>

        <p>
          Defaults to campaign settings if omitted; must be specified if

          <code>
            viewAttributionWindow
          </code>

          is one of the accepted values.
        </p>

        <p>
          Accepted values:

          <code>
            none
          </code>

          ,

          <code>
            7D
          </code>

          ,

          <code>
            14D
          </code>

          ,

          <code>
            30D
          </code>
        </p>

        <p>
          Writeable? N / Nullable? Y
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            viewAttributionWindow
          </code>
        </p>
      </td>

      <td>
        <p>
          enum
        </p>
      </td>

      <td>
        <p>
          The post-view attribution window, defined as the maximum number of days considered between an impression and a conversion for attribution; conversions are attributed to the date of conversion, not the date of impression; defaults to campaign settings if omitted; must be less than or equal to

          <code>
            clickAttributionWindow
          </code>

          ; must be specified if

          <code>
            clickAttributionWindow
          </code>

          is one of the accepted values.
        </p>

        <p>
          The post-view attribution window, defined as the maximum number of days considered between an impression and a conversion for attribution; conversions are attributed to the date of conversion, not the date of impression.
        </p>

        <p>
          Defaults to campaign settings if omitted; must be less than or equal to

          <code>
            clickAttributionWindow
          </code>

          ; must be specified if

          <code>
            clickAttributionWindow
          </code>

          is one of the accepted values.
        </p>

        <p>
          Accepted values:

          <code>
            none
          </code>

          ,

          <code>
            1D
          </code>

          ,

          <code>
            7D
          </code>

          ,

          <code>
            14D
          </code>

          ,

          <code>
            30D
          </code>
        </p>

        <p>
          Writeable? N / Nullable? Y
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            salesChannel
          </code>
        </p>
      </td>

      <td>
        <p>
          enum
        </p>
      </td>

      <td>
        <p>
          Filter on specific sales channel: online or offline
        </p>

        <p>
          Accepted values:

          <code>
            online
          </code>

          ,

          <code>
            offline
          </code>
        </p>

        <p>
          Writeable? N / Nullable? Y
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            format
          </code>
        </p>
      </td>

      <td>
        <p>
          enum
        </p>
      </td>

      <td>
        <p>
          Format of the report data returned
        </p>

        <p>
          Accepted values:

          <code>
            json
          </code>

          ,

          <code>
            json-compact
          </code>

          ,

          <code>
            json-newline
          </code>

          ,

          <code>
            csv
          </code>
        </p>

        <p>
          Default:

          <code>
            json
          </code>
        </p>

        <p>
          Writeable? N / Nullable? N
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            searchTermTypes
          </code>
        </p>
      </td>

      <td>
        <p>
          string
        </p>
      </td>

      <td>
        <p>
          The match type used to associate a search term and keywords entered for the campaign.
        </p>

        <p>
          Accepted values:
        </p>

        <p>
          <code>
            Entered
          </code>

          : the search term matches exactly what was entered manually by the Commerce Max user
        </p>

        <p>
          <code>
            Searched
          </code>

          : the search term matches what a shopper searched on the retailer’s website.
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            searchTermTargeting
          </code>
        </p>
      </td>

      <td>
        <p>
          string
        </p>
      </td>

      <td>
        <p>
          Indicates how the keyword was targeted — either manually by the user or automatically by the platform.
        </p>

        <p>
          Accepted values:
        </p>

        <p>
          <code>
            Manual
          </code>

          : The search term matches a keyword entered in Commerce Max or a variation created via stemming.
        </p>

        <p>
          <code>
            Automatic
          </code>

          : The search term was added by the automated keyword tool.
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            targetedKeywordType
          </code>
        </p>
      </td>

      <td>
        <p>
          string
        </p>
      </td>

      <td>
        <p>
          Specifies the conquesting strategy used with the keyword.
        </p>

        <p>
          Accepted values:
        </p>

        <p>
          <code>
            Conquesting
          </code>

          : Targets competitors' branded keywords.

          <code>
            Branded
          </code>

          : Targets the advertiser’s own branded keywords.
        </p>

        <p>
          <code>
            Generic
          </code>

          : Targets neutral or non-branded keywords.
        </p>
      </td>
    </tr>

    <tr>
      <td>
        <p>
          <code>
            mediaType
          </code>
        </p>
      </td>

      <td>
        <p>
          string
        </p>
      </td>

      <td>
        <p>
          The type of creative asset used in the ad, such as Display or Video.
        </p>

        <p>
          Accepted values:

          <code>
            video
          </code>

          ,

          <code>
            display
          </code>

          ,

          <code>
            all
          </code>
        </p>
      </td>
    </tr>
  </tbody>
</table>

*\*Required*

<Info>
  **Reporting Asynchronous Workflow: Step 1 of 3**

  * First, create a request for the campaign or line item report with the desired attributes
  * This generates a `reportId` representing the report
</Info>

***

## Create a Report Request

Reporting endpoints provide two separate endpoints that allow downloading reports at the campaign or line item level. Each of the following requests can be repeated for each individual report type.

### Campaigns Level Report

<EndpointBadge method="post">
  ```http theme={null}
  https://api.criteo.com/{version}/retail-media/reports/campaigns
  ```
</EndpointBadge>

**Sample Request**

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://api.criteo.com/{version}/retail-media/reports/campaigns" \
      -H "Authorization: Bearer <MY_ACCESS_TOKEN>" \
      -H "Content-Type: application/json" \
      -d '{
              "data": {
                  "type": "RetailMediaReportRequest",
                  "attributes": {
                      "id": "8343086999167541140",
                      "metrics": ["impressions"],
                      "dimensions": ["date"],
                      "reportType": "summary",
                      "startDate": "2025-01-01",
                      "endDate": "2025-01-31",
                      "timeZone": "America/New_York",
                      "campaignType": "sponsoredProducts",
                      "salesChannel": "offline"
                  }
              }
          }'
  ```

  ```python Python expandable theme={null}
  import requests
  import json

  url = "https://api.criteo.com/{version}/retail-media/reports/campaigns"

  payload = json.dumps({
    "data": {
      "type": "RetailMediaReportRequest",
      "attributes": {
        "id": "1285",
        "metrics": [
         		 "impressions"
        		 ],
        "dimensions": [
       		   "date"
       			 ],
        "reportType": "summary",
        "startDate": "2025-01-01",
        "endDate": "2025-01-31",
        "timeZone": "America/New_York",
        "campaignType": "sponsoredProducts",
        "salesChannel": "offline"
      }
    }
  })
  headers = {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer <MY_ACCESS_TOKEN>'
  }

  response = requests.request("POST", url, headers=headers, data=payload)

  print(response.text)
  ```

  ```java Java theme={null}
  OkHttpClient client = new OkHttpClient().newBuilder()
    .build();

  MediaType mediaType = MediaType.parse("application/json");

  RequestBody body = RequestBody.create(mediaType, "{\"data\":{\"type\":\"RetailMediaReportRequest\",\"attributes\":{\"id\":\"8343086999167541140\",\"metrics\":[\"impressions\"],\"dimensions\":[\"date\"],\"reportType\":\"summary\",\"startDate\":\"2025-01-01\",\"endDate\":\"2025-01-31\",\"timeZone\":\"America/New_York\",\"campaignType\":\"sponsoredProducts\",\"salesChannel\":\"offline\"}}}");

  Request request = new Request.Builder()
    .url("https://api.criteo.com/{version}/retail-media/reports/campaigns")
    .method("POST", body)
    .addHeader("Content-Type", "application/json")
    .addHeader("Accept", "application/json")
    .addHeader("Authorization", "Bearer <MY_ACCESS_TOKEN>")
    .build();

  Response response = client.newCall(request).execute();
  ```

  ```php PHP theme={null}
  <?php
  require_once 'HTTP/Request2.php';
  $request = new HTTP_Request2();
  $request->setUrl('https://api.criteo.com/{version}/retail-media/reports/campaigns');
  $request->setMethod(HTTP_Request2::METHOD_POST);
  $request->setConfig(array(
    'follow_redirects' => TRUE
  ));
  $request->setHeader(array(
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
    'Authorization' => 'Bearer <MY_ACCESS_TOKEN>'
  ));
  $request->setBody('{\"data\":{\"type\":\"RetailMediaReportRequest\",\"attributes\":{\"id\":\"8343086999167541140\",\"metrics\":[\"impressions\"],\"dimensions\":[\"date\"],\"reportType\":\"summary\",\"startDate\": \"2025-01-01\",\"endDate\":\"2025-01-31\",\"timeZone\":\"America/New_York\",\"campaignType\":\"sponsoredProducts\",\"salesChannel\":\"offline\"}}}');
  try {
    $response = $request->send();
    if ($response->getStatus() == 200) {
      echo $response->getBody();
    }
    else {
      echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
      $response->getReasonPhrase();
    }
  }
  catch(HTTP_Request2_Exception $e) {
    echo 'Error: ' . $e->getMessage();
  }
  ```
</CodeGroup>

### Line Items Level Report

<EndpointBadge method="post">
  ```http theme={null}
  https://api.criteo.com/{version}/retail-media/reports/line-items
  ```
</EndpointBadge>

**Sample Request**

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://api.criteo.com/{version}/retail-media/reports/line-items" \
      -H "Authorization: Bearer <MY_ACCESS_TOKEN>" \
      -H "Content-Type: application/json" \
      -d '{
              "data": {
                  "type": "RetailMediaReportRequest",
                  "attributes": {
                      "id": "8343086999167541140",
                      "metrics": [
                          "impressions"
                      ],
                      "dimensions": [
                          "date"
                      ],
                      "reportType": "summary",
                      "startDate": "2020-04-06",
                      "endDate": "2020-06-04",
                      "timeZone": "America/New_York",
                      "campaignType": "sponsoredProducts",
                      "salesChannel": "offline"
                  }
              }
          }'
  ```

  ```python Python expandable theme={null}
  import requests
  import json

  url = "https://api.criteo.com/{version}/retail-media/reports/line-items"

  payload = json.dumps({
    "data": {
      "type": "RetailMediaReportRequest",
      "attributes": {
        "id": "1285",
        "metrics": [
         		 "impressions"
        		 ],
        "dimensions": [
       		   "date"
       			 ],
        "reportType": "summary",
        "startDate": "2022-06-06",
        "endDate": "2022-07-04",
        "timeZone": "America/New_York",
        "campaignType": "sponsoredProducts",
        "salesChannel": "offline"
      }
    }
  })
  headers = {
    'Content-Type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer <MY_ACCESS_TOKEN>'
  }

  response = requests.request("POST", url, headers=headers, data=payload)

  print(response.text)
  ```

  ```java Java theme={null}
  OkHttpClient client = new OkHttpClient().newBuilder()
    .build();

  MediaType mediaType = MediaType.parse("application/json");

  RequestBody body = RequestBody.create(mediaType, "{\n            \"data\": {\n                \"type\": \"RetailMediaReportRequest\",\n                \"attributes\": {\n                    \"id\": \"8343086999167541140\",\n                    \"metrics\": [\n       \t\t\t\t\t\t\t\t \"impressions\"\n      \t\t\t\t\t\t\t\t ],\n      \t\t\t\t\t\t  \"dimensions\": [\n        \t\t\t\t\t\t   \"date\"\n      \t\t\t\t\t\t\t\t ],\n                    \"reportType\": \"summary\",\n                    \"startDate\": \"2020-04-06\",\n                    \"endDate\": \"2020-06-04\",\n                    \"timeZone\": \"America/New_York\",\n                    \"campaignType\": \"sponsoredProducts\",\n      \t\t\t\t\t\t  \"salesChannel\": \"offline\"\n                }\n            }\n        }");

  Request request = new Request.Builder()
    .url("https://api.criteo.com/{version}/retail-media/reports/line-items")
    .method("POST", body)
    .addHeader("Content-Type", "application/json")
    .addHeader("Accept", "application/json")
    .addHeader("Authorization", "Bearer <MY_ACCESS_TOKEN>")
    .build();

  Response response = client.newCall(request).execute();
  ```

  ```php PHP theme={null}
  <?php
  require_once 'HTTP/Request2.php';
  $request = new HTTP_Request2();
  $request->setUrl('https://api.criteo.com/{version}/retail-media/reports/line-items');
  $request->setMethod(HTTP_Request2::METHOD_POST);
  $request->setConfig(array(
    'follow_redirects' => TRUE
  ));
  $request->setHeader(array(
    'Content-Type' => 'application/json',
    'Accept' => 'application/json',
    'Authorization' => 'Bearer <MY_ACCESS_TOKEN>'
  ));
  $request->setBody('{\n            \"data\": {\n                \"type\": \"RetailMediaReportRequest\",\n                \"attributes\": {\n                    \"id\": \"8343086999167541140\",\n                    \"metrics\": [\n       \t\t\t\t\t\t\t\t \"impressions\"\n      \t\t\t\t\t\t\t\t ],\n      \t\t\t\t\t\t  \"dimensions\": [\n        \t\t\t\t\t\t   \"date\"\n      \t\t\t\t\t\t\t\t ],\n                    \"reportType\": \"summary\",\n                    \"startDate\": \"2020-04-06\",\n                    \"endDate\": \"2020-06-04\",\n                    \"timeZone\": \"America/New_York\",\n                    \"campaignType\": \"sponsoredProducts\",\n      \t\t\t\t\t\t  \"salesChannel\": \"offline\"\n                }\n            }\n        }');
  try {
    $response = $request->send();
    if ($response->getStatus() == 200) {
      echo $response->getBody();
    }
    else {
      echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
      $response->getReasonPhrase();
    }
  }
  catch(HTTP_Request2_Exception $e) {
    echo 'Error: ' . $e->getMessage();
  }
  ```
</CodeGroup>

**Sample Response**

```json theme={null}
{
    "data": {
        "type": "RetailMediaReportStatus",
        "id": "2e733b8c-9983-4237-aab9-17a42f4267cb",
        "attributes": {
            "status": "pending",
            "rowCount": null,
            "fileSizeBytes": null,
            "md5Checksum": null,
            "createdAt": null,
            "expiresAt": null,
            "message": null
        }
    }
}
```

<Info>
  **Reporting Asynchronous Workflow: Step 2 of 3**

  * Next, use the `reportId` to poll the report status endpoint until one is successfully computed
</Info>

***

## Get Status of a Specific Report

This endpoint retrieves the status of a specific report.  Status can be `pending`, `success`, `failure`, or `expired`

<EndpointBadge method="get">
  ```http theme={null}
  https://api.criteo.com/{version}/retail-media/reports/{reportId}/status
  ```
</EndpointBadge>

**Sample Request**

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET "https://api.criteo.com/{version}/retail-media/reports/2e733b8c-9983-4237-aab9-17a42f4267cb/status" \
      -H "Authorization: Bearer <MY_ACCESS_TOKEN>"
  ```

  ```python Python theme={null}
  import requests

  url = "https://api.criteo.com/{version}/retail-media/reports/73fb7859-301f-4371-be91-3e4ad00964aa/status"

  payload={}
  headers = {
    'Accept': 'application/json',
    'Authorization': 'Bearer <MY_ACCESS_TOKEN>'
  }

  response = requests.request("GET", url, headers=headers, data=payload)

  print(response.text)
  ```

  ```java Java theme={null}
  OkHttpClient client = new OkHttpClient().newBuilder()
    .build();

  MediaType mediaType = MediaType.parse("text/plain");

  RequestBody body = RequestBody.create(mediaType, "");

  Request request = new Request.Builder()
    .url("https://api.criteo.com/{version}/retail-media/reports/73fb7859-301f-4371-be91-3e4ad00964aa/status")
    .method("GET", body)
    .addHeader("Accept", "application/json")
    .addHeader("Authorization", "Bearer <MY_ACCESS_TOKEN>")
    .build();

  Response response = client.newCall(request).execute();
  ```

  ```php PHP theme={null}
  <?php
  require_once 'HTTP/Request2.php';
  $request = new HTTP_Request2();
  $request->setUrl('https://api.criteo.com/{version}/retail-media/reports/73fb7859-301f-4371-be91-3e4ad00964aa/status');
  $request->setMethod(HTTP_Request2::METHOD_GET);
  $request->setConfig(array(
    'follow_redirects' => TRUE
  ));
  $request->setHeader(array(
    'Accept' => 'application/json',
    'Authorization' => 'Bearer <MY_ACCESS_TOKEN>'
  ));
  try {
    $response = $request->send();
    if ($response->getStatus() == 200) {
      echo $response->getBody();
    }
    else {
      echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
      $response->getReasonPhrase();
    }
  }
  catch(HTTP_Request2_Exception $e) {
    echo 'Error: ' . $e->getMessage();
  }
  ```
</CodeGroup>

**Sample Response**

```json theme={null}
{
    "data": {
        "attributes": {
            "status": "success",
            "rowCount": 50,
            "fileSizeBytes": 9711,
            "md5CheckSum": "b92bf24cd899f172907f8b001b8a5edb",
            "createdAt": "2025-02-19T19:40:27.000Z",
            "expiresAt": "2025-02-26T19:40:30.000Z",
            "message": "rows_count=50",
            "id": "16d70ce4-6917-48b8-8a55-184809dd59b5"
        },
        "id": "16d70ce4-6917-48b8-8a55-184809dd59b5",
        "type": "StatusResponse"
    },
    "warnings": [],
    "errors": []
}
```

<Info>
  **Reporting Asynchronous Workflow: Step 3 of 3**

  * Finally, download the report using the report output endpoint
  * Report outputs are cached for at least 1 hour before expiration
  * Exact expiration is indicated by the `expiresAt` field in the /status response
</Info>

***

## Download Output of a Specific Report

This endpoint returns the specific report in the requested format.

<EndpointBadge method="get">
  ```http theme={null}
  https://api.criteo.com/{version}/retail-media/reports/{reportId}/output
  ```
</EndpointBadge>

**Sample Request**

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET "https://api.criteo.com/{version}/retail-media/reports/2e733b8c-9983-4237-aab9-17a42f4267cb/output" \
      -H "Authorization: Bearer <MY_ACCESS_TOKEN>"
  ```

  ```python Python theme={null}
  import requests

  url = "https://api.criteo.com/{version}/retail-media/reports/73fb7859-301f-4371-be91-3e4ad00964aa/output"

  payload={}
  headers = {
    'Accept': 'application/octet-stream',
    'Authorization': 'Bearer <MY_ACCESS_TOKEN>'
  }

  response = requests.request("GET", url, headers=headers, data=payload)

  print(response.text)
  ```

  ```java Java theme={null}
  OkHttpClient client = new OkHttpClient().newBuilder()
    .build();

  MediaType mediaType = MediaType.parse("text/plain");

  RequestBody body = RequestBody.create(mediaType, "");

  Request request = new Request.Builder()
    .url("https://api.criteo.com/{version}/retail-media/reports/73fb7859-301f-4371-be91-3e4ad00964aa/output")
    .method("GET", body)
    .addHeader("Accept", "application/octet-stream")
    .addHeader("Authorization", "Bearer <MY_ACCESS_TOKEN>")
    .build();

  Response response = client.newCall(request).execute();
  ```

  ```php PHP theme={null}
  <?php
  require_once 'HTTP/Request2.php';
  $request = new HTTP_Request2();
  $request->setUrl('https://api.criteo.com/{version}/retail-media/reports/73fb7859-301f-4371-be91-3e4ad00964aa/output');
  $request->setMethod(HTTP_Request2::METHOD_GET);
  $request->setConfig(array(
    'follow_redirects' => TRUE
  ));
  $request->setHeader(array(
    'Accept' => 'application/octet-stream',
    'Authorization' => 'Bearer <MY_ACCESS_TOKEN>'
  ));
  try {
    $response = $request->send();
    if ($response->getStatus() == 200) {
      echo $response->getBody();
    }
    else {
      echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
      $response->getReasonPhrase();
    }
  }
  catch(HTTP_Request2_Exception $e) {
    echo 'Error: ' . $e->getMessage();
  }
  ```
</CodeGroup>

**Sample Response**

*Campaign Summary Report*

```json theme={null}
{
    "columns": [
        "campaignId", "campaignName", "campaignTypeName", "date", "impressions", "clicks", 
        "attributedOrders", "attributedUnits", "attributedSales", "ctr", "spend", "cpc", "cpo", 
        "roas", "uniqueVisitors", "frequency"
    ],
    "data": [
        [
            "1285", "End of Summer Sale", "Open Auction", "2025-01-31", 0, 0, 
            1, 1, 76.9400, null, 0.0000, null, 0.0000, 
            null, null, null
        ],
        [
            "1285", "End of Summer Sale", "Open Auction", "2025-01-29", 1883, 6, 
            8, 8, 1749.2600, 0.0032, 3.7000, 0.6167, 0.4625, 
            472.7730, null, null
        ],
        [
            "1285", "End of Summer Sale", "Open Auction", "2025-01-28", 0, 0, 
            1, 1, 99.4600, null, 0.0000, null, 0.0000, 
            null, null, null
        ],
        [
            "1285", "End of Summer Sale", "Open Auction", "2025-01-27", 35087, 107, 
            25, 25, 4381.2700, 0.0030, 96.3000, 0.9000, 3.8520, 
            45.4961, null, null
        ] 
    ], 
    "rows":4
}
```

*Campaign Attribution Report*

```json theme={null}
{
    "columns": [
        "purchasedDate", "purchasedHour", "advDate", "advHour", "daysDifference", 
        "campaignId", "campaignName", "lineItemId", "lineItemName", 
        "advProductId", "advProductGtin", "advProductMpn", "advProductName", 
        "advProductCategory", "purchasedProductId", "purchasedProductGtin", 
        "purchasedProductMpn", "purchasedProductName", "purchasedProductCategory", 
        "attributedUnits", "attributedSales", "advEngagement", 
        "advToPurchasedProductRelationship", "salesChannel", "retailerName", 
        "pageTypeName", "keyword", "attributionWindow"
    ],
    "data": [
        [
            "2022-10-21", 16, "2022-10-21", 16, 0, 
            "1344", "End to end testing", "2602", "LJ Test", 
            "426292", null, null, 
            "Arm & Hammer Pure Baking Soda, 13.5 lbs", "hardware > tools > hammers > powered hammers", "426292", null, null, 
            "Arm & Hammer Pure Baking Soda, 13.5 lbs", "hardware > tools > hammers > powered hammers", 
            1, 8.6900, "click", 
            "same sku", "online", "Costco", 
            "category", "", "C30V01"
        ]
    ],
    "rows": 1
}
```

## What's next

* [Report Types](/retail-media/v2025.10/docs/report-types)
* [Metrics and Dimensions](/retail-media/v2025.10/docs/metrics-and-dimensions)
