> ## Documentation Index
> Fetch the complete documentation index at: https://docs.usecrew.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Bulk Calls

> Execute large-scale outbound calling campaigns

# Bulk Calls

Bulk calls allow you to place hundreds or thousands of outbound calls efficiently. Use them for appointment reminders, payment follow-ups, surveys, and notification campaigns.

## Use Cases

| Campaign Type             | Description                                 |
| ------------------------- | ------------------------------------------- |
| **Appointment Reminders** | Confirm upcoming appointments at scale      |
| **Payment Collections**   | Remind customers about outstanding balances |
| **Surveys & Feedback**    | Gather responses from large groups          |
| **Notifications**         | Deliver important updates                   |
| **Re-engagement**         | Reach out to dormant customers              |
| **Lead Qualification**    | Screen and qualify sales leads              |

## Creating a Campaign

### Via Dashboard

<Steps>
  <Step title="Navigate to Campaigns">
    Go to your Crew and select **Outbound** → **Campaigns**
  </Step>

  <Step title="Create New Campaign">
    Click **New Campaign** and name it
  </Step>

  <Step title="Upload Contact List">
    Upload a CSV with phone numbers and context data
  </Step>

  <Step title="Configure Settings">
    Set agent, schedule, retry logic, and limits
  </Step>

  <Step title="Review and Launch">
    Preview the campaign and start it
  </Step>
</Steps>

### Via API

```bash theme={null}
curl -X POST https://api.usecrew.ai/v1/campaigns \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "January Appointment Reminders",
    "agent_id": "agent_sarah",
    "pathway_id": "appointment_reminder",
    "contacts": [
      {
        "phone": "+14155551111",
        "context": {
          "name": "John Smith",
          "appointment_date": "January 15, 2024",
          "appointment_time": "2:00 PM"
        }
      },
      {
        "phone": "+14155552222",
        "context": {
          "name": "Jane Doe",
          "appointment_date": "January 15, 2024",
          "appointment_time": "3:00 PM"
        }
      }
    ],
    "schedule": {
      "start": "2024-01-14T09:00:00Z",
      "end": "2024-01-14T17:00:00Z",
      "timezone": "America/New_York"
    }
  }'
```

## Contact List Format

### CSV Upload

```csv theme={null}
phone,name,appointment_date,appointment_time,provider
+14155551111,John Smith,January 15 2024,2:00 PM,Dr. Johnson
+14155552222,Jane Doe,January 15 2024,3:00 PM,Dr. Williams
+14155553333,Bob Wilson,January 16 2024,10:00 AM,Dr. Johnson
```

### Required Fields

| Field   | Description                           |
| ------- | ------------------------------------- |
| `phone` | Phone number (E.164 format preferred) |

### Optional Context Fields

Any additional columns become context variables available in your pathway:

```
"Hi {{name}}, this is a reminder about your appointment 
with {{provider}} on {{appointment_date}} at {{appointment_time}}."
```

## Campaign Configuration

### Scheduling

Control when calls are placed:

```json theme={null}
{
  "schedule": {
    "start": "2024-01-14T09:00:00Z",
    "end": "2024-01-14T17:00:00Z",
    "timezone": "America/New_York",
    "days": ["monday", "tuesday", "wednesday", "thursday", "friday"],
    "excluded_dates": ["2024-01-15"]
  }
}
```

### Pacing

Control call rate:

```json theme={null}
{
  "pacing": {
    "calls_per_minute": 30,
    "max_concurrent": 10
  }
}
```

| Plan         | Max Calls/Minute | Max Concurrent |
| ------------ | ---------------- | -------------- |
| Starter      | 10               | 5              |
| Professional | 60               | 25             |
| Enterprise   | Custom           | Custom         |

### Retry Logic

Configure retry behavior for unanswered calls:

```json theme={null}
{
  "retry": {
    "enabled": true,
    "max_attempts": 3,
    "interval_hours": 4,
    "retry_on": ["no_answer", "busy", "voicemail"]
  }
}
```

### Caller ID

Set the outgoing caller ID:

```json theme={null}
{
  "caller_id": {
    "number": "+14155550000",
    "name": "Acme Medical"
  }
}
```

## Campaign States

| State       | Description                      |
| ----------- | -------------------------------- |
| `draft`     | Campaign created but not started |
| `scheduled` | Waiting for start time           |
| `running`   | Actively placing calls           |
| `paused`    | Temporarily stopped              |
| `completed` | All calls attempted              |
| `cancelled` | Stopped before completion        |

### Managing Campaign State

