AI Inbx

Email API for a new era.

Email APIs solved delivery, then developer experience. AI Inbx is built for what comes next: software that handles the conversation end to end, on its own.

Get started

What arrived, and what AI Inbx did with it

Your agentnora@northwind.ioMon 09:12

RFQ 4471 — 3mm brushed sheets

Sent by your code

One POST. We hold the conversation from here.

Dana Ruizdana@lindmetall.deMon 09:13

Automatic reply: Out of office until 8 Sep

Your agent stays asleep

out of office

We tell you which mail needs a reply. This one doesn't.

Marco Lindmarco.lind@lindmetall.deMon 11:48

Preise Blech 3mm

Same thread

smart-matched

A colleague of dana@, answering our price.

Dana Ruizdana@lindmetall.deFri 08:40

Blech 3mm — Bestätigung

Same thread

smart-matched

Back from leave. New subject, nothing quoted.

Your agentnora@northwind.ioSun 02:47

Re: Blech 3mm — Bestätigung

Held until Monday 09:00

queued

No real company sends at 02:47 on a Sunday.

5 messages · 4 subjects · 2 languages · 1 thread

threads.get("thr_8f2c")one call

One thread: an RFQ, an out-of-office, and a colleague answering from a different address — matched and categorised on the way in.

Threading

One conversation, however it comes back

You email Dana. Marco answers instead — new address, new subject, in German. Same thread.

You wrote to dana@lindmetall.de — RFQ 4471, Mon 09:12. Three replies came back:

Dana Ruiz

Mon 09:13

dana@lindmetall.de

Automatic reply: Out of office until Friday

English · In-Reply-To · the address we wrote to

The headers name our RFQ

Marco Lind

Mon 11:48

marco.lind@lindmetall.de

Preise Blech 3mm

German · no headers · new subject · new address

A colleague of dana@, answering our pricesmart-matched

Dana Ruiz

Fri 08:40

dana@lindmetall.de

Blech 3mm — Bestätigung

German · no headers · new subject · four days later

Confirms the price this thread asked forsmart-matched

thr_8f2c

One thread. One call to read it.

Reply text

Every answer, wherever they typed it

Dana answers your four questions inside the quoted text, the way people actually reply. Most email APIs hand your agent “answers below.” The four answers went with the quote.

What arrived198 tokens
Hi Nora, answers below. On Mon, 31 Aug 2026 at 09:12, Nora Berg <nora@northwind.io> wrote: > Hi Dana,>> before we raise the PO for RFQ 4471, four things:>> 1. Is 4,20 € still the price at 500 pieces?>500 is fine, 4,20 € holds to the end of Q4. > 2. Do you cut to size, or should we?>We cut. Add 0,35 € per piece. > 3. Can you deliver by the 14th?>The 14th works if the PO is in by Friday. > 4. Is pallet freight included?>Freight is 85 € on top, one pallet. > Thanks,> Nora BestDana Dana Ruiz · VertriebLind Metall GmbH · +49 231 55 40 12
Most email APIs6 tokens
Hi Nora, answers below.

Cut at the first quote marker. Cheapest of the three, and the price is every number in the mail.

AI Inbx114 tokens
Hi Nora, answers below. > 1. Is 4,20 € still the price at 500 pieces?500 is fine, 4,20 € holds to the end of Q4. > 2. Do you cut to size, or should we?We cut. Add 0,35 € per piece. > 3. Can you deliver by the 14th?The 14th works if the PO is in by Friday. > 4. Is pallet freight included?Freight is 85 € on top, one pallet.

Every answer kept, under the question it answers. The quoted conversation and the signature are gone.

The same conversation six turns in, as your agent would be handed it

tokens

Every body in full1,854

The conversation quoted again inside every reply. Dana's last message is 648 tokens carrying a 114-token answer, and the next turn is longer still.

Most email APIs, stripped257

Forty-six tokens cheaper than the row below. Dana's four answers are not in it.

AI InbxSmart stripped303

A sixth of the full bodies, and nothing dropped.

Everywhere else that is a choice between what a thread costs and what is left in it. Here it is one field on every message: stripped_text.

Categories

Skip the noise

Out-of-office replies, receipts, newsletters. Every message arrives carrying what it is, so one line of yours decides whether it is worth waking your agent for.

if (email.category !== "human") return

