- Real money. 17 operations can charge the team’s wallet or saved card, and their descriptions say so. They are
destructive, socautiousmode asks first. - Nothing but a read is retried. InboxKit has no idempotency keys, and a purchase that timed out may still have gone through. The error says so: check
domains.listormailboxes.listbefore repeating one. An error handler in your app that asks for a retry can’t repeat it either: a retry of a call whose outcome is unclear gets the same error back with nothing sent. A new call goes through, so check first. - Unexpected answers. If InboxKit’s answer doesn’t fit the documented shape, you get
{ parse_warning, raw }with the answer inraw. The call still happened, so don’t repeat it. - Workspaces. Most operations act on one workspace. Pass
workspaceIdon the call or setinboxkit({ workspaceId }). With neither, a team with one workspace uses that one (found with one extra read per call), and a team with several gets an error naming them, even on a read. - Live sending infrastructure. Changing a password or username, deleting or repairing DNS records, or running a resetup can stop a working mailbox. These are
destructivetoo. Adding or editing a DNS record iswrite, as on our other DNS plugins, so check an MX change before you make it. - Fields left out on purpose.
workspaces.createtakes no webhook URL,mailboxes.updateno username andsequencers.addandsequencers.updateno auto-export. InboxKit’s API has them, but each can send mailbox data elsewhere or change a live address. Useworkspaces.updateWebhookandmailboxes.changeUsername, which need approval incautiousmode, and the dashboard for auto-export. - Credentials.
mailboxes.showCredentialsandmailboxes.generateTotpreturn plaintext to whoever calls them. Corsair doesn’t log or store them, but your agent’s transcript may. - Not covered: InboxKit’s unified inbox (reading and sending email, drafts, labels) and the team-level webhook URL. They are in InboxKit’s MCP server and dashboard but not its documented REST API. The dashboard’s Real-time email events switch isn’t handled yet either, because nothing documents those deliveries. Leave it off: each one would get a 404, and InboxKit pauses a URL after five failures in a row.
- 181 typed API operations
- 3 synced entities (
domains,mailboxes,workspaces) for fast.search()/.list() - 4 incoming webhook event types
Setup
1
Install
2
Add the plugin
corsair.ts
multiTenancy: true, scope calls with corsair.withTenant(id). See Quick start for KEK + Hub keys, and Multi-tenancy for account isolation.3
Choose authentication
- API Key (Recommended)
No setup required yet. When you make your first request as a tenant, Corsair prompts for the API key.More: API Key
4
Connect a tenant
Mint a connect link and send the tenant to it. Hub hosts the page and delivers the result to your app — see Connect / OAuth.
Example API calls
List the workspace’s domainsQuery synced data
Mailboxes and domains seen through list operations and webhooks are kept locally, without credentials.domains, mailboxes, workspaces. See Database for filters and operators.
Webhooks
Set the URL under Settings → API → Webhooks in InboxKit, and turn off Include mailbox credentials there unless you need them. With it on, which is the default, InboxKit sends the mailbox’s decrypted passwords in this delivery. The plugin removes them before the handler returns, soafter hooks, local data and result.body never see them. A before hook runs first and does see them, so don’t log the request there.
What’s next
API reference
Every
inboxkit.api.* operation with input and output types.Database
Synced entities, search filters, and operators.
Webhooks
Event paths, payloads, and
webhookHooks examples.Connect / OAuth
createLink, Hub delivery, and tenant connect flows.
Use with agents
Expose this plugin’s operations as MCP tools.