API ReferenceCampaigns
Campaign progress
GET /api/v1/campaign/{id}/progress — live progress, source sync, rate-limit, and lifecycle timestamps.
GET /api/v1/campaign/{campaign_id}/progressLightweight live status — designed for dashboarding. Per-contact results live on campaign-runs, and the per-outcome breakdown (busy / no-answer / etc.) on GET /calls?campaign_id={id} via connectionStatus; this endpoint reports the aggregates. For why a campaign moved to paused or failed, read the structured logs[] field on the campaign itself (see get-campaign).
Response
{
"campaign_id": 7,
"state": "running",
"total_rows": 500,
"processed_rows": 120,
"failed_calls": 25,
"progress_percentage": 24.0,
"source_sync": {
"in_progress": false,
"last_synced": "2026-06-16T10:00:00Z",
"rows_synced": 500
},
"rate_limit": 5,
"started_at": "2026-06-16T10:05:00Z",
"completed_at": null
}| Field | Type | Notes |
|---|---|---|
campaign_id | int | Echo. |
state | string | created, syncing, running, paused, completed, failed. |
total_rows | int | Total contacts queued for the campaign. |
processed_rows | int | Calls dispatched (regardless of outcome). |
failed_calls | int | Calls that ended with a non-success outcome. |
progress_percentage | float | processed_rows / total_rows * 100. |
source_sync | object | Status of the most recent CSV sync. |
rate_limit | int | Current effective concurrency cap (org limit + max_concurrency). |
started_at / completed_at | ISO 8601 | null | Lifecycle timestamps. |
Examples
curl https://dashboard.zoxa.ai/api/v1/campaign/7/progress \
-H "X-API-Key: zsk_..."Errors
| Status | detail | When |
|---|---|---|
404 | "Campaign not found" | Id not in your org. |
Related
GET /campaign/{id}/runs— per-contact outcomes; combine withGET /calls?campaign_id={id}to count busy / no-answer separately viaconnectionStatusGET /campaign/{id}— full campaign detail including the structuredlogs[]event timeline