# Quickstart

Source: https://jointextkit.com/docs/quickstart
Index: https://jointextkit.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 another provider.** Bring numbers, sender pools and webhooks
  for app messaging, or numbers, contacts and templates for marketing:
  [migration guides](/migrate).

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

Using Node.js, Python, Next.js, Django, Laravel or another stack? The
[quickstarts by language](/docs/quickstarts) show the same steps in it.

## 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. Copy it from Home.

## 2. Send a message

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

That is the whole request. `from` is optional here: a test key sends from
your sandbox number (shown in the console). `+15005550006` is a magic sandbox
number that simulates successful delivery.

Test keys simulate. The message below ends up `delivered`, but no text is
sent to any phone: `"simulated": true` says so. The one exception is your own
verified phone. Verify it (sign-up offers this, or
[Settings](/console/settings) later), put it in `to`, and a test key hands
that text to a carrier for real; the response then says
`"simulated": false`. See [Sandbox](/docs/sandbox#simulated-or-real).

## 3. Read the response

```json
{
  "id": "msg_a1B2c3D4e5F6g7H8",
  "object": "message",
  "to": "+15005550006",
  "from": "+15005550100",
  "body": "Hello from TextKit",
  "direction": "outbound",
  "status": "delivered",
  "test": true,
  "simulated": 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.jointextkit.com/v1/test/inbound \
  -H "Authorization: Bearer ssms_sk_test_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "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, add a number and
register your business from the [console](/console). We verify your business
(someone authorized to act for it signs for it) and file your registration
with the carriers. Until the carriers approve it, your number can text only
your own verified numbers; after that, it can text anyone who opted in. See
[going live](/docs/compliance).
