MJ vs MailKite logo
Alternative to Mailjet

Inbound your agent can trust — a parsed event with a verdict, not a parseroute to assemble.

Mailjet is a capable EU-based ESP whose Parse API does receive inbound, but you provision a parseroute by API, map its own field names, and verify DKIM yourself because the payload carries no normalized trust verdict. MailKite gives an agent a real inbox: one signed JSON event with an spf/dkim/dmarc block already computed, plus a place to run the receive→reply loop.

A fair take on Mailjet

Mailjet is a real ESP with a real inbound story: EU data residency by default (Frankfurt and Belgium), ISO 27001, an early GDPR-certified posture, a free tier that survived, and a Parse API that genuinely decodes headers, text, HTML, and attachments for you. It can receive — the gap is what it hands the agent.

How it works

Mailjet vs MailKite, in one diagram

MJ Mailjet Parse API sender parse-in1 addrcreated via API your webhookMailjet field names map + verify DKIMyour job agent SpamAssassinScore is in the payload; a normalized SPF/DKIM/DMARC verdict is not. You read DKIM-Signature out of Headers and verify it yourself. MailKite sender MX edgeparse + auth JSON webhooksigned, with auth block agent the agent gets fields plus an auth verdict; the loop below is the whole integration
Why teams switch

What MailKite does differently

A trust verdict, not a spam score

Mailjet's payload gives you SpamAssassinScore and a raw DKIM-Signature buried in Headers; verifying sender authenticity is your code. MailKite ships auth: { spf, dkim, dmarc, spam } on every inbound event, so an agent can gate on whether the sender is really the sender.

No parseroute to provision, no fields to map

On Mailjet you POST /v3/REST/parseroute to create an inbound address, then rename Text-part, Html-part, and From into your own shape. MailKite: point a domain, pick an address, set a webhook — the edge parses to a stable email.received shape.

Run the loop, or bring your own

Mailjet is a send-first ESP with no built-in inbound runtime — the model loop, reply threading, and guardrails are yours to host. MailKite gives you a bring-your-own webhook loop or a route with action: 'agent' that runs receive→reply on a durable, capped, transcript-recorded queue.

Unlimited domains, one combined quota

Receive and send from one account and one quota, with every domain and alias free on every plan. Replies thread with inReplyTo and go out SPF/DKIM-aligned to your own domain from the same API.

Side by side

MailKite vs Mailjet

MailKite Mailjet
Inbound → JSON webhook Yes — stable email.received shape Yes — Parse API, its own field names
Give an agent an inbox Point a domain, pick an address, set a webhook Create a parseroute via API, get a parse-in1 address
Auth verdict in payload auth: { spf, dkim, dmarc, spam } SpamAssassin score only; no SPF/DKIM/DMARC verdict
Trust decision Read the auth block Verify DKIM/SPF yourself from raw Headers
Reply threading inReplyTo + reply from event.to[0] Build In-Reply-To and reply-from logic yourself
Built-in agent runtime Route with action: 'agent', or bring your own None — host the loop yourself
EU data residency SPF/DKIM/DMARC aligned on send EU by default (Frankfurt, Belgium), ISO 27001
Per-domain fees None — unlimited domains Plan/volume tiered

Competitor capabilities change — we re-audit these tables regularly. Spot something out of date? Tell us and we'll fix it.

Show the payload

What actually hits your webhook

Mailjet hands you its own hyphenated field names and a raw DKIM-Signature to verify; MailKite hands you a stable shape with the SPF/DKIM/DMARC verdict already computed.

Mailjet Parse API (its own field names, no auth verdict)
http
POST /your-webhook
Content-Type: application/json

{
"Sender": "ada@example.com",
"Recipient": "agent@parse-in1.mailjet.com",
"From": "Ada <ada@example.com>",
"Subject": "Re: invoice #1042",
"Text-part": "Looks good — approved!",
"Html-part": "<p>Looks good — approved!</p>",
"SpamAssassinScore": "0.2",
"Headers": { "DKIM-Signature": "v=1; a=rsa-sha256; …" },
"Parts": [ … ],
"Attachment1": "…base64…"
}
// map Text-part/From to your shape, then
// verify DKIM from the raw Headers yourself
MailKite
json
POST /your-webhook   Content-Type: application/json
x-mailkite-signature: t=…,v1=… (HMAC-SHA256 — verify locally)

{
"id": "msg_2Hk9…",
"type": "email.received",
"from": { "address": "ada@example.com" },
"to": [{ "address": "support@myapp.ai" }],
"subject": "Re: invoice #1042",
"text": "Looks good — approved!",
"html": "<p>Looks good — approved!</p>",
"threadId": "<a1b2c3@mail.example.com>",
"auth": { "spf": "pass", "dkim": "pass", "dmarc": "pass", "spam": "ham" },
"attachments": [
{ "filename": "po.pdf", "contentType": "application/pdf",
"size": 18213, "url": "https://api.mailkite.dev/att/2Hk9…/0?sig=…" }
]
}
The price advantage

Unlimited domains. One quota. Free to start.

MailKite

  • Free: 3,000 emails/mo (in + out)
  • Unlimited domains on every plan
  • Pro $20/mo → 50,000, graceful overage

Mailjet

  • Free: 6,000/mo, capped at 200/day
  • Send-first ESP; inbound Parse API rides along
  • Marketing + transactional, volume-tiered plans

Mailjet's free tier is larger by count but daily-capped and send-first; MailKite counts inbound and outbound against one quota and never bills per domain.

See full MailKite pricing →

Switch in an afternoon

Moving from Mailjet

  1. 1

    Point a domain at MailKite

    Add MX to receive and SPF + DKIM to send (or start on a managed subdomain). No parseroute to provision by API — pick an address like agent@yourco.dev.

  2. 2

    Replace the map + verify handler

    Delete the field-renaming and DIY DKIM step. Read the JSON directly: event.from.address, event.subject, event.text, and gate on event.auth.

  3. 3

    Verify the signature and reply

    Check x-mailkite-signature with verifyWebhook, then reply through the same send API — inReplyTo threads it, SPF/DKIM aligned to your domain.

Questions

Can Mailjet receive inbound email for an agent?

Yes. Mailjet's Parse API receives inbound — you create a parseroute (POST /v3/REST/parseroute) pointing an address to your webhook, and Mailjet POSTs each email as JSON with fields like From, Subject, Text-part, and SpamAssassinScore. The agent gap is that it uses Mailjet's field naming and includes no normalized SPF/DKIM/DMARC verdict, so trust decisions are your code.

Does the Mailjet Parse API include SPF, DKIM, or DMARC results?

Not as a normalized verdict. The payload includes a SpamAssassin score, and the raw DKIM-Signature lives inside the Headers object, but there's no spf/dkim/dmarc field. If your agent's action depends on sender authenticity, you verify it yourself. MailKite ships that verdict in an auth block on every inbound event.

Is Mailjet a better choice if I need EU data residency?

It's one of Mailjet's genuine strengths — founded in Paris, EU-hosted (Frankfurt and Belgium), ISO 27001, an early GDPR-certified ESP, now under Sinch. If EU residency is a hard requirement and you're comfortable assembling the inbound layer yourself, that's a real reason to pick it.

Go deeper

The Mailjet alternative for AI agents →

The long-form take on our blog — receipts, runnable code, and where we won't overclaim.

Try MailKite free — keep Mailjet running until you're ready.

Point a domain, drop in a webhook URL, receive your first email. Unlimited domains, no credit card.