> ## Documentation Index
> Fetch the complete documentation index at: https://docs.moritosh.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Quickstart

> Send your first message in under five minutes

## Step 1: Create an API key

Sign in to the [Pulsewave dashboard](https://dashboard.pulsewave.dev) and create a key from **Settings → API Keys**, or create one via the API itself once you have a starter key:

```bash theme={null}
curl -X POST https://api.pulsewave.dev/v1/api-keys \
  -H "Authorization: Bearer pw_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "name": "Quickstart", "mode": "test" }'
```

Start with a **test key** (`pw_test_...`) — it behaves identically to a live key but only delivers to addresses you've verified as test recipients, and never bills your account. See [Authentication](/authentication).

## Step 2: Install an SDK

<CodeGroup>
  ```bash Node.js theme={null}
  npm install pulsewave
  ```

  ```bash Python theme={null}
  pip install pulsewave
  ```
</CodeGroup>

## Step 3: Send a message

<CodeGroup>
  ```javascript Node.js theme={null}
  import Pulsewave from 'pulsewave';

  const pulsewave = new Pulsewave(process.env.PULSEWAVE_API_KEY);

  const message = await pulsewave.messages.send({
    channel: 'email',
    to: 'you@example.com',
    from: 'onboarding@notifications.acme.com',
    subject: 'Hello from Pulsewave',
    html: '<p>This is your first message.</p>',
  });

  console.log(message.id, message.status);
  ```

  ```python Python theme={null}
  from pulsewave import Pulsewave

  pulsewave = Pulsewave(api_key=os.environ["PULSEWAVE_API_KEY"])

  message = pulsewave.messages.send(
      channel="email",
      to="you@example.com",
      from_="onboarding@notifications.acme.com",
      subject="Hello from Pulsewave",
      html="<p>This is your first message.</p>",
  )

  print(message.id, message.status)
  ```

  ```bash cURL theme={null}
  curl -X POST https://api.pulsewave.dev/v1/messages \
    -H "Authorization: Bearer pw_test_..." \
    -H "Content-Type: application/json" \
    -d '{
      "channel": "email",
      "to": "you@example.com",
      "from": "onboarding@notifications.acme.com",
      "subject": "Hello from Pulsewave",
      "html": "<p>This is your first message.</p>"
    }'
  ```
</CodeGroup>

You'll get back a message in `queued` status:

```json theme={null}
{
  "id": "msg_3p2k9q",
  "object": "message",
  "channel": "email",
  "status": "queued",
  "to": "you@example.com",
  "from": "onboarding@notifications.acme.com",
  "subject": "Hello from Pulsewave",
  "created_at": "2024-06-01T14:32:00Z"
}
```

## Step 4: Track delivery

Poll [Retrieve a message](/api-reference/messages/retrieve) with the returned `id`:

```bash theme={null}
curl https://api.pulsewave.dev/v1/messages/msg_3p2k9q \
  -H "Authorization: Bearer pw_test_..."
```

Or, better, set up a [webhook endpoint](/api-reference/webhook-endpoints/create) once and get delivery, bounce, open, and click events pushed to you automatically — see [Webhooks](/webhooks).

## Next steps

<CardGroup cols={2}>
  <Card title="Use a domain you own" icon="globe" href="/concepts/domains">
    Verify a sending domain for better email deliverability.
  </Card>

  <Card title="Build with templates" icon="file-lines" href="/concepts/templates">
    Move message content out of your codebase and into reusable templates.
  </Card>

  <Card title="Add SMS and push" icon="comment-sms" href="/concepts/messages">
    Send to other channels with the same endpoint.
  </Card>

  <Card title="Go live" icon="key" href="/authentication">
    Switch from a test key to a live key when you're ready.
  </Card>
</CardGroup>
