Placing Calls: Single and Batch
Voice notification sending in practice: choosing a channel, numbers and templates, scheduling, redial, hang-up SMS, and batch semantics.
This page covers the complete sending practice — from a single trial call to batch tasks — plus the semantics of batch processing and failure retry.
Prerequisites
- A template that has passed review (see Using the Voice Console)
- During testing, add numbers to the test whitelist (see Using the Voice Console)
Choose a Send Channel
| Channel | Best for |
|---|---|
| Console call task | Manual operation, Excel bulk import, no development needed |
| Send API | System integration, automated triggers, bulkId-based reconciliation |
Both channels go through the same call pipeline and share the same result semantics.
Numbers and Countries
- Recipient numbers use E.164 format (country calling code + local number, without
+in the request), e.g.8613800138000; see the code table at Country/Region Codes - The call country is determined by the template: no country code is needed in the send request; the recipient number's calling code must match the template country, otherwise
120003is returned - A single API request accepts at most 1000 recipients; Console tasks support larger batch imports
Templates and Variables
- Template variables use ordinal placeholders such as
{1}and{2}, with values passed per number:{"to": "8613800138000", "variables": ["John", "A12345"]} - The variable order must match the placeholders; omit
variablesfor templates without variables - The playback count can be overridden per send on top of the template default
Scheduled Sending
- Set
scheduling.type = SCHEDULEDand providestartTime/endTime(ISO 8601 with timezone, e.g.2026-11-20T09:00:00+08:00) - Window constraints: the start must be later than the current time, the end later than the start, and the window spans at most 8 days; the platform completes the outbound calls within the window
- Time fields are allowed only on scheduled tasks
Redial Policy
Calls that do not connect can be redialed automatically (the retry object):
| Parameter | Default | Description |
|---|---|---|
| maxCount | 1 | Number of redials, 0-3 |
| intervalMinutes | 60 | Redial interval in minutes, 1-360 |
| noConnected | true | Whether to redial when the recipient is unreachable |
| noAnswer | true | Whether to redial when there is no answer |
Redialing improves the chance of connecting, but every actual call is billed; for time-sensitive scenarios, disable redial or keep it minimal.
Hang-up SMS
After a call ends, a follow-up SMS can be sent to the recipient (the hangupSms object; its presence enables the feature):
templateId: the hang-up SMS template (independent of voice templates; create and review it first)sendType:ON_CONNECTEDsend after the call is answered (default) /ALLall calls /ON_UNANSWEREDnot connected /BY_DURATIONby answered durationdurationLimitSeconds: the duration threshold in seconds when usingBY_DURATION
Batch Processing Semantics
- Before acceptance: the platform validates the whole batch (number formats, count limits, cross-field rules) — a validation failure rejects the entire batch (HTTP 400 or
010003) - After acceptance: calls are placed one by one; a single failure does not affect the other numbers in the batch
- On acceptance the API returns
callId(the task identifier) andacceptedCount(the number of accepted recipients)
Invalid and Duplicate Numbers
- Numbers with illegal formats are rejected before acceptance; make sure the E.164 format and calling code are correct
- Duplicate numbers within a batch each receive their own call; deduplicate before sending
Idempotency and Retry
bulkIdis for reconciliation linkage only (echoed back as-is in the response) and is not an idempotency key: duplicate submissions trigger new calls and new charges- After an API timeout, do not blindly resend: first query with the returned
callId(or look up thebulkIdin records) to check whether the task was accepted, and retry only if it was not - Recommended client-side idempotency: generate a unique
bulkIdper business event, and deduplicate bycallId+mobileonce results arrive (CDR push or the query API)
FAQ
Accepted (000000) but the recipient did not get the call?
The call may be waiting for a redial after a failed attempt, the recipient's phone may be off or busy, or the route may be faulty. See send records for per-call status and Error Codes for release code meanings.
When does a validation failure return HTTP 400, and when does it return 010003?
Single-field format/value problems (e.g. a number that is not E.164, more than 1 messages entry) return the standard HTTP 400 error body; cross-field/business rule problems (e.g. an invalid scheduled window or incomplete hang-up SMS fields) return HTTP 200 + code=010003.
Related Resources
Last updated on