curl --request POST \
--url https://api.criteo.com/2027-01/marketing-solutions/statistics-adlevel/report \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"data": {
"type": "AdLevelReportQuery",
"attributes": {
"startDate": "2026-06-01T00:00:00.0000000+00:00",
"endDate": "2026-06-30T00:00:00.0000000+00:00",
"advertiserIds": [
"123456"
],
"adsetIds": [
"987654"
],
"dimensions": [
"AdsetId",
"AdsetName",
"AdGroupName"
],
"metrics": [
"Impressions",
"Clicks",
"Ctr",
"Spend"
],
"mediaChannel": [
"AI Platform"
],
"platform": [
"OpenAI"
],
"currency": "USD",
"format": "json"
}
}
}
'import requests
url = "https://api.criteo.com/2027-01/marketing-solutions/statistics-adlevel/report"
payload = { "data": {
"type": "AdLevelReportQuery",
"attributes": {
"startDate": "2026-06-01T00:00:00.0000000+00:00",
"endDate": "2026-06-30T00:00:00.0000000+00:00",
"advertiserIds": ["123456"],
"adsetIds": ["987654"],
"dimensions": ["AdsetId", "AdsetName", "AdGroupName"],
"metrics": ["Impressions", "Clicks", "Ctr", "Spend"],
"mediaChannel": ["AI Platform"],
"platform": ["OpenAI"],
"currency": "USD",
"format": "json"
}
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
data: {
type: 'AdLevelReportQuery',
attributes: {
startDate: '2026-06-01T00:00:00.0000000+00:00',
endDate: '2026-06-30T00:00:00.0000000+00:00',
advertiserIds: ['123456'],
adsetIds: ['987654'],
dimensions: ['AdsetId', 'AdsetName', 'AdGroupName'],
metrics: ['Impressions', 'Clicks', 'Ctr', 'Spend'],
mediaChannel: ['AI Platform'],
platform: ['OpenAI'],
currency: 'USD',
format: 'json'
}
}
})
};
fetch('https://api.criteo.com/2027-01/marketing-solutions/statistics-adlevel/report', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.criteo.com/2027-01/marketing-solutions/statistics-adlevel/report",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'data' => [
'type' => 'AdLevelReportQuery',
'attributes' => [
'startDate' => '2026-06-01T00:00:00.0000000+00:00',
'endDate' => '2026-06-30T00:00:00.0000000+00:00',
'advertiserIds' => [
'123456'
],
'adsetIds' => [
'987654'
],
'dimensions' => [
'AdsetId',
'AdsetName',
'AdGroupName'
],
'metrics' => [
'Impressions',
'Clicks',
'Ctr',
'Spend'
],
'mediaChannel' => [
'AI Platform'
],
'platform' => [
'OpenAI'
],
'currency' => 'USD',
'format' => 'json'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.criteo.com/2027-01/marketing-solutions/statistics-adlevel/report"
payload := strings.NewReader("{\n \"data\": {\n \"type\": \"AdLevelReportQuery\",\n \"attributes\": {\n \"startDate\": \"2026-06-01T00:00:00.0000000+00:00\",\n \"endDate\": \"2026-06-30T00:00:00.0000000+00:00\",\n \"advertiserIds\": [\n \"123456\"\n ],\n \"adsetIds\": [\n \"987654\"\n ],\n \"dimensions\": [\n \"AdsetId\",\n \"AdsetName\",\n \"AdGroupName\"\n ],\n \"metrics\": [\n \"Impressions\",\n \"Clicks\",\n \"Ctr\",\n \"Spend\"\n ],\n \"mediaChannel\": [\n \"AI Platform\"\n ],\n \"platform\": [\n \"OpenAI\"\n ],\n \"currency\": \"USD\",\n \"format\": \"json\"\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.criteo.com/2027-01/marketing-solutions/statistics-adlevel/report")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"type\": \"AdLevelReportQuery\",\n \"attributes\": {\n \"startDate\": \"2026-06-01T00:00:00.0000000+00:00\",\n \"endDate\": \"2026-06-30T00:00:00.0000000+00:00\",\n \"advertiserIds\": [\n \"123456\"\n ],\n \"adsetIds\": [\n \"987654\"\n ],\n \"dimensions\": [\n \"AdsetId\",\n \"AdsetName\",\n \"AdGroupName\"\n ],\n \"metrics\": [\n \"Impressions\",\n \"Clicks\",\n \"Ctr\",\n \"Spend\"\n ],\n \"mediaChannel\": [\n \"AI Platform\"\n ],\n \"platform\": [\n \"OpenAI\"\n ],\n \"currency\": \"USD\",\n \"format\": \"json\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.criteo.com/2027-01/marketing-solutions/statistics-adlevel/report")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"type\": \"AdLevelReportQuery\",\n \"attributes\": {\n \"startDate\": \"2026-06-01T00:00:00.0000000+00:00\",\n \"endDate\": \"2026-06-30T00:00:00.0000000+00:00\",\n \"advertiserIds\": [\n \"123456\"\n ],\n \"adsetIds\": [\n \"987654\"\n ],\n \"dimensions\": [\n \"AdsetId\",\n \"AdsetName\",\n \"AdGroupName\"\n ],\n \"metrics\": [\n \"Impressions\",\n \"Clicks\",\n \"Ctr\",\n \"Spend\"\n ],\n \"mediaChannel\": [\n \"AI Platform\"\n ],\n \"platform\": [\n \"OpenAI\"\n ],\n \"currency\": \"USD\",\n \"format\": \"json\"\n }\n }\n}"
response = http.request(request)
puts response.read_body"<string>"/2027-01/marketing-solutions/statistics-adlevel/report
Generates a synchronous ad-level report (currently OpenAI campaigns only, with Open Web planned) returned directly in the response as JSON or CSV — no job creation, polling, or separate download step.
Breakdown dimensions and metrics must both be explicitly requested — nothing is added to the response just because a dimension was requested. Requesting AdGroupName, ProductId, or AdId as a breakdown requires the query to already be scoped to specific ad set(s), either via a non-empty adsetIds filter or by also including AdsetId in dimensions. Some metrics also require their own matching breakdown dimension to be requested — see the endpoint description for the full compatibility table. Results are capped at 100,000 rows; beyond that the response is truncated and a row-limit-exceeded warning is included.
Optional mediaChannel/platform filters narrow results to specific media channels/platforms (e.g. “AI Platform”/“OpenAI”); omit for no filtering. Monetary metrics (Spend, Cpc, Cpm) are converted into the currency requested via the currency field (ISO 4217 code, defaults to EUR). This report always operates in UTC.
curl --request POST \
--url https://api.criteo.com/2027-01/marketing-solutions/statistics-adlevel/report \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"data": {
"type": "AdLevelReportQuery",
"attributes": {
"startDate": "2026-06-01T00:00:00.0000000+00:00",
"endDate": "2026-06-30T00:00:00.0000000+00:00",
"advertiserIds": [
"123456"
],
"adsetIds": [
"987654"
],
"dimensions": [
"AdsetId",
"AdsetName",
"AdGroupName"
],
"metrics": [
"Impressions",
"Clicks",
"Ctr",
"Spend"
],
"mediaChannel": [
"AI Platform"
],
"platform": [
"OpenAI"
],
"currency": "USD",
"format": "json"
}
}
}
'import requests
url = "https://api.criteo.com/2027-01/marketing-solutions/statistics-adlevel/report"
payload = { "data": {
"type": "AdLevelReportQuery",
"attributes": {
"startDate": "2026-06-01T00:00:00.0000000+00:00",
"endDate": "2026-06-30T00:00:00.0000000+00:00",
"advertiserIds": ["123456"],
"adsetIds": ["987654"],
"dimensions": ["AdsetId", "AdsetName", "AdGroupName"],
"metrics": ["Impressions", "Clicks", "Ctr", "Spend"],
"mediaChannel": ["AI Platform"],
"platform": ["OpenAI"],
"currency": "USD",
"format": "json"
}
} }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
data: {
type: 'AdLevelReportQuery',
attributes: {
startDate: '2026-06-01T00:00:00.0000000+00:00',
endDate: '2026-06-30T00:00:00.0000000+00:00',
advertiserIds: ['123456'],
adsetIds: ['987654'],
dimensions: ['AdsetId', 'AdsetName', 'AdGroupName'],
metrics: ['Impressions', 'Clicks', 'Ctr', 'Spend'],
mediaChannel: ['AI Platform'],
platform: ['OpenAI'],
currency: 'USD',
format: 'json'
}
}
})
};
fetch('https://api.criteo.com/2027-01/marketing-solutions/statistics-adlevel/report', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.criteo.com/2027-01/marketing-solutions/statistics-adlevel/report",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'data' => [
'type' => 'AdLevelReportQuery',
'attributes' => [
'startDate' => '2026-06-01T00:00:00.0000000+00:00',
'endDate' => '2026-06-30T00:00:00.0000000+00:00',
'advertiserIds' => [
'123456'
],
'adsetIds' => [
'987654'
],
'dimensions' => [
'AdsetId',
'AdsetName',
'AdGroupName'
],
'metrics' => [
'Impressions',
'Clicks',
'Ctr',
'Spend'
],
'mediaChannel' => [
'AI Platform'
],
'platform' => [
'OpenAI'
],
'currency' => 'USD',
'format' => 'json'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.criteo.com/2027-01/marketing-solutions/statistics-adlevel/report"
payload := strings.NewReader("{\n \"data\": {\n \"type\": \"AdLevelReportQuery\",\n \"attributes\": {\n \"startDate\": \"2026-06-01T00:00:00.0000000+00:00\",\n \"endDate\": \"2026-06-30T00:00:00.0000000+00:00\",\n \"advertiserIds\": [\n \"123456\"\n ],\n \"adsetIds\": [\n \"987654\"\n ],\n \"dimensions\": [\n \"AdsetId\",\n \"AdsetName\",\n \"AdGroupName\"\n ],\n \"metrics\": [\n \"Impressions\",\n \"Clicks\",\n \"Ctr\",\n \"Spend\"\n ],\n \"mediaChannel\": [\n \"AI Platform\"\n ],\n \"platform\": [\n \"OpenAI\"\n ],\n \"currency\": \"USD\",\n \"format\": \"json\"\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.criteo.com/2027-01/marketing-solutions/statistics-adlevel/report")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"data\": {\n \"type\": \"AdLevelReportQuery\",\n \"attributes\": {\n \"startDate\": \"2026-06-01T00:00:00.0000000+00:00\",\n \"endDate\": \"2026-06-30T00:00:00.0000000+00:00\",\n \"advertiserIds\": [\n \"123456\"\n ],\n \"adsetIds\": [\n \"987654\"\n ],\n \"dimensions\": [\n \"AdsetId\",\n \"AdsetName\",\n \"AdGroupName\"\n ],\n \"metrics\": [\n \"Impressions\",\n \"Clicks\",\n \"Ctr\",\n \"Spend\"\n ],\n \"mediaChannel\": [\n \"AI Platform\"\n ],\n \"platform\": [\n \"OpenAI\"\n ],\n \"currency\": \"USD\",\n \"format\": \"json\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.criteo.com/2027-01/marketing-solutions/statistics-adlevel/report")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"data\": {\n \"type\": \"AdLevelReportQuery\",\n \"attributes\": {\n \"startDate\": \"2026-06-01T00:00:00.0000000+00:00\",\n \"endDate\": \"2026-06-30T00:00:00.0000000+00:00\",\n \"advertiserIds\": [\n \"123456\"\n ],\n \"adsetIds\": [\n \"987654\"\n ],\n \"dimensions\": [\n \"AdsetId\",\n \"AdsetName\",\n \"AdGroupName\"\n ],\n \"metrics\": [\n \"Impressions\",\n \"Clicks\",\n \"Ctr\",\n \"Spend\"\n ],\n \"mediaChannel\": [\n \"AI Platform\"\n ],\n \"platform\": [\n \"OpenAI\"\n ],\n \"currency\": \"USD\",\n \"format\": \"json\"\n }\n }\n}"
response = http.request(request)
puts response.read_body"<string>"Authorizations
The access token received from the authorization server in the OAuth 2.0 flow.
Body
A top-level object that encapsulates a Criteo API request for a single value object.
A value resource exposed by the API.
Show child attributes
Show child attributes
Response
Success
The response is of type file.
Was this page helpful?