---
title: Quickstart | SendHQ Docs
description: Create a key, verify a domain, and send a controlled email with a retry-safe request.
canonical: https://sendhq.cc/docs/quickstart
last-updated: 2026-09-07
---
# Quickstart

Create a key, verify a domain, and send a controlled email with a retry-safe request.

## Before you begin

Create a SendHQ workspace and keep the dashboard open. New workspaces receive a controlled integration trial: deliveries can go only to the account email or an AWS SES simulator address until a paid subscription is active.

## 1. Create an API key

Open **API keys** in the dashboard, choose a descriptive name such as `Production`, and copy the key when it is shown. Store it in a server-side secret manager. SendHQ never returns the full value again.

```shell
SENDHQ_API_KEY=re_your_key_here
```

## 2. Add a sending domain

Open **Domains**, add a domain you control, and publish the returned DKIM, SPF, DMARC, and SES verification records. Cloudflare users can authorize a one-time DNS setup; SendHQ discards the OAuth token after the callback.

**Do not publish a second SPF policy.** If SPF already exists, merge `include:amazonses.com` into the existing `v=spf1` value.

## 3. Wait for verification

Use the dashboard or `POST /domains/:id/verify`. DNS can move through `pending`, `checking`, and `propagating` before SES reports the identity as `verified`.

## 4. Send a controlled message

```shell
curl https://sendhq.cc/api/v1/emails \
  -H "Authorization: Bearer $SENDHQ_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: onboarding-user-42" \
  -d '{"from":"Acme <hello@example.com>","to":["owner@example.com"],"subject":"SendHQ is connected","html":"<h1>It works</h1><p>Your first controlled message was accepted.</p>","text":"It works. Your first controlled message was accepted."}'
```

A successful request returns a SendHQ email ID, the provider message ID, and the conversation thread ID. Persist the SendHQ ID with the application event that caused the email.

## 5. Handle outcomes

An accepted API request is not the same as recipient delivery. Retrieve `/emails/:id/events` or use the dashboard to inspect delivery, bounce, complaint, reject, open, and click events.
