curl --request GET \
--url https://api.example.com/api/v1/campaigns/{campaign_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.example.com/api/v1/campaigns/{campaign_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.example.com/api/v1/campaigns/{campaign_id}', 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.example.com/api/v1/campaigns/{campaign_id}",
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.example.com/api/v1/campaigns/{campaign_id}"
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.example.com/api/v1/campaigns/{campaign_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/campaigns/{campaign_id}")
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{
"campaign_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"type": "<string>",
"status": "draft",
"launch_type": "immediate",
"daily_limit": 123,
"sending_window_start": "<string>",
"sending_window_end": "<string>",
"min_interval_seconds": 123,
"timezone": "<string>",
"steps_config": [
{
"step": 2,
"delay_days": 1,
"channel": "email",
"variants": [
{
"label": "<string>",
"weight": 50,
"type": "TEMPLATE",
"template_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sender_profile_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"message_template": "<string>",
"prompt_name": "<string>"
}
],
"include_catch_all": false,
"ai_personalization_enabled": true,
"track_clicks": false,
"track_opens": false,
"attachments": [
{
"attachment_id": "<string>",
"filename": "<string>",
"mime_type": "<string>",
"size_bytes": 2000000,
"sha256": "<string>"
}
],
"action_type": "connection_request",
"message_template": "<string>",
"media": {
"url": "<string>",
"media_asset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"gate": {
"gate_on": "<string>",
"gate_timeout_days": 15,
"gate_on_timeout_step": 2
},
"end_sequence": false
}
],
"send_days": [
"<string>"
],
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"dataset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"discovery_enabled": false,
"discovery_targeting": {
"enforced": [
"<string>"
],
"not_enforceable": [
"<string>"
]
},
"description": "<string>",
"start_date": "2023-11-07T05:31:56Z",
"alias_ids": [
"<string>"
],
"connected_mailbox_ids": [
"<string>"
],
"connected_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"total_leads": 123,
"processed_leads": 0,
"launch_job_id": "<string>",
"launch_requested_at": "2023-11-07T05:31:56Z",
"launch_error": "<string>",
"system_prompt": "<string>",
"unreviewed_launch_policy": "launch_default",
"paused_reason": "<string>",
"playground_discovery_dismissed_at": "2023-11-07T05:31:56Z",
"locked_through": 123,
"metrics": {
"sent": 0,
"delivered": 0,
"opened": 0,
"clicked": 0,
"replied": 0,
"bounced": 0,
"unsubscribed": 0,
"open_rate": "0.0",
"click_rate": "0.0",
"reply_rate": "0.0",
"bounce_rate": "0.0",
"delivery_rate": "0.0",
"linkedin_requests_sent": 0,
"linkedin_accepted": 0,
"linkedin_replied": 0,
"linkedin_acceptance_rate": "0.0",
"linkedin_reply_rate": "0.0",
"channel": "email"
},
"compliance_footer_enabled": false,
"list_unsub_enabled": false,
"compliance_risk_ack_at": "2023-11-07T05:31:56Z",
"compliance_risk_ack_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Get Campaign
Get a specific campaign by ID (org-scoped).
Args: campaign_id: Campaign ID org_context: Resolved org scope for the request (B1b-read) service: Campaign service instance
Returns: Campaign response with total leads count
curl --request GET \
--url https://api.example.com/api/v1/campaigns/{campaign_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.example.com/api/v1/campaigns/{campaign_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.example.com/api/v1/campaigns/{campaign_id}', 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.example.com/api/v1/campaigns/{campaign_id}",
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.example.com/api/v1/campaigns/{campaign_id}"
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.example.com/api/v1/campaigns/{campaign_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/campaigns/{campaign_id}")
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{
"campaign_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"user_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"type": "<string>",
"status": "draft",
"launch_type": "immediate",
"daily_limit": 123,
"sending_window_start": "<string>",
"sending_window_end": "<string>",
"min_interval_seconds": 123,
"timezone": "<string>",
"steps_config": [
{
"step": 2,
"delay_days": 1,
"channel": "email",
"variants": [
{
"label": "<string>",
"weight": 50,
"type": "TEMPLATE",
"template_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sender_profile_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"message_template": "<string>",
"prompt_name": "<string>"
}
],
"include_catch_all": false,
"ai_personalization_enabled": true,
"track_clicks": false,
"track_opens": false,
"attachments": [
{
"attachment_id": "<string>",
"filename": "<string>",
"mime_type": "<string>",
"size_bytes": 2000000,
"sha256": "<string>"
}
],
"action_type": "connection_request",
"message_template": "<string>",
"media": {
"url": "<string>",
"media_asset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
},
"gate": {
"gate_on": "<string>",
"gate_timeout_days": 15,
"gate_on_timeout_step": 2
},
"end_sequence": false
}
],
"send_days": [
"<string>"
],
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"dataset_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"discovery_enabled": false,
"discovery_targeting": {
"enforced": [
"<string>"
],
"not_enforceable": [
"<string>"
]
},
"description": "<string>",
"start_date": "2023-11-07T05:31:56Z",
"alias_ids": [
"<string>"
],
"connected_mailbox_ids": [
"<string>"
],
"connected_account_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"total_leads": 123,
"processed_leads": 0,
"launch_job_id": "<string>",
"launch_requested_at": "2023-11-07T05:31:56Z",
"launch_error": "<string>",
"system_prompt": "<string>",
"unreviewed_launch_policy": "launch_default",
"paused_reason": "<string>",
"playground_discovery_dismissed_at": "2023-11-07T05:31:56Z",
"locked_through": 123,
"metrics": {
"sent": 0,
"delivered": 0,
"opened": 0,
"clicked": 0,
"replied": 0,
"bounced": 0,
"unsubscribed": 0,
"open_rate": "0.0",
"click_rate": "0.0",
"reply_rate": "0.0",
"bounce_rate": "0.0",
"delivery_rate": "0.0",
"linkedin_requests_sent": 0,
"linkedin_accepted": 0,
"linkedin_replied": 0,
"linkedin_acceptance_rate": "0.0",
"linkedin_reply_rate": "0.0",
"channel": "email"
},
"compliance_footer_enabled": false,
"list_unsub_enabled": false,
"compliance_risk_ack_at": "2023-11-07T05:31:56Z",
"compliance_risk_ack_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Response
Successful Response
Response model for campaign.
Unique campaign identifier
Owner user ID
Campaign name
Campaign type (email, linkedin, mixed)
Current campaign status
draft, launching, scoring, review_ready, scheduled, active, draining, paused, completed, failed Launch type
immediate, scheduled Max actions per day
Daily sending window start
Daily sending window end
Min seconds between actions
Timezone for sending window
Steps configuration
Show child attributes
Show child attributes
Days of week to send
Creation timestamp
Last update timestamp
Associated dataset ID
Whether continuous discovery is currently enabled.
What continuous discovery enforces against LinkedIn data, and which saved filters it cannot verify.
Show child attributes
Show child attributes
Campaign description
Scheduled start date
Bavimail alias IDs
Connected mailbox emails to send from (peer of alias_ids, mig 272)
Connected account for LinkedIn
Total leads in campaign
Leads not in pending/active status
ARQ job ID for background launch
When launch was requested
Error message if launch failed
Campaign-level personalization prompt override (migration 108).
Policy for scheduled launch without playground review (migration 108).
launch_default, hold, cancel Reason the campaign is paused, e.g. 'pending_personalization_review' (migration 108).
When the owner dismissed the playground discovery banner (migration 108).
Highest step index reached by a non-terminal lead. Steps up to and including this are locked; later steps are the editable tail.
Per-campaign engagement metrics (open_rate/reply_rate etc.) for the list view. Same computation as GET /campaigns/{id}/stats.
Show child attributes
Show child attributes
CASL opt-in: compliance footer enabled for this campaign.
CASL opt-in: List-Unsubscribe header enabled for this campaign.
§9 risk-shift audit: when the no-footer risk was acknowledged.
§9 risk-shift audit: user who acknowledged (frontend-written).