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:
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 withrate_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.
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.