Skip to content

Send an email

POST
/v1/send
curl --request POST \
--url https://api.frontmail.dev/v1/send \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: 7f0b6c1e-3a57-4a0e-9d0c-5d3f2d1b2a10' \
--header 'X-Frontmail-Public-Key: <X-Frontmail-Public-Key>' \
--data '{ "service_id": "svc_01j9z3k8q4w5e6r7t8y9u0i1o2", "template_id": "tpl_01j9z3k8q4w5e6r7t8y9u0i1o2", "user_id": "example", "accessToken": "example", "template_params": { "name": "Jan", "email": "jan@example.com", "message": "Hello!" }, "turnstile_token": "example", "turnstile_key": "org", "attachments": [ { "filename": "example", "content_type": "example", "content_base64": "example" } ] }'

Validates template_params against the template schema and queues the message. Returns status: "held" instead of failing when the organization has no credits (hold mode); 402 in reject mode.

Idempotency-Key

Unique key per logical send (≤ 255 chars of [A-Za-z0-9_-:.]). Retries with the same key and body return the original response.

string
<= 255 characters
Example
7f0b6c1e-3a57-4a0e-9d0c-5d3f2d1b2a10

Unique key per logical send (≤ 255 chars of [A-Za-z0-9_-:.]). Retries with the same key and body return the original response.

Media typeapplication/json
object
service_id

Service id; omitted or default_service → the template’s / organization’s default service.

string
<= 64 characters
Example
svc_01j9z3k8q4w5e6r7t8y9u0i1o2
template_id
required
string
>= 1 characters <= 64 characters
Example
tpl_01j9z3k8q4w5e6r7t8y9u0i1o2
user_id

Public key pk_… (EmailJS-compatible). Alternatively the X-Frontmail-Public-Key header.

string
<= 200 characters
accessToken

Private key sk_… (EmailJS-compatible). Prefer Authorization: Bearer.

string
<= 300 characters
template_params

Values for the template’s parameters (validated against its schema).

object
key
additional properties
Example
{
"name": "Jan",
"email": "jan@example.com",
"message": "Hello!"
}
turnstile_token

Cloudflare Turnstile token; required when the template has CAPTCHA enabled and no private key is used.

string
<= 4096 characters
turnstile_key

Which Turnstile widget issued the token for requests without an Origin header (native apps): frontmail (default, Frontmail’s shared mobile key) or org (the organization’s own key). Requests with an Origin always use the organization’s key.

string
Allowed values: org frontmail
attachments
Array
<= 20 items
Any of:
object
filename
required
string
>= 1 characters <= 255 characters
content_type
string
<= 255 characters
content_base64
required
string
>= 1 characters
key
additional properties

Accepted: queued, or held when the organization is out of credits (hold mode).

Media typeapplication/json
object
message_id
required
string
status
required

held = accepted but waiting for credits; it is sent automatically once credits are added.

string
Allowed values: queued held
status_token
required

Pass as ?token= to GET /v1/messages/{id} with a public key.

string
Example
{
"message_id": "msg_01j9z3m2c7v8b9n0m1q2w3e4r5",
"status": "queued"
}

Invalid request body, query or Idempotency-Key (invalid_body, bad_request, invalid_idempotency_key).

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request invalid_body invalid_idempotency_key unauthorized invalid_public_key invalid_private_key insufficient_credits forbidden origin_not_allowed captcha_required captcha_failed captcha_not_configured headless_blocked recipient_blocked private_key_required private_key_in_browser email_not_verified organization_suspended plan_limit_reached dynamic_recipient_not_allowed dynamic_recipient_requires_captcha dynamic_field_not_allowed link_not_allowed attachments_not_allowed not_found service_not_found template_not_found message_not_found conflict idempotency_conflict payload_too_large attachment_too_large invalid_template_params template_render_failed invalid_recipient service_unavailable_for_template sender_not_configured rate_limited test_send_limit recipient_suppressed internal_error provider_error service_unavailable
message
required
string
docs_url
required
string format: uri
details
Example
{
"error": {
"code": "invalid_template_params",
"message": "Invalid template parameters. email: Enter a valid e-mail address.",
"docs_url": "https://docs.frontmail.dev/reference/errors/#invalid-template-params",
"details": {
"issues": [
{
"param": "email",
"code": "invalid_email",
"message": "Enter a valid e-mail address."
}
]
}
}
}

