POST /v5/sms/sends request. Instead of making one API call per recipient, you define a global template once and selectively override the content, template name, or personalization tags for any individual recipient. This reduces API overhead and keeps your messaging logic centralized.
How batch SMS works
Every batch request is built around two layers:- Global layer — A default
contentstring ortemplateName, plus optionalparamstag values applied to every recipient who doesn’t have their own override. - Per-recipient layer — Individual entries in
toListcan carry their owncontent,templateName, orparams, which take precedence over the global values for that specific recipient.
Parameter priority (highest → lowest)
When EffiLink assembles a message for a given recipient, it resolves content in this order:
For tag values (
params), per-recipient toList[].params override the top-level params for matching keys.
Using {{tag}} placeholders
Include {{tagName}} tokens in any content string to inject dynamic values at send time. Supply the corresponding values in the params object, where each key matches a tag name.
"params": {"name": "Alice", "code": "987654"} in their toList entry will receive:
[EffiLink] Hi Alice, your code is 987654.
While a recipient with no per-recipient params falls back to the global defaults:
[EffiLink] Hi User, your code is 000000.
Send a personalized batch
Endpoint:POST /v5/sms/sends
cURL example
The example below demonstrates all four recipient scenarios in one request:Request parameters
Top-level fields
toList entry fields
Tips
- Keep batches under 100 entries. The API accepts up to 100
toListentries per request. Split larger audiences across multiple requests. - Use templates for regulated content. If your SMS content is subject to carrier registration requirements, prefer
templateNameover inlinecontentto ensure only approved copy is sent. - Test with
sandboxMode. Add"sandboxMode": trueto your payload to dry-run the entire batch without dispatching any messages. - Minimize redundant overrides. Only populate per-recipient fields when the value actually differs from the global default — this keeps payloads lean and easier to debug.