```bash theme={null}
# Pause a running campaign
curl -X POST https://api.usecrew.ai/v1/campaigns/{campaign_id}/pause \
  -H "Authorization: Bearer YOUR_API_KEY"

# Resume a paused campaign
curl -X POST https://api.usecrew.ai/v1/campaigns/{campaign_id}/resume \
  -H "Authorization: Bearer YOUR_API_KEY"

# Cancel a campaign
curl -X POST https://api.usecrew.ai/v1/campaigns/{campaign_id}/cancel \
  -H "Authorization: Bearer YOUR_API_KEY"
```

## Monitoring Campaigns

### Real-Time Dashboard

The campaign dashboard shows:

* Progress (calls attempted / total)
* Current status
* Outcome breakdown
* Active calls
* Errors and failures

### API Status

```bash theme={null}
curl https://api.usecrew.ai/v1/campaigns/{campaign_id}/status \
  -H "Authorization: Bearer YOUR_API_KEY"
```

```json theme={null}
{
  "campaign_id": "campaign_abc123",
  "status": "running",
  "progress": {
    "total": 1000,
    "attempted": 456,
    "remaining": 544,
    "in_progress": 8
  },
  "outcomes": {
    "completed": 312,
    "confirmed": 289,
    "declined": 23,
    "voicemail": 87,
    "no_answer": 45,
    "failed": 12
  },
  "timing": {
    "started_at": "2024-01-14T09:00:00Z",
    "estimated_completion": "2024-01-14T14:30:00Z"
  }
}
```

## Webhooks

Receive real-time updates:

```json theme={null}
{
  "webhooks": {
    "campaign.started": "https://yourapp.com/hooks/campaign-started",
    "campaign.progress": "https://yourapp.com/hooks/campaign-progress",
    "campaign.completed": "https://yourapp.com/hooks/campaign-completed",
    "campaign.call_completed": "https://yourapp.com/hooks/call-completed"
  }
}
```

### Progress Webhook

Sent periodically during campaign execution:

```json theme={null}
{
  "event": "campaign.progress",
  "campaign_id": "campaign_abc123",
  "progress_percent": 45.6,
  "outcomes": {
    "completed": 312,
    "voicemail": 87,
    "no_answer": 45
  }
}
```

## Results Export

Download complete results:

```bash theme={null}
curl https://api.usecrew.ai/v1/campaigns/{campaign_id}/results \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -o results.csv
```

### Results CSV

```csv theme={null}
phone,name,outcome,duration,confirmed,notes,completed_at
+14155551111,John Smith,completed,45,true,Confirmed appointment,2024-01-14T09:15:00Z
+14155552222,Jane Doe,voicemail,12,false,Left message,2024-01-14T09:16:00Z
+14155553333,Bob Wilson,no_answer,0,false,No answer after 3 attempts,2024-01-14T13:20:00Z
```

## Compliance

<Warning>
  Bulk calling is subject to strict regulations. Ensure compliance with TCPA (US), GDPR (EU), and local telemarketing laws.
</Warning>

### Requirements

* **Consent** — Only call numbers with documented opt-in
* **Time restrictions** — Respect calling hour regulations
* **Do Not Call** — Scrub against DNC registries
* **Opt-out** — Honor opt-out requests immediately
* **Identification** — Clearly identify who is calling

### Compliance Configuration

```json theme={null}
{
  "compliance": {
    "dnc_scrub": true,
    "dnc_list_id": "dnc_abc123",
    "calling_hours": {
      "start": "09:00",
      "end": "20:00",
      "timezone": "local"
    },
    "opt_out_handling": {
      "keywords": ["stop", "unsubscribe", "remove"],
      "action": "add_to_dnc"
    }
  }
}
```

## Best Practices

<AccordionGroup>
  <Accordion title="Start small">
    Test with a small batch before launching a large campaign. Verify outcomes match expectations.
  </Accordion>

  <Accordion title="Optimize timing">
    Analyze when your audience is most likely to answer. Adjust schedule accordingly.
  </Accordion>

  <Accordion title="Personalize context">
    Include relevant data (names, dates, details) for natural, personalized conversations.
  </Accordion>

  <Accordion title="Monitor in real-time">
    Watch early results for unexpected issues. Pause if something is wrong.
  </Accordion>

  <Accordion title="Respect opt-outs">
    Immediately stop calling anyone who requests it. Update your DNC list.
  </Accordion>
</AccordionGroup>

## Pricing

Bulk calls are billed per call attempt:

| Plan         | Included Calls | Additional Cost |
| ------------ | -------------- | --------------- |
| Starter      | 500/month      | \$0.10/call     |
| Professional | 5,000/month    | \$0.08/call     |
| Enterprise   | Custom         | Custom          |

## Next Steps

* [Outbound Calls](/voice/outbound-calls) — Single call configuration
* [Webhooks](/integrations/webhooks) — Process campaign events
* [Analytics](/enterprise/audit-logs) — Analyze campaign performance
