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

# Webhook Triggers

> Send contacts from an external system to a continuous outbound campaign.

Use a webhook when an external system should add contacts to a **Continuous Calling** campaign. Requests to an active campaign add calls to its queue; the campaign's calling schedule determines when they can run. Draft-only field capture is described below.

Phonely does not deduplicate accepted webhook requests. If the sending system retries a request, it can queue another call. Prevent duplicate requests before sending them when one contact should produce only one call.

## Configure the webhook

During campaign setup:

1. Create a **Continuous Calling** campaign and choose **Webhook** in **Call initiation**.
2. In **Source setup**, copy the webhook URL and API key. Send a JSON POST with the key in the `X-Authorization` header.
3. To capture fields from a request, open **Live test**, select **Start listening**, and send a representative test request. This draft-only test captures field names without queuing a call. You can also declare fields by hand on the **Manual** tab.
4. In **Calling hours**, configure any per-person timezone or calling-window field. If using **Internal routing**, choose the dial-out-number field in **Number routing**.
5. In **Variables**, map the remaining source data to the variables used by the outbound flow.

For a campaign that has finished setup, edit webhook fields manually in **Settings > Call initiation** and select **Save changes**. Live test is unavailable after setup; requests to an active campaign are contacts to call.

Include `phone_number` for the number to call. The following example also includes optional scheduling and dial-out fields. Declare the fields you send and enable the corresponding controls in Calling hours or Number routing; adding an optional field to the request alone does not turn that behavior on.

```json theme={null}
{
  "phone_number": "+12125551234",
  "timezone": "America/New_York",
  "dialout_number": "+12125559876",
  "calling_window": "09:00-12:00;13:00-17:00",
  "customer_name": "Jordan Lee"
}
```

A `calling_window` narrows the campaign's calling hours for that contact only. See [calling windows](/outbound-calling/campaigns#give-a-contact-its-own-calling-window).

Keep the API key private. Do not place it in client-side code, screenshots, or documentation examples.

## Keep the schema aligned

Update the declared fields whenever you add, rename, or remove a top-level field. During draft setup, capture another request with **Live test** or edit the list on **Manual**. After setup, use **Settings > Call initiation** and save the changes. Then review the routing, scheduling, and flow-variable mappings that use those fields.

## Verify the trigger

Use a phone number you control and send a representative request. Confirm that:

1. the call appears in the campaign queue;
2. the phone number, timezone, and optional dial-out number or calling window resolve correctly; and
3. the selected flow receives the expected mapped values.

Testing the webhook can queue and place a real outbound call when the campaign is running.


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