Missing or invalid key (unauthorized, invalid_public_key, invalid_private_key).

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request invalid_body invalid_idempotency_key unauthorized invalid_public_key invalid_private_key insufficient_credits forbidden origin_not_allowed captcha_required captcha_failed captcha_not_configured headless_blocked recipient_blocked private_key_required private_key_in_browser email_not_verified organization_suspended plan_limit_reached dynamic_recipient_not_allowed dynamic_recipient_requires_captcha dynamic_field_not_allowed link_not_allowed attachments_not_allowed not_found service_not_found template_not_found message_not_found conflict idempotency_conflict payload_too_large attachment_too_large invalid_template_params template_render_failed invalid_recipient service_unavailable_for_template sender_not_configured rate_limited test_send_limit recipient_suppressed internal_error provider_error service_unavailable
message
required
string
docs_url
required
string format: uri
details
Example
{
"error": {
"code": "invalid_template_params",
"message": "Invalid template parameters. email: Enter a valid e-mail address.",
"docs_url": "https://docs.frontmail.dev/reference/errors/#invalid-template-params",
"details": {
"issues": [
{
"param": "email",
"code": "invalid_email",
"message": "Enter a valid e-mail address."
}
]
}
}
}

No credits left and the organization uses reject mode (insufficient_credits).

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request invalid_body invalid_idempotency_key unauthorized invalid_public_key invalid_private_key insufficient_credits forbidden origin_not_allowed captcha_required captcha_failed captcha_not_configured headless_blocked recipient_blocked private_key_required private_key_in_browser email_not_verified organization_suspended plan_limit_reached dynamic_recipient_not_allowed dynamic_recipient_requires_captcha dynamic_field_not_allowed link_not_allowed attachments_not_allowed not_found service_not_found template_not_found message_not_found conflict idempotency_conflict payload_too_large attachment_too_large invalid_template_params template_render_failed invalid_recipient service_unavailable_for_template sender_not_configured rate_limited test_send_limit recipient_suppressed internal_error provider_error service_unavailable
message
required
string
docs_url
required
string format: uri
details
Example
{
"error": {
"code": "invalid_template_params",
"message": "Invalid template parameters. email: Enter a valid e-mail address.",
"docs_url": "https://docs.frontmail.dev/reference/errors/#invalid-template-params",
"details": {
"issues": [
{
"param": "email",
"code": "invalid_email",
"message": "Enter a valid e-mail address."
}
]
}
}
}

Forbidden: origin, CAPTCHA (required, failed, not configured), headless, block list, private key required, suspended, unverified owner e-mail, plan limit, dynamic recipient, attachments.

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request invalid_body invalid_idempotency_key unauthorized invalid_public_key invalid_private_key insufficient_credits forbidden origin_not_allowed captcha_required captcha_failed captcha_not_configured headless_blocked recipient_blocked private_key_required private_key_in_browser email_not_verified organization_suspended plan_limit_reached dynamic_recipient_not_allowed dynamic_recipient_requires_captcha dynamic_field_not_allowed link_not_allowed attachments_not_allowed not_found service_not_found template_not_found message_not_found conflict idempotency_conflict payload_too_large attachment_too_large invalid_template_params template_render_failed invalid_recipient service_unavailable_for_template sender_not_configured rate_limited test_send_limit recipient_suppressed internal_error provider_error service_unavailable
message
required
string
docs_url
required
string format: uri
details
Example
{
"error": {
"code": "invalid_template_params",
"message": "Invalid template parameters. email: Enter a valid e-mail address.",
"docs_url": "https://docs.frontmail.dev/reference/errors/#invalid-template-params",
"details": {
"issues": [
{
"param": "email",
"code": "invalid_email",
"message": "Enter a valid e-mail address."
}
]
}
}
}

