Skip to main content

Email API

Email endpoints exposed by the Devotel CPaaS API Base path: /api/v1/email Endpoint count: 32

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.

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.

List the org’s sending domains

GET /api/v1/email/domains

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

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

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

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

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.

List email senders

GET /api/v1/email/senders
List every verified email sending identity configured for the authenticated tenant — the set that backs the compose sender dropdown and the senders settings page. Each entry reports its sending domain, default from-name / from-address, reply-to, sending-stream assignment, and a dnsVerified flag derived from live SPF/DKIM evidence. Requires an owner / admin role.

Get an email sender

GET /api/v1/email/senders/{senderId}
Fetch a single email sender by id, scoped to the authenticated tenant. Resolves both persisted senders and lazily-migrated legacy rows (esend_legacy_<slug>). Returns 404 when no sender with that id exists for the tenant. Requires an owner / admin role.
string
required
Email sender id (esend_…).

List email suppressions

GET /api/v1/email/suppressions
Page the tenant’s email suppression list, newest first — the addresses the platform will not send to. Filter with search (case-insensitive substring on the address) and reason, and page with limit / offset. Requires an owner / admin role.
integer
Page size (1–200, default 50).
integer
Row offset for pagination (default 0).
Case-insensitive substring match on the suppressed address.
string
Filter to a single suppression reason (e.g. complaint, hard_bounce).

Export email suppressions as CSV

GET /api/v1/email/suppressions/export
Download the tenant’s full email suppression list as an RFC 4180 CSV file (columns: email, reason, bounce_type, added_at, expires_at), capped at 10,000 rows. Use it to back up the list or carry it to another provider. Requires an owner / admin role.

Get email sender reputation

GET /api/v1/email/suppressions/reputation
Return a sender-reputation summary for the tenant over a lookback window — sent / delivered / bounced / complaint counts and rates, a health tier and score, the current suppression-list size, and the shared-IP disclosure. Derived from the delivery receipts the email DLR webhook already records. Requires an owner / admin role.
integer
Lookback window in days (1–90). Defaults to the platform health-score window.

Process a one-click email unsubscribe

GET /api/v1/email/unsubscribe/{token}
Public landing endpoint for the signed List-Unsubscribe URL that Orbit stamps into every outbound email. The {token} is an HMAC-signed value binding the tenant, message, and recipient — no API key or session is required, the token is the credential. Opening the link suppresses that recipient from future sends (idempotently) and either renders a confirmation page or 302-redirects to the sender’s configured unsubscribe page. Use this for the human-clickable (GET) half of RFC 8058 one-click unsubscribe.
string
required
Signed, single-use unsubscribe token minted by Orbit and embedded in the email’s List-Unsubscribe header/link. Opaque to callers.

Check an IP-warmup batch-send verdict

GET /api/v1/email/warmup-enforcement
Given the batch size you want to send now (requested), return a batch-level accept/defer verdict against today’s live warmup headroom: how many emails may go today, how many must wait, and when headroom reopens. This is the enforcement layer over the warmup status — a bulk send can gate on one authoritative allow / partial / block decision instead of re-deriving the arithmetic. Read-only and tenant-isolated: the verdict only ever withholds volume above today’s ceiling, it never authorises a send. Requires an operator role.
integer
required
Steady-state daily send volume the ramp builds up to.
integer
required
Number of emails the caller wants to send right now.
integer
Optional day-1 seed volume (defaults to 50/day).
number
Optional per-day growth multiplier (defaults to 1.5).

Get an IP-warmup ramp plan

GET /api/v1/email/warmup-plan
Return an automated IP-warmup schedule: the day-by-day send-volume caps that grow a fresh sending reputation up to your target steady-state daily volume, so a high-volume sender ramps deliberately instead of spiking a cold IP. Pure computation — no email is sent and nothing is persisted; the plan is the schedule you (or an automated throttle) follow. Requires an operator role (owner / admin / developer).
integer
required
Steady-state daily send volume the ramp builds up to.
integer
Optional day-1 seed volume (defaults to a conservative 50/day).
number
Optional per-day growth multiplier (defaults to 1.5, a ~50%/day ramp).

Get live IP-warmup ramp status

