Back to home

SMTPDog developer documentation

Clear integration guides: domain verification, SMTP and Email API, API keys, webhook signatures and troubleshooting.

01 · quickstart

Quickstart

Start with a verified sending domain, then connect through SMTP or the Email API.

1. Before you begin

Have an account with a verified email, a domain whose DNS you manage, and your current package details. Adding a domain requires an active package. Quotas and domain limits come from your actual account configuration. This guide does not perform login, purchases or real sends.

2. Add and verify a domain

Add an ASCII domain in the console. Read dns_records and publish the returned DKIM and SPF TXT values. Once DNS propagates, request verification and inspect all_passed and each check; HTTP 200 alone is not verification. Only verified sending domains can be used.

curl -X POST "${SMTPDOG_API_ORIGIN}/domains" \
  -H "Authorization: Bearer ${SMTPDOG_SESSION_TOKEN}" \
  -H "Content-Type: application/json" \
  --data '{"domain_name":"example.com"}'

3. Create a sending credential

Save the full key securely as soon as you create an API Key; subsequent lists expose metadata only. Prefer a domain scope. Sending uses an API Key, while domain and key management use a session token. Never interchange them or put a key in a browser or public repository.

4. Choose an integration

The Email API uses standard HTTP requests and returns a message_id. SMTP works with standard TLS-capable clients and accepts one recipient per message. Example environment variables are documentation placeholders, not backend configuration keys; set them to your verified connection details.

curl -X POST "${SMTPDOG_API_ORIGIN}/v1/mail/send" \
  -H "Authorization: Bearer ${SMTPDOG_API_KEY}" \
  -H "Content-Type: application/json" \
  --data '{
    "from": "sender@example.com",
    "to": "recipient@example.com",
    "subject": "Welcome to your product",
    "text": "Your message goes here."
  }'

5. Understand acceptance

HTTP 202 and queued mean accepted into the queue only. Query later status by message_id or receive Webhooks. sent does not guarantee inbox placement or reading. Do not blindly repeat a timed-out send: there is no client send idempotency protocol.