A clean, versioned JSON API that integrates in minutes. Works with any language, framework, or platform. Sub-100ms response time, guaranteed.
https://api.maildoot.net/v1
All requests require Authorization: Bearer <api_key>
Static mdsk_ keys for machines. Scoped to full, send, or read. Optional expiry.
Consistent JSON request/response. Machine-readable error codes. Predictable 4xx/5xx shapes across every endpoint.
URL-path versioning (/v1/). We never break existing integrations — deprecations announced 6 months ahead.
Messages are queued immediately and returned with 202 Accepted. Delivery happens asynchronously by our MTA cluster.
All endpoints under https://api.maildoot.net/v1/
| Method | Endpoint | Description |
|---|---|---|
| POST | /messages | Send a single email or batch |
| GET | /messages | List transactions with filters |
| GET | /messages/:msg_id | Get full transaction detail + delivery events |
| DEL | /messages/:msg_id | Cancel a queued message |
| Method | Endpoint | Description |
|---|---|---|
| GET | /templates | List all templates |
| POST | /templates | Create a new template with {{variables}} |
| GET | /templates/:template_id | Get template by ID |
| PATCH | /templates/:template_id | Update template |
| DEL | /templates/:template_id | Delete template |
| POST | /templates/:template_id/send | Send using a template with variable substitution |
| Method | Endpoint | Description |
|---|---|---|
| GET | /user-settings/domains | List sending domains |
| POST | /user-settings/domains | Add domain — get DNS records |
| POST | /user-settings/domains/:domain/verify | Trigger DNS verification |
| GET | /user-settings/smtp-users | List SMTP users |
| POST | /user-settings/smtp-users | Create SMTP user |
| GET | /user-settings/callbacks | List webhook callbacks |
| POST | /user-settings/callbacks | Create webhook callback |
| Method | Endpoint | Description |
|---|---|---|
| POST | /auth/login | Email + password → JWT access token |
| POST | /auth/refresh | Refresh JWT access token |
| GET | /api-keys | List API keys |
| POST | /api-keys | Create API key with scope |
| DEL | /api-keys/:key_id | Revoke API key |
No proprietary SDK required — any HTTP client works.
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>"
}'
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>',
}),
}
);
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>",
}
)
$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);
Read the full API reference with request/response examples for every endpoint.