Known gaps
Two current limitations will change how you design against this. Both are being worked on; neither is hidden behind a support ticket.Cold outbound is unreliable
A message to someone who has never corresponded with the inbox before may not arrive, and you may not be told. The sending domain currently publishes a soft-failSPF record and no DKIM signature. Strict receivers — Gmail among them — treat unauthenticated mail from an unfamiliar sender as spam, and often discard it silently rather than bouncing it. The send will report success, and the mail simply will not appear.
Replies into an existing conversation are unaffected. An established thread carries the relationship signals that get mail delivered, and those land in the inbox normally.
Attachment bodies are not stored
Attachment metadata is captured — filename, content type, size — and appears on the message. The bytes are not retained on the current deployment, so fetching an attachment returns nothing. Everything else about a message carrying an attachment works normally: it is parsed, threaded, stored, and your agent can see that a file was attached and what it was called. It just cannot read the contents. Outbound attachments are unaffected; you can send them.Size limits
Rate limits
300 requests per 60 seconds, per API key. Over the limit returns429 rate_limited with Retry-After: 60.
Giving each agent its own scoped key isolates them, so one busy agent cannot throttle the rest.
Webhook delivery
Total window is roughly 15 hours before a delivery is marked
failed.
Event types that never fire
message.delivered, message.bounced and message.complained are accepted on subscriptions but do not fire on this deployment — they need asynchronous feedback from the mail transport that is not available today. They are accepted so client code stays portable across mailbox APIs.
Do not build logic that waits for them. In particular, absence of message.bounced is not evidence of delivery.

