invalid_input | 422 | UnprocessableEntityError | NiadraAPIError | The body does not match the contract: an unknown field, a missing required field, a value out of range, a feedback without the fields its action needs, a batch over 2.5 MB or 500 items. detail lists the field paths and error types, never the values you sent. Fix the request; retrying the same body gives the same answer. |
invalid_handle | 422 | UnprocessableEntityError | NiadraAPIError | A value that is not a valid identifier of the type you declared: a phone outside E.164, an e-mail without a domain. detail names the type, never the value. Fix the value; repeating it gets the same answer. |
unsupported_type | 422 | UnprocessableEntityError | NiadraAPIError | The suppression list only takes destinations a person is reached at: phone, WhatsApp or e-mail. Another identifier type cannot be suppressed; use the channel’s identifier. |
no_fingerprint | 422 | UnprocessableEntityError | NiadraAPIError | A drift check of a declared type that keeps no fingerprint of the schema it mirrors. Declare the type’s fingerprint, or let Niadra follow the type from traffic, with no check. |
unknown_object | 422 | UnprocessableEntityError | NiadraAPIError | A customer-facing agent or a person named, in an action, an object of a type your systems send (mirror_of), and no system has sent that object yet, neither before nor earlier in the same batch. Agents name the objects they were given and never create one. Item code only: it comes back inside the 207 of the batch, and detail names the object and its system. Send the system event first, or fix the object reference. |
verification_not_allowed | 422 | UnprocessableEntityError | NiadraAPIError | A verify declared a level above the ceiling of your source. A customer-facing agent source starts with a V2 ceiling and can go up to V3, the level of the OTP it runs itself; V4 is only for human and internal_agent sources. Create a source with the right ceiling in the Console, issue its key and cut off the old one; the request does not raise the ceiling. |
about_without_link | 422 | UnprocessableEntityError | NiadraAPIError | No route answers it any longer: a read whose about names an account or partner with no active link to the person serves the person’s own memory and says about_unlinked: true, the same whether the organization exists or not. Create the link with POST /v1/identity/links to read the organization. |
personal_data_in_agent_memory | 422 | UnprocessableEntityError | NiadraAPIError | A note of the agent memory carried personal data (a phone number, an e-mail, an ID number, a customer’s name or id) in its title, body or tags. The note was refused, not masked: rewrite it without the data. detail names the kinds found, never the values. Through the kit and MCP, the model gets the same code as the result of the remember tool. |
unauthenticated | 401 | AuthenticationError | NiadraAuthenticationError | The key is missing, malformed, rotated or revoked. Do not retry. The SDKs drop the cached context of that key on a 401. |
forbidden | 403 | PermissionDeniedError | NiadraPermissionError | The key is valid but may not do this, or the access of its source was cut; or the Console person lacks a role of the route; or a vendor person asked about a source outside their binding. |
scope_missing | 403 | PermissionDeniedError | NiadraPermissionError | The key lacks the scope of the route: track, act, context, search, identify, admin, analytics, agent_memory, agent_memory:write, replay, coordinate, state:push or agent_state. Create a key with the scope. |
operation_not_allowed | 403 | PermissionDeniedError | NiadraPermissionError | An action used an operation outside the trusted_action_ops of this source. |
not_found | 404 | NotFoundError | NiadraAPIError | The item, object or resource does not exist in this space, or the policy of your source does not let it be seen. A path with no route answers the same way, and so does a route of a feature the space did not turn on: turns, state, agent_state, signals, claims, coordination, measurement, notifications and legal_holds start off. |
method_not_allowed | 405 | APIError | NiadraAPIError | The route exists, but not with that method. The Allow header lists the methods it takes. |
conflict | 409 | ConflictError | NiadraAPIError | The same Idempotency-Key was sent with a different body in the last 24 hours. Use a new key for a new request. |
lease_held | 409 | ConflictError | NiadraAPIError | Another holder has a claim at least as restrictive on the customer; the answer says who and until when. Wait, or hand off. The same holder renews its own. |
task_locked | 409 | ConflictError | NiadraAPIError | Another holder has the lock of that task on that object. Wait for it to end. |
effect_in_flight | 409 | ConflictError | NiadraAPIError | Another attempt holds the effect’s key. Do not act; the attempt in flight ends as done, failed or unknown_outcome. |
replay_expired | 410 | APIError | NiadraAPIError | The scenario’s turn left storage: an erasure took it, or the scenario_days you set passed after the last run. Record the scenario again from turns that still exist. |
agent_state_conflict | 412 | APIError | NiadraAPIError | A compare-and-swap of the working memory found another version instead of if_version. Read again and write from the current version, or use merge_by_key. |
turn_too_large | 413 | APIError | NiadraAPIError | The batch of turns is over 4 MB compressed or 16 MB decompressed. The SDKs send a turn too large on its own with its blobs reduced to hashes, so this never loops. |
pin_mismatch | 422 | UnprocessableEntityError | NiadraAPIError | A required pin of the running build does not match the recorded one: pins lists name, recorded and running. Run with the same build, or name the pin in vary when the change is on purpose. |
not_replayable | 422 | UnprocessableEntityError | NiadraAPIError | The turn cannot be run again: reasons lists content_mode (hash_only), fidelity (bronze, silver), completeness (partial, incomplete, unknown) or missing_pin. Record gold, complete turns, in stored or pointer mode, with the required pins. |
object_type_unknown | 422 | UnprocessableEntityError | NiadraAPIError | A snapshot (POST /v1/objects/snapshot) named a type the space does not declare and that Niadra has not inferred from any event or push yet. Send the type’s events or pushes first, or fix the name. A push, read or write of an undeclared type is not refused: the type is inferred from traffic. |
invalid_handle, unsupported_type | 422 | UnprocessableEntityError | NiadraAPIError | A destination of the suppression list or of a contact token is not a valid phone number or e-mail address, or is of a handle type the list does not cover. |
wrong_cell | 421 | WrongCellError | NiadraAPIError | The space moved to another cell, and the old cell answers this way for 30 days after the move. Retry at once on a new connection; both SDKs do it for you. |
rate_limited | 429 | RateLimitError | NiadraRateLimitError | Over the limit of your space or key. Wait the seconds in Retry-After. Reads are the last thing to be limited. Also when a write process already holds its maximum of large bodies (over 1 MB, as sent or decoded) at once: the batch of turns or events comes back with Retry-After, and the SDK sends it again. |
internal_error | 500 | ServerError | NiadraAPIError | Something failed on our side. Retry with backoff and send the request_id if it persists. |
unavailable | 503 | ServerError | NiadraAPIError | A dependency is temporarily out, or the database of a space created a moment ago is still being prepared. Retry after Retry-After; writes stay in the SDK queue until then. A shared object push whose hot copy did not answer comes back this way, with Retry-After: 1, and nothing was kept. |
coordination_unavailable | 503 | ServerError | NiadraAPIError | A coordination write could not be recorded durably: nothing new was stored. Send it again; the SDK does it on its own. A check never answers this way: with a dependency down, it decides by the purpose’s direction, with unavailable or unchecked among its reasons. |