Start here

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.

.env
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

curl
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.