Skip to main content
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/senders
Request
The domain 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}
Request
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-default
The compose dropdown fills with this sender first; the previous default is demoted. Deleting a sender (DELETE /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-status
Request
Each record renders a traffic light (valid / 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-send
Poll GET /api/v1/email/domains/{domainId}/test-send/{testId}/result with the returned testId:
Until the proof lands the result endpoint returns 404 (retry — it usually settles within a minute). 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/validate
Request
Check addresses before a campaign or import. suggestion carries the corrected domain on mistyped common domains (e.g. gamil.com → gmail.com). For batch checks, POST /api/v1/email/validate/bulk: Request
Each address reports 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/suppressions
Request
Suppressed addresses never receive sends — the send path rejects them before they reach the provider. Manual reason accepts manual, 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=):
Remove an entry with 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 show valid 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):
Eligibility read (eligibility is also nested inside GET /dedicated-sending):
Status read after submitting 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):
Postmaster — 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):
Malformed records are skipped and counted in skipped, never thrown — a corrupt attachment or a single bad snapshot never sinks the batch.

See also


Get dedicated sending status

GET /api/v1/email/dedicated-sending
Retrieve the organization’s dedicated sending IP status based on actual trailing-30-day email volume. Returns eligibility status, current request status (pending, approved, etc.), and provisioning details. Server-authoritative; uses real send volume from the messages table, not client-supplied estimates. 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.

Check dedicated IP eligibility

GET /api/v1/email/dedicated-sending/eligibility
Assess whether the organization qualifies for a dedicated sending IP based on projected monthly send volume (~50k/month threshold). Returns eligibility status and a recommended IP-warmup ramp if eligible. Pure computation with no IP provisioning or billing changes. 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.

List sending domains

GET /api/v1/email/domains
List every sending domain your organization can use — the platform default plus your configured and registered sender domains. Returns the domain ids accepted by every per-domain endpoint (DNS status, DNS history, inbox placement, BIMI, test send); call this first to discover ids before drilling into a single domain. Read-only: no DNS lookup, no provider call. 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 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-history
Retrieve the historical DNS verification record snapshots for a sending domain over the past N days (default 30). Shows when records were added, verified, or failed. Useful for debugging DNS propagation and troubleshooting verification issues. 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.

Check domain DNS records

GET /api/v1/email/domains/{domainId}/dns-status
Verify the SPF, DKIM, and DMARC DNS records for a sending domain. Returns a traffic-light status (verified, partial, or failed) for each record. Pass refresh=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-placement
Aggregate inbox placement statistics for a sending domain over the past N days (default 30). Shows the percentage of test emails delivered to inbox vs. spam/promotions folders across major ISPs. Computed from delivered test-send proofs. Returns zeros for domains with no test history. 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 test email send result

GET /api/v1/email/domains/{domainId}/test-send/{testId}/result
Retrieve the delivery and spam-scoring results from a test email send. Shows which ISPs delivered to inbox vs. spam, SPF/DKIM/DMARC authentication results, and an estimated spam score. Returns 404 if the test has not yet completed or been delivered. Requires owner or admin role.
string
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-routes
Retrieve all configured inbound email routes for the authenticated organization. Routes match incoming messages against recipient patterns and forward parsed email as JSON to a destination webhook. Signing secrets are masked in responses. 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.

List email senders

GET /api/v1/email/senders
Return every email sender registered for the calling organization: domain, default From: address/name, Reply-To, the isDefault flag, and the sending-stream assignment. Use this to populate the compose dropdown and the Senders settings table. Includes the legacy esend_legacy_&lt;slug&gt; 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}
Retrieve a single email sender by id — including the legacy esend_legacy_&lt;slug&gt; 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_&lt;slug&gt;).
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/streams
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 suppressed email addresses

