Routing & control
Pick a sender per request
Override the default rotation by naming which sender should be used for a single message. Pick by UUID (sender.id) or by label (sender.label).
When to use it
- Multi-staff apps: every staff member owns one number (collection agent, restaurant invoicer).
- Brand separation: billing notifications from a billing number, delivery notifications from a delivery number.
- Routing A/B tests — dispatch a slice of messages through a different sender to compare response rates.
Hint shape
sender.iduuid- UUID of the number. Fastest override — no extra lookup.
sender.labelstring- Case-insensitive label set at pairing time (e.g. 'alfi').
{
"to": "+6281234567890",
"text": "Tagihan #100.",
"sender": { "label": "alfi" }
}{
"to": "+6281234567890",
"text": "Receipt #200.",
"sender": { "id": "019e57fa-de42-7619-8dd0-5768211dab6c" }
}Resolution (rule order)
| # | Condition | Result |
|---|---|---|
| R1 | pinned key + hint menunjuk nomor lain | 409 PINNED_SENDER_CONFLICT |
| R2 | pinned key + pin sehat | pin dipakai · source: pinned |
| R3 | pinned key + pin unhealthy + onPinFailure: fallback | rotasi · source: pinned_fallback |
| R4 | pinned key + pin unhealthy + onPinFailure: strict | 503 PINNED_SENDER_UNHEALTHY |
| R5 | pool + sender.id | source: hint_id |
| R6 | pool + sender.label | source: hint_label |
| R7 | pool, tidak ada hint | rotasi · source: rotation |
The sender.source field in the response always tells you which rule won — handy for audit + debugging.
Edge cases
404 SENDER_NOT_FOUND— Hint refers to an ID/label not owned by this workspace. We don't leak cross-workspace existence.503 SENDER_UNHEALTHY— Hint refers to a banned/disconnected number. The response includes a retry-after hint in details.- Labels are workspace-isolated — 'alfi' in workspace A is distinct from 'alfi' in workspace B.