# Changelog

Version history and recent changes to Robotomail.

## April 9, 2026

### Inbound attachments

- Inbound message attachments are now extracted automatically and uploaded to R2. Each attachment is linked to the inbound `Message` row and surfaced via the REST API and the webhook/SSE event payloads.
- REST API: `GET /v1/mailboxes/:id/messages/:msgId` returns inbound messages with new fields `hasAttachments`, `attachmentsDropped`, `attachmentsDroppedReason`, and an `attachments[]` array (call `GET /v1/attachments/:id` per attachment to get a presigned download URL). New `contentId` field on each attachment for inline image rewriting.
- `message.received` webhook and SSE payloads now include the `attachments` array with a fresh presigned `download_url` per attachment, materialized at delivery time. Inline image parts include `content_id` matching the original Content-ID header.
- Limits: **25 MB** per attachment, **20 attachments** per inbound message. Over-cap parts are dropped; the message body is still ingested with `attachments_dropped: true` and `attachments_dropped_reason`: `"size"`, `"count"`, or `"both"`.
- See [Inbound attachments](https://robotomail.com/docs/api/messages#inbound-attachments) for the full schema, the inline-image rewrite examples, and the storage quota semantics.

### Webhook delivery is at-least-once (action required)

- Every webhook POST now includes a new `X-Robotomail-Delivery-Id` header containing a stable UUID for that delivery. The same delivery ID is sent on every retry; distinct deliveries always have distinct IDs.
- **Your endpoint MUST dedupe on this header.** Webhook delivery is at-least-once — if a network blip happens between us receiving HTTP 200 and recording success, we will retry. The dedupe row and your business logic must commit atomically (in a single DB transaction) to avoid silently losing events on handler failures.
- See [Webhook delivery is at-least-once](https://robotomail.com/docs/api/webhooks#at-least-once) for the full code example using the verify→transactional-dedup→commit pattern.


## April 2, 2026

### Multi-tier pricing

- New 4-tier pricing: Free ($0), Developer ($19/mo), Growth ($79/mo), Scale ($199/mo)
- Free tier expanded — 3 platform mailboxes (was 1), 100 sends/day (was 50), 5,000/mo (was 1,000)
- Custom domain limits per tier — Developer: 1, Growth: 5, Scale: unlimited
- Unlimited monthly sending on Growth and Scale
- Immediate plan switching via Stripe Customer Portal with automatic proration

### CLI

- CLI v0.1.7 — `robotomail upgrade` now accepts `--plan developer|growth|scale`


## March 30, 2026

### Claude Code channel plugin

- Robotomail channel plugin for Claude Code — receive and reply to emails directly in your Claude Code session
- Connects to SSE endpoint, pushes inbound emails as notifications, Claude replies using `reply_email` and `send_email` tools
- Install with Bun, free tier compatible


## March 29, 2026

### Dashboard

- Support contact form — reach us directly from the dashboard

### Misc

- Custom 404 and 500 error pages
- 29 additional reserved slugs to prevent squatting on common terms


## March 26, 2026

### Send accounting

- Daily and monthly send quotas now count per recipient, not per message
- Recipient caps: 50 per `to` field, 50 per `cc` field


## March 24, 2026

### Abuse prevention

- Account and mailbox suspension on bounce/complaint threshold breaches (3% bounce, 0.05% complaint over 7-day window)
- Send velocity limiting — 30 messages/min per mailbox, 60/min per account
- Suspended accounts receive structured 403 responses with reason and support contact
- `GET /v1/account` now returns suspension status

### CLI

- CLI v0.1.6 — suspension and rate-limit detection with actionable error messages on all write commands


## March 22, 2026

### Content

- Blog with developer guides on agent email architecture, infrastructure, and integration
- 20 use case pages covering agent email scenarios (customer support, sales outreach, recruiting, and more)
- Comparison pages: Robotomail vs SendGrid, Mailgun, and Gmail API
- About page


## March 20, 2026

### Dashboard

- DNS records modal — view and copy DNS records for custom domains, trigger verification inline
- Relative hostnames displayed for registrar compatibility (Namecheap, Cloudflare, GoDaddy)


## March 19, 2026

### OpenClaw skill

- Published Robotomail as an OpenClaw skill on ClawHub — AI agents can now discover and use Robotomail across 30+ agent platforms (Claude Code, Cursor, Gemini CLI, and more)
- Skill includes full API reference, decision trees for common workflows, and webhook verification examples
- Install with `clawhub install robotomail`


## March 18, 2026

### Real-time event streaming (SSE)

- New `GET /v1/events` endpoint — real-time Server-Sent Events stream for receiving events without webhooks
- Supports all 5 event types: `message.received`, `message.sent`, `message.delivered`, `message.bounced`, `message.complaint`
- Automatic replay on reconnect via `Last-Event-ID` header (buffer: last 100 events, 1-hour TTL)
- Scoped API key filtering — scoped keys only receive events for their permitted mailboxes
- Connection limits: 5 concurrent per user, 4.5-minute lifetime with graceful reconnect signal

### CLI listen command

- New `robotomail listen` command — stream events in your terminal (like `stripe listen`)
- `--forward-to <url>` — forward events to a local HTTP endpoint with HMAC-SHA256 signatures
- `--json` — output NDJSON for piping to `jq` and other tools
- `--mailbox` and `--events` filters
- Auto-reconnect with exponential backoff; exits immediately on auth/validation errors

### Documentation

- New [Events (SSE) API](https://robotomail.com/docs/api/events) docs page with connection guide, payload schemas for all 5 event types, and reconnection reference
- Webhook payload schema reference added to [Webhooks API](https://robotomail.com/docs/api/webhooks) page
- [CLI docs](https://robotomail.com/docs/cli) updated with listen command


## March 13, 2026

### Email delivery

- Migrated outbound email to Resend for improved deliverability
- Delivery status tracking via webhooks (bounces, complaints, delivery confirmations)
- Total message size limit increased from 10 MB to 40 MB
- Automatic retry with backoff on rate limits
- Platform email addresses are now `slug@robotomail.co` — simpler, no DNS setup needed per account
- Default mailbox auto-created at signup
- Display name support — set via `PATCH /v1/mailboxes/:id` so emails show `"Name" <slug@robotomail.co>`
- Auto-quoting in replies — original message included as quoted block when `inReplyTo` is set

### Account management

- Added `DELETE /v1/account` endpoint for permanent account deletion
- Account deletion available in dashboard settings

### Documentation

- All docs pages available as markdown at `/docs/*.md` (e.g. `/docs/quickstart.md`)
- Content negotiation: request docs with `Accept: text/markdown` header
- Navigation links in markdown views for prev/next page browsing


## March 11, 2026

### Documentation

- Launched API documentation at [/docs](https://robotomail.com/docs) — overview, concepts, API reference, guides, and CLI

### Features

- Health endpoint (`GET /api/health`) and public [status page](https://stats.uptimerobot.com/5hwqjYveUl)
- New webhook events: `message.delivered` and `message.complaint`
- Account status endpoint (`GET /v1/account`) — check plan, limits, and verification state


## March 6, 2026

- Resend outbound relay — all outbound email now sent via Resend for reliable delivery
- Resend webhook processing for delivery confirmations, bounces, and complaints
- Custom domain registration with Resend DKIM
- Automatic suppression list management


## March 1, 2026

- Initial launch with full send/receive API
- Stalwart-based mail server for inbound and outbound
- Webhook system with signature verification
- CLI package (`@robotomail/cli`)
- Stripe billing integration
- Agent skill page for self-service onboarding


---

Previous: [CLI](https://robotomail.com/docs/cli.md)
