$ transactional email gateway
Transactional email that arrives.
Send your first email in 60 seconds, over a REST API or an SMTP relay. Forward-confirmed PTR, enforced DMARC alignment and continuous blocklist monitoring on every account — including the free one.
3,000 emails/month free · no card · send from code, cron, n8n or an agent
curl -X POST https://api.pharos.email/v1/send \
-H "Authorization: Bearer $PHAROS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "receipts@yourapp.com",
"to": "customer@example.com",
"subject": "Your receipt from Acme",
"html": "<p>Thanks for your order.</p>"
}' # change the host, change nothing else
MAIL_HOST=smtp.pharosinfra.net
MAIL_PORT=587
MAIL_ENCRYPTION=tls
MAIL_USERNAME=$PHAROS_SMTP_USER
MAIL_PASSWORD=$PHAROS_SMTP_PASS
# 250 2.0.0 Ok — signed, aligned, queued // no SDK required
await fetch("https://api.pharos.email/v1/send", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.PHAROS_API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({ from, to, subject, html })
}); # no SDK required
import os, requests
requests.post(
"https://api.pharos.email/v1/send",
headers={"Authorization": f"Bearer {os.environ['PHAROS_API_KEY']}"},
json={
"from": "receipts@yourapp.com",
"to": "customer@example.com",
"subject": "Your receipt from Acme",
"html": "<p>Thanks for your order.</p>",
},
) // no SDK required
$ch = curl_init("https://api.pharos.email/v1/send");
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("PHAROS_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode($message),
CURLOPT_RETURNTRANSFER => true,
]);
curl_exec($ch); {
"id": "msg_2f8Kq1Zx",
"status": "queued",
"dkim": "signed",
"dmarc": "aligned"
} What happens to a message
- 01 your app n8n · agent · cron
- 02 API or SMTP relay one queue, either way
- 03 sign & align DKIM · SPF · DMARC
- 04 Pharos email server Pharos IPs · FCrDNS
- 05 recipient inbox not the spam folder
- ↑ signed webhooks return delivered, bounced and complained events to your app
Two ways in. No rewrite.
Post JSON from new code, or point an existing mailer at the relay. Templates, webhooks and suppressions behave identically on both.
// no SDK required
await fetch("https://api.pharos.email/v1/send", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.PHAROS_API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({ from, to, subject, html })
}); # change the host, change nothing else
MAIL_HOST=smtp.pharosinfra.net
MAIL_PORT=587
MAIL_ENCRYPTION=tls
MAIL_USERNAME=$PHAROS_SMTP_USER
MAIL_PASSWORD=$PHAROS_SMTP_PASS
# 250 2.0.0 Ok — signed, aligned, queued $ who is sending in 2026
Your workflows and agents send email too.
A growing share of transactional mail is sent by something nobody is watching — an n8n workflow at 3am, an agent finishing a task, a cron job. Those senders need authentication that is already correct, because there is no human to notice when it isn't.
Already works with
- n8n
- Make
- Zapier
- Retool
- LangChain
- cron
- Host
- smtp.pharosinfra.net
- Port
- 587
- SSL/TLS
- STARTTLS
- User
- your Pharos SMTP user
- Password
- ••••••••••••
{
"name": "send_email",
"description": "Send a transactional email",
"input_schema": {
"type": "object",
"properties": {
"to": { "type": "string" },
"subject": { "type": "string" },
"html": { "type": "string" }
}
}
}
# the tool body is the same POST as the hero
POST https://api.pharos.email/v1/send -
one key per agent
Scoped API keys, revoked individually. A workflow you retire does not leave a live key behind.
-
suppression is automatic
A loop that retries a dead address stops hitting it. Bounces and complaints suppress themselves.
-
every send is in the log
Including the receiving server's response — so you can tell what your agent actually did at 3am.
Authentication checked before your first send.
Add four records. Pharos verifies every one of them, refuses to send from a domain that fails, and re-checks the whole set daily — because a DKIM key that was correct in March is not evidence about today.
- → Strict DMARC alignment, not relaxed-and-hope
- → Forward-confirmed reverse DNS on the sending host
- → Daily re-scan, with an alert when a record drifts
- TXT v=spf1 include:pharosinfra.net ~all SPF OK
- TXT ph1._domainkey v=DKIM1; k=rsa; p=MIIBIj… DKIM OK
- TXT _dmarc v=DMARC1; p=quarantine; adkim=s ALIGNED
- PTR mta1.pharosinfra.net → forward-confirmed FCrDNS
Other email APIs ship features. We ship inbox placement.
The API is the easy half. The half that decides whether your receipt shows up is underneath it, and it is the half we sell.
-
sending_ips
IPs dedicated to Pharos, never a public shared pool. Isolated IPs on request.
-
fcrdns_ptr
Forward-confirmed reverse DNS, re-scanned every day.
-
dmarc_alignment
SPF, DKIM and DMARC enforced at send time, not suggested.
-
signed_webhooks
Delivery, bounce and complaint events you can verify.
-
event_log
Every message with the receiving server's own response.
-
templates
Versioned and variable-driven, editable without a deploy.
-
suppressions
Bounces and complaints suppressed automatically, per account.
-
domain_setup
Exact records to add, verified automatically before first send.
Every account sees the whole log.
Sender domains, per-domain volume, bounce rate and the receiving server's response — on the free plan too.
| Time | Recipient | Subject | Event | SMTP response |
|---|---|---|---|---|
| 09:41:02 | customer@example.com | Your receipt from Acme | delivered | 250 2.0.0 OK |
| 09:40:58 | ops@partner.example | Password reset | delivered | 250 2.0.0 OK |
| 09:40:31 | old-address@example.net | Invoice #4471 | bounced | 550 5.1.1 unknown |
| 09:40:12 | jo@example.org | Your receipt from Acme | delivered | 250 2.0.0 OK |
Illustrative account data.
$ pick your volume
Priced on volume. Nothing else.
Every plan carries every feature. The only thing that changes is how much you send — and the more you send, the less each email costs.
Send your first email today.
Free for the first 3,000 emails a month. No card, no sales call, no minimum term.
start free