curl --request GET \
--url https://api.upliftai.org/v1/campaigns/{campaignId}/callbacks \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.upliftai.org/v1/campaigns/{campaignId}/callbacks"
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}/callbacks', 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}/callbacks",
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}/callbacks"
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}/callbacks")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.upliftai.org/v1/campaigns/{campaignId}/callbacks")
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{
"callbacks": [
{
"callbackId": "callback_N2Q0MWM5ZTIteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4Iys5MjMwMDQ1Njc4OTAjYTEjY2I",
"organizationId": "a12b7e74-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "c782a4ec-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"assistantId": "80b00435-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"campaignId": "7d41c9e2-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"sessionId": "session_N2Q0MWM5ZTIteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4Iys5MjMwMDQ1Njc4OTAjYTE",
"kind": "human",
"reason": "Cardholder disputes the late fee and wants an agent to go through the statement.",
"requestedText": "mujhe kisi banday se baat karni hai, kal subah",
"callbackAfter": "2026-10-29T11:00:00+05:00",
"timezone": "Asia/Karachi",
"status": "open",
"timeline": [
{
"type": "created",
"at": "2026-10-28T06:41:19.204Z"
},
{
"type": "note",
"at": "2026-10-28T07:02:10.000Z",
"by": "user_2Nq8",
"text": "Statement pulled, calling after 11."
}
],
"createdAt": "2026-10-28T06:41:19.204Z",
"updatedAt": "2026-10-28T07:02:10.000Z"
},
{
"callbackId": "callback_N2Q0MWM5ZTIteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4Iys5MjMyMTg3NjU0MzIjYTIjY2I",
"organizationId": "a12b7e74-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "c782a4ec-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"assistantId": "80b00435-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"campaignId": "7d41c9e2-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"sessionId": "session_N2Q0MWM5ZTIteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4Iys5MjMyMTg3NjU0MzIjYTI",
"kind": "later",
"reason": "Driving, asked to be called tomorrow at 3 pm.",
"requestedText": "abhi drive kar raha hoon, kal 3 baje call karein",
"callbackAfter": "2026-10-29T15:00:00+05:00",
"timezone": "Asia/Karachi",
"status": "scheduled",
"redial": {
"status": "scheduled",
"at": "2026-10-29T15:00:00+05:00"
},
"timeline": [
{
"type": "created",
"at": "2026-10-28T09:12:00.000Z"
},
{
"type": "redial",
"at": "2026-10-28T09:12:00.000Z",
"redial": {
"status": "scheduled",
"at": "2026-10-29T15:00:00+05:00"
}
}
],
"createdAt": "2026-10-28T09:12:00.000Z",
"updatedAt": "2026-10-28T09:12:00.000Z"
}
]
}{
"message": "Invalid pagination cursor",
"error": "Bad Request",
"statusCode": 400
}{
"message": "invalid authorization",
"error": "Unauthorized",
"statusCode": 401
}{
"message": "Forbidden resource",
"error": "Forbidden",
"statusCode": 403
}{
"message": "Campaign not found: 00000000-0000-4000-8000-000000000000",
"error": "Not Found",
"statusCode": 404
}List a campaign's callback requests
The contacts who asked to be called again, soonest first. Post-call analysis opens these — nothing in the API creates one. Every status comes back, and there is no status query parameter — so to build a “who still needs a call” queue, filter to open in your own code.
kind: human means a person must call. kind: later means the assistant may call again: on a campaign it requeues the contact for callbackAfter (status: scheduled), and the callback becomes done when a redial reaches the contact or failed when the redial cycle runs out.
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}/callbacks \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.upliftai.org/v1/campaigns/{campaignId}/callbacks"
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}/callbacks', 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}/callbacks",
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}/callbacks"
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}/callbacks")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.upliftai.org/v1/campaigns/{campaignId}/callbacks")
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{
"callbacks": [
{
"callbackId": "callback_N2Q0MWM5ZTIteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4Iys5MjMwMDQ1Njc4OTAjYTEjY2I",
"organizationId": "a12b7e74-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "c782a4ec-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"assistantId": "80b00435-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"campaignId": "7d41c9e2-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"sessionId": "session_N2Q0MWM5ZTIteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4Iys5MjMwMDQ1Njc4OTAjYTE",
"kind": "human",
"reason": "Cardholder disputes the late fee and wants an agent to go through the statement.",
"requestedText": "mujhe kisi banday se baat karni hai, kal subah",
"callbackAfter": "2026-10-29T11:00:00+05:00",
"timezone": "Asia/Karachi",
"status": "open",
"timeline": [
{
"type": "created",
"at": "2026-10-28T06:41:19.204Z"
},
{
"type": "note",
"at": "2026-10-28T07:02:10.000Z",
"by": "user_2Nq8",
"text": "Statement pulled, calling after 11."
}
],
"createdAt": "2026-10-28T06:41:19.204Z",
"updatedAt": "2026-10-28T07:02:10.000Z"
},
{
"callbackId": "callback_N2Q0MWM5ZTIteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4Iys5MjMyMTg3NjU0MzIjYTIjY2I",
"organizationId": "a12b7e74-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "c782a4ec-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"assistantId": "80b00435-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"campaignId": "7d41c9e2-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"sessionId": "session_N2Q0MWM5ZTIteHh4eC14eHh4LXh4eHgteHh4eHh4eHh4eHh4Iys5MjMyMTg3NjU0MzIjYTI",
"kind": "later",
"reason": "Driving, asked to be called tomorrow at 3 pm.",
"requestedText": "abhi drive kar raha hoon, kal 3 baje call karein",
"callbackAfter": "2026-10-29T15:00:00+05:00",
"timezone": "Asia/Karachi",
"status": "scheduled",
"redial": {
"status": "scheduled",
"at": "2026-10-29T15:00:00+05:00"
},
"timeline": [
{
"type": "created",
"at": "2026-10-28T09:12:00.000Z"
},
{
"type": "redial",
"at": "2026-10-28T09:12:00.000Z",
"redial": {
"status": "scheduled",
"at": "2026-10-29T15:00:00+05:00"
}
}
],
"createdAt": "2026-10-28T09:12:00.000Z",
"updatedAt": "2026-10-28T09:12:00.000Z"
}
]
}{
"message": "Invalid pagination cursor",
"error": "Bad Request",
"statusCode": 400
}{
"message": "invalid authorization",
"error": "Unauthorized",
"statusCode": 401
}{
"message": "Forbidden resource",
"error": "Forbidden",
"statusCode": 403
}{
"message": "Campaign not found: 00000000-0000-4000-8000-000000000000",
"error": "Not Found",
"statusCode": 404
}Authorizations
Project API key (sk_api_…).
Path Parameters
Query Parameters
Only this kind. human also returns callbacks from before kinds existed, which were all for a person. A filtered page can be short, or empty, and still have nextCursor.
human, later Rows per page. Larger values are clamped to 100.
x >= 1The nextCursor returned by the previous page.
