Skip to main content
Contacts are the people an outbound agent calls, texts, or emails. Each contact belongs to one agent and carries a name, one or more phone numbers (or an email address), and any custom fields your script uses as variables. You can add contacts from a CSV file, type them in by hand, or send them from your own systems through the API (see the Manage contacts API guide).
Contacts are added to outbound agents only. Inbound agents create a record for each incoming call automatically, so the Add Contact button is not shown for them.

Before you start: required columns

Every agent needs a few columns for each contact. The upload screen lists them under “The file must include the following columns”. Variables are required when they appear in any published version of the script (or in the draft, if nothing is published yet). Two kinds of variables are optional, and appear as (Optional) columns:
  • Variables filled by a pre-conversation action.
  • Call data variables, such as the current date or the dialed number.
See Variables for how columns become variables.

Import contacts from a CSV file

Agent page header showing the agent name, a Running status badge, and the Edit, Test, and Add Contact buttons

The agent header with the Add Contact button that opens the import window.

1

Open the import window

Go to Agents, open your agent, and click Add Contact. If you’ve imported before, the window opens on Import History. Click Add to start a new import.
2

Prepare your file

On the Import File tab, click Download Sample CSV to get a file that already has the right headers for this agent. Fill it in using Google Sheets, Excel, or any spreadsheet tool, and save it as CSV.
3

Upload the file

Drop the file on the upload area or click Select file. Callers checks that the file is a CSV, isn’t empty, and has every required column. If anything is missing you’ll see a Validation Error message naming the problem.
4

Check the preview

The preview shows the first 10 rows so you can confirm the columns line up. Click Confirm & Upload to start the import, or Cancel to pick another file.
5

Wait for processing

The import runs in the background. The window shows live progress and the number of contacts Added, Updated, and Failed. You can close the window; the import continues and appears in Import History.
Contact Imports window on the Import File tab with a drop zone, a Select file button, the list of required columns, and a Download Sample CSV link

The Import File tab with the upload area, the required columns, and the Download Sample CSV link.

CSV formatting rules

  • Only .csv files are accepted. Export Excel or Google Sheets files as CSV first.
  • Header names are matched to variables. Callers converts each header to camelCase, so Phone Number, phone-number, and PhoneNumber all become phoneNumber, and Property Address becomes propertyAddress. Underscores are kept as they are, so phone_number does not match phoneNumber. Use spaces, hyphens, or camelCase.
  • Include the country code on every phone number, for example +1 555 555 1234. Spaces, dashes, and parentheses are fine. A 10-digit number without a country code is retried as a US number.
  • Every other column is stored as contact data and is available to the script as a variable with the same (camelCased) name.
  • Empty headers are ignored.
contacts.csv
Start from Download Sample CSV rather than building headers by hand. It contains exactly the columns this agent needs, including every script variable.

Multiple phone numbers per contact

Add a phoneNumbers column to give one contact several numbers, such as mobile, office, and home. Separate numbers with commas, semicolons, or line breaks, and wrap the cell in double quotes when it contains commas.
contacts.csv
How Callers dials them:
  • Duplicate numbers in the list are removed. The first valid number becomes the contact’s primary phoneNumber.
  • Each attempt dials the number that has been tried the fewest times, so attempts rotate through the list in order.
  • A number that fails (for example, it’s invalid or disconnected) is skipped from then on.
  • The attempt limit scales with the number of valid numbers. With Total Dial Attempts set to 5 and two valid numbers, the contact can be dialed up to 10 times. See Scheduling and retries.

Import history and failed rows

Import History lists your last 50 imports for the agent, newest first. Each row shows the file name (or Manual Import), the number of contacts, the date, and the result: Common reasons a row fails:
  • Missing required fields: …: a required column is empty for that row.
  • Invalid phone number(s): …: the number couldn’t be parsed. Add the country code.
  • Phone number is in the local DNC list: the number is on your account’s Do Not Call list and the agent checks it.
  • A registry match: the agent checks the US Do Not Call registry and the number is listed.
Contacts with several phone numbers aren’t checked against Do Not Call lists at import. They’re checked each time a number is dialed.

Add contacts manually

Use Add Manually for a handful of contacts, or to add a test contact.
1

Open the Add Manually tab

Click Add Contact on the agent, then the Add Manually tab.
2

Fill in the grid

Each required field has a column. Click + to add a custom column (enter a Column title), and Add more to add rows.
3

Import

Click Finalize Import. The button stays disabled until at least one row has every required field. The result appears in Import History as Manual Import.
Contact Imports window on the Add Manually tab with an empty grid of name, phoneNumber, companyName, and agentName columns, an Add more link, and Cancel and Finalize Import buttons

The Add Manually tab: one row per contact, with the Add more and Finalize Import buttons.

Time zones

Callers works out each contact’s time zone from their primary phone number:
  • US and Canada: from the area code.
  • Other countries: from the country.
