Send one transactional email (one event, one payload) to one or more recipients.
Use for password resets, receipts, shipping updates, and other app-triggered mail. Clean addresses first with Email Validator. Verify domains/senders before first send (Setting up your email account). Marketing blasts belong in Waymore, not this API.
A 200 response means the message was accepted for processing — not delivered — and that at least one valid to was accepted. Persist trackingId and recipients[]. Invalid to / cc / bcc mailboxes may appear in rejected[] (not charged, no timeline). If every to fails local mailbox syntax, the API returns 400 with to: at least one valid mailbox address. Invalid from / replyTo reject the whole request.
Persist ids, then poll Search email tracking / Get email tracking (single message timeline) after ~1–2 minutes, or configure callback webhooks.
Common failures: 400 unverified domain/sender, mailbox syntax, validation, or insufficient balance; 401 bad token; 403 missing transactional_email scope.
Quickstarts: Send your first email (HTTP API), Send transactional email via SMTP.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
Send a transactional email over HTTP API v2 on Connect (https://connect.routee.net/transactional-email).
HTTP 200 means the message was accepted for processing, not delivered to the recipient's inbox. Delivery status arrives asynchronously via optional callbacks or the Email Tracking API.
Authentication
- Obtain a Bearer token with OAuth 2.0 client credentials —
POST https://auth.routee.net/oauth/tokenusing HTTP Basic auth (Application ID:Application Secret),grant_type=client_credentials, andscope=transactional_email. See Get authenticated using your application credentials. - Call this endpoint with
Authorization: Bearer {access_token}.
Do not send a Principal header (or any account-id header). Routee resolves your tenant from the OAuth token.
Usage is charged against your Transactional Email subscription on go.routee.net (Email → Pricing → My Plan). Ensure the subscription is active before sending; otherwise the API returns HTTP 400 with error code 000004 (No active subscription exists).
Example — cURL
# 1) Token (Basic auth with application credentials)
curl -s -X POST 'https://auth.routee.net/oauth/token' \
-u 'YOUR_APPLICATION_ID:YOUR_APPLICATION_SECRET' \
-d 'grant_type=client_credentials&scope=transactional_email'
# 2) Send (Bearer token from step 1)
curl -X POST 'https://connect.routee.net/transactional-email' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
-d '{
"from": { "name": "Acme", "address": "[email protected]" },
"to": [{ "address": "[email protected]" }],
"subject": "Order confirmed",
"content": { "html": "<p>Thank you.</p>" }
}'Response
| Field | Description |
|---|---|
trackingId | Primary id for Search email tracking and Get email tracking (single message timeline). |
Tracking rows typically appear within 1–2 minutes after a successful send.
Common HTTP 400 errors
| errorCode | Typical cause |
|---|---|
000000 | Invalid or unverified sending domain |
000001 | Invalid sender address |
000002 | Unverified sender |
000003 | Message size limit exceeded |
000004 | No active subscription |
000005 | Insufficient subscription resources |
Skip link and open tracking
By default Routee rewrites HTML links for click tracking and injects an open-tracking pixel (trackLinks and trackOpens default to true). Set either flag to false on this request to leave original hrefs and/or skip the pixel.
{
"from": { "address": "[email protected]" },
"to": [{ "address": "[email protected]" }],
"subject": "Order confirmed",
"content": { "html": "<p>Thanks. <a href=\"https://example.com/order\">View order</a></p>" },
"trackLinks": false,
"trackOpens": false
}These flags control instrumentation of the message. callback.eventCallback is separate — it only configures webhook URLs for opens and clicks that actually occur. HTTP API only; SMTP has no equivalent fields. Field reference: Track Links & Opens Explained.
Optional callback.statusCallback and callback.eventCallback (onOpen, onClick) receive HTTPS POST notifications as the message progresses. Engagement callbacks fire on every open/click; webhook results[] is latest-only — see Email callback payloads. Set send-time label to your campaign id for searchable tracking (fieldName=label / tags).
401Unauthorized — missing, invalid, or expired Bearer token. Obtain a new token from Authentication.
403Access denied — token lacks transactional_email (or equivalent) permission/scope.