Template, service or message not found.

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request invalid_body invalid_idempotency_key unauthorized invalid_public_key invalid_private_key insufficient_credits forbidden origin_not_allowed captcha_required captcha_failed captcha_not_configured headless_blocked recipient_blocked private_key_required private_key_in_browser email_not_verified organization_suspended plan_limit_reached dynamic_recipient_not_allowed dynamic_recipient_requires_captcha dynamic_field_not_allowed link_not_allowed attachments_not_allowed not_found service_not_found template_not_found message_not_found conflict idempotency_conflict payload_too_large attachment_too_large invalid_template_params template_render_failed invalid_recipient service_unavailable_for_template sender_not_configured rate_limited test_send_limit recipient_suppressed internal_error provider_error service_unavailable
message
required
string
docs_url
required
string format: uri
details
Example
{
"error": {
"code": "invalid_template_params",
"message": "Invalid template parameters. email: Enter a valid e-mail address.",
"docs_url": "https://docs.frontmail.dev/reference/errors/#invalid-template-params",
"details": {
"issues": [
{
"param": "email",
"code": "invalid_email",
"message": "Enter a valid e-mail address."
}
]
}
}
}

Idempotency-Key reused with a different body, or still in progress (idempotency_conflict).

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request invalid_body invalid_idempotency_key unauthorized invalid_public_key invalid_private_key insufficient_credits forbidden origin_not_allowed captcha_required captcha_failed captcha_not_configured headless_blocked recipient_blocked private_key_required private_key_in_browser email_not_verified organization_suspended plan_limit_reached dynamic_recipient_not_allowed dynamic_recipient_requires_captcha dynamic_field_not_allowed link_not_allowed attachments_not_allowed not_found service_not_found template_not_found message_not_found conflict idempotency_conflict payload_too_large attachment_too_large invalid_template_params template_render_failed invalid_recipient service_unavailable_for_template sender_not_configured rate_limited test_send_limit recipient_suppressed internal_error provider_error service_unavailable
message
required
string
docs_url
required
string format: uri
details
Example
{
"error": {
"code": "invalid_template_params",
"message": "Invalid template parameters. email: Enter a valid e-mail address.",
"docs_url": "https://docs.frontmail.dev/reference/errors/#invalid-template-params",
"details": {
"issues": [
{
"param": "email",
"code": "invalid_email",
"message": "Enter a valid e-mail address."
}
]
}
}
}

Request or attachments too large (payload_too_large, attachment_too_large).

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request invalid_body invalid_idempotency_key unauthorized invalid_public_key invalid_private_key insufficient_credits forbidden origin_not_allowed captcha_required captcha_failed captcha_not_configured headless_blocked recipient_blocked private_key_required private_key_in_browser email_not_verified organization_suspended plan_limit_reached dynamic_recipient_not_allowed dynamic_recipient_requires_captcha dynamic_field_not_allowed link_not_allowed attachments_not_allowed not_found service_not_found template_not_found message_not_found conflict idempotency_conflict payload_too_large attachment_too_large invalid_template_params template_render_failed invalid_recipient service_unavailable_for_template sender_not_configured rate_limited test_send_limit recipient_suppressed internal_error provider_error service_unavailable
message
required
string
docs_url
required
string format: uri
details
Example
{
"error": {
"code": "invalid_template_params",
"message": "Invalid template parameters. email: Enter a valid e-mail address.",
"docs_url": "https://docs.frontmail.dev/reference/errors/#invalid-template-params",
"details": {
"issues": [
{
"param": "email",
"code": "invalid_email",
"message": "Enter a valid e-mail address."
}
]
}
}
}

Invalid template params, recipient or rendering error.

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request invalid_body invalid_idempotency_key unauthorized invalid_public_key invalid_private_key insufficient_credits forbidden origin_not_allowed captcha_required captcha_failed captcha_not_configured headless_blocked recipient_blocked private_key_required private_key_in_browser email_not_verified organization_suspended plan_limit_reached dynamic_recipient_not_allowed dynamic_recipient_requires_captcha dynamic_field_not_allowed link_not_allowed attachments_not_allowed not_found service_not_found template_not_found message_not_found conflict idempotency_conflict payload_too_large attachment_too_large invalid_template_params template_render_failed invalid_recipient service_unavailable_for_template sender_not_configured rate_limited test_send_limit recipient_suppressed internal_error provider_error service_unavailable
message
required
string
docs_url
required
string format: uri
details
Example
{
"error": {
"code": "invalid_template_params",
"message": "Invalid template parameters. email: Enter a valid e-mail address.",
"docs_url": "https://docs.frontmail.dev/reference/errors/#invalid-template-params",
"details": {
"issues": [
{
"param": "email",
"code": "invalid_email",
"message": "Enter a valid e-mail address."
}
]
}
}
}

