The LegallyMail API allows you to send certified emails from your application. All sends are recorded and you can obtain legal certificates of delivery and reading.
All API requests require authentication via an access token. You can get your token from the user panel.
Include the token in the Authorization header:
Authorization: Bearer YOUR_TOKEN_HERE
Include the token in the JSON body:
{
"token": "YOUR_TOKEN_HERE",
"recipient": "example@example.com",
...
}
To get an API token, you must first have made at least one payment. Then you can create tokens from your user panel.
Login/api/send
Send a certified email.
| Parameter | Type | Required | Description |
|---|---|---|---|
Authorization |
string (header) | Yes | Authentication token in "Bearer {token}" format or just the token |
recipient / to |
string | Yes | Recipient email address |
subject |
string | Yes | Email subject |
message / body / content |
string (HTML) | Yes | Email content in HTML format |
reply_to |
string (email) | No | Reply email address (optional) |
reply_to_name |
string | No | Reply name (optional) |
attachments |
array | No | Array of attachment files (optional). Each file must have: filename, content (base64), mime_type |
curl -X POST https://legallymail.com/api/send \
-H "Authorization: Bearer YOUR_TOKEN_HERE" \
-H "Content-Type: application/json" \
-d '{
"recipient": "example@example.com",
"subject": "Test Email with Attachment",
"message": "<h1>Hello World</h1><p>This email contains an attachment.</p>",
"attachments": [
{
"filename": "document.pdf",
"content": "base64_encoded_file_content_here",
"mime_type": "application/pdf"
}
]
}'
<?php
$token = 'YOUR_TOKEN_HERE';
$url = 'https://legallymail.com/api/send';
// Leer el archivo y codificarlo en base64
$filePath = '/path/to/document.pdf';
$fileContent = base64_encode(file_get_contents($filePath));
$data = [
'recipient' => 'example@example.com',
'subject' => 'Test Email with Attachment',
'message' => '<h1>Hello World</h1><p>This email contains an attachment.</p>',
'attachments' => [
[
'filename' => 'document.pdf',
'content' => $fileContent,
'mime_type' => 'application/pdf'
]
]
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $token,
'Content-Type: application/json'
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
?>
import requests
import base64
token = 'YOUR_TOKEN_HERE'
url = 'https://legallymail.com/api/send'
# Leer el archivo y codificarlo en base64
with open('/path/to/document.pdf', 'rb') as file:
file_content = base64.b64encode(file.read()).decode('utf-8')
data = {
'recipient': 'example@example.com',
'subject': 'Test Email with Attachment',
'message': '<h1>Hello World</h1><p>This email contains an attachment.</p>',
'attachments': [
{
'filename': 'document.pdf',
'content': file_content,
'mime_type': 'application/pdf'
}
]
}
headers = {
'Authorization': f'Bearer {token}',
'Content-Type': 'application/json'
}
response = requests.post(url, json=data, headers=headers)
result = response.json()
const token = 'YOUR_TOKEN_HERE';
const url = 'https://legallymail.com/api/send';
// Leer el archivo y codificarlo en base64 (Node.js)
const fs = require('fs');
const filePath = '/path/to/document.pdf';
const fileContent = fs.readFileSync(filePath).toString('base64');
const data = {
recipient: 'example@example.com',
subject: 'Test Email with Attachment',
message: '<h1>Hello World</h1><p>This email contains an attachment.</p>',
attachments: [
{
filename: 'document.pdf',
content: fileContent,
mime_type: 'application/pdf'
}
]
};
fetch(url, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(result => console.log(result))
.catch(error => console.error('Error:', error));
package main
import (
'bytes'
'encoding/base64'
'encoding/json'
'io/ioutil'
'net/http'
)
func main() {
token := 'YOUR_TOKEN_HERE'
url := 'https://legallymail.com/api/send'
// Leer el archivo y codificarlo en base64
filePath := '/path/to/document.pdf'
fileContent, _ := ioutil.ReadFile(filePath)
fileBase64 := base64.StdEncoding.EncodeToString(fileContent)
data := map[string]interface{}{
'recipient': 'example@example.com',
'subject': 'Test Email with Attachment',
'message': '<h1>Hello World</h1><p>This email contains an attachment.</p>',
'attachments': []map[string]string{
{
'filename': 'document.pdf',
'content': fileBase64,
'mime_type': 'application/pdf',
},
},
}
jsonData, _ := json.Marshal(data)
req, _ := http.NewRequest('POST', url, bytes.NewBuffer(jsonData))
req.Header.Set('Authorization', 'Bearer '+token)
req.Header.Set('Content-Type', 'application/json')
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
}
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Base64;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import com.google.gson.Gson;
public class SendEmail {
public static void main(String[] args) throws IOException, InterruptedException {
String token = 'YOUR_TOKEN_HERE';
String url = 'https://legallymail.com/api/send';
// Leer el archivo y codificarlo en base64
String filePath = '/path/to/document.pdf';
byte[] fileBytes = Files.readAllBytes(Paths.get(filePath));
String fileBase64 = Base64.getEncoder().encodeToString(fileBytes);
Map<String, Object> attachment = new HashMap<>();
attachment.put('filename', 'document.pdf');
attachment.put('content', fileBase64);
attachment.put('mime_type', 'application/pdf');
Map<String, Object> data = new HashMap<>();
data.put('recipient', 'example@example.com');
data.put('subject', 'Test Email with Attachment');
data.put('message', '<h1>Hello World</h1><p>This email contains an attachment.</p>');
data.put('attachments', Arrays.asList(attachment));
Gson gson = new Gson();
String jsonData = gson.toJson(data);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header('Authorization', 'Bearer ' + token)
.header('Content-Type', 'application/json')
.POST(HttpRequest.BodyPublishers.ofString(jsonData))
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
}
}
const https = require('https');
const fs = require('fs');
const token = 'YOUR_TOKEN_HERE';
const url = 'https://legallymail.com/api/send';
// Leer el archivo y codificarlo en base64
const filePath = '/path/to/document.pdf';
const fileContent = fs.readFileSync(filePath).toString('base64');
const data = {
recipient: 'example@example.com',
subject: 'Test Email with Attachment',
message: '<h1>Hello World</h1><p>This email contains an attachment.</p>',
attachments: [
{
filename: 'document.pdf',
content: fileContent,
mime_type: 'application/pdf'
}
]
};
const options = {
hostname: 'legallymail.com',
path: '/api/send',
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json'
}
};
const req = https.request(options, (res) => {
let responseData = '';
res.on('data', (chunk) => {
responseData += chunk;
});
res.on('end', () => {
const result = JSON.parse(responseData);
console.log(result);
});
});
req.on('error', (error) => {
console.error('Error:', error);
});
req.write(JSON.stringify(data));
req.end();
using System;
using System.Net.Http;
using System.Text;
using System.IO;
using Newtonsoft.Json;
class Program
{
static async System.Threading.Tasks.Task Main()
{
string token = 'YOUR_TOKEN_HERE';
string url = 'https://legallymail.com/api/send';
// Leer el archivo y codificarlo en base64
string filePath = '/path/to/document.pdf';
byte[] fileBytes = File.ReadAllBytes(filePath);
string fileBase64 = Convert.ToBase64String(fileBytes);
var attachment = new
{
filename = 'document.pdf',
content = fileBase64,
mime_type = 'application/pdf'
};
var data = new
{
recipient = 'example@example.com',
subject = 'Test Email with Attachment',
message = '<h1>Hello World</h1><p>This email contains an attachment.</p>',
attachments = new[] { attachment }
};
string jsonData = JsonConvert.SerializeObject(data);
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add('Authorization', 'Bearer ' + token);
var content = new StringContent(jsonData, Encoding.UTF8, 'application/json');
var response = await client.PostAsync(url, content);
string result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
}
}
}
{
"success": true,
"message": "Email sent successfully",
"data": {
"tracking_id": "cm_xxx",
"recipient": "example@example.com",
"subject": "Test Email",
"sent_at": "2024-01-01 12:00:00",
"mailsender_id": "xxx"
}
}
/api/info
Get API and authenticated user information
Returns information about the API and the authenticated user, including email, subscription plan, and remaining emails.
| Parameter | Type | Required | Description |
|---|---|---|---|
Authorization |
string (header) | Yes | Authentication token in "Bearer {token}" format or just the token |
curl -X GET https://legallymail.com/api/info \
-H "Authorization: Bearer YOUR_TOKEN_HERE"
<?php
$token = 'YOUR_TOKEN_HERE';
$url = 'https://legallymail.com/api/info';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $token
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
?>
import requests
token = 'YOUR_TOKEN_HERE'
url = 'https://legallymail.com/api/info'
headers = {
'Authorization': f'Bearer {token}'
}
response = requests.get(url, headers=headers)
result = response.json()
const token = 'YOUR_TOKEN_HERE';
const url = 'https://legallymail.com/api/info';
fetch(url, {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`
}
})
.then(response => response.json())
.then(result => console.log(result))
.catch(error => console.error('Error:', error));
package main
import (
'net/http'
'io/ioutil'
)
func main() {
token := 'YOUR_TOKEN_HERE'
url := 'https://legallymail.com/api/info'
req, _ := http.NewRequest('GET', url, nil)
req.Header.Set('Authorization', 'Bearer '+token)
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
}
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
public class GetInfo {
public static void main(String[] args) throws Exception {
String token = 'YOUR_TOKEN_HERE';
String url = 'https://legallymail.com/api/info';
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header('Authorization', 'Bearer ' + token)
.GET()
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
String result = response.body();
}
}
const https = require('https');
const token = 'YOUR_TOKEN_HERE';
const url = 'https://legallymail.com/api/info';
const options = {
hostname: 'legallymail.com',
path: '/api/info',
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`
}
};
const req = https.request(options, (res) => {
let responseData = '';
res.on('data', (chunk) => {
responseData += chunk;
});
res.on('end', () => {
const result = JSON.parse(responseData);
console.log(result);
});
});
req.on('error', (error) => {
console.error('Error:', error);
});
req.end();
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
string token = 'YOUR_TOKEN_HERE';
string url = 'https://legallymail.com/api/info';
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add('Authorization', 'Bearer ' + token);
var response = await client.GetAsync(url);
string result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
}
}
}
{
"name": "LegallyMail API",
"version": "1.0.0",
"user": {
"email": "usuario@example.com",
"name": "Nombre Usuario",
"plan": "professional",
"plan_name": "Profesional",
"plan_limit": 100,
"extra_emails": 0,
"remaining_emails": 75
}
}
/api/emails
Get last sent emails
Returns a list of the last emails sent by the authenticated user, including their status (sent, read, failed). Maximum 25 results.
| Parameter | Type | Required | Description |
|---|---|---|---|
Authorization |
string (header) | Yes | Authentication token in "Bearer {token}" format or just the token |
limit |
integer (query) | Yes | Number of emails to return (between 1 and 25). Required. |
curl -X GET "https://legallymail.com/api/emails?limit=10" \
-H "Authorization: Bearer YOUR_TOKEN_HERE"
<?php
$token = 'YOUR_TOKEN_HERE';
$url = 'https://legallymail.com/api/emails?limit=10';
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $token
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
?>
import requests
token = 'YOUR_TOKEN_HERE'
url = 'https://legallymail.com/api/emails'
params = {'limit': 10}
headers = {
'Authorization': f'Bearer {token}'
}
response = requests.get(url, params=params, headers=headers)
result = response.json()
const token = 'YOUR_TOKEN_HERE';
const url = 'https://legallymail.com/api/emails?limit=10';
fetch(url, {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`
}
})
.then(response => response.json())
.then(result => console.log(result))
.catch(error => console.error('Error:', error));
package main
import (
'net/http'
'io/ioutil'
)
func main() {
token := 'YOUR_TOKEN_HERE'
url := 'https://legallymail.com/api/emails?limit=10'
req, _ := http.NewRequest('GET', url, nil)
req.Header.Set('Authorization', 'Bearer '+token)
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
}
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
public class GetEmails {
public static void main(String[] args) throws Exception {
String token = 'YOUR_TOKEN_HERE';
String url = 'https://legallymail.com/api/emails?limit=10';
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header('Authorization', 'Bearer ' + token)
.GET()
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
String result = response.body();
}
}
const https = require('https');
const token = 'YOUR_TOKEN_HERE';
const url = 'https://legallymail.com/api/emails?limit=10';
const options = {
hostname: 'legallymail.com',
path: '/api/emails?limit=10',
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`
}
};
const req = https.request(options, (res) => {
let responseData = '';
res.on('data', (chunk) => {
responseData += chunk;
});
res.on('end', () => {
const result = JSON.parse(responseData);
console.log(result);
});
});
req.on('error', (error) => {
console.error('Error:', error);
});
req.end();
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
string token = 'YOUR_TOKEN_HERE';
string url = 'https://legallymail.com/api/emails?limit=10';
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add('Authorization', 'Bearer ' + token);
var response = await client.GetAsync(url);
string result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
}
}
}
{
"success": true,
"count": 2,
"limit": 10,
"max_limit": 25,
"emails": [
{
"id": 123,
"tracking_id": "cm_abc123",
"recipient": "example@example.com",
"subject": "Test Email",
"status": "read",
"sent_at": "2024-01-15 10:30:00",
"read_at": "2024-01-15 11:00:00",
"created_at": "2024-01-15 10:30:00",
"mailsender_id": "mail_xyz789"
},
{
"id": 122,
"tracking_id": "cm_def456",
"recipient": "test@example.com",
"subject": "Another Email",
"status": "sent",
"sent_at": "2024-01-14 15:20:00",
"read_at": null,
"created_at": "2024-01-14 15:20:00",
"mailsender_id": "mail_uvw012"
}
]
}
/api/email
Get status of a specific email
Returns detailed information about a specific email identified by its tracking_id, including its current status (sent, read, failed) and send/read dates.
| Parameter | Type | Required | Description |
|---|---|---|---|
Authorization |
string (header) | Yes | Authentication token in "Bearer {token}" format or just the token |
tracking_id |
string (query) | Yes | The unique tracking identifier (tracking_id) returned when sending the email. |
curl -X GET "https://legallymail.com/api/email?tracking_id=cm_abc123" \
-H "Authorization: Bearer YOUR_TOKEN_HERE"
<?php
$token = 'YOUR_TOKEN_HERE';
$trackingId = 'cm_abc123';
$url = 'https://legallymail.com/api/email?tracking_id=' . urlencode($trackingId);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $token
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
?>
import requests
token = 'YOUR_TOKEN_HERE'
url = 'https://legallymail.com/api/email'
params = {'tracking_id': 'cm_abc123'}
headers = {
'Authorization': f'Bearer {token}'
}
response = requests.get(url, params=params, headers=headers)
result = response.json()
const token = 'YOUR_TOKEN_HERE';
const trackingId = 'cm_abc123';
const url = `https://legallymail.com/api/email?tracking_id=${trackingId}`;
fetch(url, {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`
}
})
.then(response => response.json())
.then(result => console.log(result))
.catch(error => console.error('Error:', error));
package main
import (
'net/http'
'io/ioutil'
'net/url'
)
func main() {
token := 'YOUR_TOKEN_HERE'
trackingId := 'cm_abc123'
baseUrl := 'https://legallymail.com/api/email'
params := url.Values{}
params.Add('tracking_id', trackingId)
fullUrl := baseUrl + '?' + params.Encode()
req, _ := http.NewRequest('GET', fullUrl, nil)
req.Header.Set('Authorization', 'Bearer '+token)
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
}
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
public class GetEmail {
public static void main(String[] args) throws Exception {
String token = 'YOUR_TOKEN_HERE';
String trackingId = 'cm_abc123';
String url = 'https://legallymail.com/api/email?tracking_id=' + trackingId;
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header('Authorization', 'Bearer ' + token)
.GET()
.build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
String result = response.body();
}
}
const https = require('https');
const token = 'YOUR_TOKEN_HERE';
const trackingId = 'cm_abc123';
const url = `https://legallymail.com/api/email?tracking_id=${trackingId}`;
const options = {
hostname: 'legallymail.com',
path: `/api/email?tracking_id=${trackingId}`,
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`
}
};
const req = https.request(options, (res) => {
let responseData = '';
res.on('data', (chunk) => {
responseData += chunk;
});
res.on('end', () => {
const result = JSON.parse(responseData);
console.log(result);
});
});
req.on('error', (error) => {
console.error('Error:', error);
});
req.end();
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
string token = 'YOUR_TOKEN_HERE';
string trackingId = 'cm_abc123';
string url = $"https://legallymail.com/api/email?tracking_id={trackingId}";
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add('Authorization', 'Bearer ' + token);
var response = await client.GetAsync(url);
string result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
}
}
}
{
"success": true,
"email": {
"id": 123,
"tracking_id": "cm_abc123",
"recipient": "example@example.com",
"subject": "Test Email",
"status": "read",
"sent_at": "2024-01-15 10:30:00",
"read_at": "2024-01-15 11:00:00",
"created_at": "2024-01-15 10:30:00",
"mailsender_id": "mail_xyz789"
}
}
| Code | Message | Description |
|---|---|---|
400 |
Bad Request | The provided data is not valid |
401 |
Unauthorized | Invalid or missing token |
403 |
Forbidden |
You do not have permission to perform this action Also returned when the user has no remaining credits/emails available. |
404 |
Not Found | Resource not found. Verify that the requested resource exists (e.g., an email with the specified tracking_id). |
405 |
Method Not Allowed | HTTP method not allowed |
429 |
Too Many Requests | Too many requests. Rate limit exceeded. |
500 |
Internal Server Error | Internal server error |
The API has the following restrictions: