Base URL: https://api.convertnow.co
All API keys begin with cn_live_ and are generated from your dashboard at Email API → API Keys.
Authentication
The public send API uses Bearer token authentication with your cn_live_ API key.
Authorization: Bearer cn_live_YOUR_KEY
Keys are stored as SHA-256 hashes. The raw key is shown only once at creation time.
POST /v1/email/send
Send a transactional email.
Authentication: Authorization: Bearer cn_live_YOUR_KEY
Request body
Field | Type | Required | Description |
to | string | string[] | Yes | One recipient or an array. All addresses receive the email in a single send. |
from | string | No | Sender address. Falls back to your account reply-to, then [email protected]. |
cc | string | string[] | No | Carbon-copy recipient(s). |
bcc | string | string[] | No | Blind carbon-copy recipient(s). |
subject | string | Yes | Email subject line. |
html | string | Yes* | HTML body. Required if text is not provided. |
text | string | Yes* | Plain-text body. Required if html is not provided. |
reply_to | string | No | Reply-To address. |
attachments | Attachment[] | No | File attachments. Max total size 10 MB. |
tags | string[] | No | Attribution tags. Max 10 tags, 64 characters each. |
📌 Custom headers passthrough is not yet available on the HTTP API. Use SMTP (port 465) for custom headers.
📌 Auto-injected: List-Unsubscribe and List-Unsubscribe-Post headers are added to every send automatically.
Attachment object
Field | Type | Required | Description |
filename | string | Yes | File name shown to recipients (e.g. report.pdf). |
content | string | Yes | Base64-encoded file content. |
content_type | string | No | MIME type. Defaults to application/octet-stream. |
Success response 200
{
“id”: “msg_abc123xyz”,
“status”: “sent”,
“message”: “Email queued for delivery to 2 recipients”
}
Error responses
Status | Meaning |
400 | Missing required fields / invalid email format / invalid tags |
401 | Invalid or revoked API key |
422 | All recipient addresses are suppressed |
502 | Upstream mail server rejected the message |
Node.js example
const response = await fetch(‘https://api.convertnow.co/v1/email/send’, {
method: ‘POST’,
headers: {
‘Authorization’: ‘Bearer cn_live_YOUR_KEY’,
‘Content-Type’: ‘application/json’,
},
body: JSON.stringify({
to: ‘[email protected]’,
subject: ‘Hello from ConvertNow’,
html: ‘<h1>It works!</h1>’,
}),
});
const data = await response.json();
Python example
import requests
response = requests.post(
‘https://api.convertnow.co/v1/email/send’,
headers={‘Authorization’: ‘Bearer cn_live_YOUR_KEY’},
json={‘to’: ‘[email protected]’, ‘subject’: ‘Hello’, ‘html’: ‘<h1>It works!</h1>’}
)
print(response.json())
curl example
curl -X POST https://api.convertnow.co/v1/email/send \
-H “Authorization: Bearer cn_live_YOUR_KEY” \
-H “Content-Type: application/json” \
-d ‘{“to”:”[email protected]”,”subject”:”Hello”,”html”:”<h1>It works!</h1>”}’
GET /api/email-api/keys
List all API keys for the authenticated account. Authentication: JWT session token (web app only).
POST /api/email-api/keys
Create a new API key. Body: { “name”: “Production” }. The rawKey is returned only at creation time.
DELETE /api/email-api/keys/:id
Revoke an API key permanently. Authentication: JWT session token.
GET /api/email-api/logs
Retrieve recent send logs. Query param: limit (default 50, max 200). Authentication: JWT session token.