---
title: "Add contacts to a campaign (JSON)"
method: POST
path: "/v1/campaigns/{campaign_id}/contacts"
tags: ["Campaigns", "Campaigns"]
---

# Add contacts to a campaign (JSON)

`POST /v1/campaigns/{campaign_id}/contacts`

## Request

- Base URL: `https://api.call2me.app`
- URL: `https://api.call2me.app/v1/campaigns/{campaign_id}/contacts`
- Auth: HTTP bearer

Add one or more contacts to a campaign by JSON payload. Each contact needs at minimum `phone_number`; `name` and a `variables` object (arbitrary key/value template variables consumed by the agent's system prompt) are optional. Duplicate phone numbers are silently skipped via `ON CONFLICT`. Only allowed while the campaign is in `draft` status — for bulk import prefer `POST /upload-csv`.

## Path parameters

- `campaign_id` string, required

## Request body

- AddContactsRequest
  - `contacts` AddContactRequest[], required
    - `phone_number` string, required
    - `name` string, nullable
    - `variables` object, nullable

## Response `201`

Number of contacts inserted (duplicates by phone are skipped).

- unknown

## Other responses

- `400`: Campaign is not in draft status.
- `404`: Campaign not found.
- `422`: Validation Error

---

[API](https://skmtc.dev/call2me/apis/call2me-api.md) · [All operations](https://skmtc.dev/call2me/apis/call2me-api/llms.txt) · [OpenAPI document](https://skmtc.dev/call2me/apis/call2me-api/revisions/3951f9b7e47d?raw)
