curl --request GET \
--url https://api.privy.com/v1/reports/displays \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.privy.com/v1/reports/displays"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.privy.com/v1/reports/displays', 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.privy.com/v1/reports/displays",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.privy.com/v1/reports/displays"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.privy.com/v1/reports/displays")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.privy.com/v1/reports/displays")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"display_id": "gk2P8Zw1Lq",
"title": "Summer Sale Popup",
"display_type": "popup",
"status": "live",
"published_date": "2026-06-01",
"stats": {
"views": {
"value": 4200,
"unit": "count"
},
"signups": {
"value": 310,
"unit": "count"
},
"signup_rate": {
"value": 7.4,
"unit": "percent"
},
"attributed_orders": {
"value": 28,
"unit": "count"
},
"attributed_revenue": {
"value": 1840.5,
"unit": "usd"
}
}
}
],
"period": {
"label": "last_30_days",
"start_date": "2026-06-21",
"end_date": "2026-07-20"
},
"pagination": {
"page": 1,
"per_page": 40,
"total_count": 1,
"total_pages": 1
}
}{
"error": {
"code": "unauthorized",
"message": "Bearer token is missing or invalid"
}
}{
"error": {
"code": "insufficient_scope",
"message": "Token does not have the required scope"
}
}{
"error": {
"code": "validation_failed",
"message": "One or more fields are invalid",
"details": [
{
"field": "email",
"message": "is required"
}
]
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded"
}
}List display performance
Rank your displays by performance over a period — signups by default,
or any of the documented sort keys. Displays whose value for the chosen
sort key is zero are left out entirely, and ranking stops at 50
displays, which also caps the reported total_count. Use
/v1/reports/displays/{display_id} for one display’s full stat set,
including average order value and A/B test results.
Required scope: reports_read
curl --request GET \
--url https://api.privy.com/v1/reports/displays \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.privy.com/v1/reports/displays"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.privy.com/v1/reports/displays', 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.privy.com/v1/reports/displays",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.privy.com/v1/reports/displays"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.privy.com/v1/reports/displays")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.privy.com/v1/reports/displays")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"display_id": "gk2P8Zw1Lq",
"title": "Summer Sale Popup",
"display_type": "popup",
"status": "live",
"published_date": "2026-06-01",
"stats": {
"views": {
"value": 4200,
"unit": "count"
},
"signups": {
"value": 310,
"unit": "count"
},
"signup_rate": {
"value": 7.4,
"unit": "percent"
},
"attributed_orders": {
"value": 28,
"unit": "count"
},
"attributed_revenue": {
"value": 1840.5,
"unit": "usd"
}
}
}
],
"period": {
"label": "last_30_days",
"start_date": "2026-06-21",
"end_date": "2026-07-20"
},
"pagination": {
"page": 1,
"per_page": 40,
"total_count": 1,
"total_pages": 1
}
}{
"error": {
"code": "unauthorized",
"message": "Bearer token is missing or invalid"
}
}{
"error": {
"code": "insufficient_scope",
"message": "Token does not have the required scope"
}
}{
"error": {
"code": "validation_failed",
"message": "One or more fields are invalid",
"details": [
{
"field": "email",
"message": "is required"
}
]
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded"
}
}Authorizations
Send either an API token or an OAuth access token as
Authorization: Bearer <token>. See the Authentication page for details.
Headers
Target a subaccount instead of the main connected account.
Pass a subaccount id from get_account's subaccounts list. Only direct subaccounts
of the connected account are reachable — omit this for the main account itself.
Query Parameters
The date range to report over, resolved in the account's time zone. Pass custom together with start_date and end_date.
last_7_days, last_30_days, last_90_days, this_month, last_month, custom Inclusive start of a custom period (ISO 8601 date). Required when period=custom, ignored otherwise.
Inclusive end of a custom period (ISO 8601 date). Required when period=custom, ignored otherwise. Custom periods are capped at 366 days.
The metric to rank displays by, best first.
signups, signup_rate, views, revenue, orders Page number (starts at 1).
x >= 1Number of results per page. Values outside 10–100 are clamped to the nearest bound.
10 <= x <= 100Response
Displays ranked by the requested sort, with the resolved period.
Show child attributes
Show child attributes
The resolved date range the report covers, inclusive, in the account's
time zone. Every label except last_month ends today, so the last day
of the range is still in progress: last_7_days is the six days before
today plus today, this_month runs from the 1st through today, and
last_month is the whole previous calendar month. Custom ranges cannot
exceed 366 days.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Was this page helpful?