Skip to content
DocsAPI reference

API reference

Public developer REST endpoints, grouped by resource. Account, billing, admin, auth, and internal routes are intentionally documented separately from this API-key surface.

Request anatomy

Build requests from the versioned base URL, a scoped bearer key, and JSON only when a body is present.

curl -X POST https://sendix.dev/api/v1/emails \
  -H "Authorization: Bearer $SENDIX_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "X-Request-Id: checkout-order_9f83a2" \
  -H "Idempotency-Key: order_9f83a2-receipt" \
  -d '{
    "from": "[email protected]",
    "to": "[email protected]",
    "subject": "Your receipt",
    "text": "Thank you for your order."
  }'
HeaderWhenPurpose
AuthorizationRequiredBearer API key with the endpoint's scope.
Content-TypeJSON bodySet to application/json for non-empty request bodies.
Idempotency-KeyCreate sendMakes an ambiguous network retry return the original email ID.
X-Request-IdRecommended8–128 safe characters for log and support correlation.

The API also accepts a valid X-Correlation-Id when X-Request-Id is absent. Sendix reflects the selected ID in the response. Do not place credentials or sensitive recipient data in either identifier.

Responses

Branch on the HTTP status first, then use the machine-readable error code.

201 Created
X-Request-Id: checkout-order_9f83a2
Content-Type: application/json

{ "id": "2f0b4d7e-..." }

400 Bad Request
X-Request-Id: checkout-order_9f83a2
Content-Type: application/json

{
  "error": {
    "code": "validation_error",
    "message": "Invalid request",
    "details": { "fieldErrors": { "to": ["Invalid email"] } },
    "request_id": "checkout-order_9f83a2"
  }
}

A 200 or 201 response contains JSON. 202 means asynchronous work was accepted, not completed. 204 has no response body. Error responses use an error object; validation and domain errors can add details, and server-generated errors include a correlation request ID.

Be forward-compatible
Ignore response fields and enum values your current client does not need. Treat documented required request fields as required, but do not reject a successful response only because Sendix added an optional field.

Safe mutations

Email creation

Use one stable Idempotency-Key per logical email. It must be 8–128 characters using letters, digits, dot, underscore, colon, or hyphen. The body field idempotency_key is equivalent; if both are sent, they must match.

Updates and deletes

Read the current resource state before workflows that depend on it, then handle 404 and 409 explicitly. For example, only a scheduled email can be rescheduled or cancelled; a worker may advance its state between your read and mutation.

Do not retry every failure
Retry network failures, 429, and selected 5xx responses with a finite backoff budget. Validation, authentication, permission, ownership, and state conflicts require a code or data change rather than another identical request.

Attachments and images

Send files and images by passing base64-encoded attachment objects to POST /emails.

Sendix accepts up to 20 attachments per message, with a 10 MB limit per file and 25 MB total attachment limit. Executable and script-like attachment types are blocked to reduce abuse and mailbox-provider risk.

curl -X POST https://sendix.dev/api/v1/emails \
  -H "Authorization: Bearer $SENDIX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "[email protected]",
    "to": ["[email protected]"],
    "subject": "Invoice",
    "text": "Your invoice is attached.",
    "attachments": [
      {
        "filename": "invoice.pdf",
        "contentType": "application/pdf",
        "content": "JVBERi0xLjQK..."
      },
      {
        "filename": "receipt.png",
        "contentType": "image/png",
        "content": "iVBORw0KGgo..."
      }
    ]
  }'

Spam risk check

Use POST /emails/spam-check before a large rollout or template launch.

The endpoint returns a score, triggered rules, recommendations, and a sendability flag. It does not replace SPF, DKIM, DMARC, clean lists, or gradual warmup; it gives developers a fast preflight signal before submitting real traffic.

curl -X POST https://sendix.dev/api/v1/emails/spam-check \
  -H "Authorization: Bearer $SENDIX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "[email protected]",
    "subject": "Your invoice is ready",
    "html": "<p>Your invoice is attached.</p>",
    "text": "Your invoice is attached."
  }'

Emails

Outbound transactional mail — single send, batch, schedule, cancel, attachments.

MethodPathScopeDescription
POST/emailsemail:sendSend a single transactional email.
POST/emails/spam-checkemail:sendScore subject/body risk before sending.
POST/emails/batchemail:sendSend up to 100 messages in one round-trip.
GET/emailsemail:readList sends with status / domain / search filters.
GET/emails/{id}email:readFetch a single send with its full delivery timeline.
GET/emails/{id}/eventsemail:readList webhook/event outbox records for one send.
GET/emails/{id}/attemptsemail:readList SMTP delivery attempts for one send.
PATCH/emails/{id}email:sendRe-schedule a not-yet-sent message.
POST/emails/{id}/cancelemail:sendCancel a scheduled message before the queue picks it up.
GET/emails/{id}/attachmentsemail:readList the attachments staged with a send.
GET/emails/{id}/attachments/{aid}email:readDownload a signed URL for a single attachment.

