Skip to main content

Bulk Calls JSON API

Engagement Hub supports bulk engagements via file upload (POST /bulk-calls/upload) and JSON submit (POST /bulk-calls/submit). CRM integrations and the Follow Up Boss campaign embed use the JSON endpoint.

Authentication

Same as file upload: API key with call_management permission.

Authorization: Bearer {API_KEY}

POST /bulk-calls/submit

Campaign-level body

FieldRequiredDescription
domain_nameYesHub domain slug
rowsYesArray of contact rows (max 1000)
call_typeNoDefault informational
languageNoDefault en
campaign_nameNoStored as batch file_name
source_systemNoe.g. twenty, followupboss
source_org_idNoWorkspace ID or domain slug
source_objectNoDefault person

Per-row fields

FieldRequiredDescription
instructionYesAgent instruction for this contact
phone_numberFor phone/SMSE.164 or North American number
email or email_addressFor channel=emailRecipient email
nameNoDisplay name
channelNophone, sms, email, etc.
call_typeNoRow override
scheduled_timeNoISO or common datetime formats
user_phone_numberNoInitiator/broker phone
email_template_nameNoHub email layout name
email_subjectNoEmail subject
email_template_idNoHub template id
email_template_paramsNoObject of placeholder values
source_record_idNoCRM person id for sync
crm_contact_idNoOptional contact hint

Example (Aventora CRM)

{
"domain_name": "aventora",
"campaign_name": "June SMS follow-up",
"source_system": "twenty",
"source_org_id": "workspace-uuid",
"call_type": "informational",
"rows": [
{
"phone_number": "+14165550000",
"instruction": "Confirm appointment time",
"name": "Jane Doe",
"channel": "sms",
"source_record_id": "person-uuid"
}
]
}

Response

{
"success": true,
"batch_id": "uuid",
"queued_calls": 10,
"skipped_calls": 2,
"errors": ["Row 3: skipped — duplicate customer"],
"message": "Batch created with 10 calls. Processing will start shortly."
}

Batch status

  • GET /bulk-calls/batches
  • GET /bulk-calls/batches/{batch_id}

Limits

  • Max 1000 rows per submit (request timeout safety)
  • BULK_CALL_RATE_LIMIT applies when the worker calls /start per row
  • customer_dedup_days applies to bulk rows