Signup
POST /signup is the only public mutating endpoint — it requires no authentication, but is rate-limited to 5 requests per hour per IP.
Create an account
Section titled “Create an account”POST /signupContent-Type: application/json
{ "email": "you@example.com", "name": "Your Name" }name is optional. The email must be a valid format and unique across all accounts.
Response
Section titled “Response”HTTP/1.1 201 CreatedContent-Type: application/json
{ "account_id": "...", "plan_slug": "free", "api_key": { "id": "...", "prefix": "ak_live_abcd", "plaintext": "ak_live_abcd...XYZ" }}The plaintext API key is only returned here. Save it. The account is placed on the free plan (100 sends/month) and given a “Signup default” API key with client_kind: "direct".
If STRIPE_SECRET_KEY is configured server-side, a Stripe customer is created in the same transaction and account.stripe_customer_id is populated, so the account is ready for POST /billing/checkout immediately.
Errors
Section titled “Errors”| Status | Code | When |
|---|---|---|
| 422 | validation_failed | Missing/invalid email, duplicate email, or other model validation failure. |
| 429 | rate_limited | More than 5 signups from this IP in the last hour. |