Send emails from your verified domains via a simple REST API. Reliable delivery, real-time status tracking, and full DKIM/SPF authentication — all included.
All API requests must include a Bearer token in the Authorization header. API keys use the je_ prefix.
Authorization: Bearer je_live_abc123...You can create and manage API keys from the dashboard or via the POST /api-keys endpoint below.
https://justemails.app/api/v1All paths below are relative to this base URL. HTTPS is required.
/sendSend a transactional email from a verified domain.
Request body
{
"from": "hello@yourdomain.com",
"to": "user@example.com",
"subject": "Welcome!",
"html": "<h1>Hello</h1><p>Thanks for signing up.</p>",
"text": "Hello — Thanks for signing up.",
"replyTo": "support@yourdomain.com",
"headers": { "X-My-Tag": "onboarding" }
}Response
{
"id": "msg_abc123",
"status": "queued",
"from": "hello@yourdomain.com",
"to": "user@example.com",
"createdAt": "2026-04-06T12:00:00Z"
}/send/:idRetrieve the delivery status of a sent message.
Response
{
"id": "msg_abc123",
"status": "delivered",
"from": "hello@yourdomain.com",
"to": "user@example.com",
"subject": "Welcome!",
"createdAt": "2026-04-06T12:00:00Z",
"deliveredAt": "2026-04-06T12:00:02Z"
}/messagesList sent messages with optional filters.
Response
{
"data": [ { "id": "msg_abc123", "status": "delivered", ... } ],
"pagination": { "page": 1, "perPage": 50, "total": 312 }
}/api-keysCreate a new API key.
Request body
{ "name": "Production backend" }Response
{
"id": "key_xyz789",
"name": "Production backend",
"key": "je_live_abc123...",
"createdAt": "2026-04-06T12:00:00Z"
}/api-keysList all API keys for the authenticated account.
Response
{
"data": [
{ "id": "key_xyz789", "name": "Production backend", "lastUsed": "2026-04-06T11:50:00Z" }
]
}/api-keys/:idRevoke an API key. This action is irreversible.
Response
{ "deleted": true }curl -X POST https://justemails.app/api/v1/send \
-H "Authorization: Bearer je_live_abc123..." \
-H "Content-Type: application/json" \
-d '{
"from": "hello@yourdomain.com",
"to": "user@example.com",
"subject": "Welcome!",
"html": "<h1>Hello</h1>"
}'import fetch from "node-fetch";
const res = await fetch("https://justemails.app/api/v1/send", {
method: "POST",
headers: {
Authorization: "Bearer je_live_abc123...",
"Content-Type": "application/json",
},
body: JSON.stringify({
from: "hello@yourdomain.com",
to: "user@example.com",
subject: "Welcome!",
html: "<h1>Hello</h1>",
}),
});
const data = await res.json();
console.log(data.id); // "msg_abc123"import requests
resp = requests.post(
"https://justemails.app/api/v1/send",
headers={
"Authorization": "Bearer je_live_abc123...",
"Content-Type": "application/json",
},
json={
"from": "hello@yourdomain.com",
"to": "user@example.com",
"subject": "Welcome!",
"html": "<h1>Hello</h1>",
},
)
data = resp.json()
print(data["id"]) # "msg_abc123"API requests are rate-limited per API key to ensure fair usage and platform stability.
| Tier | Limit | Window |
|---|---|---|
| Send emails | 100 requests | per minute |
| Read endpoints | 300 requests | per minute |
| Key management | 10 requests | per minute |
When you exceed the limit you will receive a 429 Too Many Requests response. Use the Retry-After header to know when to retry.
Error responses always return a JSON body with error and message fields.
{ "error": "VALIDATION_ERROR", "message": "The 'to' field is required." }| Code | Meaning | Description |
|---|---|---|
| 400 | Bad Request | Missing or invalid parameters. |
| 401 | Unauthorized | Missing or invalid API key. |
| 403 | Forbidden | The API key does not have permission for this action. |
| 404 | Not Found | The requested resource does not exist. |
| 409 | Conflict | Duplicate resource (e.g. sending-domain already exists). |
| 422 | Unprocessable Entity | Validation failed (e.g. unverified from domain). |
| 429 | Too Many Requests | Rate limit exceeded. Retry after the Retry-After header. |
| 500 | Internal Server Error | Something went wrong on our end. Please try again. |
Create a free account, verify your domain, and get your API key in under 2 minutes.