VALIDATION_ERROR | 400 | The request body or parameters failed schema validation. | Fix the request shape; details carries field-level errors. |
BAD_REQUEST | 400 | The request is well-formed but invalid in the current state (e.g. re-enabling an already-active webhook, replaying a delivery that isn’t dead-lettered). | Read detail — it names the state that blocked the operation. |
INVALID_IDEMPOTENCY_KEY | 400 | Idempotency-Key isn’t 1–255 printable ASCII characters. | Send a UUID (or any conforming string). |
UNAUTHORIZED | 401 | Missing or invalid credentials. | Send Authorization: Bearer <key> with a live ak_/mk_ key or OAuth token. |
PAYMENT_REQUIRED | 402 | A plan limit was reached (agents, identities, monthly volume). | Upgrade the tier or wait for the billing period; see Pricing & Limits. |
VOICE_MONTHLY_CAP_EXCEEDED | 402 | The tier’s monthly outbound-call cap is used up. | Upgrade or wait until the next billing period; details carries current/cap. |
FORBIDDEN | 403 | Authenticated, but not allowed: acting on another agent’s resources, or an agent capability policy refused the action. | Use the right key for the agent, or have an org admin adjust the agent’s policy. |
MASTER_KEY_REQUIRED | 403 | The operation needs org-admin authority (agent creation, billing, policy writes). | Use an mk_ key, or request the admin:full scope in the OAuth flow. |
NOT_FOUND | 404 | The resource doesn’t exist — or belongs to another organization (deliberately indistinguishable). | Check the id and which org your key belongs to. |
CONFLICT | 409 | State conflict, e.g. a duplicate slug or an already-existing resource. | Change the conflicting value or reuse the existing resource. |
IDEMPOTENCY_BODY_MISMATCH | 409 | The same Idempotency-Key was reused with a different body or path. | Use a fresh key per distinct request; reuse keys only for identical retries. |
IDENTITY_NOT_VERIFIED | 409 | The sending email identity isn’t verified in the send region. | Follow details.remediation — verify the identity or attach one on a verified domain (Custom Domains). |
DOMAIN_NOT_VERIFIED | 409 | Provision-time gate: the email domain isn’t added/verified for this workspace. | Add and verify the domain first — see Custom Domains. |
RECIPIENT_NOT_VERIFIED | 409 | The upstream provider (SES sandbox) only delivers to verified recipients. | Verify the recipient at AWS or request SES production access; details.remediation explains both. |
RECIPIENT_SUPPRESSED | 409 | The recipient unsubscribed, hard-bounced, or complained — Anima refuses to send to them. | Remove the address from the recipient list; suppressions are inspectable per workspace. |
RATE_LIMITED, RATE_LIMIT | 429 | Per-minute/per-hour quota exceeded for the channel. | Honor Retry-After and the X-RateLimit-* headers; back off and retry. |
RATE_LIMIT_PER_SECOND | 429 | The per-org per-second soft cap was hit. | Smooth the burst; caps scale with tier. |
VOICE_RATE_LIMIT_EXCEEDED | 429 | Outbound dialing exceeded the per-second call cap. | Slow the dialing loop; details carries current/cap. |
TCPA_GATE_BLOCKED | 451 | Outbound calling is blocked until the org completes consent attestation (TCPA/DNC), or this call failed the gate. | Complete the consent attestation in the console; details.missingFields lists what’s missing. |