Skip to main content
Every error response — validation, auth, rate limit, not found, server — uses the same JSON shape:

type

Coarse category. One of:

code

Specific machine-readable identifier. Stable per (type, code) pair — safe to switch on:

param

If the error is about a specific field, param names it (e.g., email, custom_attributes.tier). Absent for non-field errors.

message

Human-readable string. Do not parse this — code is the stable contract.