Skip to main content
Get real-time progress and metrics for a campaign. Use this endpoint for dashboard displays and progress tracking.
For live updates without polling, use the Campaign Progress WebSocket instead.

Path Parameters

  • campaign_id (integer, required): The unique identifier of the campaign

Response

Response
{
  "campaign_id": 42,
  "status": "running",
  "progress": {
    "total_contacts": 500,
    "completed": 325,
    "failed": 25,
    "processing": 5,
    "pending": 145,
    "progress_percentage": 70.0,
    "success_rate": 92.86
  },
  "metrics": {
    "total_duration_seconds": 14625,
    "average_duration_seconds": 45,
    "success_rate": 92.86,
    "answer_rate": 85.0,
    "completion_rate": 70.0,
    "cost_estimate": 25.50,
    "actual_cost": 18.75,
    "last_updated": "2024-02-15T14:30:00Z"
  },
  "started_at": "2024-02-15T09:00:00Z",
  "completed_at": null,
  "recent_activity": [
    {
      "execution_id": 1001,
      "contact_phone": "+15551234567",
      "status": "completed",
      "executed_at": "2024-02-15T14:29:30Z",
      "call_id": "CA123abc456def"
    },
    {
      "execution_id": 1000,
      "contact_phone": "+15559876543",
      "status": "failed",
      "executed_at": "2024-02-15T14:28:45Z",
      "call_id": "CA789ghi012jkl"
    }
  ]
}

Response Fields

Progress Object

FieldDescription
total_contactsTotal contacts to process
completedSuccessfully contacted
failedFailed contact attempts
processingCurrently being contacted
pendingWaiting to be contacted
progress_percentageCompletion percentage
success_rateSuccess rate (completed / (completed + failed))

Metrics Object

FieldDescription
total_duration_secondsTotal call time
average_duration_secondsAverage call duration
success_rateSuccess percentage
answer_rateCalls answered percentage
completion_rateProgress percentage
cost_estimateEstimated total cost
actual_costActual cost so far
last_updatedLast metrics update

Recent Activity

Array of recent execution events (most recent first):
FieldDescription
execution_idExecution record ID
contact_phoneContact’s phone number
statusExecution status
executed_atExecution timestamp
call_idCall SID (for calls)

Example Code

cURL
curl -X GET "https://api.burki.dev/api/v1/campaigns/42/progress" \
  -H "Authorization: Bearer YOUR_API_KEY"
Python
import requests
import time

def monitor_campaign(campaign_id, api_key):
    """Poll campaign progress until complete."""
    while True:
        response = requests.get(
            f"https://api.burki.dev/api/v1/campaigns/{campaign_id}/progress",
            headers={"Authorization": f"Bearer {api_key}"}
        )
        
        data = response.json()
        progress = data["progress"]
        
        print(f"Progress: {progress['completed']}/{progress['total_contacts']} "
              f"({progress['progress_percentage']:.1f}%)")
        print(f"Success rate: {progress['success_rate']:.1f}%")
        
        if data["status"] in ["completed", "cancelled", "failed"]:
            print(f"Campaign {data['status']}")
            break
        
        time.sleep(5)  # Poll every 5 seconds

monitor_campaign(42, "YOUR_API_KEY")
JavaScript
async function monitorCampaign(campaignId, apiKey) {
  while (true) {
    const response = await fetch(
      `https://api.burki.dev/api/v1/campaigns/${campaignId}/progress`,
      {
        headers: { "Authorization": `Bearer ${apiKey}` }
      }
    );
    
    const data = await response.json();
    const progress = data.progress;
    
    console.log(`Progress: ${progress.completed}/${progress.total_contacts} ` +
                `(${progress.progress_percentage.toFixed(1)}%)`);
    console.log(`Success rate: ${progress.success_rate.toFixed(1)}%`);
    
    if (["completed", "cancelled", "failed"].includes(data.status)) {
      console.log(`Campaign ${data.status}`);
      break;
    }
    
    await new Promise(resolve => setTimeout(resolve, 5000));
  }
}

monitorCampaign(42, "YOUR_API_KEY");

Error Responses

Status CodeDescription
404Campaign not found
401Unauthorized

Polling Recommendations

ScenarioRecommended Interval
Active dashboard5-10 seconds
Background monitoring30-60 seconds
Batch processingOn-demand
For real-time updates without polling overhead, use the WebSocket endpoint.