EmofyEmofy Developers
Errors

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.

CodeHTTP statusDescription
bad_request400Bad request
unauthorized401Unauthorized
forbidden403Forbidden
not_found404Not found
conflict409Conflict
validation_error422Validation error
rate_limit_exceeded429Rate limit exceeded
internal_error500Internal error
unknown_error500Unknown 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.

CodeHTTP statusDescription
report_not_foundvariesReport not found
report_not_pendingvariesReport not pending
post_already_deletedvariesPost already deleted
self_report_not_allowedvariesSelf report not allowed
invalid_user_report_bodyvariesInvalid user report body
invalid_moderation_queryvariesInvalid moderation query
invalid_review_action_bodyvariesInvalid review action body
organization_context_requiredvariesOrganization context required
membership_inactivevariesMembership inactive
missing_initdatavariesMissing initdata
initdata_invalidvariesInitdata invalid
initdata_expiredvariesInitdata expired
credential_not_foundvariesCredential not found
scope_insufficientvariesScope insufficient
scope_unmappedvariesScope unmapped

Family codes

Family / child-passport domain codes. All are raised via FamilyErrorException (a 400 Bad Request).

CodeHTTP statusDescription
INVITATION_EXPIRED400Invitation expired
INVITATION_NOT_PENDING400Invitation not pending
CAPABILITY_DENIED400Capability denied
CHILD_NOT_FOUND400Child not found
CHILD_SOFT_DELETED400Child soft deleted
SHARE_LIMIT_REACHED400Share limit reached
MEMBER_LIMIT_REACHED400Member limit reached
INVALID_ROLE400Invalid role
DUPLICATE_INVITATION400Duplicate invitation
CONSENT_REQUIRED400Consent required
PIN_TOO_RECENT400Pin too recent
LOOKUP_NOT_FOUND400Lookup not found
INVALID_ACCESS_LEVEL400Invalid access level
INVALID_HEALTH_PAYLOAD400Invalid health payload
RESEND_RATE_LIMIT400Resend rate limit
PIN_INVALID400Pin invalid
PIN_LOCKED400Pin locked
PIN_ROTATE_TOO_RECENT400Pin rotate too recent
PIN_NOT_SET400Pin not set
SCHEDULE_INVALID400Schedule invalid
OUT_OF_SCHEDULE400Out of schedule
DROPOFF_UNAUTHORIZED400Dropoff unauthorized
CROSS_ORG_DENIED400Cross org denied
GRANT_EXPIRED400Grant expired
GRANT_CONSUMED400Grant consumed
GRANT_REVOKED400Grant revoked
OTP_INVALID400Otp invalid
OTP_DELIVERY_FAILED400Otp delivery failed
DUPLICATE_PICKUP_EVENT400Duplicate pickup event
LAST_GUARDIAN_PROTECTED400Last 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).

CodeHTTP statusDescription
invalid_cursorInvalid cursor
idempotency_conflictIdempotency conflict
idempotency_key_reusedIdempotency key reused
org_quota_exceededOrg quota exceeded

On this page