> ## Documentation Index
> Fetch the complete documentation index at: https://docs.puntego.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Console codes

> Every code Puntego prints to the browser console, what causes it, and how to fix it.

Every message the Puntego widget and SDK print to the browser console starts with a stable code, then a plain-language sentence, then a link to this page:

```text theme={null}
[puntego] E_BOOT_ORIGIN_NOT_ALLOWED: Not authorized for this page's origin. … https://docs.puntego.com/console-codes
```

A code keeps its meaning for good and is never reused, so you can search for it, alert on it, or quote it to support. The sentence next to it may be reworded. Console codes are separate from the [error reasons](/errors) the worker returns in JSON (`boot/origin_not_allowed`), which name the server's answer; a console code names what the page should change.

## Codes

| Code | Cause | Fix |
| - | - | - |
| `E_BOOT_ORIGIN_NOT_ALLOWED` | /boot refused the page's origin (403 `boot/origin_*`). An unknown or revoked app id answers the same, on purpose. | Serve the page from https on a verified domain of the workspace (Install → Domains), and check `data-app-id`. Local development: see [local development](/install#local-development). |
| `E_BOOT_DECLINED` | /boot declined the request with another 4xx; the message names the status and its public reason (for example `boot/invalid_request`). | Look the reason up in [Errors](/errors) and correct the install attributes or identity token it names. |
| `E_BOOT_UNAVAILABLE` | /boot answered 5xx. The widget retries on its own. | Nothing to change on the page. If it persists, contact support with the time it happened. |
| `E_BOOT_UNREACHABLE` | /boot could not be reached at all (network, CSP `connect-src`, an ad blocker). | Allow the worker origin in `connect-src` (see [CSP](/csp)) and check the network. |
| `E_API_URL_INVALID` | `data-gp-api` (or the `apiUrl` option) is not an https URL (http only on localhost), or carries credentials, a query or a fragment. | Use the worker URL from Install, exactly as shown. |
| `E_BOOT_SCRIPT_URL_INVALID` | The boot script URL is not an https URL (http only on localhost). | Use the script URL from Install, exactly as shown. |
| `E_TRUSTED_TYPES_BLOCKED` | The site enforces Trusted Types (`require-trusted-types-for 'script'`) and does not allow Puntego's policies. | Add `puntego-loader`, `puntego-boot` and `puntego` to the `trusted-types` directive (see [CSP](/csp)). |
| `E_RUNTIME_LOAD_FAILED` | The runtime script failed to load (its URL, CSP `script-src`, or the network). | Check the script URL and CSP, then retry. With a signed-in customer, provide a fresh identity token: the previous one was discarded. |
| `E_SCRIPT_MOUNT_FAILED` | The runtime or boot script could not be added to the document (the page threw while appending it). | Check for a script that locks `document.head` or a CSP that rejects it; the error object printed with the message names the cause. |
| `E_STYLESHEET_BLOCKED` | The widget stylesheet was blocked, usually by a nonce-enforced `style-src` policy, so the assistant would be invisible. | Pass the nonce with `data-nonce` on the embed script, or allow the constructed `<style>` (see [CSP](/csp)). |
| `E_SDK_PROTOCOL_MISMATCH` | The page-level SDK and the boot script on the page speak different protocol versions. | Use one current boot script and matching `@puntego/*` package versions (see [SDK migration](/sdk-migration)). |
| `E_APP_ID_CONFLICT` | A second install asked for another app id while one was already on the page; the first one is kept. | Mount a single `PuntegoProvider` or snippet per page. To switch workspaces, reload the document. |
| `E_APP_ID_REQUIRED` | `init()` or `PuntegoProvider` was called without an app id. | Pass the app id from Install (`data-app-id` or `appId`). |
| `E_CONFIG_IMMUTABLE` | An install configuration that is fixed after boot (headless, or another provider setup) was changed without a reload. | Reload the document to apply the new configuration. |
| `E_IDENTITY_TOKEN_INVALID` | The customer identity token is not a valid one-time token, or none was given where one is required. | Mint a fresh short-lived token on your server for each page load and identity change (see [Authentication](/authentication)). |
| `E_IDENTITY_AFTER_BOOT` | A customer identity arrived after the page-level SDK had already booted, or belongs to another install on the page. | Give the token to the first loader or provider call, with one identity-aware install per page; reload to switch customers. |
| `E_IDENTITY_PENDING` | Another identity boot is still pending. | Wait for it, or reload the document to switch customers safely. |
| `E_IDENTITY_CHANGE_REFUSED` | The visitor identity changed in a way the running widget cannot follow, or `setIdentity()` ran before `init()`. | Call `init()` first; after a change of signed-in customer, reload or use `setIdentity()` with a fresh token. |
| `E_IDENTITY_NOT_READY` | The signed-in customer, or the guide after a sign-out, did not become ready. | Mint a fresh one-time identity token and check the worker, network and CSP. |
| `E_SDK_NOT_READY` | The SDK did not become ready in time. | Check the worker URL, the network and the CSP; an SDK call made before ready throws this too. |
| `E_SDK_STOP_FAILED` | The previous guide could not be stopped safely before a new one took over. | Reload the document before continuing. |
| `E_COLLECTION_PLACEMENT_INVALID` | A `data-puntego-collection` placement key is not valid. | Use a lowercase letter first, then lowercase letters, digits, `_` or `-` (see [Experience collections](/experience-collections)). |
| `E_HOST_TOOL_REFUSED` | `registerTool()` or `usePuntegoTool()` refused a host tool (its definition, the per-page limit, or a write tool on a runtime that runs none), or a tool was called through a declaration React had already replaced. | Correct the tool definition the message names, within the limits in [Host tools](/host-tools). |
| `E_CONTEXT_INVALID` | `accountFacts` or `usePuntegoContext` data was not plain JSON, or was over its size limit, and was not sent. | Pass a plain JSON object within the documented size (see [Account facts](/account-facts)). |
| `E_FRAME_CONFIG_INVALID` | The sub-app snippet `frame.js` is missing `data-parent-origin`, or its `data-gp-api` is not a clean https URL. | Set `data-parent-origin` to the page origins allowed to guide the sub-app, and use the worker URL from Install (see [Frames](/frames)). |
| `E_CURSOR_PRESET_UNKNOWN` | The launcher names a cursor preset key that does not exist; the default cursor is shown. | Pick a cursor in Brand, or pass one of the documented preset keys (see [Configuration](/configuration)). |
| `E_BOOT_SCRIPT_REFUSED` | The page-level SDK did not mount its boot script because the loader refused it; the loader printed its own code just before (for example `E_API_URL_INVALID`). | Fix what that earlier line names, then reload. |
| `E_HOOK_OUTSIDE_PROVIDER` | A Puntego React hook was used outside `<PuntegoProvider>`. | Render the component inside the page-level `<PuntegoProvider>` (see [React components](/react-components)). |
| `E_TURN_IN_PROGRESS` | `sendMessage()` was called while another turn was still running; it rejects rather than queue. | Await the previous `sendMessage()` before sending the next one (see [SDK reference](/sdk-reference)). |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.