← All API sections

Emails

Send and track transactional emails

7 endpoints

Endpoints

MethodPathDescription
GET/v1/emailsGET /v1/emails - List emails with pagination and filters
POST/v1/emailsPOST /v1/emails - Send a single email
POST/v1/emails/batchPOST /v1/emails/batch - Send up to 500 emails in a single request
POST/v1/emails/broadcastPOST /v1/emails/broadcast - Send an email to all active subscribers in a contact list
GET/v1/emails/{id}GET /v1/emails/:id - Get email details with events
POST/v1/emails/{id}/cancel
GET/v1/emails/{id}/linksGET /v1/emails/{id}/links - Per-link click statistics for an email

GET /v1/emails

GET /v1/emails - List emails with pagination and filters

Parameters

NameInTypeRequiredDescription
pagequeryintegerNoPage number (default: 1)
per_pagequeryintegerNoItems per page (default: 25)
statusquerystringNoFilter by status (queued, sent, bounced, failed)
from_datequerystringNoFilter from date (ISO 8601)
to_datequerystringNoFilter to date (ISO 8601)

Responses

StatusDescription
200Paginated list of emails
401Unauthorized

Example

curl -X GET https://api.euromail.dev/v1/emails \
  -H "X-EuroMail-Api-Key: em_live_..."
import { EuroMail } from "@euromail/sdk";

const euromail = new EuroMail({ apiKey: "em_live_..." });

const result = await euromail.listEmails();
from euromail import EuroMail

client = EuroMail(api_key="em_live_...")

result = client.list_emails()
use euromail::EuroMail;

let client = EuroMail::new("em_live_...");

let result = client.list_emails().await?;
client := euromail.NewClient("em_live_...")

result, err := client.ListEmails(ctx)

POST /v1/emails

POST /v1/emails - Send a single email

Request Body

FieldTypeRequiredDescription
attachmentsAttachmentRequest[]No
bccstring[]No
ccstring[]No
fromstringYes
headersanyNo
html_body`stringnull`No
idempotency_key`stringnull`No
key (per account) returns the original email instead of creating a new one.
metadataanyNo
reply_to`stringnull`No
send_at`stringnull`No
stream`stringnull`No
separate reputation tracking for transactional vs. marketing email.
Defaults to "transactional". The stream must exist for the account.
subject`stringnull`No
tagsstring[]No
template_alias`stringnull`No
template_dataanyNo
text_body`stringnull`No
toOneOrManyYes#/components/schemas/OneOrMany
tracking`booleannull`No
for this email even if the account has tracking enabled. When true,
enables tracking even if the account default is off. Omit to use account default.
transactionalbooleanNoWhether this is a transactional email (password reset, receipt, notification).
When true (default), List-Unsubscribe headers are omitted so Gmail routes
the message to the Primary inbox instead of Promotions.
Set to false for marketing or newsletter emails that need one-click unsubscribe.

Responses

StatusDescription
202Email accepted for delivery
401Unauthorized
422Validation error
429Rate limit or quota exceeded

Example

curl -X POST https://api.euromail.dev/v1/emails \
  -H "X-EuroMail-Api-Key: em_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "from": "[email protected]", "to": "[email protected]" }'
import { EuroMail } from "@euromail/sdk";

const euromail = new EuroMail({ apiKey: "em_live_..." });

const result = await euromail.sendEmail({
    from: "[email protected]",
    to: "[email protected]",
  });
from euromail import EuroMail

client = EuroMail(api_key="em_live_...")

result = client.send_email(
    from_address="[email protected]",
    to="[email protected]",
)
use euromail::EuroMail;

let client = EuroMail::new("em_live_...");

let result = client.send_email(&SendEmailParams {
    from: "[email protected]".into(),
    to: "[email protected]",
    ..Default::default()
}).await?;
client := euromail.NewClient("em_live_...")

result, err := client.SendEmail(ctx, euromail.SendEmailParams{
    From: "[email protected]",
    To: euromail.Recipients("[email protected]"),
})

POST /v1/emails/batch

Send up to 500 emails in a single request. Returns an operation_id for tracking, a data array of queued emails, and an errors array for any per-email validation failures. Partial success is supported.

Request Body

FieldTypeRequiredDescription
emailsSendEmailRequest[]Yes

Responses

StatusDescription
202Batch accepted for delivery
401Unauthorized
422Validation error
429Rate limit or quota exceeded

Example

curl -X POST https://api.euromail.dev/v1/emails/batch \
  -H "X-EuroMail-Api-Key: em_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "emails": "[email protected]" }'
import { EuroMail } from "@euromail/sdk";

const euromail = new EuroMail({ apiKey: "em_live_..." });

const result = await euromail.sendBatch({
    emails: "[email protected]",
  });
from euromail import EuroMail

client = EuroMail(api_key="em_live_...")

result = client.send_batch(
    emails="[email protected]",
)
use euromail::EuroMail;

