List campaigns
Returns a paginated list of campaigns for the workspace. Supports filtering by status and searching by name.
curl -X GET "https://api.sendkit.ai/v1/campaigns?status=draft&search=example_string&cursor=665a1b2c3d4e5f6a7b8c9d0e&limit=42" \
-H "Content-Type: application/json" \
-H "X-Api-Key: YOUR_API_KEY"
import requests
import json
url = "https://api.sendkit.ai/v1/campaigns?status=draft&search=example_string&cursor=665a1b2c3d4e5f6a7b8c9d0e&limit=42"
headers = {
"Content-Type": "application/json",
"X-Api-Key": "YOUR_API_KEY"
}
response = requests.get(url, headers=headers)
print(response.json())
const response = await fetch("https://api.sendkit.ai/v1/campaigns?status=draft&search=example_string&cursor=665a1b2c3d4e5f6a7b8c9d0e&limit=42", {
method: "GET",
headers: {
"Content-Type": "application/json",
"X-Api-Key": "YOUR_API_KEY"
}
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://api.sendkit.ai/v1/campaigns?status=draft&search=example_string&cursor=665a1b2c3d4e5f6a7b8c9d0e&limit=42", nil)
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-Api-Key", "YOUR_API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://api.sendkit.ai/v1/campaigns?status=draft&search=example_string&cursor=665a1b2c3d4e5f6a7b8c9d0e&limit=42')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
request['Content-Type'] = 'application/json'
request['X-Api-Key'] = 'YOUR_API_KEY'
response = http.request(request)
puts response.body
{
"success": true,
"data": [
{
"_id": "665a1b2c3d4e5f6a7b8c9d0e",
"name": "Q1 Outreach Campaign",
"status": "active",
"stats": {
"totalLeads": 200,
"contacted": 150,
"contactedLeads": 150,
"totalEmailsSent": 150,
"sent": 150,
"delivered": 145,
"opened": 72,
"clicked": 18,
"replied": 12,
"bounced": 5,
"failed": 0,
"unsubscribed": 2,
"completed": 50,
"active": 100,
"pending": 50,
"softBounces": 2,
"hardBounces": 3
},
"sequence": [
{
"_id": "665a1b2c3d4e5f6a7b8c0001",
"type": "email",
"name": "Initial Email",
"order": 0,
"useVariables": false,
"variables": [],
"variants": [
{
"_id": "665a1b2c3d4e5f6a7b8c0002",
"label": "A",
"subject": "Quick question about {{companyName}}",
"body": "<p>Hi {{firstName}},</p>",
"useVariables": false,
"variables": [],
"enabled": true,
"status": "active"
}
]
},
{
"_id": "665a1b2c3d4e5f6a7b8c0003",
"type": "wait",
"name": "Wait 3 days",
"order": 1,
"waitDays": 3,
"useVariables": false,
"variables": [],
"variants": []
},
{
"_id": "665a1b2c3d4e5f6a7b8c0004",
"type": "follow-up",
"name": "Follow-up 1",
"order": 2,
"useVariables": false,
"variables": [],
"variants": [
{
"_id": "665a1b2c3d4e5f6a7b8c0005",
"label": "A",
"subject": "Re: Quick question about {{companyName}}",
"body": "<p>Just following up...</p>",
"useVariables": false,
"variables": [],
"enabled": true,
"status": "active"
}
]
}
],
"sendingSchedule": {
"timezone": "America/New_York",
"startTime": "09:00",
"endTime": "17:00",
"workingDays": [
1,
2,
3,
4,
5
],
"skipNationalHolidays": false
},
"trackOpens": true,
"trackClicks": true,
"stopOnReply": true,
"startedAt": "2025-06-15T09:00:00.000Z",
"completedAt": null,
"createdAt": "2025-06-10T10:30:00.000Z"
}
],
"pagination": {
"limit": 25,
"total": 1,
"hasMore": false,
"nextCursor": "665a1b2c3d4e5f6a7b8c9d0e"
}
}
/v1/campaigns
Platform API key (sk_user_...) or Workspace API key (sk_...)
Filter campaigns by status
Search campaigns by name (case-insensitive partial match)
Cursor for pagination - use the nextCursor value from the previous response to fetch the next page
Items per page (default 25, max 100)
Request Preview
Response
Response will appear here after sending the request
Authentication
API Key for authentication. Platform API key (sk_user_...) or Workspace API key (sk_...)
Query Parameters
Search campaigns by name (case-insensitive partial match)
Cursor for pagination - use the nextCursor value from the previous response to fetch the next page
Items per page (default 25, max 100)
Responses
draftactivepausedcompletedarchivedReplies with a positive AI tag (e.g. Interested, Meeting Request)
emailfollow-upwaitNumber of days to wait (wait steps only)
Email variants for A/B testing (email/follow-up steps only)
Variant label — single uppercase letter A-Z. Must be unique within a step but does not need to be sequential or start at A.
HTML email body
disabledautodisabledskip_allskip_providersLast updated 4 days ago
Built with Documentation.AI