Inbound

Email arriving on configured inboxes, parsed and signed.

MethodPathScopeDescription
GET/emails/receivingemail:readList received messages with pagination.
GET/emails/receiving/{id}email:readFetch a received message with parsed headers and body.
GET/emails/receiving/{id}/attachmentsemail:readList attachments for a received message.
GET/emails/receiving/{id}/attachments/{attachmentId}email:readDownload a signed URL for one inbound attachment.
POST/emails/receivingemail:sendControlled inbound ingest for tests and internal integrations.
PATCH/emails/receiving/{id}email:readUpdate the read or starred state of a received message.
POST/emails/receiving/{id}/replyemail:sendReply to a received message through the outbound pipeline.
GET/emails/receiving/healthemail:readCheck inbound receiver and MX readiness.
GET/emails/receiving/forwardingemail:readList inbound forwarding rules.
POST/emails/receiving/forwardingdomain:manageCreate an inbound forwarding rule.
PATCH/emails/receiving/forwarding/{ruleId}domain:manageUpdate an inbound forwarding rule.
DELETE/emails/receiving/forwarding/{ruleId}domain:manageDelete an inbound forwarding rule.

Domains

Sending domains plus DNS records (SPF / DKIM / DMARC) and verification state.

MethodPathScopeDescription
GET/domainsdomain:readList domains in the workspace.
POST/domainsdomain:manageRegister a new sending domain.
GET/domains/{id}domain:readFetch one domain with its current DNS records.
PATCH/domains/{id}domain:manageUpdate sending or receiving settings for a domain.
POST/domains/{id}/verifydomain:manageRe-run SPF / DKIM / DMARC checks.
POST/domains/{id}/cloudflare/applydomain:manageApply generated DNS records through the connected Cloudflare account.
POST/domains/{id}/domain-connect/cloudflare-urldomain:manageCreate a signed Cloudflare Domain Connect URL; the optional records object selects mail, inbound, or combined setup.
POST/domains/{id}/receivingdomain:manageEnable or disable receiving after receiver and MX checks pass.
DELETE/domains/{id}domain:manage + dashboard session + fresh 2FA when enabledRemove a domain from the workspace.

Managed customers

Downstream customer and domain lifecycle for SaaS and ecommerce platforms.

MethodPathScopeDescription
GET/managed-tenantstenant:readList managed customers and current plan limits.
POST/managed-tenantstenant:manageIdempotently create a customer using your external id.
GET/managed-tenants/by-external-id/{externalId}tenant:readResolve a customer using the stable id from your own system.
GET/managed-tenants/{id}tenant:readFetch a customer with its attached domains.
PATCH/managed-tenants/{id}tenant:manageUpdate metadata, provider, name, or pause state.
DELETE/managed-tenants/{id}tenant:manageDelete a customer after removing all attached domains.
POST/managed-tenants/{id}/domainstenant:manageRegister a sending domain for a customer.
DELETE/managed-tenants/{id}/domains/{domainId}tenant:manageRemove a customer domain and its Sendix domain resource.

API keys

Programmatic credentials with per-scope authorisation and optional IP allow-lists.

MethodPathScopeDescription
GET/api-keysdashboard sessionList keys with their scopes and last-used timestamp.
POST/api-keysdashboard session + fresh 2FA when enabledMint a new key (returned in plaintext exactly once).
POST/api-keys/{id}/rotatedashboard session + fresh 2FA when enabledIssue a new secret while keeping the same id.
DELETE/api-keys/{id}dashboard session + fresh 2FA when enabledRevoke a key immediately.

Webhooks

HMAC-signed event delivery with automatic retries and replay.

MethodPathScopeDescription
GET/webhook-eventswebhook:readCatalog of every event you can subscribe to.
GET/webhookswebhook:readList endpoints registered in the workspace.
POST/webhookswebhook:manageRegister a new endpoint and event subscription.
GET/webhooks/{id}webhook:readFetch a single endpoint with its secret prefix.
PATCH/webhooks/{id}webhook:manageUpdate url / events / description.
DELETE/webhooks/{id}webhook:manageDelete the endpoint.
POST/webhooks/{id}/testwebhook:manageQueue a signed Sendix event to verify the endpoint.
POST/webhooks/{id}/test/livewebhook:manage + dashboard session + fresh 2FA when enabledAttempt an immediate live test delivery with fresh dashboard 2FA.
POST/webhooks/{id}/rotate-secretwebhook:manage + dashboard session + fresh 2FA when enabledRotate the HMAC signing secret.
GET/webhook-deliverieswebhook:readList delivery attempts across all endpoints.
GET/webhooks/{id}/deliverieswebhook:readList delivery attempts for one endpoint.
POST/webhook-deliveries/{deliveryId}/replaywebhook:manage + dashboard session + fresh 2FA when enabledReplay a failed webhook delivery.

