I just launched Social SDK. Come check it out →
Email SDK
Adapters

SendHeron

Send through the SendHeron transactional email API with native idempotency, scheduling, and suppressed sends reported as errors.

Capabilities

Repeated headersIdempotencySchedulingPersonalized
NonativeYesexpanded

These values come from the adapter's exported capabilities declaration. The field support matrix covers normalized message fields.

The SendHeron adapter calls POST /emails/send on the SendHeron API with plain fetch. Every send passes through SendHeron's compliance gate, which can refuse a message on policy. The adapter turns that refusal into an error so it is never mistaken for a sent email.

SendHeron logo
SendHeron@opencoredev/email-sdk/sendheron
Provider docs

Configure

Create an API key with the emails:send scope in your SendHeron workspace and verify the domain you send from.

Prop

Type

Send

SendHeron takes one recipient per send. The adapter maps cc and bcc (up to 50 each), one replyTo, headers, attachments, and sendAt. The sender's display name goes into SendHeron's fromName field.

SendHeron has no plain-text body. When a message has html, the adapter sends it and drops text. A text-only message is HTML-escaped and wrapped in a <pre> block so line breaks survive.

The client's idempotency key goes out as SendHeron's idempotency-key header. SendHeron honors a key for 24 hours, so a retry after a timeout replays the first response instead of sending twice.

Suppressed sends

SendHeron answers a refused send with HTTP 201 and status: "suppressed", with the reason (such as HARD_SUPPRESSED or ORG_SENDING_PAUSED) in errorMessage. The adapter throws an EmailAdapterError for it with retryable: false and delivery: "not_sent", and the reason appears in the error message. Fix the cause instead of retrying.

Plain addresses, one recipient

to, cc, bcc, and replyTo must be plain addresses without display names, and to takes exactly one address. Attachments need a contentType from SendHeron's allowlist (PDF, PNG, JPEG, GIF, WebP, calendar, CSV, plain text, or ZIP), are limited to 10 per message, and cannot be combined with sendAt. Inline attachments, tags, and metadata are not supported. Each of these throws an EmailValidationError before any request is made.

Verify from the CLI

The live check reads a send ID that cannot exist. SendHeron answers emailSending.notFound once the key authenticates and holds the emails:send scope, so no email is sent. A missing scope reports insufficient_permissions.

Drop --dry-run to send for real. Failed requests surface SendHeron's description and its stable error key, for example SendHeron failed with 401: Unauthorized (apiKeys.invalidToken).

Frequently asked questions

Does Email SDK support SendHeron?

Yes. Email SDK ships a SendHeron adapter imported from @opencoredev/email-sdk/sendheron. You keep your SendHeron account and credentials; the SDK adds message validation, typed errors, and no-network test adapters around the same send() call used for every other provider.

Which message fields does the SendHeron adapter support?

SendHeron supports CC recipients, BCC recipients, Reply-To address, Custom headers, Attachments, and Scheduled sending (sendAt). It does not support Tags and Metadata; Email SDK rejects a message that uses those fields before any request is made.

Can SendHeron schedule email for later with Email SDK?

Yes. Set sendAt on the message and the SendHeron adapter passes the scheduled time to the provider.

Does the SendHeron adapter support idempotent sends?

Yes. The SendHeron adapter passes an idempotency key to the provider, so SendHeron deduplicates repeated sends on its side.

On this page