← 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 multiple emails (up to max_batch_size)
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
subject`stringnull`No
suppress_list_management_headerbooleanNoWhen true, omits the List-Unsubscribe and List-Unsubscribe-Post headers.
Use for transactional emails (password resets, receipts) where an unsubscribe
link is inappropriate.
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.

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

POST /v1/emails/batch - Send multiple emails (up to max_batch_size)

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