Skip to main content

Overview

The Digital Shelf Intelligence API gives brands and advertisers programmatic access to weekly aggregated performance data for products sold through supported retailers. It enables automated retrieval of:
  • Sales performance data — units sold, sales, and listing prices at brand or SKU level
  • Visibility and ranking data — PDP views and category-level sales rank
  • Competitive benchmark indices — relative performance vs. category benchmarks for consideration and sales conversion
The API is designed for users who need to pull shelf intelligence data at scale — integrating it into internal reporting pipelines, BI tools, or automated alerting workflows — without relying on manual dashboard exports. All data is aligned to the retailer’s local time zone and reported in weekly intervals (Monday–Sunday). The report supports two aggregation levels:
  • Brand-level — metrics grouped across all SKUs belonging to a brand (portfolio tracking, brand vs. category benchmarking, retailer comparisons)
  • SKU-level — metrics reported per individual product (performance diagnostics, assortment optimization, PDP traffic and conversion analysis)
You can find the Digital Shelf Intelligence endpoints in the API Reference under Insights.

Endpoints

VerbEndpointDescription
POST/preview/retail-media/insights/digital-shelf-intelligenceSubmit a Digital Shelf Intelligence report request
GET/preview/retail-media/insights/{reportId}/statusPoll the status of a submitted report
GET/preview/retail-media/insights/{reportId}/outputRetrieve the output of a completed report

Dimensions

Dimensions describe how report data is grouped. The dimension set is fixed by aggregationLevel — clients do not provide a custom dimensions list.

Time dimensions

DimensionDescription
startDateStart of the reporting week (always a Monday)
endDateEnd of the reporting week (always a Sunday, inclusive)

Retailer dimensions

DimensionDescription
retailerIdUnique identifier for the retailer
retailerNameDisplay name of the retailer

Product & taxonomy dimensions

DimensionAvailabilityDescription
categoryBrand & SKUProduct category
brandIdBrand onlyUnique identifier for the brand
brandNameBrand onlyBrand name
skuIdSKU onlyRetailer-specific SKU identifier
skuNameSKU onlyRetailer-specific product name

Metrics

Metrics represent performance, sales, and visibility indicators. Availability varies by aggregation level.

Commercial performance

MetricAvailabilityDescription
totalSalesOnlineBrand & SKUTotal online sales, in the account’s local currency
totalSoldUnitsOnlineBrand & SKUTotal number of units sold online
listingPriceSKU onlyProduct listing price from the retailer catalog

Visibility & ranking

MetricAvailabilityDescription
totalPdpPageViewsBrand & SKUTotal product detail page (PDP) views
pdpViewRankBrand & SKURank of products by PDP views within the category
salesRankBrand & SKURank of products by total sales within the category

Performance indices

MetricAvailabilityDescription
considerationIndexBrand & SKURelative PDP views per SKU vs. category benchmark. Values >1 indicate above benchmark.
salesIndexBrand & SKURelative sales per PDP view vs. category benchmark. Values >1 indicate above benchmark.

Endpoint: Submit report request

Submit a Digital Shelf Intelligence report job. The API is asynchronous — this call returns a reportId to poll for results.

Request attributes

AttributeTypeRequiredDescription
accountIdstringYesExternal Retail Media account ID. Must be numeric.
startDatestring (date)YesInclusive start date. If not a Monday, the report is accepted and shifted back to the Monday of that week, with a warning.
endDatestring (date)YesInclusive end date. If not a Sunday, the report is accepted and shifted forward to the Sunday of that week, with a warning.
aggregationLevelstringYesOne of brand or sku.
metricsstring[]YesAt least one metric. Allowed values: considerationIndex, listingPrice, pdpViewRank, salesIndex, salesRank, totalPdpPageViews, totalSalesOnline, totalSoldUnitsOnline.
retailerIdsstring[]NoRetailer IDs to filter on. Must be numeric internal IDs.
brandIdsstring[]NoBrand IDs to filter on. Must be numeric external IDs.
skuIdsobject[]NoSKU filters grouped by retailer. Ignored with a warning when aggregationLevel is brand. Each entry requires retailerId (string) and retailerSkuIds (string[]).
categoriesstring[]NoCategory names to filter on.
formatstringNoOutput format. One of json, json-compact, json-newline, csv. Default: json-compact.
startDate must not be after endDate, and the requested interval must be 100 days or less.