Rate limited – see Retry-After (seconds).

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request invalid_body invalid_idempotency_key unauthorized invalid_public_key invalid_private_key insufficient_credits forbidden origin_not_allowed captcha_required captcha_failed captcha_not_configured headless_blocked recipient_blocked private_key_required private_key_in_browser email_not_verified organization_suspended plan_limit_reached dynamic_recipient_not_allowed dynamic_recipient_requires_captcha dynamic_field_not_allowed link_not_allowed attachments_not_allowed not_found service_not_found template_not_found message_not_found conflict idempotency_conflict payload_too_large attachment_too_large invalid_template_params template_render_failed invalid_recipient service_unavailable_for_template sender_not_configured rate_limited test_send_limit recipient_suppressed internal_error provider_error service_unavailable
message
required
string
docs_url
required
string format: uri
details
Example
{
"error": {
"code": "invalid_template_params",
"message": "Invalid template parameters. email: Enter a valid e-mail address.",
"docs_url": "https://docs.frontmail.dev/reference/errors/#invalid-template-params",
"details": {
"issues": [
{
"param": "email",
"code": "invalid_email",
"message": "Enter a valid e-mail address."
}
]
}
}
}
Retry-After
required

Seconds to wait before retrying.

string

Seconds to wait before retrying.

A recipient is on the suppression list (recipient_suppressed).

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request invalid_body invalid_idempotency_key unauthorized invalid_public_key invalid_private_key insufficient_credits forbidden origin_not_allowed captcha_required captcha_failed captcha_not_configured headless_blocked recipient_blocked private_key_required private_key_in_browser email_not_verified organization_suspended plan_limit_reached dynamic_recipient_not_allowed dynamic_recipient_requires_captcha dynamic_field_not_allowed link_not_allowed attachments_not_allowed not_found service_not_found template_not_found message_not_found conflict idempotency_conflict payload_too_large attachment_too_large invalid_template_params template_render_failed invalid_recipient service_unavailable_for_template sender_not_configured rate_limited test_send_limit recipient_suppressed internal_error provider_error service_unavailable
message
required
string
docs_url
required
string format: uri
details
Example
{
"error": {
"code": "invalid_template_params",
"message": "Invalid template parameters. email: Enter a valid e-mail address.",
"docs_url": "https://docs.frontmail.dev/reference/errors/#invalid-template-params",
"details": {
"issues": [
{
"param": "email",
"code": "invalid_email",
"message": "Enter a valid e-mail address."
}
]
}
}
}

Unexpected error; details.request_id identifies the request.

Media typeapplication/json
object
error
required
object
code
required
string
Allowed values: bad_request invalid_body invalid_idempotency_key unauthorized invalid_public_key invalid_private_key insufficient_credits forbidden origin_not_allowed captcha_required captcha_failed captcha_not_configured headless_blocked recipient_blocked private_key_required private_key_in_browser email_not_verified organization_suspended plan_limit_reached dynamic_recipient_not_allowed dynamic_recipient_requires_captcha dynamic_field_not_allowed link_not_allowed attachments_not_allowed not_found service_not_found template_not_found message_not_found conflict idempotency_conflict payload_too_large attachment_too_large invalid_template_params template_render_failed invalid_recipient service_unavailable_for_template sender_not_configured rate_limited test_send_limit recipient_suppressed internal_error provider_error service_unavailable
message
required
string
docs_url
required
string format: uri
details
Example
{
"error": {
"code": "invalid_template_params",
"message": "Invalid template parameters. email: Enter a valid e-mail address.",
"docs_url": "https://docs.frontmail.dev/reference/errors/#invalid-template-params",
"details": {
"issues": [
{
"param": "email",
"code": "invalid_email",
"message": "Enter a valid e-mail address."
}
]
}
}
}