Templates

HTML templates with versioning, preview, and live rendering.

MethodPathScopeDescription
GET/templatestemplate:readList templates and current active version.
POST/templatestemplate:manageCreate a new template with version 1 active.
GET/templates/{id}template:readFetch a template with the latest source.
PATCH/templates/{id}template:manageCreate the next active version.
DELETE/templates/{id}template:manageArchive (soft-delete) the template.
POST/templates/{id}/publishtemplate:manageActivate an existing template version.
POST/templates/{id}/duplicatetemplate:manageFork into a new template with the same source.
POST/templates/{id}/previewtemplate:manageRender with preview variables for a preview pane.
POST/templates/rendertemplate:manageRender arbitrary source without saving.
POST/templates/{id}/test-sendtemplate:manage + email:sendSend a test message from a template.
POST/templates/test-sendemail:send + verified account emailSend unsaved template source as a test message.
PUT/templates/{id}/drafttemplate:manageSave draft source without publishing it.
GET/templates/{id}/versionstemplate:readList the immutable versions of a template.
GET/templates/{id}/versions/{version}template:readFetch one template version.
GET/templates/{id}/statstemplate:readRead delivery and engagement statistics for a template.

Audience

Contacts, audiences, segments, and subscription state.

MethodPathScopeDescription
GET/audience/listsaudience:readList audiences in the workspace.
POST/audience/listsaudience:manageCreate a new audience.
GET/audience/lists/{id}audience:readFetch an audience list.
PATCH/audience/lists/{id}audience:manageUpdate an audience list.
DELETE/audience/lists/{id}audience:manageDelete an audience list.
GET/audience/contactsaudience:readList contacts.
POST/audience/contactsaudience:manageAdd or upsert a contact.
PATCH/audience/contacts/{id}audience:manageUpdate a contact.
DELETE/audience/contacts/{id}audience:manageDelete a contact.
POST/audience/contacts/importaudience:manageImport contacts into an audience.
POST/audience/contacts/{id}/send-confirmationaudience:manage + verified sender domainSend a double opt-in confirmation to one contact.
POST/audience/lists/{id}/send-confirmationsaudience:manage + verified sender domainSend double opt-in confirmations to eligible list contacts.
GET/audience/confirm/{token}signed confirmation tokenApply consent from a signed double opt-in link.
GET/segmentsaudience:readList dynamic segments.
POST/segmentsaudience:manageCreate a segment from a filter expression.
GET/segments/{id}audience:readFetch a segment.
PATCH/segments/{id}audience:manageUpdate a segment.
DELETE/segments/{id}audience:manageDelete a segment.
GET/segments/{id}/contactsaudience:readList contacts in a segment.
POST/segments/{id}/contactsaudience:manageAdd contacts to a segment.
DELETE/segments/{id}/contacts/{contactId}audience:manageRemove one contact from a segment.
GET/topicsaudience:readList subscription topics.
POST/topicsaudience:manageCreate a subscription topic.
GET/topics/{id}audience:readFetch a topic.
PATCH/topics/{id}audience:manageUpdate a topic.
DELETE/topics/{id}audience:manageDelete a topic.
GET/contacts/{id}/topicsaudience:readList topic subscriptions for a contact.
POST/contacts/{id}/topicsaudience:manageSubscribe a contact to a topic.
PATCH/contacts/{id}/topicsaudience:manageUpdate contact topic subscriptions.
DELETE/contacts/{id}/topics/{topicId}audience:manageUnsubscribe a contact from a topic.
GET/contact-propertiesaudience:readList custom contact properties.
POST/contact-propertiesaudience:manageCreate a custom contact property.
GET/contact-properties/{id}audience:readFetch a custom contact property.
PATCH/contact-properties/{id}audience:manageUpdate a custom contact property.
DELETE/contact-properties/{id}audience:manageDelete a custom contact property.
GET/contacts/{id}/propertiesaudience:readList custom property values for a contact.
PUT/contacts/{id}/properties/{propertyId}audience:manageSet one custom property value for a contact.

Broadcasts

One-off campaigns to an audience or segment with scheduling and throttling.

