senderkit send fires a send from your terminal — the same
operation as the SDK’s send() and sendRaw(). Useful for smoke-testing
templates while you build them, scripting one-off blasts, and triggering
messages from cron or CI.
Like the SDK, both commands return as soon as the API has accepted the message —
the id you get back is a queued message, not a delivered
one. Watch it with messages list.
senderkit send
Send a templated message, filling in
variables at send time.
Arguments
required
Template slug, e.g.
"welcome" or "password-reset".Options
Template variables as a JSON object, e.g.
'{"name":"Ada","city":"London"}'.
Substituted into the template’s variable holes.Force a channel. Defaults to the template’s primary channel — only set this
for multi-channel templates.
Pin a specific template version. Omit to let
SenderKit pick the current published version for the environment.
Free-form metadata as a JSON object of strings, numbers, or booleans —
e.g.
'{"userId":"usr_123","orderId":"ord_9"}'. Indexed for later filtering
in messages list.Defer delivery until a future ISO 8601 timestamp, e.g.
"2026-06-01T09:00:00Z". Must be in the future and within 30 days. The
response comes back with status: scheduled instead of queued.Idempotency key. A repeat key within your workspace returns the original
message instead of duplicating. Auto-generated if omitted — see
Sending: Idempotency.
Reply-To address for the message. Email only.
Cc recipients as a comma-separated string (
a@x.com,b@x.com) or a JSON
array ('["a@x.com","b@x.com"]'). Email only.Bcc recipients — same format as
--cc. Email only.Attachments as a JSON array, e.g.
'[{"filename":"doc.pdf","contentType":"application/pdf","content":"<base64>"}]'.
Email only. Total decoded size must not exceed 10 MB. For inline attachments,
add "inline": true and a "contentId" value.From address override (bare address, email only). Defaults to the provider
connection’s configured address. On managed sending, honored only on the
workspace’s verified sending domain.
From display name override (email only), rendered as
Name <address>. Max
128 characters; no control characters or angle brackets. Always applies,
regardless of sending domain.Examples
--json, the same response as the send endpoint:
senderkit send-raw
Send inline content without a registered template. Useful for one-off messages
that don’t warrant a template, or for testing provider configuration before you
move copy into the dashboard.
--channel selects the content shape; the required content options depend on
the channel.
Arguments
required
Recipient address — email, phone number, push token, or (for
web-push) the
JSON-encoded browser PushSubscription object (endpoint + p256dh/auth keys).Required option
required
Selects the content shape. Required on every call.
Email content (--channel email)
required
Email subject line.
required
HTML body.
Plain-text fallback body.
Email preheader — the snippet shown in inbox previews.
From address override (bare address). Defaults to your workspace’s
configured sender. On managed sending, honored only on the workspace’s
verified sending domain.
From display name override, rendered as
Name <address>. Max 128
characters; no control characters or angle brackets. Always applies,
regardless of sending domain.Reply-To address.
Cc recipients as a comma-separated string (
a@x.com,b@x.com) or a JSON
array ('["a@x.com","b@x.com"]').Bcc recipients — same format as
--cc.Attachments as a JSON array. Total decoded size must not exceed 10 MB.
Each item:
{ filename, contentType, content (base64), inline?, contentId? }.SMS content (--channel sms)
required
SMS body.
Push content (--channel push)
required
Notification title.
required
Notification body.
Badge count.
Notification sound name.
Push data payload as a JSON object of strings,
e.g.
'{"deeplink":"app://x"}'.Web Push content (--channel web-push)
required
Notification title.
required
Notification body.
Icon URL shown in the notification.
URL opened when the user clicks the notification.
Badge count.
Data payload as a JSON object of strings — available to the service worker
that handles the push event, e.g.
'{"deeplink":"app://orders/9"}'.Shared options
Variables for interpolation as a JSON object. Only substituted when
--interpolate is set.Free-form metadata as a JSON object.
Run server-side variable substitution over the content. Off by default —
raw content is otherwise delivered verbatim.
Defer delivery until a future ISO 8601 timestamp, e.g.
"2026-06-01T09:00:00Z". Must be in the future and within 30 days. The
response comes back with status: scheduled instead of queued.Idempotency key.
Examples
When to reach for the CLI vs the SDK
Use the CLI for ad-hoc work: triggering a real send while building a template, scripting backfills, wiring up cron jobs that pipe throughjq. For
application code, use the TypeScript SDK — it adds
automatic retries, batch helpers, and types.
Sending
What
send() accepts now and delivers later.Variables
How
--vars fills the dynamic holes in a template.Versioning
Why
--version is rarely needed.messages
Watch the message you just queued.