Skip to content

Everything you need to run SMS in production

One clean API, your own phones, and the operational depth of a real platform.

Messaging

Send SMS via REST API

One endpoint, JSON in, job id out. Long messages are split and reassembled automatically; send up to 1,600 characters per message. POST /api/v1/sms/send returns 202 Accepted with a job_… id.

Two-way messaging & chatbot replies

Receive replies as well as send. Incoming SMS are threaded into conversations in your inbox (Standard plan) and pushed to your webhook as sms:received (every plan). Connect your own bot for chatbot replies. Pass the event’s deviceId and simSlot for a same-SIM API reply, or pick that phone and SIM in the dashboard.

Delivery reports

Track what actually landed (Pending, Assigned, Sent, Delivered) per message, per SIM, per carrier. Real delivery state, beyond "we accepted it."

Bulk & priority sending

Queue many messages and let the engine fan them out across your devices. Priority levels (0–10) push time-sensitive OTPs ahead of bulk traffic.

Idempotency keys

While the original job is retained, an idempotencyKey lets a retried API request return that job. Delivery retries can still produce duplicate SMS.

Devices & routing

Email alerts for credit & battery

SMSKit can email a warning when a SIM's estimated SMS credit runs low or its bundle nears expiry, and when a phone's battery falls to a level you set. Turn on each alert per SIM or per phone from the dashboard. Alerts warn only; sending carries on. The credit amount is an estimate counted from the starting credit you enter and the messages SMSKit sends on that SIM. SMSKit does not read the carrier balance.

Replace a phone in the same slot

A slot covers one active phone at a time, not a particular phone. To replace a phone, deactivate or delete the old phone, then activate the new phone in the freed slot. A phone paired while a slot is free fills it on its own. There is no extra slot or charge.

Multi-device support

Connect as many phones as you have slots for. The engine load-balances sends across all of them.

Multi-SIM routing

Dual- and multi-SIM phones report every SIM. Enable, disable, and target individual SIMs from the dashboard. The server stays authoritative.

Per-device throttling

Each device has an hourly send limit (default 200/hr) to control its sending rate. Carrier filtering and SIM restrictions can still apply.

Auto-failover

A phone goes offline mid-send? In-flight jobs are unrouted and reassigned to a healthy device. No single phone is a single point of failure.

Retry and dead-letter queue

Failed sends retry across available devices with backoff. Jobs that exhaust every option land in a dead-letter queue you can inspect. Nothing silently disappears.

Device health monitoring

Battery, signal, network type, pending-job count, and last heartbeat for every phone, live in the dashboard.

Integration

Webhooks

Subscribe to sms:sent, sms:delivered, sms:failed, and sms:received. Deliveries retry with exponential backoff and jitter; failing endpoints auto-suspend so a dead URL does not back up your queue.

REST API and SDK

A clean, predictable API with a .NET reference SDK and copy-paste samples in cURL, Node.js, Python, PHP, C#, and Go.

API client keys with zero-downtime rotation

Each API client carries two independent keys (Key 1 and Key 2). Rotate one while the other keeps serving, with no downtime.

Archiving & history

Import existing history

Back up the inbox and sent messages already on the phone, including business texts sent from the phone's native app. New SMS sync after phone consent; older history needs a manual import. Standard covers up to 90 days, with 5,000 messages shared by manual and automatic uploads in a device’s 24-hour archive window and one manual import per 24 hours.

Unified two-way timeline

Received, SMSKit-sent, and imported messages merge per contact, each tagged with its origin, so you always know what SMSKit sent versus what the phone sent. Texts sent from the phone's own app after the import are not captured.

Bulk export (NDJSON / CSV)

On the Standard plan, export up to 50,000 messages per request for backup or migration: NDJSON by default, CSV on request. Use date ranges or the paginated messages API for larger timelines.

Pull API

On the Standard plan, use GET /api/v1/messages for paginated results filtered by peer, direction, origin, and date. GET /api/v1/archive/export accepts a date range and format, with a 50,000-message cap. Both use your API key and return 403 on Free.

Names instead of bare numbers

A contacts store resolves peer numbers to names across the inbox, archive, and API. Upload contacts in bulk from the dashboard or API, or import complete contacts from the phone. Edits in SMSKit change SMSKit’s copy only.

Retention & deletion

SMS expires under plan retention: 30 days on Standard. Delete imported and received messages individually or in bulk. SMSKit send-history rows are protected; contacts remain until deleted through the API or account deletion.

Operations & trust

Observability built in

Prometheus metrics, health checks, and structured logging with automatic PII masking, ready to use in production.

Real-time dashboard

Devices, jobs, and inboxes update live over the wire (SignalR). Watch a send go out and a reply come back without refreshing.

Fully managed

No servers to run, nothing to deploy. We operate the backend, push, routing, and dashboard; you bring phones and SIMs and start sending.

Scheduled backups

Automated database backups keep your job history and audit trail safe.

Explore SMSKit

Read the documentation or use your existing account. Public app downloads are currently unavailable.