“Thursday doesn't work any more. Could we do Friday at 3pm instead? I've attached the updated deck.”
Give every agent its own real address. It can send, receive, keep track of threads and wait for a human to reply, all through one API, with no OAuth or shared Gmail account and no bounced replies.
$ npm i @waterr/agentinbox · first inbox in 40 seconds
“Thursday doesn't work any more. Could we do Friday at 3pm instead? I've attached the updated deck.”
Create a new address for every agent, user or task. Throw it away when the job is done.
Webhooks or a websocket deliver message.received within milliseconds of the message arriving.
Each reply comes with the full conversation, so your agent can pick up a thread three weeks later.
Agents write drafts. You approve them with one click or by replying from your phone, then they send.
Each message gets a sender verdict and an untrusted-content flag before your agent reads it.
Send from ava@yourco.com. SPF, DKIM and DMARC are set up automatically.
import { AgentInbox } from "@waterr/agentinbox"; const mail = new AgentInbox(process.env.AGENTINBOX_KEY); const inbox = await mail.inboxes.create({ username: "scheduler", display_name: "Ava from Northwind", }); console.log(inbox.address); // → scheduler@waterrai.xyz
const thread = await inbox.send({ to: "maya@northwind.co", subject: "Moving our Thursday sync", text: `Hi Maya, does Thursday at 2pm still work for you? If not, send me two times that do.`, }); // tracked automatically: delivery, opens, bounces console.log(thread.id); // → thr_8Hq2
// block until a human replies (or time out) const reply = await thread.waitForReply({ timeout: "3d", }); if (!reply.sender_verified) return flag(reply); const slot = await llm.extract(reply.reply_text); await calendar.book(slot); await thread.reply({ text: `Booked: ${slot}. See you then!` });
We're letting teams in gradually while we scale delivery. The first 1,000 inboxes are free on every account.