Documentation

Get from signup to first SMS in five minutes

Last updated · 2026-05-19

8ms turns Android phones you already own into a programmable SMS endpoint. This page is the short-form overview — enough to get the first message out, paired with links to deeper references for the API, webhooks, and the GoHighLevel integration.

Quickstart

  1. Create your workspace. Sign up at app.8ms.dev/login. You'll receive a magic link by email; clicking it creates your workspace.
  2. Download the Android app. Visit 8ms.dev/download on the phone you want to use as a gateway, install the APK, and open it.
  3. Pair the phone with a QR code. In the dashboard, go to Phones → Add a phone. The dashboard shows a QR code. In the 8ms app on the phone, tap Scan QR. The phone registers automatically; the dashboard's phone-card flips to Connected within a few seconds.
  4. Send your first SMS. Open the conversation inbox or call the API:
    curl -X POST https://api.8ms.dev/v1/sms/send \
      -H "Authorization: Bearer $YOUR_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"to":"+14155551234","body":"Hello from my own phone"}'
    The message leaves your paired phone over its normal carrier connection within seconds.

How the gateway works

Your phone holds a persistent server-sent-events connection to gateway.8ms.dev. When you queue an outbound message — from the dashboard, from a campaign, or via API — the gateway forwards a send command down that connection. The phone uses Android's standard SmsManager to deliver it on whichever SIM you've selected, and reports delivery state back. Inbound replies are captured by the same app and forwarded to your account via a webhook.

Because the SMS leaves your own phone, you keep the sender identity, the conversational nature of the channel, and the carrier-level deliverability that mass-CPaaS providers can't match. You also keep responsibility for the consent of every recipient — see our Terms and the compliance guide below.

Pairing in detail

Every QR code is a single-use, 10-minute deep-link that encodes the gateway endpoint, a registration token, and an optional label for the phone. The Android app handles the URI through an eightms://pair intent filter, so scanning the QR is a one-tap operation — no typing of server URLs or credentials. After pairing, the dashboard shows the phone with health signals: battery percentage, network type (Wi-Fi / 4G / 5G), and the timestamp of its most recent heartbeat.

Carrier warmup & rate limits

Fresh SIMs that suddenly blast hundreds of messages a day get flagged and blocked by carriers. To avoid that, 8ms ramps the daily send cap on every new phone over the first three weeks:

Phone age (days)Effective daily cap
1–7min(50, your configured cap)
8–14min(100, your configured cap)
15–21min(150, your configured cap)
22+your configured cap (default 200)

Each phone also has a minimum gap between sends (default 240 seconds, about 15 sends per hour, which looks human to carriers). Quiet-hours windows pause outbound at night automatically. All these defaults can be tightened — but only loosened with a warning, since they're what keeps your SIMs healthy.

Conversations & opt-outs

Every send/reply is stored as a conversation against the contact's phone number. Replies are run through a keyword check (STOP / UNSUBSCRIBE / REMOVE / QUIT / END / CANCEL / OPTOUT, case-insensitive) — any match marks the contact as do_not_contact, blocks future sends, and sends a single confirmation reply. Inbound replies that aren't opt-outs are optionally run through an AI classifier (Claude Haiku) to flag intent (positive / negative / question / appointment) and surface a suggested response in the inbox.

API basics

Full API reference is at /v1/docs in your account (OpenAPI spec, interactive). Common endpoints:

# Send a single SMS
POST /v1/sms/send                { contact_id, body, phone_id? }

# Bulk-import contacts (CSV multipart)
POST /v1/contacts/bulk           CSV: first_name,last_name,phone,email,...

# Create + start a campaign
POST /v1/campaigns               { name, template, contact_filter, send_window }
POST /v1/campaigns/{id}/start

# List phones with live health
GET  /v1/phones

# List conversations (paginated)
GET  /v1/conversations?status=unread&limit=50

Authentication is a Bearer JWT issued by Supabase (the same login your dashboard uses) or a long-lived API key minted under Settings → API keys in your account.

Webhooks

Subscribe at Settings → Webhooks. We deliver these events, signed with HMAC-SHA256 of the request body using your webhook secret:

GoHighLevel integration

If your team works inside GoHighLevel, connect 8ms via Settings → Integrations → Connect GHL. Two-way sync mirrors outbound messages from your inbox into GHL conversations and routes replies from inside the GHL inbox back through your Android phones — your team never leaves GHL, and SMS goes out through your own carrier connection rather than Twilio. DNC tags sync bidirectionally.

Full reference: /integrations/gohighlevel.

Help

Stuck? Email support@8ms.dev or visit the support page for response-time expectations and common troubleshooting topics.