Languages: every operation supports cURL, Node.js (TypeScript), Python, Go, Ruby, and PHP. The first 15 operations on this page show all six languages; the remaining 27 show cURL and TypeScript — the two most-used.
Email API
Email endpoints exposed by the Devotel CPaaS API Base path:/api/v1/email
Endpoint count: 42
title: “Worked email lifecycle samples” description: “Worked request and response samples for the email senders lifecycle: register a sender, verify the domain’s DNS records, run a test-send, manage suppressions, and validate recipients.”
Worked email lifecycle samples
Copy a request as written, substitute your own ids, and compare the response envelope. Errors follow Devotel Orbit’s{ error, meta } envelope and carry a request_id in meta you quote when reporting. The sender chain: register a sender → publish the domain’s DNS records → run a test-send → keep suppressions clean.
1. Register a sender
POST /api/v1/email/sendersdomain is registered with the sending provider, which issues real SPF/DKIM records — publish them with your DNS provider, then verify with the DNS-status read below before the sender can send. Omit default_from_email to send as noreply@<domain>.
2. Update the sender’s defaults
PUT /api/v1/email/senders/{senderId}PUT replaces the From/Reply-To defaults — pass every field you want to keep. Promoting back to default uses the dedicated endpoint below (flipping isDefault: false here is a no-op).
3. Promote a sender to the org default
POST /api/v1/email/senders/{senderId}/set-defaultDELETE /api/v1/email/senders/{senderId}) removes it from the dropdown and accepts no body.
4. Check the domain’s DNS records
GET /api/v1/email/domains/{domainId}/dns-statusvalid / warning / invalid / unknown); overallStatus is the worst of them. Compare recordExpected against recordActual to see what your DNS provider is missing. Pass ?refresh=true to re-verify at the provider, not just at DNS. GET /dns-history?days=30 returns the same id with an entries array of dated record snapshots so you can trace propagation.
5. Run a test-send and poll the result
POST /api/v1/email/domains/{domainId}/test-sendGET /api/v1/email/domains/{domainId}/test-send/{testId}/result with the returned testId:
estimated: true means the spamScore is a provisional estimate from the domain’s DNS grid, not the measured receiver verdict. GET /inbox-placement?days=30 aggregates delivered proofs into an inbox/spam/promotions breakdown with an inboxRate percentage.
6. Validate recipient addresses
POST /api/v1/email/validatesuggestion carries the corrected domain on mistyped common domains (e.g. gamil.com → gmail.com). For batch checks, POST /api/v1/email/validate/bulk:
Request
deliverable, mailbox_full / undeliverable, mailbox_disabled, spamtrap, potential, invalid_mx, no_mx, or syntax_failure. The bulk form returns a results map plus the invalidAddresses list so you don’t have to cross-check every entry.
7. Manage the suppression list
POST /api/v1/email/suppressionsmanual, unsubscribe, complaint, or hard_bounce; bounce/automatic entries (collector handles them) carry the machine reasons. Repeat an add and it returns 200 with the existing entry rather than 201.
Bulk-import (POST /api/v1/email/suppressions/bulk-import) accepts either CSV text (one address per line, optional email header row tolerated) or an emails array:
Request
imported counts newly-added entries; skipped counts duplicates already on the list; invalid counts malformed addresses dropped. GET /api/v1/email/suppressions pages the list (?limit=&offset=&search=&reason=):
DELETE /api/v1/email/suppressions/{id} (returns { "ok": true }). GET /api/v1/email/suppressions/reputation?days=30 reports a suppression-rate breakdown by reason over trailing send volume — the number a deliverability review quotes.
8. Poll readiness and DNS, then promote to default
Once the DNS records publish (step 4), poll until the records showvalid and then promote the sender to the org default. The Node.js escape hatch — the SDK is generated from this same OpenAPI contract, so a typed client covers it; raw fetch is fine too:
refresh=true re-verifies at the provider, not just at DNS — pass it when you just published the records. The promote call accepts no body; steps 3–5 above show the shapes.
Warmup, dedicated IP, TLS reports, and inbound routing (advanced)
These complete the sender’s onboard checklist; most tenants never need them.POST /api/v1/email/inbound-routes registers an inbound subdomain→destination mapping (webhook):
Request
GET /api/v1/email/warmup-plan returns the day-by-day ramp for your ?targetDailyVolume=:
GET /api/v1/email/warmup-status adds what you have actually sent (sent.totalSent, the live-day current.maxAllowed, and reputation). GET /api/v1/email/warmup-enforcement answers “which batches get sent when the pattern doesn’t match a plan day” for a requested batch.
Dedicated sending — eligibility, request, status
Check eligibility (GET /api/v1/email/dedicated-sending/eligibility) against your actual trailing-30-day volume, submit a free-text request, then read back the server-authoritative status (GET /api/v1/email/dedicated-sending):
GET /dedicated-sending):
POST /dedicated-sending/request with a justification note:
eligibility.monthlySendVolume comes from real send history, not a client estimate — the request is rejected 403 below the ~50k/month bar, and re-submitting a pending request returns the existing record.
TLS-report and Postmaster reputation reads
Two stateless analysis routes fold the aggregate reports mailbox providers mail (TLS-RPT) and the per-delivery reputation Google / feedback loops expose (Postmaster) into one tenant-side readout — no persistence, no quota to the provider. TLS-RPT —POST /api/v1/email/tls-rpt/reports/analyze (base64-encode the report body you receive, or publish the _smtp._tls.<domain> record providers attach as application/tlsrpt+gzip):
POST /api/v1/email/postmaster/reputation/analyze (POST the payloads a tenant’s scheduled connector fetches from Google Postmaster Tools and your configured feedback loops — we deliberately do not pull from Google directly, so the route stays read-through):
skipped, never thrown — a corrupt attachment or a single bad snapshot never sinks the batch.
See also
- Email attachments guide — attach outbound media and pull inbound attachments.
- Inbound email parse guide — map parsed inbound email into your webhook.
- Email lifecycle guide — the full sender-setup walk-through this page excerpts.
Get dedicated sending status
GET /api/v1/email/dedicated-sendingstring (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Check dedicated IP eligibility
GET /api/v1/email/dedicated-sending/eligibilitystring (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.List sending domains
GET /api/v1/email/domainsstring (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get domains
GET /api/v1/email/domains/{domainId}string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get domain DNS verification history
GET /api/v1/email/domains/{domainId}/dns-historystring
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Check domain DNS records
GET /api/v1/email/domains/{domainId}/dns-statusrefresh=true to trigger a provider re-verification and update Resend’s domain status. Requires owner or admin role.
string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get domain inbox placement rate
GET /api/v1/email/domains/{domainId}/inbox-placementstring
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get test email send result
GET /api/v1/email/domains/{domainId}/test-send/{testId}/resultstring
required
—
string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.List inbound email routes
GET /api/v1/email/inbound-routesstring (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.List email senders
GET /api/v1/email/sendersesend_legacy_<slug> row when the org still uses a flat channels domain. Requires owner or admin role.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get one email sender
GET /api/v1/email/senders/{senderId}esend_legacy_<slug> ids the list endpoint advertises. Use it to fetch the sender’s domain, from-fields, and stream assignment before editing. Returns 404 when the id does not exist for the organization. Requires owner or admin role.
string
required
Sender id (
esend_… or esend_legacy_<slug>).string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.List streams
GET /api/v1/email/streamsstring (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.List suppressed email addresses
GET /api/v1/email/suppressionslimit / offset pagination plus search and reason filters. Use it to audit why email to an address stopped and to decide which entry to remove. Requires owner or admin role.
integer
Page size (default 50, max 200). Coerced number falls back to the default on a malformed value.
integer
Zero-based row offset for pagination.
string
Substring filter on the suppressed address.
string
Filter by suppression reason (bounce, complaint, unsubscribe, manual).
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Export suppression list as CSV
GET /api/v1/email/suppressions/exportemail, reason, bounce_type, added_at, expires_at). Use it to reconcile the blocklist against an external system or take an offline snapshot. Requires owner or admin role.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get sender-reputation summary
GET /api/v1/email/suppressions/reputationdays, max 90). Use it to spot deliverability regressions — a rising hard-bounce or complaint rate directly degrades sender reputation. Requires owner or admin role.
integer
Lookback window in days (default 30, max 90).
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.One-click email unsubscribe
GET /api/v1/email/unsubscribe/{token}token embedded in every outbound email’s List-Unsubscribe URL, records the recipient address on the tenant suppression list (idempotent), then either 302-redirects to the organization’s configured unsubscribe page or renders a minimal HTML confirmation. POST is the RFC 8058 one-click method (mailbox gateways POST without a body); GET is the human-click fallback. Invalid, expired, or tampered tokens return an HTTP 400 HTML error page.
string
required
HMAC-signed token binding tenant, message id, and recipient address; minted into the message’s List-Unsubscribe URL at send time.
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Check batch send against warmup headroom
GET /api/v1/email/warmup-enforcementtargetDailyVolume plus the requested batch size; startingVolume / growthFactor are optional ramp-tuning knobs identical to /warmup-plan. Read-only: the verdict only ever withholds volume above today’s ceiling, it never authorises a send. Requires owner or admin role.
integer
required
Steady-state daily volume the warmup ramp aims toward (1-10M/day). Required.
integer
required
Batch size the caller wants to send now. Required.
integer
Optional custom day-one daily cap (same knob as /warmup-plan).
number
Optional daily-growth multiplier (1.05-4; default ~1.5).
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get IP warmup ramp plan
GET /api/v1/email/warmup-planinteger
required
Steady-state daily volume the warmup ramp aims toward (1-10M/day). Required.
integer
Optional custom day-one daily cap (overrides the default curve start).
number
Optional daily-growth multiplier applied day over day (1.05-4; default ~1.5).
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Get live IP warmup status
GET /api/v1/email/warmup-statusinteger
required
Steady-state daily volume the warmup ramp aims toward (1-10M/day). Required.
integer
Optional custom day-one daily cap (same knob as /warmup-plan).
number
Optional daily-growth multiplier (1.05-4; default ~1.5).
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Request a dedicated sending IP
POST /api/v1/email/dedicated-sending/requeststring
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Analyze reports
POST /api/v1/email/dmarc/reports/analyzestring
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Configure BIMI brand logo
POST /api/v1/email/domains/{domainId}/bimistring
required
—
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Create mta-sts
POST /api/v1/email/domains/{domainId}/mta-stsstring
required
—
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Initiate a test email send
POST /api/v1/email/domains/{domainId}/test-sendstring
required
—
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Register an inbound email route
POST /api/v1/email/inbound-routesstring
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Analyze Google Postmaster Tools + feedback-loop reputation data
POST /api/v1/email/postmaster/reputation/analyzestring
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Senders email
POST /api/v1/email/sendersstring
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Create set-default
POST /api/v1/email/senders/{senderId}/set-defaultstring
required
—
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Streams email
POST /api/v1/email/streamsstring
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Create set-default
POST /api/v1/email/streams/{streamId}/set-defaultstring
required
—
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Suppressions email
POST /api/v1/email/suppressionsstring
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Bulk-import suppressions
POST /api/v1/email/suppressions/bulk-importstring
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Analyze TLS-RPT aggregate reports
POST /api/v1/email/tls-rpt/reports/analyzestring
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.One-click email unsubscribe
POST /api/v1/email/unsubscribe/{token}token embedded in every outbound email’s List-Unsubscribe URL, records the recipient address on the tenant suppression list (idempotent), then either 302-redirects to the organization’s configured unsubscribe page or renders a minimal HTML confirmation. POST is the RFC 8058 one-click method (mailbox gateways POST without a body); GET is the human-click fallback. Invalid, expired, or tampered tokens return an HTTP 400 HTML error page.
string
required
HMAC-signed token binding tenant, message id, and recipient address; minted into the message’s List-Unsubscribe URL at send time.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Validate a recipient email address
POST /api/v1/email/validatePOST /api/v1/email/validate/bulk to scrub a whole list in one call. The address is never persisted (transient validation only). Owner / admin only; an invalid body returns 422 and an unexpected validator failure returns 500.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.any
Recipient address to validate — 3 to 254 characters (required).
Bulk-validate recipient email addresses
POST /api/v1/email/validate/bulksummary (total, valid, invalid, risky). Accepts up to 1,000 addresses per call (de-duplicated case-insensitively), runs the MX fan-out behind a concurrency cap, and meters one usage event per call with quantity = distinct addresses validated (sandbox traffic is never metered). Use it to surface undeliverable or risky rows pre-import; use POST /api/v1/email/validate for a single address. Recipient addresses are never persisted. Invalid bodies return 422.
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.any
Address list to validate — 1 to 1,000 entries, each 3–254 characters. De-duplicated case-insensitively before validation; one result row per distinct address, input order preserved (required).
Update senders
PUT /api/v1/email/senders/{senderId}string
required
—
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Update streams
PUT /api/v1/email/streams/{streamId}string
required
—
string
Stripe-style idempotency token. Pass a stable, client-generated value (1-255 chars) to dedupe retries on transient timeouts. The same key+credential+path replays the original response for 24h on 2xx (5min on 4xx, 30s on 5xx). Returns 409 if a concurrent request with the same key is already in flight; replayed responses include the
Idempotency-Replay: true response header.string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Delete an inbound email route
DELETE /api/v1/email/inbound-routes/{routeId}string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Delete senders
DELETE /api/v1/email/senders/{senderId}string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Delete streams
DELETE /api/v1/email/streams/{streamId}string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.Delete suppressions
DELETE /api/v1/email/suppressions/{id}string
required
—
string (enum: true|false)
Sandbox opt-in for Clerk-session-authenticated requests. Set to
true to route the call through the test-mode pipeline: no real provider delivery, no credits deducted, response meta.test_mode: true. Ignored for live API keys (dv_live_sk_*) — server-to-server clients must use a test-prefixed key (dv_test_sk_*) to exercise sandbox. Test-prefixed keys unconditionally enable sandbox regardless of this header.