curl --request GET \
--url https://api.upliftai.org/v1/campaigns/{campaignId}/results \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.upliftai.org/v1/campaigns/{campaignId}/results"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.upliftai.org/v1/campaigns/{campaignId}/results', 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.upliftai.org/v1/campaigns/{campaignId}/results",
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.upliftai.org/v1/campaigns/{campaignId}/results"
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.upliftai.org/v1/campaigns/{campaignId}/results")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.upliftai.org/v1/campaigns/{campaignId}/results")
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{
"artifactModel": "lead_list",
"vocabulary": {
"conversionVerb": "qualified",
"conversionNoun": "lead"
},
"rows": [
{
"sessionId": "a5be4d9e-xxxx-xxxx-xxxx-xxxxxxxxxxxx#+923001234567#a1",
"goalKind": "lead",
"name": "عائشہ خان",
"phone": "+923001234567",
"runId": "d1403129-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"payload": {
"kind": "lead",
"status": "qualified",
"interest": "سائبر سیکیورٹی ڈپلومہ",
"nextStep": "ڈیمو سیشن کے لیے رابطہ",
"summary": "پروگرام میں دلچسپی ہے، فیس اور شیڈول بتا دیا گیا۔"
},
"createdAt": "2026-08-18T05:16:47.324Z"
},
{
"sessionId": "a5be4d9e-xxxx-xxxx-xxxx-xxxxxxxxxxxx#03214567890#a2",
"goalKind": "lead",
"name": "بلال احمد",
"phone": "03214567890",
"runId": "d1403129-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"payload": {
"kind": "lead",
"status": "callback",
"notes": "شام چھ بجے دوبارہ کال کرنے کو کہا۔"
},
"createdAt": "2026-08-18T05:11:02.881Z"
}
]
}{
"message": "Invalid pagination cursor",
"error": "Bad Request",
"statusCode": 400
}{
"message": "invalid authorization",
"error": "Unauthorized",
"statusCode": 401
}{
"message": "Forbidden resource",
"error": "Forbidden",
"statusCode": 403
}{
"message": "Realtime assistant not found: 00000000-0000-4000-8000-000000000000",
"error": "Not Found",
"statusCode": 404
}List a campaign's outcomes
One row per connected call, carrying the outcome post-call analysis recorded — a booked appointment, a qualified lead, an RSVP, whatever the campaign’s goal defines as a result. The shape of each outcome and the labels to render it under follow that goal; vocabulary tells your UI which set applies. Contacts never dialed or never answered are not here — they live in /campaigns/{campaignId}/calls — and a campaign with no scorecard produces no rows at all.
Note: Scores, conversions, and sentiment are computed by LLMs — best effort, with room to be wrong. We are continuously closing the tracking gaps, but for sensitive workloads we recommend running your own analysis on the transcripts delivered over webhooks.
curl --request GET \
--url https://api.upliftai.org/v1/campaigns/{campaignId}/results \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.upliftai.org/v1/campaigns/{campaignId}/results"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.upliftai.org/v1/campaigns/{campaignId}/results', 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.upliftai.org/v1/campaigns/{campaignId}/results",
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.upliftai.org/v1/campaigns/{campaignId}/results"
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.upliftai.org/v1/campaigns/{campaignId}/results")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.upliftai.org/v1/campaigns/{campaignId}/results")
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{
"artifactModel": "lead_list",
"vocabulary": {
"conversionVerb": "qualified",
"conversionNoun": "lead"
},
"rows": [
{
"sessionId": "a5be4d9e-xxxx-xxxx-xxxx-xxxxxxxxxxxx#+923001234567#a1",
"goalKind": "lead",
"name": "عائشہ خان",
"phone": "+923001234567",
"runId": "d1403129-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"payload": {
"kind": "lead",
"status": "qualified",
"interest": "سائبر سیکیورٹی ڈپلومہ",
"nextStep": "ڈیمو سیشن کے لیے رابطہ",
"summary": "پروگرام میں دلچسپی ہے، فیس اور شیڈول بتا دیا گیا۔"
},
"createdAt": "2026-08-18T05:16:47.324Z"
},
{
"sessionId": "a5be4d9e-xxxx-xxxx-xxxx-xxxxxxxxxxxx#03214567890#a2",
"goalKind": "lead",
"name": "بلال احمد",
"phone": "03214567890",
"runId": "d1403129-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"payload": {
"kind": "lead",
"status": "callback",
"notes": "شام چھ بجے دوبارہ کال کرنے کو کہا۔"
},
"createdAt": "2026-08-18T05:11:02.881Z"
}
]
}{
"message": "Invalid pagination cursor",
"error": "Bad Request",
"statusCode": 400
}{
"message": "invalid authorization",
"error": "Unauthorized",
"statusCode": 401
}{
"message": "Forbidden resource",
"error": "Forbidden",
"statusCode": 403
}{
"message": "Realtime assistant not found: 00000000-0000-4000-8000-000000000000",
"error": "Not Found",
"statusCode": 404
}Authorizations
Project API key (sk_api_…).
Path Parameters
Query Parameters
Rows per page. Values above 100 are clamped, not rejected.
1 <= x <= 100The nextCursor of the previous page.
Response
One page of outcomes, newest first.
The row shape this campaign's goal produces.
day_sheet, guest_list, lead_list, order_list, payment_list, outreach_list, reservation_list How this goal words a successful outcome, for labelling a UI: booked an appointment, qualified a lead.
Show child attributes
Show child attributes
Ordered newest first by slotIso where the goal has one, by createdAt otherwise.
Show child attributes
Show child attributes
Absent on the last page.
