Email API Documentation
Version: 1.0.0 | Last updated: September 10, 2025
Brazeno’s Email API enables seamless, secure, and scalable messaging for your business. This documentation covers authentication, endpoints, request/response formats, error handling, and best practices.1. Send Email
POST /email
Sends an Email message. The message can be directly specified or templated.
Headers
x-api-key
(required): API key for authorization.
Request Body
Field | Type | Required | Description | Default |
---|---|---|---|---|
to | string | Yes | Destination email. Valid email address. Example: example@example.com . | - |
from | string | Yes | Originating email. Must be a verified sender in your account. | - |
body | string | Conditionally required | Email text body. Required if templateId is not provided. | - |
subject | string | Conditionally required | Email subject. Required if templateId is not provided. | |
templateId | string | Conditionally required | Template ID. Required if body & subject is not provided. | - |
data | object | No | Template data as key-value pairs. | - |
clientIdentifier | string | No | Source system identifier for tracking. | "" |
notBefore | string (ISO 8601) | No | Do not send before this UTC time. | - |
notAfter | string (ISO 8601) | No | Expire after this UTC time. | - |
Sample Request (Non Templated)
curl --location 'https://api.brazeno.com/api/v1/email' \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"to": "someone@example.com",
"from": "alerts@example.com",
"body": "This is a sample Email message for testing purposes.",
"subject": "Test Email",
"clientIdentifier": "client-001"
}'
Sample Request (Templated)
curl --location 'https://api.brazeno.com/api/v1/email' \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"templateId": "tmpl_1234567890abcdef",
"to": "someone@example.com",
"from": "alerts@example.com",
"data": {
"name": "Alex Example",
"address": "123 Example Street",
"etor": "8pm"
},
"clientIdentifier": "client-001",
"notBefore": "2025-01-01T12:00:00Z",
"notAfter": "2025-01-01T14:00:00Z"
}'
Sample Response
200 OK
{
"status": "queued",
"messageId": "1234567890abcdef"
}
Response Fields
Field | Type | Description |
---|---|---|
message |
string | A confirmation message indicating the Email has been successfully received by the API. |
messageId |
string | A unique identifier for tracking the Email. This ID can be used in subsequent API calls to retrieve the Email status and any associated events. |
Rate Limiting
To ensure fair usage of resources, the Send Email API endpoint is rate-limited based on each client’s API key. If the rate limit is exceeded, subsequent requests will be temporarily blocked until the rate limit resets.
Current Rate Limit
The current rate limit may vary based on your subscription plan and usage agreement. Please refer to the API’s response headers to monitor your rate limit status, or contact us for your specific rate limit settings.
Rate Limit Headers
On each response, the following headers provide rate limit details:
Header | Description |
---|---|
X-RateLimit-Limit |
The maximum number of requests allowed per minute for the API key. |
X-RateLimit-Remaining |
The number of requests remaining in the current time window. |
X-RateLimit-Reset |
The time (in seconds) until the rate limit resets and the full quota is available again. |
Exceeded Rate Limit Response
If the rate limit is exceeded, the following response will be returned:
{
"error": "Rate limit exceeded"
}
Increasing Rate Limit
If your application requires a higher rate limit, please reach out to the Brazeno support team to discuss rate limit adjustments that suit your requirements. We are happy to accommodate higher traffic where possible. Contact us via email at contact@emsgnow.net or through your Brazeno representative.
2. Get Email Status
Retrieve message status events using either a POST (for multiple message IDs) or a GET (for a single message ID).
Headers
x-api-key
(required): API key for authorization.Content-Type
:application/json
Endpoint
https://api.brazeno.com/api/v1/message/status
Sample Request (POST - multiple messageIds)
curl --location 'https://api.brazeno.com/api/v1/message/status' \
--header 'x-api-key: YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data '{
"messageIds": [
"1eff6f78-0701-453e-8c6c-8cb969d2e5cd",
"7d4b3db1-e4fa-44ff-8ac6-94b29b40885e"
]
}'
Sample Request (GET - single messageId)
curl --location --request GET 'https://api.brazeno.com/api/v1/message/status?messageId=390b6f28-20bd-4cc5-8cae-6e598f9abf8b' \
--header 'x-api-key: YOUR_API_KEY'
Sample Response (both verbs)
[
{
"messageId": "390b6f28-20bd-4cc5-8cae-6e598f9abf8b",
"clientIdentifier": "approval-886f97ec-ecfe-4285-b2e7-f4fdff4c9000-1757449306535",
"to": "someone@example.com",
"from": "alerts@example.com",
"channel": "email",
"statuses": [
{
"status": "queued",
"statusAt": "2025-09-09T20:21:46.646Z",
},
{
"status": "sent to provider",
"statusAt": "2025-09-09T20:21:47.162Z"
},
{
"status": "delivered",
"statusAt": "2025-09-09T20:21:47.162Z"
},
{
"status": "open",
"statusAt": "2025-09-09T20:21:47.162Z"
},
{
"status": "click",
"statusAt": "2025-09-09T20:21:47.162Z",
"url": "https://example.com",
}
]
}
]
Response Fields
Field | Type | Description |
---|---|---|
messageId | string | Unique identifier of the message. |
clientIdentifier | string | Client-supplied identifier for correlation. |
to | string | Destination number (E.164). |
from | string | Originating number (short/long code). |
channel | string | Channel of message, e.g., email . |
statuses | array | Timeline of status records. |
statuses
Array
Field | Type | Description |
---|---|---|
status | string | Status value, e.g., queued , sent to provider , delivered . |
statusAt | string (ISO 8601) | Timestamp when the status was recorded. |
url | string|null | Optional related URL. |
Error Responses
401 Unauthorized
{
"error": "API key is required"
}
403 Forbidden
{
"error": "Invalid API key"
}
500 Internal Server Error
{
"error": "Failed to retrieve Email status"
}
429 Too Many Requests
{
"error": "Rate limit exceeded"
}