Get Email
Retrieve detailed delivery status for a specific email, including per-recipient tracking.
Endpoint
GET /email/:id
Returns: 200 OK
Path Parameters
| Parameter | Type | Description |
|---|---|---|
id | string | The email ID returned from POST /email/send |
Response
{
"id": "01957e3a-4b5c-7d8e-9f0a-1b2c3d4e5f6a",
"from": "noreply@yourdomain.com",
"from_name": "My App",
"to": [
{
"email": "user@example.com",
"status": "delivered",
"timestamp": "2026-03-08T12:00:05.000Z"
}
],
"cc": [
{
"email": "manager@example.com",
"status": "delivered",
"timestamp": "2026-03-08T12:00:05.000Z"
}
],
"bcc": [
{
"email": "archive@example.com",
"status": "bounced",
"timestamp": "2026-03-08T12:00:03.000Z"
}
],
"subject": "Welcome to our platform",
"html": "<h1>Welcome!</h1><p>Thanks for signing up.</p>",
"text": null,
"reply_to": null,
"category": "welcome",
"attachments": [
{
"filename": "guide.pdf",
"size": 204800,
"content_type": "application/pdf"
}
],
"created_at": "2026-03-08T12:00:00.000Z"
}
The to, cc, and bcc arrays each list their respective recipients with the
latest delivery status per address. status reflects the most recent tracking
event for that recipient and defaults to sent until the first event arrives.
note
Open and click tracking is message-level for multi-recipient emails — an open or
click cannot be attributed to a specific cc/bcc recipient.
Recipient Status Values
| Status | Description |
|---|---|
sent | Accepted by the mail provider, delivery pending |
delivered | Confirmed delivered to the recipient's inbox |
opened | Recipient opened the email |
clicked | Recipient clicked a link in the email |
bounced | Delivery failed (address doesn't exist or mailbox full) |
complained | Recipient reported the email as spam |
rejected | The mail provider rejected the message |
unsubscribed | Recipient unsubscribed via the email's unsubscribe link |
render_failure | The email template failed to render |
Examples
- cURL
- JavaScript
- Python
- C#
- PHP
curl "https://api.arsel.sa/v1/email/01957e3a-4b5c-7d8e-9f0a-1b2c3d4e5f6a" \
-H "Authorization: Bearer $ARSEL_API_KEY"
const response = await fetch("https://api.arsel.sa/v1/email/01957e3a-4b5c-7d8e-9f0a-1b2c3d4e5f6a", {
headers: {
Authorization: `Bearer ${process.env.ARSEL_API_KEY}`,
},
});
const data = await response.json();
if (!response.ok) {
throw new Error(`${data.name}: ${data.message}`);
}
console.log(data);
import os
import requests
response = requests.get(
"https://api.arsel.sa/v1/email/01957e3a-4b5c-7d8e-9f0a-1b2c3d4e5f6a",
headers={"Authorization": f"Bearer {os.environ['ARSEL_API_KEY']}"},
)
response.raise_for_status()
print(response.json())
using System.Net.Http.Headers;
var client = new HttpClient(); // share one instance across requests
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
"Bearer", Environment.GetEnvironmentVariable("ARSEL_API_KEY"));
var response = await client.GetAsync("https://api.arsel.sa/v1/email/01957e3a-4b5c-7d8e-9f0a-1b2c3d4e5f6a");
var body = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
throw new HttpRequestException($"{(int)response.StatusCode}: {body}");
Console.WriteLine(body);
<?php
$ch = curl_init("https://api.arsel.sa/v1/email/01957e3a-4b5c-7d8e-9f0a-1b2c3d4e5f6a");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("ARSEL_API_KEY"),
],
]);
$data = json_decode(curl_exec($ch), true);
if (curl_getinfo($ch, CURLINFO_HTTP_CODE) >= 400) {
throw new Exception("{$data['name']}: {$data['message']}");
}
print_r($data);
Error Responses
- 404 Not Found
- 401 Unauthorized
{
"status_code": 404,
"name": "not_found",
"message": "Email not found"
}
{
"status_code": 401,
"name": "unauthorized",
"message": "Invalid API Key"
}