Docs › Help
API errors
What 400, 401, 403, 404, 422 and 429 from the Nvivio API mean, with the code of each error and how to fix it, from a missing key to the hourly limit.
Every error from the REST API has an error (what is wrong), a fix (what to do) and a stable code to compare on, in your language (Errors). Compare on code, never on the text. These are the ones people run into most.
401: who are you?
| Code | Cause | Fix |
|---|---|---|
auth.not_logged_in |
No key was sent. | Send Authorization: Bearer nv_…, with the word Bearer and a space. |
auth.invalid_key |
The key is wrong, incomplete or revoked. | Copy the whole key; you only saw it once when you made it. Lost it? Make a new one in API and AI assistants (/app/api) and revoke the old one. |
auth.session_expired |
A dashboard session expired, or the token sent is not an API key at all (keys start with nv_). |
Log in again, or send the whole key. |
share.invalid |
A shared link that does not work: unknown, expired, revoked, or more than the plan allows now. | Ask whoever gave you the link for a new one. |
share.password |
A shared link with a password, without the value from POST /share/unlock. |
Give the password, then send Share <token>.<unlock>. |
403: not allowed
| Code | Cause | Fix |
|---|---|---|
api.plan |
Your organisation is on Free, which has no API of its own. | Take Starter or above (The API), or connect an AI assistant, which reads through the MCP server on every plan. |
key.mcp_only |
A key for the MCP server asked for something its tools never ask. | Use it in the MCP server only. For the REST API, make a key of its own on Starter or above (Authentication). |
key.wordpress_only |
A key for WordPress asked for something the plugin never shows. | Use it in the WordPress plugin only. For the REST API, make a key of its own on Starter or above (Authentication). |
auth.key_read_only |
A key with the scope read tried to change something. |
Make a key with the scope admin for changes (Authentication). |
auth.read_only |
Your role on this site only reads. | Ask an owner or admin to change your role (Roles). |
auth.not_admin |
Only owners and admins can do this. | Ask an owner or admin, of the organisation or of the site. |
Managing a team (inviting, changing roles) is never possible with a key, only as a logged-in person, so a leaked key cannot hand out access.
404: not found
site.not_found means the site does not exist or your key or login has no access to it: Nvivio does not say which, so nobody learns that a site exists (The site in a path).
- Check the site in the path: its code (
NV-9Y5FVJQ) or its domain withouthttps://, such asexample.com. - A key belongs to one organisation. A site of another organisation needs a key made there.
- Through a shared link,
share.not_shownmeans the link does not show this: it reads only its own site’s numbers, never single visits, labels or settings. GET /v1/siteslists every site your key can read.
request.no_endpoint means the method and path together do not exist, for example a typo in the path or POST where only GET exists: compare with the endpoints.
400 and 422: the request is not right
Through a shared link, share.filter refuses a filter that could single out a visitor (a city, a device model, “is not”) and share.too_few a view with fewer than 5 visitors. The fix says what is missing or wrong, often with an example. Common ones: 400 for a period that does not exist (period.unknown, see Periods) or a filter on a goal or part the site does not have (goal.unknown, part.unknown), and 422 for a value Nvivio cannot accept, such as a shared domain like github.io as a site (site.domain_shared).
A filter in the wrong form or with an unknown key is no error: it is left out. When a filter seems to change nothing, check it against the filter syntax.
429: too many requests
| Code | Cause | Fix |
|---|---|---|
api.limit |
Your organisation used its requests for this hour: all its API keys together, while keys of the MCP server and for WordPress count apart (Limits). | Wait for the next hour: the Retry-After header says how many seconds. The fix names the plan that allows more. |
demo.too_many |
Too many requests to the live demo at once, without a key. | Wait a minute and try again. |
share.too_many |
Too many requests or passwords through a shared link at once. | Wait a minute and try again. |
Every answer to a request with a key carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, so your code can slow down before it hits the limit. The dashboard itself is never counted. Need many numbers at once? One request to GET /v1/sites/periods returns totals for up to 24 sites, and a breakdown returns up to 500 rows.
Errors from the script’s endpoint
The endpoint that receives your visitors’ events, nviv.io/e, has errors of its own, such as 403 for an address that is not one of the site’s domains. See No data arrives.