List campaigns
curl --request GET \
--url https://api.goyappr.com/campaigns \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.goyappr.com/campaigns"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.goyappr.com/campaigns', 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.goyappr.com/campaigns",
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.goyappr.com/campaigns"
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.goyappr.com/campaigns")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goyappr.com/campaigns")
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{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"company_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "July reactivation",
"description": "<string>",
"status": "draft",
"agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"agent": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"type": "prompt",
"flow_config": {
"nodes": [
{
"id": "<string>",
"type": "start",
"name": "<string>",
"position": {
"x": 123,
"y": 123
},
"agent_speaks_first": true,
"greeting": "<string>",
"is_literal": false,
"next_step_id": "<string>",
"auto_advance": true
}
],
"flow_config_version": "1",
"metadata": {
"custom_metadata_keys": [
"<string>"
]
}
},
"system_prompt": "<string>",
"description": "<string>",
"voice": "Michal",
"background_sound": "call_center",
"background_sound_volume": 0.3,
"language": "he",
"temperature": 1,
"greeting_message": "<string>",
"agent_speaks_first": true,
"vad_stop_secs": 0.5,
"vad_start_secs": 0.2,
"vad_confidence": 0.7,
"silence_timeout_secs": 60,
"max_continuous_speech_secs": 120,
"max_call_duration_secs": 600,
"lead_memory_enabled": true,
"is_active": true,
"webhook_url": "<string>",
"webhook_events": [
"call.started"
],
"webhook_headers": {
"Authorization": "Bearer sk_live_…",
"X-Source": "yappr"
},
"extraction_parameters": [
{
"name": "customerName",
"description": "The caller's full name as mentioned during the conversation"
}
],
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
},
"from_phone_number_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"from_phone_number": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"number": "+972551234567",
"friendly_name": "<string>",
"provider": "<string>",
"status": "active",
"is_active": true,
"inbound_agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"outbound_agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sip_inbound_configured": true,
"sip_outbound_configured": true,
"country_code": "<string>",
"monthly_cost": 123,
"created_at": "2023-11-07T05:31:56Z",
"carrier_account": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"provider": "telnyx",
"status": "untested"
},
"ownership_verified_at": "2023-11-07T05:31:56Z"
},
"from_number": "+972551234567",
"retry_rules": {},
"calling_window": {},
"stop_disposition_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"stop_dispositions": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"label": "<string>",
"color": "#22c55e",
"position": 123,
"is_protected": true,
"created_at": "2023-11-07T05:31:56Z"
}
],
"stop_on_no_answer": false,
"stop_on_voicemail": false,
"stop_on_unclassified": false,
"max_attempts": 3,
"max_infra_retries": 3,
"retry_no_answer_seconds": 3600,
"retry_completed_seconds": 86400,
"randomize_retry_time": false,
"double_dial_enabled": false,
"double_dial_gap_seconds": 90,
"max_calls_per_day": 200,
"min_seconds_between_calls": 30,
"max_in_flight": 2,
"budget_cents": 2,
"regulatory_basis": "lawful_basis_confirmed",
"starts_at": "2023-11-07T05:31:56Z",
"ends_at": "2023-11-07T05:31:56Z",
"daily_admitted_count": 123,
"daily_window_date": "2023-12-25",
"last_admitted_at": "2023-11-07T05:31:56Z",
"estimate_cents": 123,
"spent_cents": 123,
"reserved_cents": 123,
"last_tick_at": "2023-11-07T05:31:56Z",
"last_tick_result": "<string>",
"last_error": "<string>",
"started_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"total_leads": 123,
"stats": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"created_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"pagination": {
"total": 123,
"limit": 123,
"offset": 123
},
"company_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}Campaigns
List campaigns
Newest-first. Required scope campaigns:read.
GET
/
campaigns
List campaigns
curl --request GET \
--url https://api.goyappr.com/campaigns \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.goyappr.com/campaigns"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.goyappr.com/campaigns', 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.goyappr.com/campaigns",
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.goyappr.com/campaigns"
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.goyappr.com/campaigns")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goyappr.com/campaigns")
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{
"data": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"company_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "July reactivation",
"description": "<string>",
"status": "draft",
"agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"agent": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"type": "prompt",
"flow_config": {
"nodes": [
{
"id": "<string>",
"type": "start",
"name": "<string>",
"position": {
"x": 123,
"y": 123
},
"agent_speaks_first": true,
"greeting": "<string>",
"is_literal": false,
"next_step_id": "<string>",
"auto_advance": true
}
],
"flow_config_version": "1",
"metadata": {
"custom_metadata_keys": [
"<string>"
]
}
},
"system_prompt": "<string>",
"description": "<string>",
"voice": "Michal",
"background_sound": "call_center",
"background_sound_volume": 0.3,
"language": "he",
"temperature": 1,
"greeting_message": "<string>",
"agent_speaks_first": true,
"vad_stop_secs": 0.5,
"vad_start_secs": 0.2,
"vad_confidence": 0.7,
"silence_timeout_secs": 60,
"max_continuous_speech_secs": 120,
"max_call_duration_secs": 600,
"lead_memory_enabled": true,
"is_active": true,
"webhook_url": "<string>",
"webhook_events": [
"call.started"
],
"webhook_headers": {
"Authorization": "Bearer sk_live_…",
"X-Source": "yappr"
},
"extraction_parameters": [
{
"name": "customerName",
"description": "The caller's full name as mentioned during the conversation"
}
],
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
},
"from_phone_number_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"from_phone_number": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"number": "+972551234567",
"friendly_name": "<string>",
"provider": "<string>",
"status": "active",
"is_active": true,
"inbound_agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"outbound_agent_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"sip_inbound_configured": true,
"sip_outbound_configured": true,
"country_code": "<string>",
"monthly_cost": 123,
"created_at": "2023-11-07T05:31:56Z",
"carrier_account": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"name": "<string>",
"provider": "telnyx",
"status": "untested"
},
"ownership_verified_at": "2023-11-07T05:31:56Z"
},
"from_number": "+972551234567",
"retry_rules": {},
"calling_window": {},
"stop_disposition_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"stop_dispositions": [
{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"label": "<string>",
"color": "#22c55e",
"position": 123,
"is_protected": true,
"created_at": "2023-11-07T05:31:56Z"
}
],
"stop_on_no_answer": false,
"stop_on_voicemail": false,
"stop_on_unclassified": false,
"max_attempts": 3,
"max_infra_retries": 3,
"retry_no_answer_seconds": 3600,
"retry_completed_seconds": 86400,
"randomize_retry_time": false,
"double_dial_enabled": false,
"double_dial_gap_seconds": 90,
"max_calls_per_day": 200,
"min_seconds_between_calls": 30,
"max_in_flight": 2,
"budget_cents": 2,
"regulatory_basis": "lawful_basis_confirmed",
"starts_at": "2023-11-07T05:31:56Z",
"ends_at": "2023-11-07T05:31:56Z",
"daily_admitted_count": 123,
"daily_window_date": "2023-12-25",
"last_admitted_at": "2023-11-07T05:31:56Z",
"estimate_cents": 123,
"spent_cents": 123,
"reserved_cents": 123,
"last_tick_at": "2023-11-07T05:31:56Z",
"last_tick_result": "<string>",
"last_error": "<string>",
"started_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"total_leads": 123,
"stats": {},
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"created_by": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}
],
"pagination": {
"total": 123,
"limit": 123,
"offset": 123
},
"company_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a"
}{
"error": "<string>",
"code": "<string>"
}{
"error": "<string>",
"code": "<string>"
}Returns your workspace’s campaigns, newest first, with
Each row carries the full campaign object; the sample above is trimmed to the interesting fields. See
agent, from_phone_number and stop_dispositions expanded to the full objects they reference. Archived campaigns are excluded.
Required scope: campaigns:read.
Query parameters
| Parameter | Type | Default | Notes |
|---|---|---|---|
status | string | — | Comma-separated list of statuses to keep. Whitespace around each value is trimmed, so running, paused works. Omit for every non-archived campaign. |
limit | integer | 50 | Page size. Clamped to 1–200. |
offset | integer | 0 | Rows to skip. Negative values are treated as 0. |
Statuses
| Status | Meaning |
|---|---|
draft | Created but never launched. Nothing dials. |
scheduled | Queued to start; treated like running once its schedule opens. |
running | Actively working the list. |
paused | Paused by you. Does not auto-resume — a top-up or a config fix will not restart it. |
paused_insufficient_credit | Balance fell below the minimum needed to place a call. Auto-resumes once you top up. |
paused_budget | budget_cents reached, counting in-flight worst case. Raise the budget and resume. |
paused_infra | Voice capacity is unhealthy or the queue is not draining. Transient. |
paused_config | A permanent configuration problem — inactive from-number, agent with no duration cap, no reachable calling window. Pauses on first occurrence rather than retrying forever. |
completed | Every enrolled contact reached a terminal state. |
stopped | Stopped by you. Terminal. |
archived | Soft-deleted. Never returned by this endpoint. |
Example request
# Everything (first page)
curl "https://api.goyappr.com/campaigns" \
-H "Authorization: Bearer $YAPPR_API_KEY"
# Only the ones that need attention
curl "https://api.goyappr.com/campaigns?status=paused,paused_insufficient_credit,paused_budget,paused_config" \
-H "Authorization: Bearer $YAPPR_API_KEY"
# Second page of 25
curl "https://api.goyappr.com/campaigns?limit=25&offset=25" \
-H "Authorization: Bearer $YAPPR_API_KEY"
Example response
{
"data": [
{
"id": "b3f1c0d2-5a44-4f0e-9c11-7a2e8d3f0001",
"name": "July renewals",
"status": "running",
"agent_id": "7e8a91c1-0000-4c11-9a00-000000000001",
"from_phone_number_id": "2d9f4b6a-0000-4a3c-8b21-000000000002",
"stop_disposition_ids": ["5c1d9a2e-0000-4b10-9f31-000000000010"],
"randomize_retry_time": true,
"max_attempts": 3,
"max_calls_per_day": 150,
"min_seconds_between_calls": 45,
"max_in_flight": 2,
"daily_admitted_count": 37,
"daily_window_date": "2026-07-28",
"last_admitted_at": "2026-07-28T11:58:04.010Z",
"budget_cents": 50000,
"spent_cents": 8140,
"reserved_cents": 1000,
"regulatory_basis": "existing_customer",
"last_tick_at": "2026-07-28T11:59:00.412Z",
"last_tick_result": "spacing",
"last_error": null,
"started_at": "2026-07-27T06:00:11.900Z",
"completed_at": null,
"total_leads": 412,
"stats": {},
"created_at": "2026-07-26T09:14:22.123Z",
"updated_at": "2026-07-28T11:59:00.412Z",
"agent": { "id": "7e8a91c1-0000-4c11-9a00-000000000001", "name": "Renewals agent" },
"from_phone_number": { "id": "2d9f4b6a-0000-4a3c-8b21-000000000002", "phone_number": "+972737000000" },
"stop_dispositions": [
{ "id": "5c1d9a2e-0000-4b10-9f31-000000000010", "label": "Do Not Call" }
]
}
],
"pagination": { "total": 4, "limit": 50, "offset": 0 },
"company_id": "fe493f11-0000-0000-0000-000000000001"
}
GET /campaigns/{id} for the complete field reference.
An unknown value in status is not an error — it simply matches nothing, so check pagination.total before concluding a campaign disappeared.
Errors
| HTTP | Code | When |
|---|---|---|
| 401 | INSUFFICIENT_SCOPE | API key lacks campaigns:read. |
| 500 | — | The list query failed. Safe to retry. |
Authorizations
Your Yappr API key (e.g. ypr_live_...). Generate one in the dashboard under Settings → API Keys.
Query Parameters
Comma-separated list of statuses to include, e.g. running,paused_insufficient_credit. Omit for every non-archived campaign.
Required range:
x <= 200