Skip to content
Docs menuCurrent page: Resend compatibility

Reference

Resend compatibility

Letterpier answers the Resend HTTP API for the endpoints it covers, tested with resend@6.30.0.

Tested with resend@6.30.0

Last reviewed

On this page (7)

Test baseline

Letterpier is tested with the unmodified resend@6.30.0 Node SDK, created with baseUrl: 'https://app.letterpier.com'. Use it with server-side keys only.

Terminal

npm install resend@6.30.0

lib/mail.ts

import { Resend } from 'resend';export const mail = new Resend(process.env.LETTERPIER_API_KEY, {  baseUrl: 'https://app.letterpier.com',});

Responses include the fields Resend’s SDK expects, plus a few Letterpier extensions. SDK compatibility doesn’t mean the whole Resend product, or every field of every Resend response.

Coverage

What Letterpier answers, tested with resend@6.30.0
OperationCoverage
POST /emails, emails.sendLive and sandbox; from, to, cc, bcc, reply_to, text, html, headers, tags, attachments, scheduled_at.
POST /emails/batch, batch.sendUp to 100 messages, accepted atomically, with request idempotency.
GET /emails, GET /emails/:idList with limit and after; retrieve with bodies. Isolated by project and environment.
PATCH /emails/:id, POST /emails/:id/cancelReschedule or cancel queued and scheduled messages only; scheduling up to 30 days ahead.
GET /emails/receiving/:idBody retrieval with a full-access live key, plus the raw original message.
/emails/receiving/:id/attachments[/:attachmentId]SDK list and get: authenticated metadata and signed download links.
GET /emails/receivingThe latest 100; cursor pagination is not implemented yet.
/domains, /domains/:id, /domains/:id/verifyCreate, list, get and verify, with Letterpier’s DNS records, an optional receiving flag on create and the eu-local region descriptor.
/api-keysCreate, list and revoke, inheriting the caller’s environment; permissions enforced.
/webhooksCreate, list and delete; the signing secret is shown once.

What Letterpier answers, tested with resend@6.30.0

  • POST /emails, emails.send
    Coverage
    Live and sandbox; from, to, cc, bcc, reply_to, text, html, headers, tags, attachments, scheduled_at.
  • POST /emails/batch, batch.send
    Coverage
    Up to 100 messages, accepted atomically, with request idempotency.
  • GET /emails, GET /emails/:id
    Coverage
    List with limit and after; retrieve with bodies. Isolated by project and environment.
  • PATCH /emails/:id, POST /emails/:id/cancel
    Coverage
    Reschedule or cancel queued and scheduled messages only; scheduling up to 30 days ahead.
  • GET /emails/receiving/:id
    Coverage
    Body retrieval with a full-access live key, plus the raw original message.
  • /emails/receiving/:id/attachments[/:attachmentId]
    Coverage
    SDK list and get: authenticated metadata and signed download links.
  • GET /emails/receiving
    Coverage
    The latest 100; cursor pagination is not implemented yet.
  • /domains, /domains/:id, /domains/:id/verify
    Coverage
    Create, list, get and verify, with Letterpier’s DNS records, an optional receiving flag on create and the eu-local region descriptor.
  • /api-keys
    Coverage
    Create, list and revoke, inheriting the caller’s environment; permissions enforced.
  • /webhooks
    Coverage
    Create, list and delete; the signing secret is shown once.

Limits apply as documented: 50 recipients and 20 attachments per message, about 10 MB of attachments per request, and 250,000 characters each for text and html. Sending-only keys can’t read messages or manage domains, keys or webhooks.

Every limit

Not supported

These parts of the Resend API are outside this version:

  • Domain scope on API keys
  • Updating and deleting domains
  • Getting and updating a single webhook
  • Forwarding received mail
  • Get APIs for the attachments of sent mail
  • Templates
  • Contacts
  • Broadcasts
  • Audiences and segments
  • Topics
  • Automations
  • Open and click tracking
  • Other marketing APIs

Where Letterpier differs

Extensions

Letterpier adds a few fields. Clients that ignore unknown fields, like the SDK, are unaffected.

Extension fields
FieldWhereMeaning
environmentMessageslive or sandbox: the environment of the key that sent it.
sandboxMessages, webhookstrue when nothing was delivered.
last_errorMessagesWhy a message was held or suppressed, or why its outcome is unknown.
rawReceived messagesA signed link to the original .eml.

Extension fields

  • environment
    Where
    Messages
    Meaning
    live or sandbox: the environment of the key that sent it.
  • sandbox
    Where
    Messages, webhooks
    Meaning
    true when nothing was delivered.
  • last_error
    Where
    Messages
    Meaning
    Why a message was held or suppressed, or why its outcome is unknown.
  • raw
    Where
    Received messages
    Meaning
    A signed link to the original .eml.

Unsupported calls

Calls outside the coverage above get an explicit error, never a silent success. With a full-access key the answer is 501:

Response
HTTP/1.1 501 Not ImplementedContent-Type: application/json{  "statusCode": 501,  "name": "validation_error",  "message": "This operation is not implemented. See docs/compatibility.md for supported features."}

The same applies to the 13 resource roots the SDK knows but Letterpier doesn’t implement:

/audiences/automations/broadcasts/contact-properties/contacts/events/logs/oauth/segments/suppressions/templates/topics/usage

  • Without a key: 401 missing_api_key.
  • With a sending-only key: 403 restricted_api_key.
  • With a full-access key: 501 validation_error.
  • Opened in a browser, an API address shows a short page explaining that it is for code. Unknown paths that aren’t API addresses show the site’s 404 page.

Trademark