let client = EuroMail::new("em_live_...");

let result = client.send_batch(&SendBatchParams {
    emails: "[email protected]",
    ..Default::default()
}).await?;
client := euromail.NewClient("em_live_...")

result, err := client.SendBatch(ctx, euromail.SendBatchParams{
    Emails: "[email protected]",
})

POST /v1/emails/broadcast

POST /v1/emails/broadcast - Send an email to all active subscribers in a contact list

Request Body

FieldTypeRequiredDescription
contact_list_idstringYes
from_addressstringYes
headersanyNo
html_body`stringnull`No
reply_to`stringnull`No
send_at`stringnull`No
subject`stringnull`No
tagsstring[]No
template_alias`stringnull`No
template_dataanyNo
text_body`stringnull`No
tracking`booleannull`No
transactionalbooleanNoWhether this is a transactional broadcast. Defaults to false because
bulk sends are typically marketing emails that need List-Unsubscribe headers
for Gmail/Yahoo compliance. Set to true only for operational bulk sends
(e.g. account migration notices) where unsubscribe headers are inappropriate.

Responses

StatusDescription
202Broadcast accepted for delivery
401Unauthorized
404Contact list not found
422Validation error

Example

curl -X POST https://api.euromail.dev/v1/emails/broadcast \
  -H "X-EuroMail-Api-Key: em_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "contact_list_id": "...", "from_address": "..." }'
import { EuroMail } from "@euromail/sdk";

const euromail = new EuroMail({ apiKey: "em_live_..." });

const result = await euromail.sendBroadcast({
    contact_list_id: "...",
    from_address: "...",
  });
from euromail import EuroMail

client = EuroMail(api_key="em_live_...")

result = client.send_broadcast(
    contact_list_id="...",
    from_address="...",
)
use euromail::EuroMail;

let client = EuroMail::new("em_live_...");

let result = client.send_broadcast(&BroadcastParams {
    contact_list_id: "...".into(),
    from_address: "...".into(),
    ..Default::default()
}).await?;
client := euromail.NewClient("em_live_...")

result, err := client.SendBroadcast(ctx, euromail.BroadcastParams{
    ContactListId: "...",
    FromAddress: "...",
})

GET /v1/emails/{id}

GET /v1/emails/:id - Get email details with events

Parameters

NameInTypeRequiredDescription
idpathstringYesEmail ID

Responses

StatusDescription
200Email details with events
401Unauthorized
404Email not found

Example

curl -X GET https://api.euromail.dev/v1/emails/{id} \
  -H "X-EuroMail-Api-Key: em_live_..."
import { EuroMail } from "@euromail/sdk";

const euromail = new EuroMail({ apiKey: "em_live_..." });

const result = await euromail.getEmail("id_...");
from euromail import EuroMail

client = EuroMail(api_key="em_live_...")

result = client.get_email("id_...")
use euromail::EuroMail;

let client = EuroMail::new("em_live_...");

let result = client.get_email("id_...").await?;
client := euromail.NewClient("em_live_...")

result, err := client.GetEmail(ctx, "id_...")

POST /v1/emails/{id}/cancel

Parameters

NameInTypeRequiredDescription
idpathstringYesEmail ID

Responses

StatusDescription
200Scheduled email cancelled
401Unauthorized
404Email not found or not in scheduled status

Example

curl -X POST https://api.euromail.dev/v1/emails/{id}/cancel \
  -H "X-EuroMail-Api-Key: em_live_..."
import { EuroMail } from "@euromail/sdk";

const euromail = new EuroMail({ apiKey: "em_live_..." });

const result = await euromail.cancelEmail("id_...");
from euromail import EuroMail

client = EuroMail(api_key="em_live_...")

result = client.cancel_email("id_...")
use euromail::EuroMail;

let client = EuroMail::new("em_live_...");

let result = client.cancel_email("id_...").await?;
client := euromail.NewClient("em_live_...")

result, err := client.CancelEmail(ctx, "id_...")

GET /v1/emails/{id}/links - Per-link click statistics for an email

Parameters

NameInTypeRequiredDescription
idpathstringYesEmail ID

Responses

StatusDescription
200Per-link click statistics
401Unauthorized
403Forbidden
404Email not found

Example

curl -X GET https://api.euromail.dev/v1/emails/{id}/links \
  -H "X-EuroMail-Api-Key: em_live_..."
import { EuroMail } from "@euromail/sdk";

const euromail = new EuroMail({ apiKey: "em_live_..." });

const result = await euromail.getEmailDetail("id_...");
from euromail import EuroMail

client = EuroMail(api_key="em_live_...")

result = client.get_email_detail("id_...")
use euromail::EuroMail;

let client = EuroMail::new("em_live_...");

let result = client.get_email_detail("id_...").await?;
client := euromail.NewClient("em_live_...")

result, err := client.GetEmailDetail(ctx, "id_...")