curl --request GET \
--url https://api.aisa.one/apis/v1/foreplay/brand/analytics \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.aisa.one/apis/v1/foreplay/brand/analytics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.aisa.one/apis/v1/foreplay/brand/analytics', 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.aisa.one/apis/v1/foreplay/brand/analytics",
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.aisa.one/apis/v1/foreplay/brand/analytics"
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.aisa.one/apis/v1/foreplay/brand/analytics")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aisa.one/apis/v1/foreplay/brand/analytics")
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{
"metadata": {
"success": true,
"status_code": 200,
"count": 2,
"cursor": null
},
"data": [
{
"date": "2025-01-01",
"active_count": 12,
"inactive_count": 3,
"video": 7,
"image": 5
},
{
"date": "2025-01-02",
"active_count": 14,
"inactive_count": 2,
"video": 8,
"image": 6
}
],
"error": null
}{
"metadata": {
"success": false,
"status_code": 406
},
"error": {
"message": "Date range too large",
"max_allowed_days": "30 days"
},
"data": []
}Get Brand Analytics
Brand-level running-ads distribution and creative velocity; id must be a page_id / ad_library_id.
curl --request GET \
--url https://api.aisa.one/apis/v1/foreplay/brand/analytics \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.aisa.one/apis/v1/foreplay/brand/analytics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.aisa.one/apis/v1/foreplay/brand/analytics', 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.aisa.one/apis/v1/foreplay/brand/analytics",
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.aisa.one/apis/v1/foreplay/brand/analytics"
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.aisa.one/apis/v1/foreplay/brand/analytics")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aisa.one/apis/v1/foreplay/brand/analytics")
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{
"metadata": {
"success": true,
"status_code": 200,
"count": 2,
"cursor": null
},
"data": [
{
"date": "2025-01-01",
"active_count": 12,
"inactive_count": 3,
"video": 7,
"image": 5
},
{
"date": "2025-01-02",
"active_count": 14,
"inactive_count": 2,
"video": 8,
"image": 6
}
],
"error": null
}{
"metadata": {
"success": false,
"status_code": 406
},
"error": {
"message": "Date range too large",
"max_allowed_days": "30 days"
},
"data": []
}data[] (date, active_count, inactive_count, and per-format counts). Optionally scope with start_date / end_date and order.
⚠️ The id parameter must be a page_id / ad_library_id, NOT a Foreplay brand_id. Passing a brand_id returns HTTP 406. Get the ad_library_id from get_foreplay-getbrandsbydomain first. Flow: getBrandsByDomain(domain) → ad_library_id → brand/analytics(id=ad_library_id).
⚠️ Date window: the range between start_date and end_date must be ≤ 30 days. A larger range returns HTTP 406 Date range too large:
{"metadata":{"success":false,"status_code":406},"error":{"message":"Date range too large","max_allowed_days":"30 days"},"data":[]}
406 cases: (1) a brand_id was passed instead of a page_id / ad_library_id, and (2) the date window exceeds 30 days.
Billing: 0.02625peritemreturnedin‘data[]‘;emptyresultsanderrorsarenotcharged.∗∗Becausetheresponseisonerowperday,∗∗eachreturnedrowis1billeditem(0.02625) — a 30-day window can bill up to ~30 items, which matters for cost estimation. A 406 (either case) is not charged.
Example: resolve a domain first (e.g. getBrandsByDomain?domain=nike.com → ad_library_id: "15087023444"), then query analytics with that id: GET /foreplay/brand/analytics?id=15087023444&start_date=2025-01-01&end_date=2025-01-30.
Related: get_foreplay-getbrandsbydomain, get_foreplay-getadsbybrandid, get_foreplay-discovery-ads.Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Page ID or Brand ID. Brand IDs are 20-25 character alphanumeric strings with mixed case. Page IDs are numeric Facebook page identifiers.
Start date (inclusive). Format: 'YYYY-MM-DD', 'YYYY-MM-DDTHH:MM:SS', or 'YYYY-MM-DD HH:MM:SS'. If you provide only the date (e.g. '2024-11-12'), it will be interpreted as '2024-11-12 00:00:00'. To get all ads from a specific day, set end_date to 'YYYY-MM-DD 23:59:59' or to the next day at '00:00:00'. Examples: start_date=2024-11-12 00:00:00, end_date=2024-11-12 23:59:59. The window between start_date and end_date must be ≤ 30 days. A larger range returns HTTP 406 Date range too large.
End date (inclusive). Format: 'YYYY-MM-DD', 'YYYY-MM-DDTHH:MM:SS', or 'YYYY-MM-DD HH:MM:SS'. If you provide only the date (e.g. '2024-11-12'), it will be interpreted as '2024-11-12 00:00:00'. To include all results for a given day, set end_date to 'YYYY-MM-DD 23:59:59' or to the next day at '00:00:00'. Examples: start_date=2024-11-12 00:00:00, end_date=2024-11-12 23:59:59. The window between start_date and end_date must be ≤ 30 days. A larger range returns HTTP 406 Date range too large.
Order of results: 'newest' (default), 'oldest', 'longest_running', or 'most_relevant'. Sorts ads by creation date, longest running duration, or relevance to the search query.
newest, oldest, longest_running, most_relevant Response
JSON envelope with metadata and a data[] array of analytics rows (one row per day, each with date, active_count, inactive_count, and per-format counts). Each row in data[] counts as one billed item.
The response is of type object.