# Add contact to dynamic campaign (/docs/api-reference/bulk-calls/addBulkCallContact)

> Push a single contact into a dynamic bulk-call campaign in real time. Dynamic campaigns are created from the dashboard (Bulk Call > Create New Campaign > Dynamic Campaign) and stay alive waiting for contacts, so this webhook is how you feed them from a CRM, form, or automation platform. The contact is queued immediately, and the campaign starts calling it as soon as it is within operating hours.

**POST** `/calls/bulk_call/{campaign_id}/add_contact`

Push a single contact into a dynamic bulk-call campaign in real
time. Dynamic campaigns are created from the dashboard (Bulk Call
> Create New Campaign > Dynamic Campaign) and stay alive waiting
for contacts, so this webhook is how you feed them from a CRM,
form, or automation platform. The contact is queued immediately,
and the campaign starts calling it as soon as it is within
operating hours.

```yaml
operationId: addBulkCallContact
parameters:
  - name: campaign_id
    in: path
    required: true
    description: ID of the dynamic campaign to add the contact to.
    schema:
      type: integer
requestBody:
  required: true
  content:
    application/json:
      schema:
        type: object
        required:
          - to_number
        properties:
          to_number:
            type: string
            description: Contact phone number in international format (e.g., +15551234567).
            example: '+15551234567'
          custom_variables:
            type: object
            description: |
              Key-value pairs passed to the agent as context for this
              call, so the agent can reference them during the
              conversation (e.g. the contact's name or reason for the
              call). Match these keys to the variables used in your
              agent's welcome message or prompt.
            additionalProperties: true
            example:
              name: Demo User
              interest: Home Insurance
          metadata:
            type: object
            description: |
              Key-value pairs stored on the contact for your own
              tracking (e.g. CRM or lead IDs). Not shared with the
              agent.
            additionalProperties: true
            example:
              crm_lead_id: lead_9876
              source: website_form
responses:
  '200':
    description: |
      Contact accepted and queued. `campaign_status` reflects the
      campaign state after the contact was added (`in_progress` when
      calling resumes, or `waiting` / `auto_paused` when the contact
      is queued for the next operating window).
    content:
      application/json:
        schema:
          type: object
          properties:
            status:
              type: string
            message:
              type: string
            campaign_id:
              type: integer
            line_id:
              type: integer
              nullable: true
              description: ID of the new contact record in this campaign.
            campaign_status:
              type: string
            to_number:
              type: string
        example:
          status: success
          message: Contact added successfully
          campaign_id: 123
          line_id: 4567
          campaign_status: in_progress
          to_number: '+15551234567'
```

**cURL**

```bash
curl -X POST "https://backend.omnidim.io/api/v1/calls/bulk_call/123/add_contact" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to_number": "+15551234567",
    "custom_variables": {
      "name": "Demo User",
      "interest": "Home Insurance"
    },
    "metadata": {
      "crm_lead_id": "lead_9876",
      "source": "website_form"
    }
  }'
```

**curl**

```bash
curl -X POST "https://backend.omnidim.io/api/v1/calls/bulk_call/{campaign_id}/add_contact" \
  -H "Authorization: Bearer $OMNIDIM_API_KEY"
```