Sample request

curl --request POST \
  --url 'https://api.criteo.com/preview/retail-media/insights/digital-shelf-intelligence' \
  --header 'Authorization: Bearer <ACCESS_TOKEN>' \
  --header 'Content-Type: application/json' \
  --data '{
    "data": {
      "attributes": {
        "accountId": "123",
        "startDate": "2025-08-11",
        "endDate": "2025-08-17",
        "aggregationLevel": "sku",
        "metrics": ["totalSalesOnline", "totalSoldUnitsOnline", "listingPrice"],
        "retailerIds": ["101", "102"],
        "brandIds": ["2001", "2002"],
        "skuIds": [
          {
            "retailerId": "101",
            "retailerSkuIds": ["sku-001", "sku-002"]
          }
        ],
        "categories": ["Beverages", "Snacks"],
        "format": "json-compact"
      }
    }
  }'

Sample response

{
  "data": {
    "id": "87a8e280-9cc9-47f3-9bf9-b68e947cade5",
    "type": "InsightStatusResponse",
    "attributes": {
      "status": "Pending",
      "message": null,
      "createdAt": "2026-06-12T14:57:07.336Z",
      "expiresAt": null,
      "rowCount": null,
      "md5CheckSum": null,
      "fileSizeBytes": null
    }
  },
  "warnings": [],
  "errors": []
}

Endpoint: Poll report status

Check whether a submitted report job has completed. Returns status: "Pending" while processing, or HTTP 410 if the report failed, expired, or was invalidated.

Sample request

curl --request GET \
  --url 'https://api.criteo.com/preview/retail-media/insights/<REPORT_ID>/status' \
  --header 'Authorization: Bearer <ACCESS_TOKEN>'

Sample response

{
  "data": {
    "id": "87a8e280-9cc9-47f3-9bf9-b68e947cade5",
    "type": "InsightStatusResponse",
    "attributes": {
      "status": "Success",
      "message": null,
      "createdAt": "2026-06-12T15:00:43.000Z",
      "expiresAt": "2026-06-19T15:00:43.000Z",
      "rowCount": 0,
      "md5CheckSum": "d41d8cd98f00b204e9800998ecf8427e",
      "fileSizeBytes": 0
    }
  },
  "warnings": [],
  "errors": []
}

Endpoint: Retrieve report output

Download the results of a completed report. Only succeeds when report status is Success. Returns HTTP 400 with code insight-not-ready if the report is still Pending.

Sample request

curl --request GET \
  --url 'https://api.criteo.com/preview/retail-media/insights/<REPORT_ID>/output' \
  --header 'Authorization: Bearer <ACCESS_TOKEN>' \
  --header 'Accept: text/plain'

Sample response

{"columns":["startDate","endDate","retailerId","retailerName","category","skuId","skuName","considerationIndex"],
"data":[],
"rows":0}

Responses

HTTP statusCodeDescriptionTroubleshooting
200 OKReport accepted. Response contains reportId in data.id.Poll /insights/{reportId}/status until status is Success.
200 OKstatus: "Pending" — report is still processing.Retry the status call later.
200 OKstatus: "Success" — output is ready.Call /insights/{reportId}/output to download.
200 OK + warninginvalid-datestartDate not a Monday or endDate not a Sunday. Request accepted and shifted to week boundaries.Send Monday–Sunday dates to avoid auto-adjustment warnings.
200 OK + warningincompatible-filterskuIds sent with aggregationLevel: brand — filter ignored.Use aggregationLevel: sku when filtering by SKU.
200 OK + warninginvalid-metriclistingPrice requested with aggregationLevel: brand — metric omitted.Use aggregationLevel: sku when requesting listingPrice.
400 Bad Requestattribute-requiredMissing required attribute, invalid ID format, startDate > endDate, or interval > 100 days.Validate the request body before submitting.
400 Bad Requestinsight-not-readyOutput endpoint called before report reached Success.Poll the status endpoint first.
403 ForbiddenforbiddenCaller not allowed to access the requested account or endpoint.Confirm account permissions and feature enablement.
404 Not Foundinsight-not-foundReport ID does not exist.Verify the reportId and try again.
410 Goneinsight-failedReport execution failed.Submit a new report request.
410 Goneinsight-invalidatedReport invalidated and no longer available.Submit a new report request.
410 Goneinsight-expiredReport expired and no longer available.Submit a new report request.