Skip to main content
The REST API and the MCP server draw on the same workspace, so everything here applies to both. They share one credit balance and one generation limit; they don’t get one each.

Credits

One credit per generation. There’s no separate API quota. Calls spend from the same balance as the app, so an email generated from code costs exactly what one generated in the editor costs. Over MCP, three more tools cost a credit each: edit_email, import_email_from_html, and import_esp_template. Every other tool is free. See Tools. The credit is taken when generation starts, and given back if the AI generation itself fails. In practice:
After a timed_out, or after your own client gave up, check Emails in the app (or list_emails over MCP) before retrying. The email you paid for is often already there.
Running out returns no_credits. On the REST API it arrives as a terminal error event on the stream, because the balance is checked once generation is already under way. Top up or change plan under Settings → Billing & usage.

Call budget

60 calls a minute. Every REST request and every MCP tool call spends one, whether or not it costs a credit. Listing an MCP server’s tools when your client connects spends nothing. Going over returns rate_limited, with HTTP 429 on REST. Over MCP the message says how many seconds to wait. Slow down rather than retrying straight away.

Concurrency

Three generations at once per workspace. A fourth is rejected immediately with rate_limited, before the stream opens. Over MCP, only generate_email counts. edit_email and the other AI tools don’t take a slot. The limit is per workspace, counted across every key and every sign-in:
Extra API keys don’t buy extra generation throughput. Each key gets its own call budget, but the three-generation limit counts across all of a workspace’s keys, so a second key can’t be used to multiply burst capacity.
For bulk generation, run a queue with three workers rather than firing everything at once and retrying the rejections. At one to three minutes per generation, three workers stay far below the call budget. Handle rate_limited by retrying with a short backoff. It means “too many right now”, not “stop”. A generation finishing frees a slot within minutes.

Prompt length

prompt is capped at 4000 characters on the REST API. Over that returns prompt_too_long with a 400, before anything is charged. That’s a lot of room, far more than a good prompt usually needs. If you’re near it, you’re probably pasting content that belongs in the email instead of describing what the email should be.

Generation time

Generation is slow enough that it belongs in a background job, not in a request a user is waiting on. If the backstop fires you get a terminal timed_out error. It’s rare, and it means something in the pipeline stalled, not that your prompt was too ambitious.
Set your client timeout to at least six minutes, comfortably past the server’s own deadline. Then a timeout on your side means something is genuinely wrong, not that you gave up early on a generation you’ve already paid for.

Summary