Skip to content

Outbound Campaigns ​

A campaign dials a queue of contacts on a schedule. You can build one from the dashboard, or drive it entirely from the public API. This guide covers both.

1. Create the campaign ​

A campaign needs, at minimum, an agent to place the calls.

Dashboard path ​

  1. Open the dashboard.
  2. Left sidebar → Deploy → Campaigns.
  3. Click + New Campaign (or Create your first campaign).
  4. In the wizard: name, agent, numbers to call from, contacts, schedule & limits, compliance.
  5. Finish with status draft until you're ready (or set active when you want dialing to start — see step 4).

API ​

bash
curl -X POST https://api.icallagent.com/api/public/v1/campaigns/ \
  -H "Authorization: Bearer ic_live_<your key>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Q3 Renewals",
    "widget_id": "7",
    "status": "draft"
  }'

Campaign creation is deliberately a separate step from adding contacts: a scenario or script shouldn't create a new campaign every time it adds one contact.

The Campaigns page listing campaigns with their status and contact counts
Only campaigns with status active are ever dialed.

2. Queue contacts ​

Dashboard path ​

  1. Left sidebar → Deploy → Contacts.
  2. + Add contact, or Import (CSV / Excel / Google Sheet).
  3. Attach them in the campaign wizard (or edit the campaign and import contacts there).

Contacts can also be added one at a time via the API:

bash
curl -X POST https://api.icallagent.com/api/public/v1/contacts/ \
  -H "Authorization: Bearer ic_live_<your key>" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "+15551234567",
    "name": "Jane Doe",
    "campaign_id": 12
  }'

Adding a contact to a draft or paused campaign is allowed. It just won't be dialed until the campaign is active. Every contact is checked against the compliance gate (blacklist, do-not-call, revoked consent) before a call is ever scheduled; a blocked contact returns 422 and nothing is queued.

3. Set the schedule (optional) ​

Leaving the schedule fields unset means the campaign runs unrestricted, any time of day, every day. To constrain it:

FieldExample
timezoneAmerica/New_York
start_date / end_date2026-08-01 / 2026-08-31
start_time / end_time09:00 / 17:00
weekdays["mon", "tue", "wed", "thu", "fri"]
excluded_dates["2026-09-01"]

4. Activate it ​

Only campaigns with status: "active" are ever dialed.

  1. Left sidebar → Deploy → Campaigns.
  2. Open the campaign.
  3. Set status to active (dashboard control).

Until then, draft / paused hold the queue without dialing.

5. React to completed calls ​

Subscribe a webhook to get a call.completed event as each call in the campaign finishes. See API Reference → Webhooks.

Full field reference ​

See API Reference → Campaigns and API Reference → Contacts for every field, default, and edge case.

Next ​