Errors
All errors return a JSON body with an error string. The HTTP status is meaningful — your client should branch on it.
Error shape
{ "error": "human-readable reason" }
That's it. No error codes, no nested structures. The MCP wrapper translates these into isError: true content blocks with the same message; in REST you'll see them as the JSON body.
Status codes
200— success. Body shape varies by tool.400— malformed input. Most often a required field missing or out-of-range. Body explains the specific reason.401— missing or invalidx-mneva-key. Check that your key is set on the request and matches an active tenant.404— referenced resource not found. Belief 12 not found, prediction 7 not found, tenant unknown. Body specifies which.5xx— unexpected. Probably temporary. Mneva's tooling does not retry automatically; your client should backoff and retry idempotent reads.
Common errors
| Message | What it means | What to do |
|---|---|---|
invalid or missing API key | Header x-mneva-key is wrong or absent | Check MNEVA_KEY env. Rotate if you suspect compromise. |
prediction X not found | The id you passed never existed, or belongs to another tenant | Confirm the id from predictions_open first. |
prediction X is already resolved | You resolved this prediction once already | Predictions resolve once; query don't re-resolve. |
outcome must be one of: correct, incorrect, partial | outcome value isn't one of the three | Use one of the literal strings. |
belief X is superseded | You're trying to add evidence against a belief that has been revised | Find the current belief via currentBeliefs and record evidence on that one. |
kind must be 'supporting' or 'refuting' | evidence(kind=...) got something else | Use the literal strings. |
prediction and domain are required | predict() was called missing one | Both fields are required; domain is the calibration key. |
If a 5xx is reproducible, please report it — support@mneva.dev or a GitHub issue against mneva-connect.