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.
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.
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.
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.
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.
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.
| 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.
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.
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 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=…" }
]
} 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.
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.
Delete the field-renaming and DIY DKIM step. Read the JSON directly: event.from.address, event.subject, event.text, and gate on event.auth.
Check x-mailkite-signature with verifyWebhook, then reply through the same send API — inReplyTo threads it, SPF/DKIM aligned to your domain.
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.
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.
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.
The Mailjet alternative for AI agents →
The long-form take on our blog — receipts, runnable code, and where we won't overclaim.
Point a domain, drop in a webhook URL, receive your first email. Unlimited domains, no credit card.