Read Studio sellables analytics
Requires analytics:read and an exact active Studio grant. Dates are inclusive from and exclusive to, at most 366 civil days, in the supplied IANA timezone. Currency USD is supported. The credential selects Test or Live; query lane overrides and unknown or repeated filters are rejected. Refunds observed later restate the original sales cohort. Null metrics and coverage disclose unavailable accounting. Returns aggregate sales only; no customer data. Cursor binds report revision and filters. Private no-store response.
curl --request GET \
--url https://api.batchrelay.com/v1/studios/{studio_id}/analytics/sellables \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.batchrelay.com/v1/studios/{studio_id}/analytics/sellables"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.batchrelay.com/v1/studios/{studio_id}/analytics/sellables', 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.batchrelay.com/v1/studios/{studio_id}/analytics/sellables",
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.batchrelay.com/v1/studios/{studio_id}/analytics/sellables"
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.batchrelay.com/v1/studios/{studio_id}/analytics/sellables")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.batchrelay.com/v1/studios/{studio_id}/analytics/sellables")
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{
"items": [
{
"average_order_value": {
"denominator": 4503599627370495,
"numerator_minor": 4503599627370495,
"value_minor": 4503599627370495
},
"captured_orders": 4503599627370495,
"discounts_minor": 4503599627370495,
"disputed_orders": 4503599627370495,
"fully_refunded_orders": 4503599627370495,
"gross_merchandise_sales_minor": 4503599627370495,
"id": "<string>",
"merchandise_sales_before_refunds_minor": 4503599627370495,
"name": "<string>",
"net_merchandise_sales_minor": 4503599627370495,
"purchased_units": 4503599627370495,
"rank": 2,
"refunds_minor": 4503599627370495,
"retained_paid_orders": 4503599627370495,
"type": "item"
}
],
"meta": {
"coverage": {
"accounting": {
"line_allocation": "verified",
"net_sales_estimated": true,
"refund_policy": "none"
},
"state": "complete",
"warning_codes": [
"<string>"
]
},
"currency": "<string>",
"data_through": "<string>",
"environment": "test",
"from": "<string>",
"generated_at": "<string>",
"metric_version": "studio_sales_v1",
"revision": "<string>",
"studio_id": "<string>",
"timezone": "<string>",
"to": "<string>",
"utc_from": "<string>",
"utc_to": "<string>"
},
"page": {
"has_more": true,
"limit": 50,
"next_cursor": "<string>",
"sort_by": "net_sales",
"total": 4503599627370495
}
}{
"code": "<string>",
"docs_url": "<string>",
"error": "<string>",
"message": "<string>",
"request_id": "<string>"
}{
"code": "<string>",
"docs_url": "<string>",
"error": "<string>",
"message": "<string>",
"request_id": "<string>"
}{
"code": "<string>",
"docs_url": "<string>",
"error": "<string>",
"message": "<string>",
"request_id": "<string>"
}{
"code": "<string>",
"docs_url": "<string>",
"error": "<string>",
"message": "<string>",
"request_id": "<string>"
}{
"code": "<string>",
"docs_url": "<string>",
"error": "<string>",
"message": "<string>",
"request_id": "<string>"
}{
"code": "<string>",
"docs_url": "<string>",
"error": "<string>",
"message": "<string>",
"request_id": "<string>"
}Authorizations
Batch Relay scoped API key or an anonymous Test Mode session. Scope names document required capabilities. Anonymous sessions are sandbox-only and do not authorize studio, event, billing, or Live Mode operations.
Headers
Untrusted optional analytics hint naming the calling client surface. It never affects authorization, routing, pricing, or behavior.
1 - 100Untrusted optional analytics hint naming the calling client version. It never affects authorization, routing, pricing, or behavior.
1 - 100Untrusted optional analytics hint naming the invocation mode. It never affects authorization, routing, pricing, or behavior.
1 - 100Path Parameters
256^stu_Query Parameters
USD 256^evt_1 <= x <= 1001024net_sales, units, orders all, item, package curl --request GET \
--url https://api.batchrelay.com/v1/studios/{studio_id}/analytics/sellables \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.batchrelay.com/v1/studios/{studio_id}/analytics/sellables"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.batchrelay.com/v1/studios/{studio_id}/analytics/sellables', 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.batchrelay.com/v1/studios/{studio_id}/analytics/sellables",
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.batchrelay.com/v1/studios/{studio_id}/analytics/sellables"
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.batchrelay.com/v1/studios/{studio_id}/analytics/sellables")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.batchrelay.com/v1/studios/{studio_id}/analytics/sellables")
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{
"items": [
{
"average_order_value": {
"denominator": 4503599627370495,
"numerator_minor": 4503599627370495,
"value_minor": 4503599627370495
},
"captured_orders": 4503599627370495,
"discounts_minor": 4503599627370495,
"disputed_orders": 4503599627370495,
"fully_refunded_orders": 4503599627370495,
"gross_merchandise_sales_minor": 4503599627370495,
"id": "<string>",
"merchandise_sales_before_refunds_minor": 4503599627370495,
"name": "<string>",
"net_merchandise_sales_minor": 4503599627370495,
"purchased_units": 4503599627370495,
"rank": 2,
"refunds_minor": 4503599627370495,
"retained_paid_orders": 4503599627370495,
"type": "item"
}
],
"meta": {
"coverage": {
"accounting": {
"line_allocation": "verified",
"net_sales_estimated": true,
"refund_policy": "none"
},
"state": "complete",
"warning_codes": [
"<string>"
]
},
"currency": "<string>",
"data_through": "<string>",
"environment": "test",
"from": "<string>",
"generated_at": "<string>",
"metric_version": "studio_sales_v1",
"revision": "<string>",
"studio_id": "<string>",
"timezone": "<string>",
"to": "<string>",
"utc_from": "<string>",
"utc_to": "<string>"
},
"page": {
"has_more": true,
"limit": 50,
"next_cursor": "<string>",
"sort_by": "net_sales",
"total": 4503599627370495
}
}{
"code": "<string>",
"docs_url": "<string>",
"error": "<string>",
"message": "<string>",
"request_id": "<string>"
}{
"code": "<string>",
"docs_url": "<string>",
"error": "<string>",
"message": "<string>",
"request_id": "<string>"
}{
"code": "<string>",
"docs_url": "<string>",
"error": "<string>",
"message": "<string>",
"request_id": "<string>"
}{
"code": "<string>",
"docs_url": "<string>",
"error": "<string>",
"message": "<string>",
"request_id": "<string>"
}{
"code": "<string>",
"docs_url": "<string>",
"error": "<string>",
"message": "<string>",
"request_id": "<string>"
}{
"code": "<string>",
"docs_url": "<string>",
"error": "<string>",
"message": "<string>",
"request_id": "<string>"
}