Maildoot
REST API · v1

Send email with a
single API call

A clean, versioned JSON API that integrates in minutes. Works with any language, framework, or platform. Sub-100ms response time, guaranteed.

Base URL https://api.maildoot.net/v1 All requests require Authorization: Bearer <api_key>

Built the way developers want it

Scoped API keys

Static mdsk_ keys for machines. Scoped to full, send, or read. Optional expiry.

JSON everywhere

Consistent JSON request/response. Machine-readable error codes. Predictable 4xx/5xx shapes across every endpoint.

Versioned forever

URL-path versioning (/v1/). We never break existing integrations — deprecations announced 6 months ahead.

Sub-100ms response

Messages are queued immediately and returned with 202 Accepted. Delivery happens asynchronously by our MTA cluster.

API endpoints

All endpoints under https://api.maildoot.net/v1/

Email Sending

MethodEndpointDescription
POST/messagesSend a single email or batch
GET/messagesList transactions with filters
GET/messages/:msg_idGet full transaction detail + delivery events
DEL/messages/:msg_idCancel a queued message

Templates

MethodEndpointDescription
GET/templatesList all templates
POST/templatesCreate a new template with {{variables}}
GET/templates/:template_idGet template by ID
PATCH/templates/:template_idUpdate template
DEL/templates/:template_idDelete template
POST/templates/:template_id/sendSend using a template with variable substitution

User Settings

MethodEndpointDescription
GET/user-settings/domainsList sending domains
POST/user-settings/domainsAdd domain — get DNS records
POST/user-settings/domains/:domain/verifyTrigger DNS verification
GET/user-settings/smtp-usersList SMTP users
POST/user-settings/smtp-usersCreate SMTP user
GET/user-settings/callbacksList webhook callbacks
POST/user-settings/callbacksCreate webhook callback

Auth & API Keys

MethodEndpointDescription
POST/auth/loginEmail + password → JWT access token
POST/auth/refreshRefresh JWT access token
GET/api-keysList API keys
POST/api-keysCreate API key with scope
DEL/api-keys/:key_idRevoke API key

Send from any language

No proprietary SDK required — any HTTP client works.

cURL
curl -X POST \
  https://api.maildoot.net/v1/messages \
  -H "Authorization: Bearer mdsk_..." \
  -H "Content-Type: application/json" \
  -d '{
    "from": "no-reply@yourdomain.com",
    "to": "user@example.com",
    "subject": "Order Confirmed",
    "html": "<p>Your order is confirmed!</p>"
  }'
Node.js
const res = await fetch(
  'https://api.maildoot.net/v1/messages',
  {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      from: 'no-reply@yourdomain.com',
      to:   'user@example.com',
      subject: 'Order Confirmed',
      html: '<p>Your order is confirmed!</p>',
    }),
  }
);
Python
import requests

res = requests.post(
  "https://api.maildoot.net/v1/messages",
  headers={
    "Authorization": f"Bearer {API_KEY}",
    "Content-Type": "application/json",
  },
  json={
    "from": "no-reply@yourdomain.com",
    "to": "user@example.com",
    "subject": "Order Confirmed",
    "html": "<p>Confirmed!</p>",
  }
)
PHP
$ch = curl_init('https://api.maildoot.net/v1/messages');
curl_setopt_array($ch, [
  CURLOPT_POST       => true,
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer {$API_KEY}",
    'Content-Type: application/json',
  ],
  CURLOPT_POSTFIELDS => json_encode([
    'from'    => 'no-reply@yourdomain.com',
    'to'      => 'user@example.com',
    'subject' => 'Order Confirmed',
    'html'    => '<p>Confirmed!</p>',
  ]),
]);
$res = curl_exec($ch);

Ready to integrate?

Read the full API reference with request/response examples for every endpoint.