← All API sections

Emails

Send and track transactional emails

6 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
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]",
})

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_...")