3 of 8 wake your agent

  • marco.lind@lindmetall.de

    your agent

    Re: RFQ 4471 — can you do 3mm?

  • dana@lindmetall.de

    out of office

    Automatic reply: Out of office until 8 Sep

  • growth@sendhive.co

    marketing

    50% off enterprise seats, this week only

  • p.raman@cadence.health

    your agent

    Quick question before we sign

  • mailer-daemon@googlemail.com

    bounce

    Delivery Status Notification (Failure)

  • receipts@stripe.com

    transactional

    Your receipt from Lind Metall #1832

  • support@vendor.io

    auto-reply

    [Ticket #58213] We received your request

  • lena@fjordlabs.no

    your agent

    Re: intro call — Thursday works

Attachments

Every document arrives as text

Marco answers with a PDF. It is Markdown before the email is, and so is the spreadsheet under it — your agent is handed what the document says, not a file and a parsing problem.

Angebot-4471.pdf

Lind Metall GmbH

Industriestraße 14

44536 Lünen

Northwind GmbH

z. Hd. Nora Berg

Angebot AN-4471

31.08.2026

PosArtikelMengePreis
1Blech 3mm5004,20 €
2Zuschnitt5000,35 €
Netto
2.275,00 €
MwSt. 19 %
432,25 €
Gesamt
2.707,25 €

Lieferzeit: 10 Werktage ab Auftrag.

Zahlung: 30 Tage netto.

Angebot-4471.pdf.md

LLM-ready
<!-- Page 1 --> Lind Metall GmbHIndustriestraße 1444536 Lünen Northwind GmbHz. Hd. Nora Berg # Angebot AN-4471 31.08.2026 | Pos | Artikel   | Menge | Preis  || --- | --------- | ----- | ------ || 1   | Blech 3mm | 500   | 4,20 € || 2   | Zuschnitt | 500   | 0,35 € | Netto 2.275,00 €MwSt. 19 % 432,25 €Gesamt 2.707,25 € Lieferzeit: 10 Werktage ab Auftrag.Zahlung: 30 Tage netto.

Sending hours

Never email at 3am

Your agent runs at all hours. A company does not, and a Sunday 02:47 timestamp is how people tell the difference.

Set the hours you actually work. Anything your code sends outside them waits, and goes out the moment the window opens — stamped like a person sent it.

Weekdays 09:00–18:00

MonTueWedThuFriSatSun
06121824
Sun 02:47heldMon 09:00
Following up on RFQ 4471

Pacing

Slow down, without stopping

Send too fast and mail providers mark your domain down for it. Write the caps you want — per sender, per company, across everything — and stack them. Every email clears all the ones that apply to it.

rate limitWarm-up
from *@northwind.io
1 per minute · sender
rate limitAccount cap
either *
4 per 3 minutes · this rule
Add rulerate limit · time lock

nora@northwind.io

jonas@northwind.io

2 waiting
now4 minutes ago
Whole account3 / 4 in the last 3 minutes

Both rules live. Warm-up counts Nora and Jonas separately; together they never cross the account cap.

Suppressions

Unsubscribe, handled

The link and the one-click header go on every send. And when someone just writes “please stop emailing me”, we read that too.

Six ways off your list

  • Unsubscribe link
  • One-click header
  • A reply saying stop
  • Hard bounce
  • Complaint
  • API

Sent

Following up on RFQ 4471

Nora · Northwind

Unsubscribe·List-Unsubscribe header, one click

Reply

IK

Iris Kaplan

iris@overtone.dev

“Please stop emailing me.”

Detected

UnsubscribedFrom the words. She never clicked.

Since then

Q4 follow-up: any movement?

Suppressed

Never reached her. Nobody had to remember.

Mailboxes

Gmail and Outlook, same everything

Connect Gmail and Outlook accounts and they are just more addresses. Same send call, same threads, categories, hours, pacing and webhooks as your domains — nothing in your code knows the difference.

  • nora@gmail.comconnected
  • tom@harbourly.comconnected
  • lena@gmail.comneeds re-auth
await aiinbx.emails.send({
  from: "nora@gmail.com",
  to: "dana@lindmetall.de",
  text: draft,
})

Spaces

One space per customer

Everything above, handed through. Each customer gets a space: their domain or connected inbox, every thread that went through it, and every event stamped with it. Rules live in a space too, so a customer can set their own hours and caps from inside your product — and only their own mail waits for them.

Your workspace
rate limitAccount cap
2,000 per hour · this rule
Harbourlycus_1f4a
  • harbourly.com
  • tom@harbourly.com
rate limitWarm-up
1 per 2 minutes · sender
Rheinbaucus_2c74
  • rheinbau.de
  • jana@rheinbau.de
time lockOffice hours
Mon–Fri 09:00–18:00 · Berlin

Harbourly is sending; Rheinbau’s mail waits for Monday morning. Neither ever sees a thread of the other’s. The account cap is yours, and counts both.

Developers

Two calls and you’re live

One to send. One webhook to hear back.

const email = await aiinbx.emails.send({  from: "nora@northwind.io",  to: "dana@lindmetall.de",  subject: "RFQ 4471 — 3mm brushed sheets",  text: draft,  suppression_key: "q4-outbound",}) // Sunday, 02:47. A pacing rule holds it until Monday morning.email.status                    // "queued"email.pacing.estimated_send_at  // "2026-08-31T07:00:00Z"email.pacing.held_by            // { kind: "hours", rule_id: "pace_…" }

Sent on a Sunday night. The response says which rule held it, and until when.

Platform

Everything else, handled

The parts every email API needs, done properly so you never think about them.

Domains
Add a domain and we tell you exactly which DNS record is wrong.
Regions
EU or US, chosen per domain and per mailbox. Mail is processed and stored there.
Webhooks
Signed, retried, and replayable for when your server was down.
Sending
Attachments, cc, bcc, and retries that never double-send.
Scheduled send
Pass a timestamp and the email goes out exactly then. Move or cancel it until it does.
Search
Find a thread by what it was about, not the exact words.
Metrics
Spot bounces and complaints before a provider throttles you.
Tracking
Opens and link clicks, in the metrics and on your webhook.
Wildcard domains
Connect *.domain.com once, then create as many subdomains as you want without a single new DNS record — one for every customer to send from.

Give your product an inbox. The hard parts are already handled.

Get started