curl --request POST \
--url https://app.trackplay.io/api/v1/exports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"video_ids": [
481,
482
],
"from": "2026-06-17",
"to": "2026-07-17",
"format": "csv",
"type": "events"
}
'import requests
url = "https://app.trackplay.io/api/v1/exports"
payload = {
"video_ids": [481, 482],
"from": "2026-06-17",
"to": "2026-07-17",
"format": "csv",
"type": "events"
}
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({
video_ids: [481, 482],
from: '2026-06-17',
to: '2026-07-17',
format: 'csv',
type: 'events'
})
};
fetch('https://app.trackplay.io/api/v1/exports', 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://app.trackplay.io/api/v1/exports",
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([
'video_ids' => [
481,
482
],
'from' => '2026-06-17',
'to' => '2026-07-17',
'format' => 'csv',
'type' => 'events'
]),
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://app.trackplay.io/api/v1/exports"
payload := strings.NewReader("{\n \"video_ids\": [\n 481,\n 482\n ],\n \"from\": \"2026-06-17\",\n \"to\": \"2026-07-17\",\n \"format\": \"csv\",\n \"type\": \"events\"\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://app.trackplay.io/api/v1/exports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"video_ids\": [\n 481,\n 482\n ],\n \"from\": \"2026-06-17\",\n \"to\": \"2026-07-17\",\n \"format\": \"csv\",\n \"type\": \"events\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trackplay.io/api/v1/exports")
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 \"video_ids\": [\n 481,\n 482\n ],\n \"from\": \"2026-06-17\",\n \"to\": \"2026-07-17\",\n \"format\": \"csv\",\n \"type\": \"events\"\n}"
response = http.request(request)
puts response.read_body{
"export_id": "tpex_9f2c1a7e4d3b4a11",
"status": "pending"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "VIDEO_NOT_FOUND",
"message": "One or more video IDs not found."
}
}Start an export
Ask for a batch of analytics as a file. An export runs in the background, so this call returns straight away with an export_id and status: pending. Poll GET /exports/{export} until it is ready, then fetch the file from download_url.
One export can cover up to 50 videos.
Send an Idempotency-Key so a retried request returns the same export instead of starting a second one.
Requires a token with the analytics:read scope.
Server: https://app.trackplay.io/api/v1
curl --request POST \
--url https://app.trackplay.io/api/v1/exports \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"video_ids": [
481,
482
],
"from": "2026-06-17",
"to": "2026-07-17",
"format": "csv",
"type": "events"
}
'import requests
url = "https://app.trackplay.io/api/v1/exports"
payload = {
"video_ids": [481, 482],
"from": "2026-06-17",
"to": "2026-07-17",
"format": "csv",
"type": "events"
}
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({
video_ids: [481, 482],
from: '2026-06-17',
to: '2026-07-17',
format: 'csv',
type: 'events'
})
};
fetch('https://app.trackplay.io/api/v1/exports', 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://app.trackplay.io/api/v1/exports",
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([
'video_ids' => [
481,
482
],
'from' => '2026-06-17',
'to' => '2026-07-17',
'format' => 'csv',
'type' => 'events'
]),
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://app.trackplay.io/api/v1/exports"
payload := strings.NewReader("{\n \"video_ids\": [\n 481,\n 482\n ],\n \"from\": \"2026-06-17\",\n \"to\": \"2026-07-17\",\n \"format\": \"csv\",\n \"type\": \"events\"\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://app.trackplay.io/api/v1/exports")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"video_ids\": [\n 481,\n 482\n ],\n \"from\": \"2026-06-17\",\n \"to\": \"2026-07-17\",\n \"format\": \"csv\",\n \"type\": \"events\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.trackplay.io/api/v1/exports")
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 \"video_ids\": [\n 481,\n 482\n ],\n \"from\": \"2026-06-17\",\n \"to\": \"2026-07-17\",\n \"format\": \"csv\",\n \"type\": \"events\"\n}"
response = http.request(request)
puts response.read_body{
"export_id": "tpex_9f2c1a7e4d3b4a11",
"status": "pending"
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "VIDEO_NOT_FOUND",
"message": "One or more video IDs not found."
}
}Authorizations
A scoped token minted in Settings → API tokens. Send it as Authorization: Bearer tplt_… or X-API-Key: tplt_….
Headers
Retry-safe key. The first response for a given key is cached for 24 hours and replayed on a repeat, with Idempotency-Replayed: true set.
Body
The videos to export. Between 1 and 50 IDs. Every ID must exist in this workspace.
1 - 50 elementsStart of the range, as an ISO date. Required.
End of the range, as an ISO date. Must be on or after from. Required.
The file format. Required.
csv, json Which dataset to export. Required.
events, summary, retention, conversions