contacts

Send a contact / queue a call

Upserts a Contact by (workspace, phone) and enqueues a ScheduledCall against a campaign. Powers Make's "Send Contact" module.

Evaluated in this order — which step fails determines the status code:

  1. phone missing or unnormalizable → 400
  2. Campaign resolution: neither campaign_id nor campaign given → 400; not found → 404; campaign (name) matches more than one campaign → 409 (use campaign_id instead)
  3. Campaign status isn't draft/active/paused → 409 (not accepting new contacts)
  4. external_id already seen for this campaign → 200 (not 201) with the existing row, untouched — idempotent replay
  5. Contact upserted by (workspace, phone)
  6. Compliance gate (blacklist/DNC/consent) fails → 422, no call scheduled
  7. ScheduledCall created → 201

campaign_id wins if both campaign_id and campaign are given. An invalid consent_status silently falls back to implied rather than being rejected.

post/contacts/

Request

  • Base URL: http://127.0.0.1:8000/api/public/v1
  • URL: http://127.0.0.1:8000/api/public/v1/contacts/
  • Auth: one of:
    • HTTP bearer
    • OAuth 2 (authorization code, authorization URL /oauth/authorize/, token URL /oauth/token/)

Request body

phonestring required

Destination number in any format the platform can normalize (US-friendly forms or E.164). Missing/invalid → 400.

campaign_idinteger

Campaign to queue against. Wins over campaign if both are given. Prefer this when you already know the id from List campaigns.

campaignstring

Campaign name, exact match. Ambiguous names return 409 — use campaign_id instead. One of campaign_id or campaign is required.

namestring

Contact display name (CRM / agent context).

emailstring

Optional email. Not used for dialing.

companystring

Optional company name.

departmentstring

Optional department / team label.

notesstring

Free-form notes for your records or agent tools.

consent_statusstring

Compliance consent marker (e.g. implied, express, unknown). Invalid values silently fall back to implied.

external_idstring

Idempotency key, scoped to the campaign. Replaying the same external_id returns the original call with 200 instead of a duplicate.

Response

Idempotent replay: this campaign already has a call for the given external_id. The same four fields as 201 — existing row, not mutated.

contact_idinteger required

Id of the contact row in your workspace (upserted by phone). Reuse this id when searching or correlating CRM records.

scheduled_call_idinteger required

Id of the scheduled outbound call. On 200 this is the existing call from the first external_id request (not a new one).

campaign_idinteger required

Campaign the call is queued on (same as request campaign_id / resolved name).

statusstring required

Current dial-queue status of the scheduled call. Newly queued (or replayed) calls return pending until the scheduler places them.

Changes

No recorded changes to this operation across all 1 revision of this API.