Send Email
Send individual transactional emails using the /v3/smtp/email endpoint.
Endpoint
POST /v3/smtp/emailRequest Body
Basic Email
{ "sender": { "name": "Your App", }, "to": [ { "name": "John Doe" } ], "subject": "Welcome to our service!", "htmlContent": "<html><body><h1>Welcome!</h1><p>Thank you for signing up.</p></body></html>"}Advanced Email
{ "sender": { "name": "Your App", }, "to": [ { "name": "John Doe" } ], "cc": [ { "name": "CC User" } ], "bcc": [ { } ], "subject": "Order Confirmation #{{order_id}}", "htmlContent": "<html><body><h1>Order Confirmed</h1><p>Your order {{order_id}} has been confirmed.</p></body></html>", "textContent": "Your order {{order_id}} has been confirmed.", "params": { "order_id": "12345" }, "tags": ["transactional", "order-confirmation"], "headers": { "X-Custom-Header": "custom-value" }}Code Examples
JavaScript/Node.js
const brevo = require('@getbrevo/brevo');
const apiInstance = new brevo.TransactionalEmailsApi();apiInstance.setApiKey(brevo.TransactionalEmailsApiApiKeys.apiKey, process.env.BREVO_API_KEY);
const sendEmail = async () => { const sendSmtpEmail = new brevo.SendSmtpEmail();
sendSmtpEmail.subject = "Welcome to our service!"; sendSmtpEmail.htmlContent = "<html><body><h1>Welcome!</h1></body></html>";
try { const result = await apiInstance.sendTransacEmail(sendSmtpEmail); console.log('Email sent:', result); return result; } catch (error) { console.error('Error sending email:', error); throw error; }};Python
import sib_api_v3_sdkfrom sib_api_v3_sdk.rest import ApiException
configuration = sib_api_v3_sdk.Configuration()configuration.api_key['api-key'] = 'YOUR_API_KEY'
api_instance = sib_api_v3_sdk.TransactionalEmailsApi(sib_api_v3_sdk.ApiClient(configuration))
send_smtp_email = sib_api_v3_sdk.SendSmtpEmail( subject="Welcome to our service!", html_content="<html><body><h1>Welcome!</h1></body></html>")
try: api_response = api_instance.send_transac_email(send_smtp_email) print(api_response)except ApiException as e: print("Exception when calling TransactionalEmailsApi->send_transac_email: %s\n" % e)cURL
curl -X POST "https://api.brevo.com/v3/smtp/email" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "api-key: YOUR_API_KEY" \ -d '{ "sender": { "name": "Your App", "email": "[email protected]" }, "to": [ { "email": "[email protected]", "name": "John Doe" } ], "subject": "Welcome to our service!", "htmlContent": "<html><body><h1>Welcome!</h1></body></html>" }'Response
Success Response (201 Created)
{}Error Responses
Invalid API Key (401)
{ "code": "unauthorized", "message": "Invalid API key provided"}Invalid Email Format (400)
{ "code": "invalid_parameter", "message": "Invalid email format in 'to' field"}Rate Limit Exceeded (429)
{ "code": "too_many_requests", "message": "Rate limit exceeded"}Parameters
Required Parameters
| Parameter | Type | Description |
|---|---|---|
sender | object | Sender information |
to | array | Array of recipient objects |
subject | string | Email subject line |
Optional Parameters
| Parameter | Type | Description |
|---|---|---|
htmlContent | string | HTML content of the email |
textContent | string | Text content of the email |
cc | array | CC recipients |
bcc | array | BCC recipients |
replyTo | object | Reply-to address |
attachments | array | File attachments |
params | object | Template parameters |
tags | array | Email tags for tracking |
headers | object | Custom headers |
Template Variables
Use template variables in your subject and content:
{ "subject": "Welcome {{firstName}}!", "htmlContent": "<h1>Hello {{firstName}} {{lastName}}</h1>", "params": { "firstName": "John", "lastName": "Doe" }}Attachments
Include file attachments:
{ "attachments": [ { "content": "base64_encoded_content", "name": "invoice.pdf" }, { "url": "https://example.com/document.pdf", "name": "document.pdf" } ]}Best Practices
- Always include both HTML and text content for better deliverability
- Use template variables instead of concatenating content
- Include proper sender information to avoid spam filters
- Add tags for tracking and analytics
- Validate email addresses before sending
- Handle errors gracefully with retry logic
Rate Limits
- API rate limit: on the general tier, which every plan gets, this endpoint allows 1,000 requests per second and 3,600,000 per hour. The advanced tier (Professional and Enterprise) allows 2,000 per second, and the extended tier (Enterprise) 6,000.
- Sending volume: how many emails you can send is set by your Brevo plan, separately from the rate limit.
See Rate limits and Brevo’s rate limits page.
Tracking
Emails sent via this endpoint are automatically tracked for:
- Delivery status
- Open rates
- Click tracking
- Bounce handling
View detailed analytics in your Brevo dashboard under Statistics → Transactional.
Related Endpoints
- Email Templates
- Attachments
- Email Statistics