curl -X GET "https://api.sayvy.ai/api/v1/campaigns?status_filter=sending&limit=20&page=1" \
-H "Authorization: Bearer <token>"
import requests
url = "https://api.sayvy.ai/api/v1/campaigns"
params = {
"status_filter": "sending",
"limit": 20,
"page": 1
}
headers = {
"Authorization": "Bearer <token>"
}
response = requests.get(url, params=params, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch("https://api.sayvy.ai/api/v1/campaigns?status_filter=sending&limit=20&page=1", {
method: "GET",
headers: {
"Authorization": "Bearer <token>"
}
});
const data = await response.json();
console.log(data);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sayvy.ai/api/v1/campaigns?status_filter=sending&limit=20&page=1"))
.header("Authorization", "Bearer <token>")
.GET()
.build();
HttpResponse<String> response =
HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
{
"has_more": false,
"total": 1,
"page": 1,
"limit": 20,
"items": [
{
"id": "e4a2e584-3672-4d69-b541-6e9f1a238491",
"organization_id": "93f35dc2-5d46-4e58-a9ee-038c35d9bcf1",
"name": "Q3 Lead Reactivation",
"whatsapp_phone_number_id": "8f3b0e2a-71d3-4a5f-9e6b-123456789abc",
"message_template_id": "3a4b5c6d-7e8f-9012-3456-789abcdef012",
"audience_type": "tags",
"audience_tags": [
"high_intent",
"q3_leads"
],
"audience_contact_ids": null,
"scheduled_at": "2026-09-15T14:00:00Z",
"status": "sending",
"total_contacts_count": 450,
"sent_count": 432,
"delivered_count": 418,
"read_count": 312,
"failed_count": 14,
"created_at": "2026-09-07T10:30:00Z",
"updated_at": "2026-09-07T14:15:00Z"
}
]
}
{
"detail": "Unauthorized"
}
Campaigns
List campaigns
Retrieve a paginated list of campaigns for the organization with live broadcast metrics
GET
/
api
/
v1
/
campaigns
curl -X GET "https://api.sayvy.ai/api/v1/campaigns?status_filter=sending&limit=20&page=1" \
-H "Authorization: Bearer <token>"
import requests
url = "https://api.sayvy.ai/api/v1/campaigns"
params = {
"status_filter": "sending",
"limit": 20,
"page": 1
}
headers = {
"Authorization": "Bearer <token>"
}
response = requests.get(url, params=params, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch("https://api.sayvy.ai/api/v1/campaigns?status_filter=sending&limit=20&page=1", {
method: "GET",
headers: {
"Authorization": "Bearer <token>"
}
});
const data = await response.json();
console.log(data);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sayvy.ai/api/v1/campaigns?status_filter=sending&limit=20&page=1"))
.header("Authorization", "Bearer <token>")
.GET()
.build();
HttpResponse<String> response =
HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
{
"has_more": false,
"total": 1,
"page": 1,
"limit": 20,
"items": [
{
"id": "e4a2e584-3672-4d69-b541-6e9f1a238491",
"organization_id": "93f35dc2-5d46-4e58-a9ee-038c35d9bcf1",
"name": "Q3 Lead Reactivation",
"whatsapp_phone_number_id": "8f3b0e2a-71d3-4a5f-9e6b-123456789abc",
"message_template_id": "3a4b5c6d-7e8f-9012-3456-789abcdef012",
"audience_type": "tags",
"audience_tags": [
"high_intent",
"q3_leads"
],
"audience_contact_ids": null,
"scheduled_at": "2026-09-15T14:00:00Z",
"status": "sending",
"total_contacts_count": 450,
"sent_count": 432,
"delivered_count": 418,
"read_count": 312,
"failed_count": 14,
"created_at": "2026-09-07T10:30:00Z",
"updated_at": "2026-09-07T14:15:00Z"
}
]
}
{
"detail": "Unauthorized"
}
Retrieve paginated campaigns belonging to your organization. You can filter by campaign status and retrieve live aggregated delivery telemetry across all listed items.
Authentication
This endpoint requires Bearer token authentication.Authorization: Bearer <token>
| Header | Type | Required | Description | Format |
|---|---|---|---|---|
Authorization | string | Yes | Scoped organization API key or Bearer JWT token | Bearer <token> |
Input parameters
string
required
Bearer token for authentication. Format:
Bearer <token>.string
default:"all"
Filter campaigns by operational status:
all(default): Retrieve campaigns across all states.draft: Draft campaigns not yet queued.scheduled: Slotted for future dispatch.sending: Currently actively dispatching messages.paused: Halted dispatching.completed: Finished sending.cancelled: Terminated before finishing.
number
default:"100"
Maximum number of campaign records to return per page (min
1, max 100).number
default:"1"
Page number to fetch (starts at
1).Response Fields
boolean
Indicates whether subsequent pages of results exist beyond current page and limit.
number
Total count of matching campaigns across all pages.
number
Current page index.
number
Page limit applied.
CampaignResponse[]
Array of campaign objects including live broadcast metrics:
Show Campaign object attributes
Show Campaign object attributes
string
Unique UUID of the campaign.
string
Organization UUID.
string
Campaign display title.
string
Current status (
scheduled, sending, paused, completed, cancelled).string
Channel phone number UUID.
string
Message template UUID or null.
string
Targeting strategy (
all, tags, manual).string[]
Targeted tags if audience_type is
tags.string[]
Targeted contact UUIDs if audience_type is
manual.string
Scheduled time in UTC or null.
number
Total recipients resolved.
number
Count of sent messages.
number
Count of delivered messages.
number
Count of messages opened/read.
number
Count of failed deliveries.
string
ISO 8601 creation timestamp.
string
ISO 8601 last update timestamp.
curl -X GET "https://api.sayvy.ai/api/v1/campaigns?status_filter=sending&limit=20&page=1" \
-H "Authorization: Bearer <token>"
import requests
url = "https://api.sayvy.ai/api/v1/campaigns"
params = {
"status_filter": "sending",
"limit": 20,
"page": 1
}
headers = {
"Authorization": "Bearer <token>"
}
response = requests.get(url, params=params, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch("https://api.sayvy.ai/api/v1/campaigns?status_filter=sending&limit=20&page=1", {
method: "GET",
headers: {
"Authorization": "Bearer <token>"
}
});
const data = await response.json();
console.log(data);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sayvy.ai/api/v1/campaigns?status_filter=sending&limit=20&page=1"))
.header("Authorization", "Bearer <token>")
.GET()
.build();
HttpResponse<String> response =
HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
{
"has_more": false,
"total": 1,
"page": 1,
"limit": 20,
"items": [
{
"id": "e4a2e584-3672-4d69-b541-6e9f1a238491",
"organization_id": "93f35dc2-5d46-4e58-a9ee-038c35d9bcf1",
"name": "Q3 Lead Reactivation",
"whatsapp_phone_number_id": "8f3b0e2a-71d3-4a5f-9e6b-123456789abc",
"message_template_id": "3a4b5c6d-7e8f-9012-3456-789abcdef012",
"audience_type": "tags",
"audience_tags": [
"high_intent",
"q3_leads"
],
"audience_contact_ids": null,
"scheduled_at": "2026-09-15T14:00:00Z",
"status": "sending",
"total_contacts_count": 450,
"sent_count": 432,
"delivered_count": 418,
"read_count": 312,
"failed_count": 14,
"created_at": "2026-09-07T10:30:00Z",
"updated_at": "2026-09-07T14:15:00Z"
}
]
}
{
"detail": "Unauthorized"
}
‹ PreviousNext ›
Get campaign
GET /api/v1/campaigns/{campaign_id}
Was this page helpful?