# Quickstart

Source: https://joinsimplesms.com/docs/quickstart
Index: https://joinsimplesms.com/llms.txt

Send your first SMS in under five minutes. No card, no sales call: a test key
works instantly against the sandbox.

## Choose your path

The console asks what you are here to do and shows only the steps that goal
needs. The same four paths, in the docs:

- **Send SMS from your app.** Stay on this page: get a key, send a test, then
  [buy a number](/docs/numbers), [register your use case](/docs/compliance)
  and go live. You never need to import contacts.
- **Send a broadcast to customers.** Upload your list to
  [Contacts](/docs/contacts), then compose, preview, check and send a
  [broadcast](/docs/broadcasts).
- **Build an automated SMS flow.** Emit events from your code and let a flow
  send the messages, with waits and conditions, under
  [Automations in the console](/console/automations).
- **Move from Twilio.** Bring numbers, sender pools and webhooks for app
  messaging, or numbers, contacts and templates for marketing:
  [Migrate from Twilio](/docs/migrate-from-twilio).

A marketing send is a *broadcast*. "Campaign" here only ever means the use
case you register with carriers, which lives under
[Compliance](/docs/compliance).

## 1. Get a key

Create a free account at [the console](/console). A sandbox tenant
is provisioned automatically with a test key (`ssms_sk_test_...`) and a
sandbox number. The key is shown once, so copy it.

## 2. Send a message

```bash
curl -X POST https://api.joinsimplesms.com/v1/messages \
  -H "Authorization: Bearer ssms_sk_test_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "+15005550100",
    "to": "+15005550006",
    "body": "Hello from SimpleSMS"
  }'
```

Replace `from` with your sandbox number (shown in the console). `+15005550006`
is a magic sandbox number that simulates successful delivery. Put the phone you
verified in the console in `to` instead and the text really arrives.

## 3. Read the response

```json
{
  "id": "msg_a1B2c3D4e5F6g7H8",
  "object": "message",
  "to": "+15005550006",
  "from": "+15005550100",
  "body": "Hello from SimpleSMS",
  "direction": "outbound",
  "status": "delivered",
  "test": true,
  "created_at": "2026-08-06T16:20:00.000Z"
}
```

Fetch it back anytime with `GET /v1/messages/{id}`, and watch the delivery
lifecycle in `GET /v1/events` (`message.sent`, then `message.delivered`). The message's `timeline` shows each step with its timestamp.

## 4. Simulate a reply

```bash
curl -X POST https://api.joinsimplesms.com/v1/test/inbound \
  -H "Authorization: Bearer ssms_sk_test_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+15005550100",
    "from": "+14155550132",
    "body": "Hey, got your message!"
  }'
```

The inbound message lands in `GET /v1/messages` and emits a
`message.received` event, exactly what a real inbound SMS will do in live
mode.

## 5. Receive events (webhooks)

Instead of polling, add an endpoint URL under
[Webhooks in the console](/console/webhooks) and every event is POSTed to
you, signed, with automatic retries. Details in the
[webhooks docs](/docs/webhooks).

## 6. Go live

When you're ready to send real SMS from real numbers, request live access from
the [console](/console): one sentence about what you're building,
and we usually flip the switch same day. Live access is free during early
access.
