Developer docs
Everything you need to send your first message in minutes
Getting started
REST API with HMAC MAC signing. Live OpenAPI spec and repo copy.
Read →Authentication
Dashboard JWT login/2FA, and customer API key + secret MAC signing.
Read →Send SMS
Single sends, batches, scheduling, cancellation, listing and export.
Read →Send MMS
MMS with attachments, captions, subjects, and merge-field batches.
Read →Templates
Reusable SMS and MMS templates with merge fields and attachments.
Read →Contact lists
Manage lists, import/export contacts, and send campaigns to a list.
Read →Suppressions (opt-outs)
Manage the opt-out list; inbound STOP/START handled automatically.
Read →Webhooks (to you)
Signed delivery receipts and inbound events pushed to your endpoint.
Read →Analytics
Usage series, ledger, and per-user/channel breakdowns.
Read →Lookup & tools
Number lookup, sender IDs, and virtual/verified number requests.
Read →Account & settings
Account info, SMS settings, billing alerts, and 2FA endpoints.
Read →URL shortener
Create short links and track clicks; fires the link.click webhook.
Read →Support
Create and reply to support tickets from your integration.
Read →Team
Manage team members, roles, and invitations.
Read →Billing model
Plan segments, prepaid overage, Stripe checkout, portal and cancel.
Read →SMSWave exposes a REST API with HMAC MAC signing. Live OpenAPI: https://api.smswave.com.au/openapi.yaml (also docs/openapi.yaml in the repo). Admin routes under /v1/admin are omitted from the public contract.
Authentication
- Dashboard:
Authorization: Bearer <jwt>—POST /v1/auth/loginreturnsAuthSessionor aLogin2faChallenge; complete withPOST /v1/auth/2fa/verify. Password reset:forgot-password/reset-password. SDK:login,verify2fa,signup,forgotPassword. - Customer API:
Authorization: MAC id="key", ts="…", nonce="…", mac="…"
API credentials are key and secret (create under API keys). Prefer the SDK MAC client; the API keys page also shows a live signed curl after you create a key.
Send SMS
Per-account enqueue limit: smsPerMinute (default ACCOUNT_SMS_PER_MINUTE). Exceeding returns 429. Outbound messages carry a carrierMessageId once the network accepts them; GET /health reports carrier: ok when a live route is configured. Batch sends accept optional messageByDestination for per-recipient bodies (e.g. merge fields).
Send MMS
Shared attachments across destinations. Optional messageByDestination / subjectByDestination override caption and subject per recipient (same merge pattern as SMS batch). URL shortener rewrites http(s) links in captions and subjects when enabled.
Templates
SMS templates require body. MMS templates require at least one attachment (same limits as send: 1–15, ≤300KB each); caption and subject are optional. Existing templates default to channel: sms. List responses include attachment name/contentType only; fetch a template by id before composing or editing MMS media.
Contact lists
List send skips destinations on the suppression list. SMS requires message; MMS requires attachments (same limits as POST /v1/mms). Optional sendAt / expiresAt apply to the whole campaign.
Suppressions (opt-outs)
Outbound enqueue rejects suppressed destinations. Import accepts CSV/TSV/newlines of MSISDNs. Removing a row is a manual re-opt-in; carriers may still honor network-level blocks.
Webhooks (to you)
Events: message.status, message.inbound, account.low_balance, link.click. Each delivery is signed with X-SMSWave-Timestamp and X-SMSWave-Signature: sha256=… over timestamp.body (raw body bytes). Prefer verifyWebhookSignature from @smswave/sdk/webhook (default 5-minute skew). Status payloads include channel, carrierMessageId, errorCode, and errorMessage when known. Inbound payloads include channel, carrierMessageId, and for MMS subject / attachment metadata (full media on message detail). Events fire on carrier DLRs, cancel, permanent send failure, and inbound MO (test samples do too).
Analytics
Usage series and ledger are available to all roles. Per-user and per-channel breakdowns are owners/admins only. Outbound by-channel counts use carrier-accepted messages (carrierMessageId set).
Lookup & tools
Account & settings
URL shortener
Support
Team
Billing model
Monthly plan included segments first, then prepaid balance at overage rate. Paid plans with Stripe use recurring Checkout; renewals arrive via invoice.paid. Manage card: POST /v1/billing/portal. Cancel auto-renew: POST /v1/billing/cancel-recurring.