$ 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>"
  }'
Response 202 Accepted
{
  "id":     "msg_2f8Kq1Zx",
  "status": "queued",
  "dkim":   "signed",
  "dmarc":  "aligned"
}

What happens to a message

signed webhooks · delivered · bounced · complained 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
  1. 01 your app n8n · agent · cron
  2. 02 API or SMTP relay one queue, either way
  3. 03 sign & align DKIM · SPF · DMARC
  4. 04 Pharos email server Pharos IPs · FCrDNS
  5. 05 recipient inbox not the spam folder
  6. ↑ 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.

REST APIfor new code
// 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 })
});
SMTP relayfor what you already have
# 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
n8n · Send Email nodeno plugin to install
Host
smtp.pharosinfra.net
Port
587
SSL/TLS
STARTTLS
User
your Pharos SMTP user
Password
••••••••••••
Connection tested · signed and aligned on the way out
AI agent · one tool definitionno SDK required
{
  "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
receipts.yourapp.com VERIFIED
  • 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
last checked 4 minutes ago · next check in 24h

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.

tour the dashboard →
Sent per day last 30 days Sent 73,016 Delivered 72,884 Bounce rate 0.18%
4k 2k 0 3,260
TimeRecipientSubjectEventSMTP 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.

Emails / month 50,000
You pay $29 /month
Cost per email $0.00058 /email
Cost per email, by plan bar height = what one email costs you
Sending more than 500,000 a month? talk to us → Go over and we move you up a tier and tell you · free plan stops at 3,000 · cancel any time

full pricing →

Send your first email today.

Free for the first 3,000 emails a month. No card, no sales call, no minimum term.

start free