The time zone is shown on the contact’s Contact Info tab. It’s used for scheduling when the agent’s Use Contact’s Time Zone setting is on. See Scheduling and retries. To set a time zone yourself, send the timezone field through the API as an IANA name such as America/Chicago. A timezone column in a CSV file is not used for scheduling; CSV contacts always get the time zone that matches their phone number.

Duplicates

By default, a phone number can appear only once per agent. When you import a number that already exists in the agent:
  • The existing contact is updated, not skipped. It counts as Updated in the import results.
  • Its name, data fields, phone numbers, and time zone are replaced with the new values.
  • Its status and attempt count are kept.
  • If it was archived, it’s restored.
To keep several contacts with the same phone number, turn on Allow Duplicate Phone Numbers under the agent’s Technical Settings. Every imported row then creates a new contact.
Once Allow Duplicate Phone Numbers is turned on, it can’t be turned off for that agent.

Add contacts with the API

Use the API to push contacts from a CRM, a web form, or your own backend. Both endpoints add contacts to one agent and follow the same duplicate rules as CSV imports: sending an existing phone number updates that contact.
Paths use /agents/{agentId}. The older /campaigns/{campaignId} paths still work and behave the same.

Add one contact

POST https://api.callers.ai/agents/{agentId}/contacts
Response
created is true for a new contact. modified is true when an existing contact with the same phone number was updated.

Add many contacts

POST https://api.callers.ai/agents/{agentId}/contacts/bulk
Response (verbose=true)
Without verbose, the response has a contactIds array instead of contactDetails.
The bulk endpoint silently drops contacts that are missing a required script variable. Compare requested with added + modified to catch them. The single-contact endpoint returns a 400 error instead.

Contact fields

string
required
Contact name. At least 1 character.
string
Phone number with country code, for example +15555551234. 7–20 characters; digits, +, (, ), and - only. Required unless you send phoneNumbers or an email in data.email.
string[]
Several numbers for one contact, dialed in rotation. Same format rules as phoneNumber.
string
IANA time zone name, such as Europe/London. Abbreviations like EST are rejected. If omitted, the time zone comes from the phone number.
object
Custom fields as string key/value pairs. Keys become script variables. For email agents, put the address in data.email. Limits: up to 100 keys, keys up to 120 characters starting with a letter, $, or _, and 4,000 characters in total.
boolean
default:"false"
Create the contact as archived. Sending false (or leaving it out) for an existing archived contact restores it.

Query parameters

The request body can be up to 1 MB. Split very large lists into several bulk requests.
Contacts can’t be added to inbound agents through the API. The request returns an error.

Manage contacts

Open an agent to see its contacts. Admins can archive, restore, update, and export them.

Archive and restore

Archiving removes a contact from dialing without deleting its history.
  • One contact: hover over the row and click the archive icon, or open the contact and choose Archive Contact from the ⋯ menu. Confirm with Yes, Archive.
  • Several contacts: select them with the checkboxes, then click Archive Selected.
  • Restore: open the Archived tab (shown once any contact is archived), select contacts, and click Restore Selected.
On the account-level Contacts page, archiving a contact archives it in every agent it belongs to. Through the API, use DELETE /agents/{agentId}/contacts/{contactId}, DELETE /agents/{agentId}/contacts/bulk with contactIds, or DELETE /agents/{agentId}/contacts/phone-number/bulk with phoneNumbers. Each accepts an optional archiveReason. To restore a contact through the API, add it again with the same phone number.

Update status in bulk

Correct outcomes after reviewing calls, for example to mark contacts as Interested after a human follow-up.
1

Select contacts

Select up to 50 contacts. Each one needs a finished conversation, so its status must already be Interested, Not interested, Completed, Call later, Do not call, or Wrong number.
2

Choose the new status

Click Update Status and pick a status. The list includes your agent’s custom success criteria as well as Interested, Not interested, Call later, Do not call, Wrong number, and Completed. Text agents offer Follow up and Unsubscribed instead of Call later and Do not call.

Export

Click Export contacts (Export calls on inbound agents) to download a CSV of the list. The export uses your current search, status, date, and post-call filters and sort order. The button appears only for admins whose member access includes Export contacts or calls. See Team and permissions.

List contacts with the API

GET /agents/{agentId}/contacts returns the agent’s contacts, 50 per page by default.

Troubleshooting

Check the header spelling. Underscores aren’t converted, so phone_number doesn’t match phoneNumber. Use phoneNumber, Phone Number, or phone-number. Every script variable is also required; download the sample CSV to see the full list.
Add the country code to each number (for example +44 for the UK). Only 10-digit numbers are retried as US numbers automatically.
Those phone numbers already exist in the agent, so the existing contacts were updated. Their status and attempt history are kept.
The bulk endpoint drops contacts with missing required variables. Compare requested with added and modified, and fill the missing data keys.
Both are admin-only. Add Contact is also hidden on inbound agents, and export needs the Export contacts or calls member access.

Scheduling and retries

Control when and how often contacts are dialed.

Variables

Use contact fields in your script.

Do Not Call list

Block numbers that must never be dialed.

Statuses and outcomes

What each contact status means.