Skip to content
Developers

Three ways in. SMTP, JSON, or an agent.

Point an existing platform at the relay, script the whole thing over the REST API, or hand the chores to an AI agent through MCP. The REST API uses HTTP Basic auth; MCP uses a separate scoped Bearer token.

SMTP relay
No code
Hostsend.smtp.software
Port465 / SSL
Usernameper sending domain
Passwordon the domain page
REST API
JSON
Base URLsmtp.software/api
AuthBasic · user “api”
Passwordaccount API password
Bodyapplication/json
MCP for AI agents
New
Serversmtp.software/mcp
TransportStreamable HTTP
Authseparate scoped Bearer token
Client supportBearer auth · JSON POST
# 1. Register the domain (201 new · 200 already yours)
curl --user "api:$SMTP_API_PASSWORD" \
--header 'Content-Type: application/json' \
--data '{"domain":"shop.example"}' \
https://smtp.software/api/domains
# 2. Which records still need publishing?
curl --user "api:$SMTP_API_PASSWORD" \
https://smtp.software/api/domains/shop.example \
| jq '.response.result.dns_records[] | select(.valid == false)'
# 3. Verify now instead of waiting for the 5-minute cycle
curl --request POST --user "api:$SMTP_API_PASSWORD" \
https://smtp.software/api/domains/shop.example/verify
Transactional API v2

Send a published template with your application’s data.

Enable Transactional Studio for the workspace, publish a template and language version, then call POST /api/v2/messages with a scoped Bearer token and an Idempotency-Key. Previewing sends nothing; HTTP 202 means queued. Delivery events report later progress.

The v2 API has its own settings, brands, templates, messages, recipient blocks and optional signed webhooks. Existing SMTP and legacy REST contracts remain available.

Read the Transactional API reference →
Endpoints

Domain onboarding and sending, over REST.

GET
/connect
Check your credentials.
GET
/domains
All domains on the account with stored validation state. No DNS lookup.
POST
/domains
Register {"domain":"shop.example"}. Repeatable: 201 when new, 200 when it already exists. Returns a fresh DNS validation.
GET
/domains/{domain}
Stored status plus the exact records to publish, each with required and valid.
POST
/domains/{domain}/verify
Synchronous DNS check, stored and returned. Use after a customer changes DNS.
POST
/{domain}/message
Send: from, to, cc, bcc, subject, text, html, template, attachments, tags.
GET
/{domain}/logs
Delivery logs, filtered by refid, recipient and limit.
DNS records

What “verified” means.

SPFTXT @ → v=spf1 include:spf.smtp.software ~allrequired
DKIMCNAME ss._domainkey → dkim.smtp.softwarerequired
DMARCTXT _dmarc → v=DMARC1; p=…required
TrackingCNAME track → track.smtp.softwarerequired
MXMX @ → mxa.smtp.software / mxb.smtp.softwareoptional
status is verified once SPF, DKIM, DMARC and tracking all validate. sending_ready only needs SPF. Incomplete domains are rechecked every 5 minutes, verified ones every 24 hours.
Status codes
200
OK, or domain already yours
201
Domain registered
400
Malformed JSON body
401
Bad or missing credentials
404
Domain not on this account
409
Domain owned by another account
422
Not a valid public domain
500
Registration or storage failed
MCP for AI agents

Let the agent onboard the shop.

Our MCP server provides scoped tools for domains, DNS, delivery metadata and queuing individual emails. Use a client that supports custom Bearer authentication and Streamable HTTP JSON responses to register a domain, inspect missing DNS records, re-verify after publication and read delivery logs.

You
Onboard mail.bloomstudio.example for the new WooCommerce client and tell me what DNS they still need.
AI
→ domain_register · domain_get
Domain registered. SPF and tracking already validate. Still missing: DKIM — CNAME ss._domainkey → dkim.smtp.software — and a DMARC TXT at _dmarc. Want me to re-verify once they’ve published?