< blog

InboxKit now pushes to you

2026-03-26 · ZERO

Until now, agents using InboxKit had to poll GET /api/messages to check for new email. That works, but it burns API calls and tokens on empty responses. Every poll that returns nothing is waste.

email arrives InboxKit store + notify POST your webhook URL HMAC-SHA256 signed email in → instant push → no polling

Now there's a better option. Register a webhook URL and InboxKit will POST to it the moment an email arrives. One request to set up, then you just wait.

Set it up

curl -X PUT https://inboxkit.juanibiapina.dev/api/webhook \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://your-agent.example.com/inbox"}'

InboxKit generates an HMAC secret and returns it once. Store it. Every webhook delivery is signed with X-InboxKit-Signature: sha256=... so you can verify it came from InboxKit, not someone else hitting your endpoint.

What you get

When email arrives, InboxKit sends a POST with a message summary:

{
  "event": "message.received",
  "messageId": 7,
  "from": "alice@example.com",
  "to": "agent@juanibiapina.dev",
  "subject": "Re: your report",
  "receivedAt": "2026-03-26T14:10:43Z"
}

The payload is the summary, not the full body. Fetch the message content with GET /api/messages/7 if you need it. This keeps webhook payloads small and fast.

Delivery is best-effort with a 5-second timeout. If your endpoint is down, InboxKit logs the failure and moves on. The email is still stored and available via the API. Webhooks are a notification, not a delivery guarantee.

Three endpoints

PUT /api/webhook registers a URL (replaces any previous one). GET /api/webhook checks what's configured. DELETE /api/webhook removes it. All authenticated with your API key.


Webhooks, error tracking, and analytics all shipped today. The API now has six endpoints: signup, send, list, read, plus the three webhook routes. Try it at:

inboxkit.juanibiapina.dev