List a campaign's conversion records
curl --request GET \
--url https://api.upliftai.org/v1/campaigns/{campaignId}/conversions \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.upliftai.org/v1/campaigns/{campaignId}/conversions"
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}/conversions', 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}/conversions",
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}/conversions"
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}/conversions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.upliftai.org/v1/campaigns/{campaignId}/conversions")
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{
"conversions": [
{
"sessionId": "a5be4d9e-xxxx-xxxx-xxxx-xxxxxxxxxxxx#+923001234567#a1",
"organizationId": "a12b7e74-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "c782a4ec-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"assistantId": "0f4a91d3-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"campaignId": "a5be4d9e-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"goalKind": "lead",
"payload": {
"kind": "lead",
"status": "qualified",
"interest": "سائبر سیکیورٹی ڈپلومہ، شام والی کلاس",
"nextStep": "جمعرات شام 6 بجے ڈیمو سیشن",
"notes": "فیس کی قسطوں کے بارے میں پوچھا",
"summary": "عائشہ صدیقی کورس میں دلچسپی رکھتی ہیں اور ڈیمو کے لیے تیار ہیں۔"
},
"date": "2026-08-18",
"createdAt": "2026-08-18T09:12:44.831Z"
},
{
"sessionId": "a5be4d9e-xxxx-xxxx-xxxx-xxxxxxxxxxxx#+923214455661#a2",
"organizationId": "a12b7e74-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "c782a4ec-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"assistantId": "0f4a91d3-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"campaignId": "a5be4d9e-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"goalKind": "lead",
"payload": {
"kind": "lead",
"status": "callback",
"interest": "بی ایس سی کے بعد کے آپشنز",
"nextStep": "کل دوپہر دوبارہ کال کریں",
"summary": "بلال احمد ابھی مصروف تھے، کل بات کرنے کو کہا۔"
},
"date": "2026-08-18",
"createdAt": "2026-08-18T08:47:02.118Z"
}
],
"nextCursor": "eyJwayI6ICJhMTJiN2U3NC14eHh4LXh4eHgteHh4eC14eHh4eHh4eHh4eHgjYzc4MmE0ZWMteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4IiwgInNrIjogImE1YmU0ZDllLXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eCMrOTIzMjE0NDU1NjYxI2EyIiwgImNhbXBhaWduSWQiOiAiYTViZTRkOWUteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4IiwgInNsb3RPckNyZWF0ZWQiOiAiMjAyNi0wOC0xOFQwODo0NzowMi4xMThaIn0"
}Campaign outcomes
List a campaign's conversion records
One row per call that post-call analysis scored as an outcome — never-dialed, unanswered, and ungraded contacts are absent. Newest first. This route returns the stored record as-is; /campaigns/{campaignId}/results serves the same rows joined to each contact’s name and phone and labelled with the campaign’s goal vocabulary, which is the easier one to render.
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.
GET
/
campaigns
/
{campaignId}
/
conversions
List a campaign's conversion records
curl --request GET \
--url https://api.upliftai.org/v1/campaigns/{campaignId}/conversions \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.upliftai.org/v1/campaigns/{campaignId}/conversions"
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}/conversions', 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}/conversions",
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}/conversions"
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}/conversions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.upliftai.org/v1/campaigns/{campaignId}/conversions")
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{
"conversions": [
{
"sessionId": "a5be4d9e-xxxx-xxxx-xxxx-xxxxxxxxxxxx#+923001234567#a1",
"organizationId": "a12b7e74-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "c782a4ec-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"assistantId": "0f4a91d3-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"campaignId": "a5be4d9e-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"goalKind": "lead",
"payload": {
"kind": "lead",
"status": "qualified",
"interest": "سائبر سیکیورٹی ڈپلومہ، شام والی کلاس",
"nextStep": "جمعرات شام 6 بجے ڈیمو سیشن",
"notes": "فیس کی قسطوں کے بارے میں پوچھا",
"summary": "عائشہ صدیقی کورس میں دلچسپی رکھتی ہیں اور ڈیمو کے لیے تیار ہیں۔"
},
"date": "2026-08-18",
"createdAt": "2026-08-18T09:12:44.831Z"
},
{
"sessionId": "a5be4d9e-xxxx-xxxx-xxxx-xxxxxxxxxxxx#+923214455661#a2",
"organizationId": "a12b7e74-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "c782a4ec-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"assistantId": "0f4a91d3-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"campaignId": "a5be4d9e-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"goalKind": "lead",
"payload": {
"kind": "lead",
"status": "callback",
"interest": "بی ایس سی کے بعد کے آپشنز",
"nextStep": "کل دوپہر دوبارہ کال کریں",
"summary": "بلال احمد ابھی مصروف تھے، کل بات کرنے کو کہا۔"
},
"date": "2026-08-18",
"createdAt": "2026-08-18T08:47:02.118Z"
}
],
"nextCursor": "eyJwayI6ICJhMTJiN2U3NC14eHh4LXh4eHgteHh4eC14eHh4eHh4eHh4eHgjYzc4MmE0ZWMteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4IiwgInNrIjogImE1YmU0ZDllLXh4eHgteHh4eC14eHh4LXh4eHh4eHh4eHh4eCMrOTIzMjE0NDU1NjYxI2EyIiwgImNhbXBhaWduSWQiOiAiYTViZTRkOWUteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4IiwgInNsb3RPckNyZWF0ZWQiOiAiMjAyNi0wOC0xOFQwODo0NzowMi4xMThaIn0"
}Authorizations
Project API key (sk_api_…).
Path Parameters
Query Parameters
Rows per page. Values above 100 are capped to 100.
The nextCursor from the previous page.
