Error Catalog
Every machine-readable V1 API error code, its HTTP status, and category — generated from the @emofy/types error-code SSOT.
Error Catalog
Every V1 API error response carries a stable machine-readable code in error.code. Branch on the code, never on the human message. All 58 codes below are generated from the @emofy/types error-code SSOT (apiErrorCodeSchema) — this page cannot drift from the contract.
Codes are clamped to this catalog by the V1 exception filter; an uncatalogued code falls back to its status-map generic. See response envelope & errors for the full error shape.
Generic codes
Status-map generics — emitted from the HTTP status when a handler does not supply a domain error: code.
| Code | HTTP status | Description |
|---|---|---|
bad_request | 400 | Bad request |
unauthorized | 401 | Unauthorized |
forbidden | 403 | Forbidden |
not_found | 404 | Not found |
conflict | 409 | Conflict |
validation_error | 422 | Validation error |
rate_limit_exceeded | 429 | Rate limit exceeded |
internal_error | 500 | Internal error |
unknown_error | 500 | Unknown error |
Domain codes
Raised by specific handlers (feed moderation, reports, the EMA proxy boundary). The HTTP status is whatever HttpException carries the code, so it varies by endpoint.
| Code | HTTP status | Description |
|---|---|---|
report_not_found | varies | Report not found |
report_not_pending | varies | Report not pending |
post_already_deleted | varies | Post already deleted |
self_report_not_allowed | varies | Self report not allowed |
invalid_user_report_body | varies | Invalid user report body |
invalid_moderation_query | varies | Invalid moderation query |
invalid_review_action_body | varies | Invalid review action body |
organization_context_required | varies | Organization context required |
membership_inactive | varies | Membership inactive |
missing_initdata | varies | Missing initdata |
initdata_invalid | varies | Initdata invalid |
initdata_expired | varies | Initdata expired |
credential_not_found | varies | Credential not found |
scope_insufficient | varies | Scope insufficient |
scope_unmapped | varies | Scope unmapped |
Family codes
Family / child-passport domain codes. All are raised via FamilyErrorException (a 400 Bad Request).
| Code | HTTP status | Description |
|---|---|---|
INVITATION_EXPIRED | 400 | Invitation expired |
INVITATION_NOT_PENDING | 400 | Invitation not pending |
CAPABILITY_DENIED | 400 | Capability denied |
CHILD_NOT_FOUND | 400 | Child not found |
CHILD_SOFT_DELETED | 400 | Child soft deleted |
SHARE_LIMIT_REACHED | 400 | Share limit reached |
MEMBER_LIMIT_REACHED | 400 | Member limit reached |
INVALID_ROLE | 400 | Invalid role |
DUPLICATE_INVITATION | 400 | Duplicate invitation |
CONSENT_REQUIRED | 400 | Consent required |
PIN_TOO_RECENT | 400 | Pin too recent |
LOOKUP_NOT_FOUND | 400 | Lookup not found |
INVALID_ACCESS_LEVEL | 400 | Invalid access level |
INVALID_HEALTH_PAYLOAD | 400 | Invalid health payload |
RESEND_RATE_LIMIT | 400 | Resend rate limit |
PIN_INVALID | 400 | Pin invalid |
PIN_LOCKED | 400 | Pin locked |
PIN_ROTATE_TOO_RECENT | 400 | Pin rotate too recent |
PIN_NOT_SET | 400 | Pin not set |
SCHEDULE_INVALID | 400 | Schedule invalid |
OUT_OF_SCHEDULE | 400 | Out of schedule |
DROPOFF_UNAUTHORIZED | 400 | Dropoff unauthorized |
CROSS_ORG_DENIED | 400 | Cross org denied |
GRANT_EXPIRED | 400 | Grant expired |
GRANT_CONSUMED | 400 | Grant consumed |
GRANT_REVOKED | 400 | Grant revoked |
OTP_INVALID | 400 | Otp invalid |
OTP_DELIVERY_FAILED | 400 | Otp delivery failed |
DUPLICATE_PICKUP_EVENT | 400 | Duplicate pickup event |
LAST_GUARDIAN_PROTECTED | 400 | Last guardian protected |
Reserved codes
Minted in the SSOT so dependent work does not re-introduce a local string set; not yet emitted by live traffic (no stable status).
| Code | HTTP status | Description |
|---|---|---|
invalid_cursor | — | Invalid cursor |
idempotency_conflict | — | Idempotency conflict |
idempotency_key_reused | — | Idempotency key reused |
org_quota_exceeded | — | Org quota exceeded |