---
title: "Add Targets"
method: POST
path: "/api/v1/campaigns/{campaign_id}/targets"
tags: ["Campaigns"]
---

# Add Targets

`POST /api/v1/campaigns/{campaign_id}/targets`

## Request

- Base URL: `https://voice.getprosperapp.com` (the document declares no server; this is the origin it was published from)
- URL: `https://voice.getprosperapp.com/api/v1/campaigns/{campaign_id}/targets`
- Auth: none declared

Add targets to a campaign

## Path parameters

- `campaign_id` string, required: The ID of the campaign to add targets to.

## Request body

- AddTargetsRequest
  - `targets` TargetInput[], nullable: The list of targets as TargetInputs
    - `id` string: The ID of the target
    - `external_id` string, nullable: The external ID of the target
    - `phone_number` union, required: The phone number of the target
      - string
      - TargetInputPhoneNumber
        - `value` string, required: The phone number of the target
        - `operating_hours` WeekSchedule
          - `monday` TimeIntervalNoTz[]
            - `start` string, required: Clock time as the source writes it — "9:00", "13:30" and "1:30 PM" are all accepted; 12-hour times are converted on import.
            - `end` string, required: Clock time as the source writes it — "17:00", "12:00" and "5:00 PM" are all accepted; 12-hour times are converted on import.
          - `tuesday` TimeIntervalNoTz[]
            - `start` string, required: Clock time as the source writes it — "9:00", "13:30" and "1:30 PM" are all accepted; 12-hour times are converted on import.
            - `end` string, required: Clock time as the source writes it — "17:00", "12:00" and "5:00 PM" are all accepted; 12-hour times are converted on import.
          - `wednesday` TimeIntervalNoTz[]
            - `start` string, required: Clock time as the source writes it — "9:00", "13:30" and "1:30 PM" are all accepted; 12-hour times are converted on import.
            - `end` string, required: Clock time as the source writes it — "17:00", "12:00" and "5:00 PM" are all accepted; 12-hour times are converted on import.
          - `thursday` TimeIntervalNoTz[]
            - `start` string, required: Clock time as the source writes it — "9:00", "13:30" and "1:30 PM" are all accepted; 12-hour times are converted on import.
            - `end` string, required: Clock time as the source writes it — "17:00", "12:00" and "5:00 PM" are all accepted; 12-hour times are converted on import.
          - `friday` TimeIntervalNoTz[]
            - `start` string, required: Clock time as the source writes it — "9:00", "13:30" and "1:30 PM" are all accepted; 12-hour times are converted on import.
            - `end` string, required: Clock time as the source writes it — "17:00", "12:00" and "5:00 PM" are all accepted; 12-hour times are converted on import.
          - `saturday` TimeIntervalNoTz[]
            - `start` string, required: Clock time as the source writes it — "9:00", "13:30" and "1:30 PM" are all accepted; 12-hour times are converted on import.
            - `end` string, required: Clock time as the source writes it — "17:00", "12:00" and "5:00 PM" are all accepted; 12-hour times are converted on import.
          - `sunday` TimeIntervalNoTz[]
            - `start` string, required: Clock time as the source writes it — "9:00", "13:30" and "1:30 PM" are all accepted; 12-hour times are converted on import.
            - `end` string, required: Clock time as the source writes it — "17:00", "12:00" and "5:00 PM" are all accepted; 12-hour times are converted on import.
          - `tz` string
    - `fallback_phone_number` union: The fallback phone number of the target
      - string
      - TargetInputPhoneNumber
        - `value` string, required: The phone number of the target
        - `operating_hours` WeekSchedule
          - `monday` TimeIntervalNoTz[]
            - `start` string, required: Clock time as the source writes it — "9:00", "13:30" and "1:30 PM" are all accepted; 12-hour times are converted on import.
            - `end` string, required: Clock time as the source writes it — "17:00", "12:00" and "5:00 PM" are all accepted; 12-hour times are converted on import.
          - `tuesday` TimeIntervalNoTz[]
            - `start` string, required: Clock time as the source writes it — "9:00", "13:30" and "1:30 PM" are all accepted; 12-hour times are converted on import.
            - `end` string, required: Clock time as the source writes it — "17:00", "12:00" and "5:00 PM" are all accepted; 12-hour times are converted on import.
          - `wednesday` TimeIntervalNoTz[]
            - `start` string, required: Clock time as the source writes it — "9:00", "13:30" and "1:30 PM" are all accepted; 12-hour times are converted on import.
            - `end` string, required: Clock time as the source writes it — "17:00", "12:00" and "5:00 PM" are all accepted; 12-hour times are converted on import.
          - `thursday` TimeIntervalNoTz[]
            - `start` string, required: Clock time as the source writes it — "9:00", "13:30" and "1:30 PM" are all accepted; 12-hour times are converted on import.
            - `end` string, required: Clock time as the source writes it — "17:00", "12:00" and "5:00 PM" are all accepted; 12-hour times are converted on import.
          - `friday` TimeIntervalNoTz[]
            - `start` string, required: Clock time as the source writes it — "9:00", "13:30" and "1:30 PM" are all accepted; 12-hour times are converted on import.
            - `end` string, required: Clock time as the source writes it — "17:00", "12:00" and "5:00 PM" are all accepted; 12-hour times are converted on import.
          - `saturday` TimeIntervalNoTz[]
            - `start` string, required: Clock time as the source writes it — "9:00", "13:30" and "1:30 PM" are all accepted; 12-hour times are converted on import.
            - `end` string, required: Clock time as the source writes it — "17:00", "12:00" and "5:00 PM" are all accepted; 12-hour times are converted on import.
          - `sunday` TimeIntervalNoTz[]
            - `start` string, required: Clock time as the source writes it — "9:00", "13:30" and "1:30 PM" are all accepted; 12-hour times are converted on import.
            - `end` string, required: Clock time as the source writes it — "17:00", "12:00" and "5:00 PM" are all accepted; 12-hour times are converted on import.
          - `tz` string
    - `input_data` object: The input data of the target
    - `patient` PatientInput
      - `first_name` string, nullable: Patient first name
      - `last_name` string, nullable: Patient last name
      - `date_of_birth` string, nullable: Patient date of birth (YYYY-MM-DD)
      - `phone_number` string, nullable: Patient phone number
      - `external_id` string, nullable: The patient's id in the EHR
      - `mrn` string, nullable: The MRN the practice displays, when it differs from external_id
      - `extra_data` object, nullable: Additional patient metadata
    - `pre_call_ehr_ids` PreCallEhrIds: EHR identifiers a target carries so the call can load them before it starts. Identifiers only, never records: the chart is fetched from the EHR at call start, so anything stored here would be a stale copy of it. Unknown keys are rejected, so an id we cannot act on (a misspelling, or an id type with no fetch support) fails the upload instead of riding along silently.
      - `patient_id` string, required
  - `launch` boolean: Whether to launch the targets immediately or only add them to the campaign
  - `call_immediately` boolean: Only used together with launch. Dial these targets as soon as they are queued, on an already running agent, instead of on the next dispatch with a freshly started one. Best effort: the campaign's calling hours still apply, a call falls back to a freshly started agent when none is idle, and it has no effect on payor campaigns. Meant for a handful of calls someone is waiting on, such as a demo.
  - `allow_duplicates` boolean: When set to True all targets with and external ID already contained in the campaign will be ignored
  - `strict` boolean: When set to False, targets that fail validation are still uploaded; targets with an invalid phone number are marked as INVALID_PHONE_NUMBER when the call is about to be executed

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

## Changes

- **2026-10-27** `3e0c8901e684`: 1 info
  - added the new optional request property `targets/anyOf[subschema #1]/items/patient/anyOf[subschema #1: PatientInput]/mrn`
- **2026-10-20** `eefbf7130081`: 1 info
  - added the new optional request property `call_immediately`
- **2026-08-27** `1a91aac903bf`: 1 warning, 1 info
  - removed the request property `targets/anyOf[subschema #1]/items/pre_call_data`
  - added the new optional request property `targets/anyOf[subschema #1]/items/pre_call_ehr_ids`
- **2026-08-08** `93bd5b9524ee`: 1 info
  - added the new optional request property `strict`

[Operation history](https://skmtc.dev/getprosperapp/apis/prosper-voice/changes/api/v1/campaigns/:campaign_id/targets/post.md)

---

[API](https://skmtc.dev/getprosperapp/apis/prosper-voice.md) - [All operations](https://skmtc.dev/getprosperapp/apis/prosper-voice/llms.txt) - [OpenAPI document](https://skmtc.dev/getprosperapp/apis/prosper-voice/revisions/acd73a3750ca?raw)
