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

# Aircall

> Create an Aircall contact for a replying LinkedIn contact with a phone number, so your rep calls with context.

> [!NOTE]
>
> **Pro plan.** Aircall works through a connection and HTTP steps, which are part of Pro and Agency (and the free trial). Anything you already have keeps working on every plan. See [Plans and billing](/help/account/billing.md).

A contact who replies leaves the campaign (the **When the contact replies** box). Add **Send to another campaign** in that box and pick a follow-up campaign. There, a **Webhook / HTTP** step creates the contact as an Aircall contact, so the rep sees who they're calling.

> [!NOTE]
>
> **How it connects:** Aircall's public API with basic auth (API ID and API token). See Aircall's [Create a contact](https://developer.aircall.io/api-references/#create-a-contact) docs. The request and answer below follow Aircall's docs.

## Before you start

* **Aircall:** an admin can create API keys. Aircall limits API calls per minute for each company account (Aircall's docs).
* **A phone number on the contact:** Aircall requires at least one. It comes from enrichment (for example [Lusha](/help/integration-guides/lusha.md)) or a rep saves it on the contact. A step whose phone is empty waits instead of sending.

## 1. Connect Aircall

In Aircall, open **Integrations & API > API Keys** and generate a key; note the API ID and API token. In Kerux, open **Integrations > Connections**, click **Connect** on **Custom API** (under **Developers**):

* **How it signs in:** **Username and password**: the API ID as username, the API token as password.
* **Base URL:** `https://api.aircall.io`

Click **Save**, then **Test connection**.

## 2. Create the contact

Put a **Condition** "contact phone is not empty" before the step, then add a **Webhook / HTTP** step named `aircall`:

```json theme={null}
{
  "method": "POST",
  "url": "/v1/contacts",
  "bodyType": "json",
  "body": {
    "first_name": "{{contact.first_name}}",
    "last_name": "{{contact.last_name | optional}}",
    "company_name": "{{contact.company}}",
    "information": "LinkedIn: {{contact.linkedin_url}}",
    "phone_numbers": [{ "label": "Work", "value": "{{contact.phone}}" }],
    "emails": [{ "label": "Work", "value": "{{contact.email_or_fallback}}" }]
  }
}
```

`{{contact.email_or_fallback}}` never leaves the step waiting; remove `emails` if you'd rather not send a stand-in address. Aircall answers with the contact (trimmed):

```json theme={null}
{ "contact": { "id": 7523, "first_name": "Sofia", "phone_numbers": [{ "label": "Work", "value": "+15550172" }] } }
```

Then a **Slack message** asks the owner to call.

## Test with one contact

In the follow-up campaign's **Builder**, click **Test** to open **Test on one contact** with a contact that has a phone. Check the contact in Aircall.

## Common errors

> [accordion] 401 Unauthorized
>
> The API ID or token is wrong, or swapped. API ID is the username.

> [accordion] 400 phone\_numbers required or invalid
>
> The phone is missing or not in international format (for example `+15550172`).

> [accordion] Same contact twice
>
> Aircall's create endpoint doesn't check. Search contacts by phone first (Aircall's search endpoint) and branch.

Related: [Webhook steps](/help/integrations/webhook-steps.md), [Lusha](/help/integration-guides/lusha.md), [Close](/help/integration-guides/close.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.