Skip to main content
POST
Notify — multi-channel fan-out or waterfall

Authorizations

Authorization
string
header
required

Dashboard JWT token from Clerk

Headers

Idempotency-Key
string

Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the Idempotency-Replay: true response header.

Required string length: 1 - 255
X-Test-Mode
enum<string>

Sandbox opt-in for Clerk-session-authenticated requests. Set to true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.

Available options:
true,
false

Body

application/json
bindings
object[]
required

Array of per-binding payloads. Each specifies a channel and destination. Minimum 2 bindings for waterfall mode.

Required array length: 1 - 10000 elements
body
string

Shared message body — applied to every binding that doesn't carry its own.

Required string length: 1 - 4000
from
string

Shared sender identifier — applied to every binding that doesn't carry its own.

Required string length: 1 - 128
template_name
string

Shared template name — applied when neither shared nor per-binding body is set.

Required string length: 1 - 128
template_params
object

Shared template parameters — applied to every binding that doesn't carry its own.

metadata
object

Shared metadata bag — merged onto every binding's metadata.

mode
enum<string>

Delivery strategy. fanout (default): send every binding immediately. waterfall: send the first binding; auto-escalate remaining bindings on DLR undelivered within the TTL.

Available options:
fanout,
waterfall
fallback_window_seconds
integer

Waterfall freshness window in seconds. An undelivered DLR landing after this window does NOT escalate. Ignored in fanout mode. Default 24h; floor 30s, ceiling 24h.

Required range: 30 <= x <= 86400
max_price
number

Shared per-step cost ceiling in USD, applied to every binding that doesn't carry its own max_price. In waterfall mode this caps EACH hop independently (not the cumulative spend across hops).

Required range: 0 < x <= 100
max_total_price
number

Cumulative USD cost cap across the ENTIRE waterfall cascade (the primary send plus every escalated fallback hop). Unlike max_price, this bounds the TOTAL spend of chasing one recipient across every channel — hops that would push the running total over this cap are dropped from the escalation tail (never attempted) rather than the send being rejected. Hop order is never changed, only trimmed. Ignored in fanout mode.

Required range: 0 < x <= 1000

Response

Success — every binding queued (fanout) or at least one binding queued (waterfall). Returns per-binding delivery handles and async escalation chain.

Success — every binding queued (fanout) or at least one binding queued (waterfall). Returns per-binding delivery handles and async escalation chain.

data
object
meta
object