Send email

Send one transactional email to up to 50 recipients.

POSThttps://api.cresca.xyz/api/v1/emails

Works with sending-access and full-access keys. The email is queued and sent within seconds; the response returns as soon as it is accepted.

Body parameters

fromstringrequired

Sender address, as hello@acme.com or Acme <hello@acme.com>. It must be an active sender on a verified domain in your account. Without a display name, the sender's display name is used. Optional when the template has a default sender.

tostring | string[]required

Recipient addresses. Up to 50 recipients in total across to, cc and bcc.

subjectstringrequired

Single line, up to 998 characters. Optional when the template has a default subject.

htmlstringoptional

HTML body. Provide html, text or a template.

textstringoptional

Plain-text body. If omitted, Cresca generates it from html. Send an empty string to leave the text part out.

ccstring | string[]optional

Carbon-copy recipients.

bccstring | string[]optional

Blind carbon-copy recipients. They never appear in the message headers.

reply_tostring | string[]optional

Reply-To addresses. Defaults to the sender's Reply-To, if it has one.

templateobjectoptional

Send a published template instead of html/text: { "id": "password-reset", "variables": { "NAME": "Ana" } }. id is the template id or alias. See Templates and variables.

scheduled_atstringoptional

ISO 8601 date-time to send at, up to 30 days ahead, for example 2026-10-21T09:00:00Z. A time in the past sends immediately.

tagsobject[]optional

Up to 10 { "name", "value" } pairs to label the email, for example { "name": "category", "value": "password_reset" }. Names and values use ASCII letters, numbers, underscores and dashes, up to 256 characters.

headersobjectoptional

Custom headers, such as List-Unsubscribe or X-Entity-Ref-ID. Up to 50. Headers that Cresca controls (From, To, Cc, Bcc, Subject, Reply-To, Return-Path, Message-ID and similar) are rejected; use the request fields instead.

attachmentsobject[]optional

Up to 20 files, 7 MB in total. Each item has filename, base64 content, and optionally content_type and content_id (to show an inline image with <img src="cid:logo">). Executable types such as .exe and .js are refused. Attaching by path (URL) is not supported yet.

Headers

Idempotency-Keystringoptional

Makes the request safe to retry. See Idempotency.

Example

Request
curl -X POST 'https://api.cresca.xyz/api/v1/emails' \
  -H 'Authorization: Bearer cr_live_xxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: invoice/inv-2026-0042' \
  -d '{
  "from": "Acme Billing <billing@acme.com>",
  "to": [
    "user@example.com"
  ],
  "reply_to": "support@acme.com",
  "subject": "Your invoice INV-2026-0042",
  "html": "<p>Thanks for your payment. Your invoice is attached.</p>",
  "tags": [
    {
      "name": "category",
      "value": "invoice"
    }
  ],
  "attachments": [
    {
      "filename": "invoice.pdf",
      "content": "JVBERi0xLjQKJ..."
    }
  ]
}'
Response 200
{
  "id": "4ef9a417-02e9-4d39-ad75-9611e0fcc33c"
}

Recipients on your suppression list are skipped, but the request still succeeds. See Suppression. Unknown fields in the body are ignored.