Quickstart
Send your first message
Sign in, enable a channel, verify a sending domain, then queue a message with a scoped API key. Most teams are sending in under ten minutes.
Sign in
Supromail uses passwordless login. Enter your email address and choose Continue — there is no password field. We email a six-digit code; enter it to sign in.
The code is valid for 5 minutes, with a 30-second cooldown before you can request another. Signing up is the same flow: the first time you enter a new address your login is created automatically, so there is no separate registration step.
The first time you sign in, Supromail asks for your name, your company or workspace name, and acceptance of the Terms of Service. Once you submit, your workspace is created and you are its owner.
Enable a channel
A new workspace starts with no arms enabled. An owner or admin turns on the channel they want from that arm's Settings page, or from Get started in the dashboard.
Verify a domain and send
- Add a domain in Email → Domains and publish the DNS records Supromail returns. Full walkthrough →
- Wait until the domain shows
verified. - Create an API key in API Keys with the
email:sendscope. The secret is shown once — store it in your server-side secret manager. - Queue a message from your backend.
curl https://api.supromail.com/v1/email/messages \
-X POST \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"from": "[email protected]",
"to": "[email protected]",
"subject": "Welcome",
"text": "Thanks for joining.",
"idempotency_key": "welcome-2026-001"
}'
const res = await fetch("https://api.supromail.com/v1/email/messages", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.SUPROMAIL_API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
from: "[email protected]",
to: "[email protected]",
subject: "Welcome",
text: "Thanks for joining.",
idempotency_key: "welcome-2026-001"
})
});
const { message_id, status } = await res.json();
import os, requests
res = requests.post(
"https://api.supromail.com/v1/email/messages",
headers={"Authorization": f"Bearer {os.environ['SUPROMAIL_API_KEY']}"},
json={
"from": "[email protected]",
"to": "[email protected]",
"subject": "Welcome",
"text": "Thanks for joining.",
"idempotency_key": "welcome-2026-001",
},
)
print(res.json())
A success returns 202 Accepted with { "message_id": "…", "status": "queued" }. Queued means accepted for sending: the message and its background send job were committed together, and a worker signs it with DKIM and delivers it. Use webhooks and the dashboard to observe Email and SMS outcomes; WhatsApp and Telegram also provide a per-message status endpoint.
You must be at least 18 and authorised to act for the organisation using the workspace. Read the Terms and Acceptable Use Policy before production sending.
Core concepts
These concepts carry most of the meaning in this documentation and in the dashboard.
- Workspace
- Your organisation's container. Domains, phones, linked numbers, bots, messages, API keys, and members all belong to exactly one workspace, and workspaces never see each other's data.
- Project
- A workspace namespace that groups operational resources and their activity, such as domains, API keys, mailboxes, phones, linked accounts, and bots. Projects organise resources; they do not create separate billing accounts or member permissions.
- Arm
- A channel — Email, SMS, WhatsApp, or Telegram — enabled per workspace, independently of the others.
- Member & role
- People in your workspace, each with a role (owner, admin, or member) that controls what they can do. See Members & roles.
- Message
- One email, SMS, WhatsApp, or Telegram message you sent. Each has a status that moves from
queuedtoward a final outcome. - API key
- A secret credential a program uses to send on your behalf. Scoped, optionally IP-restricted, and shown only once.
- Webhook
- A URL Supromail calls to notify your systems when something happens — a message delivered, an email bounced, mail received.
Projects
Use projects to keep the resources and activity for different applications, environments, customers, or teams distinct inside one workspace.
Billing, subscriptions, members, and roles stay at workspace level. A project is not a permission boundary: every member uses projects under their existing workspace role. Owners and admins manage project structure and resource moves.
Default project. Every workspace starts with a Default project. Existing resources are assigned to it, and it counts toward the workspace's project allowance.
Create and switch projects
- Open Projects & resources from the account menu. Owners and admins can create a project when the workspace has capacity.
- Review the current allowance before creating another project. Your Messaging plan sets the workspace's project limit; see Pricing to compare plans.
- Use the project selector in the dashboard header, or choose Open on the Projects page, to switch the active project. The dashboard then loads data for that project.
New project-scoped resources are created in the active project. Check the selector before creating a domain, API key, mailbox, phone connection, bot, webhook, or other project-scoped configuration.
Move existing resources
- Open Projects & resources, then choose Move existing resources. Only owners and admins can move resources.
- Choose the resource type: API keys, mailboxes, SMS devices, Telegram bots, WhatsApp accounts, domains, or SMTP resources.
- Select the resource and destination project. When offered, choose whether to include its related history.
Move the existing resource instead of recreating it. Related configuration follows the resource; history moves can take longer, so do not repeat the action while it is processing.
Channels overview
One dashboard and one API cover four channels. Each is enabled independently and has its own connected-resource limits.
| Arm | What it does | How it sends |
|---|---|---|
| Send from your own domains, DKIM-signed, with bounce and complaint suppression. Receive inbound mail, forwarded to addresses or delivered to webhooks. | Through Supromail's hosted email delivery service, after you verify your sending domain. | |
| SMS | Send text messages with delivery tracking, routing rules, and failover. | Through your own Android phones running the companion app — your SIMs, your numbers. |
| WhatsAppEarly access | Send WhatsApp messages with delivered and read tracking. | Through your own WhatsApp numbers, linked by QR like WhatsApp Web. |
| Telegram | Send to users, groups, and channels that opted in to your bot. | Through your own Telegram bots, via the official Bot API. |
SMS, WhatsApp, and Telegram are never charged per message — they run on hardware and accounts you own. Email is bounded by your plan's monthly allowance. See Pricing.
Email sending
Enable the Email arm, verify a sending domain, then send through the API. After that you manage your suppression list, watch the event log, and optionally wire up webhooks.
Verify a sending domain
You can only send from a domain you have proven you own. Verification also sets up DKIM — the cryptographic signature that keeps your mail out of spam folders.
- In Email → Domains, add your domain, for example
example.com.Admin Supromail generates a unique DKIM key and returns a set of DNS records. - Publish the four required TXT records at your DNS provider, plus an MX record if you want to receive mail.
- Return to the dashboard and choose Verify. Supromail checks that the ownership, DKIM, SPF, and DMARC records are live, then flips the domain to
verified.
| Purpose | Type | Host / name | Value |
|---|---|---|---|
| DKIM (signing) | TXT | <selector>._domainkey.example.com | v=DKIM1; k=rsa; p=… |
| Ownership | TXT | example.com | supromail-site-verification=… |
| SPF | TXT | example.com | v=spf1 include:<relay> ~all |
| DMARC | TXT | _dmarc.example.com | v=DMARC1; p=none |
| Inbound mail | MX | example.com | Shown on the Domains page |
Copy the <selector> and key value from the dashboard verbatim. SPF and DMARC are additive — if you already publish SPF, merge the include: into your existing record rather than adding a second one. DNS changes take minutes to hours to propagate, and a domain can only be verified by one workspace: already claimed means it is verified elsewhere.
Send an email
The from address must be on a verified domain.
curl https://api.supromail.com/v1/email/messages \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"from": "[email protected]",
"to": "[email protected]",
"subject": "Welcome aboard",
"text": "Thanks for signing up!",
"html": "<p>Thanks for signing up!</p>",
"idempotency_key": "welcome-2026-07-26"
}'
- Provide
text,html, or both — at least one is required. frommust use a verified domain, or you get403 domain_not_verified.idempotency_keyis optional but recommended. Reusing a key for the same message returns the original queued message; reusing it for a different message returns409 idempotency_conflict.- Sends count against the account's applicable quota. A limited send returns
429 quota_exceededwithRetry-After; where a daily quota applies, successful sends includeX-Quota-Remaining.
Watch what you have sent in Email → Sending, and the per-event history in Email → Event log.
Send through SMTP
Use authenticated SMTP when your application or mail client already speaks SMTP. SMTP submissions use the same delivery pipeline and email allowance as API sends.
- Enable the Email arm and verify the domain that will appear in the message's
Fromheader. - In Email → SMTP, switch to the verified domain, choose a username localpart such as
postmaster, and create the credential.Admin Its username is[email protected]. - Copy the generated password while it is shown. Supromail displays it once, so store it in your server-side secret manager before dismissing it.
- Configure your client with the settings below and send a test message.
| Setting | Value |
|---|---|
| Host | smtp.supromail.com |
| Port | 587 |
| Security | STARTTLS |
| Authentication | Username and password |
| Username | [email protected] |
| Password | The shown-once SMTP credential password |
Use a From address on the credential's verified domain, then follow the test in Email → Sending and Email → Event log.
Use the narrowest credential. A per-domain SMTP credential can send only from its selected verified domain. An API key with email:send may also be used as the SMTP password (use apikey as the username where your client requires one), but it can send from any verified domain in the workspace. Regenerating a credential stops its old password immediately; revoking it stops the credential entirely.
The suppression list
The suppression list is your workspace's do-not-email list. If an address is on it, Supromail will not send to it. Addresses land there two ways:
- Automatically, when a message hard-bounces or the recipient marks it as spam.
- Manually, when you add one yourself.Admin
You can also remove an addressAdmin if it was suppressed by mistake. When your relay reports a hard bounce or spam complaint, Supromail suppresses the recipient, records an email.bounced or email.complained event, and notifies any subscribed webhooks.
Receiving email
Supromail can receive mail on any verified domain. Business Email mailboxes receive and store their own addresses automatically; configure additional forwarding and webhook routes per domain in Email → Receiving.Admin
- Point the domain's MX record at Supromail. The exact host and value are listed with the domain's other DNS records on the Domains page. Mail sent to a domain without the MX record never reaches Supromail.
- Choose a receiving mode. Catch all receives mail sent to any address on the domain; catch some receives only the exact addresses you list.
- Add destinations — email addresses for forwarding and/or HTTPS webhook URLs, comma-separated. Each received message is routed to every destination.
Email forwarding uses your send allowance. Each copy forwarded to an email destination counts against the account's applicable email allowance; two forwarding addresses count as two email sends. Webhook and Business Email mailbox destinations do not consume the email sending allowance.
Webhook destinations receive an email.received POST with the parsed message: from, to, subject, text and HTML bodies, headers, decoded attachments, and inbound authentication results (spf, dkim, dmarc). It is signed exactly like other webhooks — X-Signature: sha256=… over "<timestamp>.<body>" — but with a per-domain signing secret shown on the Receiving page, not the per-webhook whsec_ secret.
Large messages are trimmed to fit the webhook body budget — attachment content is dropped first, then bodies are clipped, with a truncated flag — so your endpoint always learns that a message arrived. Supromail stores only metadata about received mail: raw content is delivered to your destinations and is not retained for re-delivery.
Business Email
A professional inbox on your own domain, for addresses a person should read and reply to in a browser.
Mail sent to a Business Email address is stored and shown in the hosted webmail client. Paid Messaging plans include five accounts; the separate Business Email Free tier includes one mailbox per account.
- In Email → Business Email, add an address on a verified domain, for example
[email protected].Admin Supromail shows a password once — the same password signs in to webmail and authorises sending. - Creating the account is enough to send and receive at that address. Use Email → Receiving separately for catch-all or catch-some forwarding and webhook routes.
- Sign in at webmail with the full address and password. Replies are sent through your verified domain and DKIM-signed, exactly like the API.
| Access | Host | Port | Security |
|---|---|---|---|
| Webmail | inbox.supromail.com | — | Browser |
| IMAP | mx.supromail.com | 993 | SSL |
| SMTP | smtp.supromail.com | 587 | STARTTLS |
The username is always the full email address.
A mailbox keeps the full message on the server, unlike webhook and forwarding routes, which are metadata-only. When a mailbox is full, Supromail temporarily rejects new delivery so the sender's mail server can retry. Export and clear mail to free space or move to a plan with more storage. Deleting a mailbox stops sign-in and delivery immediately.
SMS
The SMS arm sends through Android phones you control, not a third-party gateway. Pair a phone, and Supromail routes each message to the right device, which sends it over its own SIM.
Pair a phone
Pairing connects a device to your workspace. The phone's permanent credential is never shown on screen — you scan a short-lived QR code instead.
- In SMS → Devices, register a device with a name, and optionally its number, country, carrier, and limits.Admin
- Choose Pair. The dashboard shows a QR code valid for 10 minutes.
- Open the Supromail companion app on the phone and scan it. The app exchanges the code for a private device token and is now paired.
Managing devicesAdmin: Suspend instantly disables a phone and re-routes in-flight messages; Resume re-enables it; Rotate token issues a fresh credential, after which the phone must re-pair; Delete removes it, re-routing any in-flight messages first.
Send an SMS
curl https://api.supromail.com/v1/sms/messages \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"to": "+2348012345678",
"body": "Your code is 123456"
}'
tomust be a full international number in E.164 format — a+, country code, then the number. National numbers are rejected.bodyis the message text;messageis accepted as an alias.- Optional:
idempotency_keyfor safe retries, androuting_modeto override routing for a single message.
You can also send without code from the dashboard: Test (specific device) sends through one phone you pick, and Test route sends through your configured routing rules. Both send a real SMS.
Routing: choosing which phone sends
With more than one phone, the routing engine decides which handles each message. By default (auto) it balances across your online phones, preferring higher-priority ones. Routing rules go further, mapping recipients to a set of phones by prefix, country, or carrier. Each rule has a priority — higher wins — its phones, and a strategy:
| Strategy | Picks the phone that… |
|---|---|
priority | has the highest priority (ties broken by least-busy, then random) |
round_robin | is next in rotation |
least_busy | has sent the fewest messages today |
random | is chosen at random |
first | is first by priority then ID (deterministic) |
Creating rules does nothing until you switch rule-routing on in SMS → Routing. When on, Supromail uses your rules first and falls back to auto-routing for any number no rule matches.
A rule can be marked strict, meaning it will not fall back if its own phone is unavailable — it holds the message until that phone frees up or the message expires. A misconfigured strict rule can silently hold messages until they expire. Use it deliberately, for example when a destination must only ever go out over specific SIMs.
Failover: if a chosen phone goes offline before accepting the assignment, or reports a definite failure, Supromail re-routes the message to a different phone. A phone is skipped after roughly 90 seconds of silence, and an unacknowledged assignment re-routes after about 2 minutes. Once Android has accepted the send, an ambiguous result becomes unknown rather than being retried.
Status, history, and control
SMS → Messages lists everything you have sent, newest first, with the masked recipient, status, sending phone, and timestamps. Open a message for its History (the full failover trail), Cancel (only while still queued), or Send now (force an immediate retry).
| Status | Meaning |
|---|---|
queued | Accepted, waiting to be assigned to a phone. |
assigned → sending | A phone has it and is sending. |
sent | The phone handed the SMS to the carrier. |
delivered | The carrier confirmed the handset received it. |
failed / expired / cancelled | Final non-success outcomes. |
unknown | Android accepted the send but its final outcome could not be confirmed. Terminal, and never retried automatically, because a retry could send the SMS twice. |
“Sent” versus “delivered” is not a bug. delivered requires a carrier delivery receipt, which many carriers never send — a perfectly delivered message can legitimately stay at sent. Dashboard counters treat the two together as “sent”.
WhatsAppEarly access
The WhatsApp arm sends through your own WhatsApp numbers. You link a phone by scanning a QR code, exactly like WhatsApp Web, and Supromail sends as that number using an implementation of WhatsApp's companion-device protocol.
Mind the ban risk. WhatsApp has no official API for companion-device sending, and it may restrict or ban numbers it decides are automating outside its terms. Use numbers you can afford to lose, warm them up gently, and only message people who expect to hear from you — messaging strangers at volume is the classic ban trigger. A banned number shows status banned and cannot send.
Link an account
- In WhatsApp → Settings, enable the arm.Admin
- In WhatsApp → Accounts, add the phone number.Admin A QR code appears and refreshes roughly every 20 seconds.
- On the phone that owns the number, open WhatsApp → Settings → Linked devices → Link a device and scan the code. The account flips to
connected. Keep the phone online.
Send a message
Use the linked account id, copyable on the Accounts page, with a key holding the whatsapp:send scope.
curl https://api.supromail.com/v1/whatsapp/messages \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"wa_account_id": "3f6c…",
"to": "+2348012345678",
"body": "Your order has shipped!"
}'
Sending requires the linked account to be connected, otherwise you get 409 not_connected. Statuses advance queued → pending → sent → delivered → read as receipts arrive. If the connection may have transmitted a message but loses the result, the message becomes terminal unknown and is not retried automatically. Watch everything in WhatsApp → Messages and the event logs.
Receiving is not a product feature. Incoming WhatsApp message content is not stored and is not available to you.
Telegram
The Telegram arm sends through your own bots using the official Bot API. Create a bot once, register its token, and send to any user, group, or channel that opted in.
Register a bot
- In Telegram, message @BotFather, send
/newbot, and follow the prompts to get a token like123456:ABC-DEF…. - In Telegram → Settings, enable the arm.Admin
- In Telegram → Bots, paste the token and choose Register bot.Admin
The token is verified with Telegram, stored encrypted, and accepted exactly once — it is never shown again. If you lose it, BotFather can show it to you; Supromail cannot.
Telegram bots cannot start conversations. A chat becomes reachable only after the other side opts in: a user must message your bot (press Start), a group must add your bot, and a channel must add it as an admin.
Each chat is addressed by a chat_id — a numeric id, negative for groups and channels, or @channelusername. A phone number is not a chat id.
Send a message
curl https://api.supromail.com/v1/telegram/messages \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"bot_id": "tgbot_…",
"chat_id": "-1001234567890",
"text": "Deployment completed"
}'
text is plain text up to 4,096 characters; body and message are accepted as aliases. Statuses run queued → pending → sent, where sent is final success — the Bot API has no delivered or read receipts. Transient errors that are safe to retry use bounded retries; permanent rejections such as tg_400 (chat not found) or tg_403 (bot blocked) mark the message failed. An ambiguous provider result becomes terminal unknown so a retry cannot duplicate the message.
Telegram has no status webhooks by design: the Bot API confirms acceptance only, so there is no later lifecycle event to subscribe to. Poll GET /v1/telegram/messages/{id} if your integration needs the outcome programmatically.
Members & roles
Invite teammates into your workspace and control what they can do. Roles are ranked owner > admin > member.
| Capability | Member | Admin | Owner |
|---|---|---|---|
| Read dashboards, history, logs | ✓ | ✓ | ✓ |
| Send test messages, access support | ✓ | ✓ | ✓ |
| Manage devices, domains, routing, suppressions | — | ✓ | ✓ |
| Create and revoke API keys & webhooks | — | ✓ | ✓ |
| Invite or remove members, change roles | — | ✓ | ✓ |
| Enable or disable arms | — | ✓ | ✓ |
| Rename or delete the workspace | — | — | ✓ |
You can never grant a role higher than your own, nor remove or demote the last owner. In User management, invite by email and pick a role; Supromail gives you a shareable invite link to send yourself.
The invitee is added on their first-ever Supromail sign-in with that email address. Invite a fresh address — someone who already has a login will not be auto-added.
API keys & scopes
API keys let programs send through Supromail's API. Each key carries only the scopes you grant it, and can be restricted to source IP addresses.
In API Keys, create a key,Admin give it a name, choose its scopes, and optionally restrict it to specific source IP addresses or ranges. Choose test to mint an sk_test_ key instead of a live sk_live_ one.
Supromail shows the full key secret exactly once. Copy it immediately — it is stored only as a hash and can never be shown again. If you lose it, revoke it and create a new one. Revocation is immediate and permanent.
A key can only do what its scopes allow and what the workspace's enabled arms allow:
| Scope | Grants |
|---|---|
email:send / email:read | Send email / run a connectivity and entitlement check. |
sms:send / sms:read | Send SMS / run a connectivity and entitlement check. |
whatsapp:send / whatsapp:read | Send WhatsApp / read message status and run a connectivity and entitlement check. |
telegram:send / telegram:read | Send Telegram / read message status and run a connectivity and entitlement check. |
account:read | Read account information. |
Send the key as a Bearer token:
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx
Never place a live key in browser code, a mobile app, or a client-side repository. If a key might be exposed, revoke it and create a replacement.
Webhooks
Webhooks push real-time notifications from Supromail to your own URL when events happen. Each arm has its own webhooks.
| Channel or route | Events |
|---|---|
| SMS | sms.queued, sms.assigned, sms.sent, sms.delivered, sms.failed, sms.unknown |
| Email webhooks | email.bounced, email.complained |
| Inbound routes | email.received on configured domain receiving destinations |
message.sent/delivered/read/failed/unknown, account.connected/disconnected/paired/qr/error | |
| Telegram | None — the Bot API confirms acceptance only, so sent is the final outcome. |
When you create a webhook,Admin your URL must be HTTPS in production. Supromail shows a signing secret (whsec_…) exactly once — copy it to verify incoming calls. You can rotate it later.
Content-Type: application/json
User-Agent: Supromail-Webhooks/1
X-Supromail-Event: sms.delivered
X-Supromail-Timestamp: 1700000000
X-Signature: sha256=<hex>
Verify every request
- Read the raw request body bytes before parsing JSON.
- Reject the request if
X-Supromail-Timestampis not recent — older than five minutes, say — to block replays. - Build the signed string
"<timestamp>.<raw-body>", compute HMAC-SHA256 with yourwhsec_secret, and hex-encode it. - Compare it in constant time against each
sha256=<hex>inX-Signature. If any matches, the request is valid.
import crypto from "node:crypto";
const expected = "sha256=" + crypto
.createHmac("sha256", process.env.SUPROMAIL_WEBHOOK_SECRET)
.update(`${timestamp}.${rawBody}`)
.digest("hex");
if (!crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected))) {
throw new Error("invalid signature");
}
import hmac, hashlib, os
expected = "sha256=" + hmac.new(
os.environ["SUPROMAIL_WEBHOOK_SECRET"].encode(),
f"{timestamp}.{raw_body}".encode(),
hashlib.sha256,
).hexdigest()
if not hmac.compare_digest(signature, expected):
raise ValueError("invalid signature")
Always dedupe on delivery_id — delivery is at-least-once. Return a 2xx only after successful processing. Failed deliveries retry on a fixed schedule (1 minute, 5 minutes, 30 minutes, 2 hours, 6 hours — up to six attempts) before being marked failed.
During the 24-hour window after rotating a secret, X-Signature may carry two comma-separated signatures; accept the request if either matches.
Inbound mail is the one exception to the secret model: email.received is signed with a per-domain secret shown on the Receiving page. See Receiving email.
Account & activity
Manage your profile, audit what happened in the workspace, and delete your account.
- Profile
- Change your display name in Manage account. Your email address is managed by login and is not editable there.
- Workspace name
- Owners can rename the workspace in Manage account.
- Activity (audit log)
- Admins and owners can open Activity for an audit trail of meaningful actions — members invited, joined, or removed; roles changed; keys created or revoked; arms toggled; manual suppression edits; security alerts. High-volume per-message delivery events live in the Email and SMS event logs instead.
- Delete your account
- In the Danger zone of Manage account, permanently delete your own account. This is irreversible and asks you to type your workspace name to confirm.
If you are the only owner, deleting your account deletes the entire workspace and all of its data.
Audit events are kept for at least 90 days regardless of plan; delivery events age out on your plan's window. See Limits & retention.
API reference
All API calls go to https://api.supromail.com. Authentication is a Bearer token in the Authorization header. This reference covers the machine API under /v1/….
| Endpoint | Scope | Description |
|---|---|---|
GET/v1/email/ping | email:read | Connectivity and entitlement check. |
POST/v1/email/messages | email:send | Send an email. from, to, subject, text and/or html, optional idempotency_key. |
GET/v1/sms/ping | sms:read | Connectivity and entitlement check. |
POST/v1/sms/messages | sms:send | Send an SMS. E.164 to, body, optional routing_mode and idempotency_key. |
GET/v1/whatsapp/ping | whatsapp:read | Connectivity and entitlement check. |
POST/v1/whatsapp/messages | whatsapp:send | Send a WhatsApp message. wa_account_id, to, body. |
GET/v1/whatsapp/messages/{id} | whatsapp:read | Read one message's status. |
GET/v1/telegram/ping | telegram:read | Connectivity and entitlement check. |
POST/v1/telegram/messages | telegram:send | Send a Telegram message. bot_id, chat_id, text. |
GET/v1/telegram/messages/{id} | telegram:read | Read one message's status. |
All send endpoints are transactional: a 202 always means the message is safely queued. Email and SMS do not have per-message status endpoints; use their dashboard history and webhooks to observe outcomes. WhatsApp states are queued, pending, sent, delivered, read, failed, or unknown. Telegram states are queued, pending, sent, failed, or unknown, where sent is terminal. SMS states are listed under SMS.
Errors & retries
Every error returns the same JSON shape with an appropriate HTTP status:
{ "error": { "code": "domain_not_verified", "message": "..." } }
| Status and code | What to do |
|---|---|
400 bad_request | Correct the request body. SMS can also return message_too_long. |
401 unauthorized, 403 forbidden | Check the key, its scopes, the arm's status, and domain verification. |
403 insufficient_scope | The key is valid but lacks the scope this endpoint needs. |
403 arm_disabled | The channel is not enabled for this workspace. An owner or admin enables it in that arm's Settings. |
403 domain_not_verified | The from domain is not verified. See Verify a sending domain. |
403 destination_not_allowed | The SMS destination is not permitted for this workspace. Use an allowed number. |
404 not_found | Check the linked account, bot, or message ID. |
409 idempotency_conflict | For Email, the key was already used with a different message. SMS, WhatsApp, and Telegram return the original message for a reused key, so use a new key for each logical send. |
409 not_connected | The WhatsApp account is not currently linked. Re-scan the QR code. |
429 rate_limited, quota_exceeded, recipient_rate_limited | Respect Retry-After and retry later. Do not create a duplicate message. |
Always include a stable idempotency_key when retrying a send after a timeout or network failure. Where a daily quota applies, Supromail returns X-Quota-Remaining on successful sends.
Limits & retention
Plan allowances bound your email volume; the safety ceilings below exist to contain abuse from a leaked key, not to throttle normal use. All limits are configurable by your operator.
Plan allowances
Supromail does not charge usage overages. Email sends beyond the monthly allowance are rejected until the next calendar month or a plan change; creating a project or other resource above a plan cap is rejected until you reduce active resources or change plans. See Pricing for the per-plan numbers.
SMS safety ceilings
| Limit (per workspace) | Default |
|---|---|
| Maximum segments per message | 10 (about 1,530 GSM-7 characters) |
| Messages per day / per month | 5,000 / 100,000 |
| Messages to one recipient per hour / per day | 30 / 100 |
| Duplicate (same recipient and body) collapse window | 30 seconds |
Request rate limits
| Scope | Limit |
|---|---|
| Per IP, globally | 100 requests/second |
| Per IP, send endpoints | 20 requests/second |
| Per API key, send endpoints | 20 requests/second |
| Per device | 5 requests/second |
A limited request returns 429 with Retry-After. WhatsApp throughput is additionally bounded by the linked phone and WhatsApp's own anti-abuse systems; Telegram by its flood control, roughly 30 messages/second per bot. Ramp fresh numbers gently.
Data retention
| Data | How long it is kept |
|---|---|
| Event and activity logs (per-message delivery events) | Your plan's window — Free 1 day, Developer 3 days, Growth 15 days, Business 30 days |
| Account and security audit events | At least 90 days, regardless of plan |
| Stored messages — SMS, WhatsApp, Telegram, inbound-email metadata | The more restrictive of the newest 100 per channel and your plan's window |
| Business Email mailbox contents | Until you delete them — bounded by the mailbox's storage limit, not these windows |
Because only the newest 100 messages per channel are retained, dashboard message lists and lifetime counters reflect that window — older history is removed, not archived. Support communications are generally retained for 90 days after closure. The Privacy Policy is the authoritative retention statement.
Plans & billing
Messaging and Business Email are independently billed monthly products that can be used separately or together. A paid Messaging plan includes five Business Email mailboxes; a Business Email subscription's allowance stacks on top of those. Paid plans are billed monthly in advance and renew automatically until cancelled.
A workspace owner manages each product in Plan & billing. An upgrade requires payment confirmation. A downgrade applies the lower tier while preserving the current paid period. A cancellation stops renewal at the end of that period; if Resume subscription is offered before the period ends, the owner can undo the pending cancellation without a new checkout. Once it ends, subscribing again requires checkout.
Existing resources are not silently deleted on downgrade, but you cannot create additional resources above the new plan's limit. See Pricing and the Terms.
Security & privacy
Supromail uses measures designed to protect the hosted Service and customer data, including access controls, protections for sensitive credentials, controls for connected sending resources, safeguards against abuse, and backup and recovery processes. No security measure eliminates all risk.
Read the Security page for reporting contacts and the Privacy Policy for data roles, retention, subprocessors, and international transfers. Do not use the Service for highly sensitive or regulated data unless we have agreed in writing that the intended use is supported.
Help & support
Every plan can start a support conversation through the chat widget in the Supromail app, and email [email protected]. Response targets vary by plan and are not service-level commitments. Enterprise support, including any dedicated chat, phone, or SLA, requires a separate written agreement.
For billing, security, abuse, or sales enquiries: [email protected], [email protected], [email protected], or [email protected].