Get per-ad funnel performance
curl --request GET \
--url https://api.aura-app.ai/v1/analytics/ad-performanceimport requests
url = "https://api.aura-app.ai/v1/analytics/ad-performance"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.aura-app.ai/v1/analytics/ad-performance', 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.aura-app.ai/v1/analytics/ad-performance",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.aura-app.ai/v1/analytics/ad-performance"
req, _ := http.NewRequest("GET", url, nil)
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.aura-app.ai/v1/analytics/ad-performance")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aura-app.ai/v1/analytics/ad-performance")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"data": [
{
"ad": "video-a",
"ad_set": "lookalike-1pct",
"attended_calls": 18,
"book_to_attend_rate": 60,
"booked_calls": 30,
"booked_revenue": 12000,
"campaign": "spring-2026",
"close_rate": 33.3,
"closed_calls": 6,
"collected_revenue": 9500,
"currency": "<string>",
"disqualified_leads": 20,
"lead_to_book_rate": 25,
"leads_generated": 120,
"medium": "cpc",
"meta_ad_id": "1234567890",
"qualified_leads": 100,
"revenue_summary": {
"by_currency": [
{
"booked_amount": 123,
"collected_amount": 123,
"currency": "<string>",
"sale_count": 1
}
],
"missing_currency": {
"booked_amount": 123,
"collected_amount": 123,
"sale_count": 1
}
},
"source": "facebook"
}
],
"success": true
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "DATABASE_ERROR",
"error": "Failed to fetch analytics",
"success": false,
"requestId": "req_abc123"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "DATABASE_ERROR",
"error": "Failed to fetch analytics",
"success": false,
"requestId": "req_abc123"
}{
"code": "DATABASE_ERROR",
"error": "Failed to fetch analytics",
"success": false,
"requestId": "req_abc123"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}Analytics
Get per-ad funnel performance
Alpha API - This endpoint is in active development. Schema may change without notice.
One row per AD — campaign, ad set and ad — with the funnel an ad buyer reads left
to right: leads, qualified, disqualified, booked, attended, closed, and both
revenue measures. Finer than /campaigns, which stops at campaign.
Three things it deliberately does not do:
- No spend, so no ROAS or CAC. Aura stores no ad cost, so those are not computable here. Ranking on revenue and calling it return on ad spend invents the denominator.
- Ad identity rides on UTM columns by convention (
utm_campaign,utm_term,utm_content). A call whose link omitted them is absent entirely rather than bucketed as unknown, so totals here can be lower than/dashboard. Whenadandad_setare null across every row, these are campaigns, not ads. - Two window anchors in one row. Lead counts are windowed on when the LEAD
was created; call counts on when the CALL was scheduled. So
lead_to_book_ratedivides one population by another and can exceed 100, andbooked_callshere is not comparable tobooked_callson/campaigns.
GET
/
v1
/
analytics
/
ad-performance
Get per-ad funnel performance
curl --request GET \
--url https://api.aura-app.ai/v1/analytics/ad-performanceimport requests
url = "https://api.aura-app.ai/v1/analytics/ad-performance"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://api.aura-app.ai/v1/analytics/ad-performance', 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.aura-app.ai/v1/analytics/ad-performance",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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.aura-app.ai/v1/analytics/ad-performance"
req, _ := http.NewRequest("GET", url, nil)
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.aura-app.ai/v1/analytics/ad-performance")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.aura-app.ai/v1/analytics/ad-performance")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"data": [
{
"ad": "video-a",
"ad_set": "lookalike-1pct",
"attended_calls": 18,
"book_to_attend_rate": 60,
"booked_calls": 30,
"booked_revenue": 12000,
"campaign": "spring-2026",
"close_rate": 33.3,
"closed_calls": 6,
"collected_revenue": 9500,
"currency": "<string>",
"disqualified_leads": 20,
"lead_to_book_rate": 25,
"leads_generated": 120,
"medium": "cpc",
"meta_ad_id": "1234567890",
"qualified_leads": 100,
"revenue_summary": {
"by_currency": [
{
"booked_amount": 123,
"collected_amount": 123,
"currency": "<string>",
"sale_count": 1
}
],
"missing_currency": {
"booked_amount": 123,
"collected_amount": 123,
"sale_count": 1
}
},
"source": "facebook"
}
],
"success": true
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "DATABASE_ERROR",
"error": "Failed to fetch analytics",
"success": false,
"requestId": "req_abc123"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}{
"code": "DATABASE_ERROR",
"error": "Failed to fetch analytics",
"success": false,
"requestId": "req_abc123"
}{
"code": "DATABASE_ERROR",
"error": "Failed to fetch analytics",
"success": false,
"requestId": "req_abc123"
}{
"code": "<string>",
"error": "<string>",
"success": false,
"requestId": "<string>"
}Alpha API - This endpoint is in active development. Schema may change without notice.One row per AD — campaign, ad set and ad — with the funnel an ad buyer reads left to right: leads, qualified, disqualified, booked, attended, closed, and both revenue measures. Finer than
/campaigns, which stops at campaign.
Three things it deliberately does not do:
- No spend, so no ROAS or CAC. Aura stores no ad cost, so those are not computable here. Ranking on revenue and calling it return on ad spend invents the denominator.
- Ad identity rides on UTM columns by convention (
utm_campaign,utm_term,utm_content). A call whose link omitted them is absent entirely rather than bucketed as unknown, so totals here can be lower than/dashboard. Whenadandad_setare null across every row, these are campaigns, not ads. - Two window anchors in one row. Lead counts are windowed on when the LEAD
was created; call counts on when the CALL was scheduled. So
lead_to_book_ratedivides one population by another and can exceed 100, andbooked_callshere is not comparable tobooked_callson/campaigns.
Query Parameters
ISO 8601 start date (defaults to all time)
Example:
"2026-01-01T00:00:00Z"
ISO 8601 end date (defaults to now)
Example:
"2026-03-19T23:59:59Z"