Skip to main content
POST /v1/invoices/{id}/send — requires invoices:write. Takes no request body. The recipient is always the invoice’s own stored customerEmail and cannot be overridden. That is what stops the endpoint from being an open relay. Creating an invoice never emails anyone; this call is the only thing that does.
200 OK

The three limits

Sending is capped at three independent levels. Any one of them can refuse a call. These are server-configurable, so treat the numbers as current defaults rather than a contract. The shapes — a small per-invoice allowance, a cooldown, and a store-level daily budget — are the part to design against.
The email object on an invoice reflects per-invoice state only. It cannot tell you that the store’s daily budget or the platform ceiling is what will refuse the next send, so canSend: true is a necessary condition, not a guarantee.

The rate-limit envelope

This is the one endpoint whose error body differs from the rest of the API. Every failure the mailer produces carries three fields:
  • code is one of not_found, not_sendable, rate_limited, send_failed.
  • retryAfterSeconds is always present, and null when the block is not a cooldown you can wait out (an exhausted per-invoice allowance, for example).
  • When retryAfterSeconds is set, the same value is mirrored in a Retry-After header.
A request rejected before it reaches the mailer answers with the plain { "error": … } shape instead, with no code and no retryAfterSeconds: a malformed {id} is 400 { "error": "Invalid request data" }, and a well-formed id that does not decode is 404 { "error": "Invoice not found" }. Read code defensively.

Read the allowance instead of probing

Every invoice payload — from create, retrieve and list — carries an email object, so you never need a 429 to discover you are blocked. Check email.canSend before calling the send endpoint rather than treating a 429 as your signal. It costs nothing — the field is on the invoice you already have.
A merchant can send the same email from the dashboard, against the same allowance. See Invoices from the dashboard for what the customer receives.