MethodPathScopeDescription
GET/broadcastsemail:readList broadcasts (status + audience + scheduled time).
POST/broadcastsemail:sendDraft a new broadcast.
GET/broadcasts/{id}email:readFetch broadcast detail with composition + stats.
PATCH/broadcasts/{id}email:sendEdit subject / body / audience / schedule.
DELETE/broadcasts/{id}email:sendDelete an unsent draft.
POST/broadcasts/{id}/sendemail:sendSend immediately or queue at the scheduled time.
POST/broadcasts/{id}/cancelemail:sendCancel an in-flight or scheduled broadcast.
GET/broadcasts/{id}/recipientsemail:readPage through the per-recipient delivery roster.
GET/broadcasts/summaryemail:readRead aggregate broadcast counts by state.
POST/broadcasts/audience-estimateemail:readEstimate the eligible recipient count before saving a broadcast.
GET/broadcasts/{id}/statsemail:readRead delivery and engagement statistics for a broadcast.
GET/broadcasts/{id}/recipient-errorsemail:readList recipient-level failures for a broadcast.
POST/broadcasts/{id}/duplicateemail:sendCreate a new draft from an existing broadcast.

Automations

Manual-run flows with retries, branches, run history, and event ingest.

MethodPathScopeDescription
GET/automationsautomation:readList automations and their enabled state.
POST/automationsautomation:manageCreate a new automation definition.
GET/automations/{id}automation:readFetch the definition + most recent runs.
PATCH/automations/{id}automation:manageEdit steps / triggers / metadata.
DELETE/automations/{id}automation:manageArchive the automation.
POST/automations/{id}/duplicateautomation:manageDuplicate an automation definition.
POST/automations/{id}/runautomation:runTrigger an external run with an arbitrary payload.
GET/automations/{id}/runsautomation:readList automation run history.
GET/automations/{id}/runs/{runId}automation:readFetch one automation run.
POST/automations/{id}/stopautomation:manageStop an active automation run.
POST/automations/eventsautomation:run + verified account emailTrigger eligible automations from a typed event.
GET/automations/_metaautomation:readRead automation metadata for builders and forms.
GET/automations/summaryautomation:readRead aggregate automation and run counts.
POST/automations/{id}/publishautomation:manageValidate and publish the current automation draft.
POST/automations/{id}/testautomation:run + verified account emailRun an automation with test input.
GET/automations/{id}/versionsautomation:readList published automation versions.
POST/automations/{id}/versions/{version}/rollbackautomation:manageRestore a previous automation version.
GET/automation-credentialsautomation:readList credential metadata without returning secrets.
POST/automation-credentialsautomation:manageCreate an encrypted credential for HTTP steps.
PATCH/automation-credentials/{id}automation:manageUpdate credential metadata and safe request settings.
POST/automation-credentials/{id}/rotateautomation:manageReplace the encrypted credential secret.
POST/automation-credentials/{id}/testautomation:manageTest a credential against a safe HTTP target.
DELETE/automation-credentials/{id}automation:manageDelete a credential that no automation references.

Suppressions

Workspace-wide do-not-send list, automatically maintained from bounces and complaints.

MethodPathScopeDescription
GET/suppressionssuppression:readList entries (paginated, filterable by reason).
POST/suppressionssuppression:manageManually add an address.
DELETE/suppressions/{email}suppression:manageRemove an address (e.g. after explicit re-opt-in).
GET/unsubscribe/{token}signed unsubscribe tokenRender a signed one-click unsubscribe confirmation.
POST/unsubscribe/{token}signed unsubscribe tokenApply a signed one-click unsubscribe.

Stats

Aggregate, daily, and time-series reporting on the workspace.

MethodPathScopeDescription
GET/stats/overviewanalytics:readTop-line totals over the last N days.
GET/stats/daily?days=30analytics:readDaily breakdown with zero-fill for gaps.
GET/stats/timeseriesanalytics:readPer-event time-series, suitable for charts.
GET/stats/topanalytics:readTop recipient ISPs and status mix.
GET/stats/deliverability?days=30analytics:readDeliverability scorecard, provider health, domain authentication, and actions.

Logs

Structured per-recipient timeline for every message the workspace has sent.

MethodPathScopeDescription
GET/logslogs:readQuery logs with search / time / status filters.
GET/logs/{id}logs:readFetch one log entry with the full event tape.
GET/logs/_countslogs:readFetch grouped log counts for dashboard filters.

Sending nodes

Read the available Sendix-owned delivery nodes visible to the workspace.

MethodPathScopeDescription
GET/sending-nodesauthenticatedList authenticated delivery nodes available for domain setup.

Events

Public event ingest for product timelines, analytics, and custom workflows.

MethodPathScopeDescription
POST/eventsautomation:manageCreate a typed platform event.
GET/eventsautomation:readList recent platform events.
GET/events/{id}automation:readFetch one platform event.
PATCH/events/{id}automation:manageUpdate a platform event.
DELETE/events/{id}automation:manageDelete a platform event.
POST/events/{id}/sendautomation:runSend a platform event into automation/webhook flows.