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

# Keap

> Create a Keap contact from a replying LinkedIn contact with a Personal Access Token, ready for your Keap automations.

> [!NOTE]
>
> **Pro plan.** Keap 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 in Keap, where your Keap automation takes over.

> [!NOTE]
>
> **How it connects:** Keap's REST API with a Personal Access Token or Service Account Key in the `X-Keap-API-Key` header. See Keap's [developer portal](https://developer.keap.com) and its [Postman quick start](https://developer.infusionsoft.com/postman-quick-start/). The request below follows Keap's v2 contacts docs; check the answer on your first real call.

## Before you start

* **Keap plan:** tokens have per-second and daily call limits (Keap's developer docs). One call per reply stays far below them.
* **A token:** create a Personal Access Token in your Keap account's API settings, or a Service Account Key (it belongs to the Keap app rather than one person).

## 1. Connect Keap

In Kerux, open **Integrations > Connections**, click **Connect** on **Custom API** (under **Developers**):

* **How it signs in:** **API key in a header**, **Header name** `X-Keap-API-Key`, paste the token.
* **Base URL:** `https://api.infusionsoft.com/crm/rest`

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

## 2. Create the contact

In the follow-up campaign, add a **Webhook / HTTP** step named `keap`:

```json theme={null}
{
  "method": "POST",
  "url": "/v2/contacts",
  "bodyType": "json",
  "body": {
    "given_name": "{{contact.first_name}}",
    "family_name": "{{contact.last_name | optional}}",
    "email_addresses": [{ "email": "{{email}}", "field": "EMAIL1" }]
  }
}
```

Keap answers with the new contact, including its id. Open the contact's journey after the first test to copy the id's exact path for later steps.

To start a Keap automation, have it start on new contacts from this source, or apply a tag with Keap's tag endpoint in a second step.

## Test with one contact

In the follow-up campaign's **Builder**, click **Test** to open **Test on one contact** and check the contact in Keap.

## Common errors

> [accordion] 401 Unauthorized
>
> The token is wrong or expired, or the header name isn't `X-Keap-API-Key`. Create a new token and edit the connection.

> [accordion] 429 Too Many Requests
>
> The token hit Keap's per-second or daily limit. Kerux retries later on its own.

> [accordion] 400 with an email error
>
> The email is invalid or missing. A step whose email is empty waits instead of sending.

Related: [Webhook steps](/help/integrations/webhook-steps.md), [ActiveCampaign](/help/integration-guides/activecampaign.md), [HighLevel](/help/integration-guides/highlevel.md).


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