GET /api/v1/email/suppressions
Page the tenant suppression list — addresses the platform will no longer send to, because of a bounce, complaint, unsubscribe, or manual block. Supports limit / 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.
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/export
Download the full tenant suppression list as an RFC 4180 CSV (headers email, 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/reputation
Aggregate bounce and complaint counts for the tenant’s email sends over the lookback window (default last 30 days, configurable via days, 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}
Public List-Unsubscribe endpoint. Verifies the HMAC-signed 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-enforcement
Split a proposed send batch against today’s live (feedback-adjusted) IP-warmup headroom into an allow / partial / block verdict — how many emails may go today, how many are deferred, and when headroom reopens. The operator supplies the steady-state targetDailyVolume 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-plan
Generate the day-by-day send-volume cap schedule that builds sending reputation up to a steady-state target daily volume. Use it to plan a deliberate ramp before raising send volume on a cold IP or domain; startingVolume and growthFactor are optional tuning knobs. Pure computation — no email is sent and nothing is provisioned.
integer
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-status
Report where the workspace currently sits on its IP-warmup ramp: the ramp day anchored to the first recorded outbound send, today’s recommended cap, the volume already sent today, the remaining headroom, and whether sending is still within the ramp. Live sending reputation (recent delivery and spam-complaint rates) can lower today’s ceiling while reputation recovers. Use it to decide how much volume is safe to send right now.
integer
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/request
Submit a request for a dedicated sending IP. The organization must send >50k emails/month to qualify (verified against actual trailing-30-day volume). The request is recorded and fulfilled out-of-band by Devotel; no IP is provisioned immediately. Idempotent; re-submitting the same request returns the status unchanged. Requires owner or admin role.
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.

Analyze reports

POST /api/v1/email/dmarc/reports/analyze
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.

POST /api/v1/email/domains/{domainId}/bimi
Set up BIMI (Brand Indicators for Message Identification) to display your brand logo next to emails in compatible mail clients. Supply logo URL and optional VMC (Verified Mark Certificate) URL. Validates the configuration against DNS records and DMARC requirements. Requires DMARC policy enforcement and owner or admin role.
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.

Create mta-sts

POST /api/v1/email/domains/{domainId}/mta-sts
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.

Initiate a test email send

POST /api/v1/email/domains/{domainId}/test-send
Start a test email send for a domain to verify delivery and measure inbox placement across major ISPs. The test email is signed with a generic orbittest.devotel.io DKIM key (not your domain’s key). Returns immediately with a test ID; poll the result endpoint to retrieve delivery and spam scoring details. Requires owner or admin role.
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.

Register an inbound email route

POST /api/v1/email/inbound-routes
Create a new inbound email route that matches incoming messages by recipient pattern and forwards the parsed email payload to a destination webhook URL. The route is assigned a unique signing secret, returned once at creation. Requires owner or admin role.
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.

Analyze Google Postmaster Tools + feedback-loop reputation data

POST /api/v1/email/postmaster/reputation/analyze
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.

Senders email

POST /api/v1/email/senders
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 set-default

POST /api/v1/email/senders/{senderId}/set-default
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.

Streams email

POST /api/v1/email/streams
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 set-default

POST /api/v1/email/streams/{streamId}/set-default
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.

Suppressions email

POST /api/v1/email/suppressions
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.

Bulk-import suppressions

POST /api/v1/email/suppressions/bulk-import
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.

Analyze TLS-RPT aggregate reports

POST /api/v1/email/tls-rpt/reports/analyze
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.

One-click email unsubscribe

POST /api/v1/email/unsubscribe/{token}
Public List-Unsubscribe endpoint. Verifies the HMAC-signed 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/validate
Score a single recipient email address before you send to it (SendGrid Email Validation parity). Checks syntax, MX resolution, disposable-domain and role-based-mailbox signals, computes a likely-typo correction, and folds everything into an aggregate 0–1 risk score with a coarse risk band — pure DNS + heuristics, no SMTP mailbox probing and no third-party feed. Use it to scrub one recipient row at a time as a user types or pastes; use POST /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/bulk
Score a list of recipient email addresses in one call before you import a contact list or launch a campaign. Each address is checked for syntax, MX resolution, disposable-domain and role-account signals, and a likely-typo correction, then rolled into a per-row verdict plus an aggregate summary (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}
Remove an inbound email route from the organization. The route will no longer match or forward incoming emails. Returns success when the route is deleted. 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.

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.