GET /api/v1/email/warmup-status
Return where this account actually sits on the IP-warmup ramp today: which ramp day now falls on (anchored to the first recorded outbound send), today’s recommended send cap, how much has already gone out today, and the remaining headroom. The cap also folds in the account’s live sending reputation — a poor delivery/complaint rate holds today’s ceiling below the time curve so you never keep ramping into a spam filter. Read-only and tenant-isolated; requires an operator role.
integer
required
Steady-state daily send volume the ramp builds up to.
integer
Optional day-1 seed volume (defaults to 50/day).
number
Optional per-day growth multiplier (defaults to 1.5).

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.

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

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

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.

Register an email sender

POST /api/v1/email/senders
Register a new email sending identity for a domain and optionally set its default from-name, from-address, reply-to, and sending stream. The domain is registered with the email provider so real SPF/DKIM records are issued — publish and verify them before the sender can send. Set isDefault: true to make it the org default. Requires an owner / admin role.
string
required
Sending domain to register (lowercased), e.g. mail.acme.com.
string | null
Default From address — must be on domain; omit or null to send as noreply@<domain>.
string | null
Display name shown to recipients.
string | null
Reply-To routing address.
boolean
Make this the org’s default sender (demotes the previous default).
string | null
Assign the sender to a sending stream (estream_…), or null to leave it unassigned.

Set the default email sender

POST /api/v1/email/senders/{senderId}/set-default
Promote an email sender to be the tenant’s default — the identity used when a send omits an explicit sender. Demotes the previous default and is a no-op when the target is already default. Returns 404 when the id doesn’t exist for the tenant. Requires an owner / admin role.
string
required
Email sender id (esend_…) to promote to default.

Add an email suppression

POST /api/v1/email/suppressions
Manually add a recipient address to the tenant’s suppression list so the platform stops sending to it — for example when a customer asks to be removed. Idempotent: re-adding an existing address updates its reason in place and returns 200 instead of 201. Requires an owner / admin role.
string
required
The recipient address to suppress.
string (enum: manual|unsubscribe|complaint|hard_bounce)
Why the address is being suppressed.

Bulk-import email suppressions

POST /api/v1/email/suppressions/bulk-import
Import many suppressions at once from a raw CSV blob or an explicit address array — e.g. a suppression list carried over from a previous email provider. Addresses are parsed, normalised, and de-duplicated; the response reports imported / skipped / invalid counts. Provide a non-empty csv string or emails array. Capped at 10,000 distinct addresses per call. Requires an owner / admin role.
string
Raw CSV / newline-delimited text parsed leniently for addresses.
string[]
Explicit list of addresses (alternative to csv).
string (enum: manual|unsubscribe|complaint|hard_bounce)
Reason applied to every imported address.

Confirm a one-click email unsubscribe

POST /api/v1/email/unsubscribe/{token}
RFC 8058 one-click POST counterpart of the unsubscribe link. Mail clients that honour List-Unsubscribe-Post send an application/x-www-form-urlencoded body of List-Unsubscribe=One-Click to this URL to unsubscribe the recipient without a browser round-trip. The signed {token} is the only credential; the suppression effect is identical to the GET form and is idempotent.
string
required
Signed, single-use unsubscribe token minted by Orbit and embedded in the email’s List-Unsubscribe header. Opaque to callers.

Validate a recipient email address

POST /api/v1/email/validate

Bulk-validate recipient email addresses

POST /api/v1/email/validate/bulk

Update an email sender

PUT /api/v1/email/senders/{senderId}
Update the editable fields of an email sender — default from-name, from-address, reply-to, and stream assignment. The sending domain is immutable (delete and re-create to change it). Setting isDefault: true promotes this sender to the org default in the same request. Requires an owner / admin role.
string
required
Email sender id (esend_…).
string | null
Default From address — must be on the sender’s domain.
string | null
Display name shown to recipients.
string | null
Reply-To routing address.
boolean
Set true to promote this sender to the org default.
string | null
Reassign to a sending stream (estream_…), or null to clear the assignment.

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

Delete an email sender

DELETE /api/v1/email/senders/{senderId}
Remove an email sender from the tenant. Deleting the current default promotes the most recently created remaining sender to default; deleting the last sender clears the tenant’s verified-sender list. Requires an owner / admin role.
string
required
Email sender id (esend_…).

Remove an email suppression

DELETE /api/v1/email/suppressions/{id}
Remove an address from the tenant’s suppression list by suppression id, re-enabling sends to that address. Returns 404 when no suppression with that id exists for the tenant. Requires an owner / admin role.
string
required
Suppression id (suppression_…).