Get a contact list's metadata
curl --request GET \
--url https://api.upliftai.org/v1/contact-lists/{listId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.upliftai.org/v1/contact-lists/{listId}"
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/contact-lists/{listId}', 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/contact-lists/{listId}",
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/contact-lists/{listId}"
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/contact-lists/{listId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.upliftai.org/v1/contact-lists/{listId}")
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{
"listId": "894ab1c2-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"organizationId": "a12b7e74-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "c782a4ec-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "Shifa Clinic patients — 19 August",
"sourceKind": "csv_upload",
"summary": {
"willBeCalled": 3,
"excluded": {
"invalidPhone": 1,
"missingName": 0,
"duplicate": 1,
"dnc": 0,
"recentlyCalled": 0
},
"errors": [
{
"row": 5,
"issue": "duplicate",
"value": "+923001234567"
},
{
"row": 6,
"issue": "invalidPhone",
"value": "0300"
}
]
},
"contactCount": 3,
"createdAt": "2026-08-18T05:17:55.237Z",
"updatedAt": "2026-08-18T05:17:55.237Z",
"version": 1
}{
"message": "invalid authorization",
"error": "Unauthorized",
"statusCode": 401
}{
"message": "Forbidden resource",
"error": "Forbidden",
"statusCode": 403
}{
"message": "Contact list not found: 00000000-0000-4000-8000-000000000000",
"error": "Not Found",
"statusCode": 404
}Contacts
Get a contact list's metadata
A list’s metadata — how many contacts were kept and which rows were dropped, as recorded when the list was created. It is never recomputed after import, so it is not campaign progress. For the contacts themselves, page /contact-lists/{listId}/contacts.
GET
/
contact-lists
/
{listId}
Get a contact list's metadata
curl --request GET \
--url https://api.upliftai.org/v1/contact-lists/{listId} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.upliftai.org/v1/contact-lists/{listId}"
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/contact-lists/{listId}', 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/contact-lists/{listId}",
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/contact-lists/{listId}"
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/contact-lists/{listId}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.upliftai.org/v1/contact-lists/{listId}")
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{
"listId": "894ab1c2-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"organizationId": "a12b7e74-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"projectId": "c782a4ec-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"name": "Shifa Clinic patients — 19 August",
"sourceKind": "csv_upload",
"summary": {
"willBeCalled": 3,
"excluded": {
"invalidPhone": 1,
"missingName": 0,
"duplicate": 1,
"dnc": 0,
"recentlyCalled": 0
},
"errors": [
{
"row": 5,
"issue": "duplicate",
"value": "+923001234567"
},
{
"row": 6,
"issue": "invalidPhone",
"value": "0300"
}
]
},
"contactCount": 3,
"createdAt": "2026-08-18T05:17:55.237Z",
"updatedAt": "2026-08-18T05:17:55.237Z",
"version": 1
}{
"message": "invalid authorization",
"error": "Unauthorized",
"statusCode": 401
}{
"message": "Forbidden resource",
"error": "Forbidden",
"statusCode": 403
}{
"message": "Contact list not found: 00000000-0000-4000-8000-000000000000",
"error": "Not Found",
"statusCode": 404
}Authorizations
Project API key (sk_api_…).
Path Parameters
Response
The contact list.
Available options:
csv_upload, paste, google_sheets, customer_api Present only when the import supplied an uploadId or a sheet ref — inline rows have none, even when labelled csv_upload.
What the import kept and dropped.
Show child attributes
Show child attributes
Contacts stored — the same number as summary.willBeCalled.
Equal to createdAt, since a list is never edited.
Always 1.
