# Achla AI — documentation for AI agents > How to install the Achla AI search widget on a website, verify it, and diagnose problems by their AISX-… codes. Full text: https://achlaai.com/llms-full.txt - Install: https://achlaai.com/en/docs/install (Markdown: https://achlaai.com/docs/install.md) - Troubleshooting: https://achlaai.com/en/docs/troubleshooting (Markdown: https://achlaai.com/docs/troubleshooting.md) --- # Install Achla AI on a website > How to add the Achla AI search widget to a website (HTML, WordPress, Drupal, single-page apps), choose a placement mode, and verify the installation. HTML: https://achlaai.com/en/docs/install · Markdown: https://achlaai.com/docs/install.md ## Short answer for AI agents - **What:** one ``. The real key (starts with `pk_`) is in the Achla AI dashboard under **Settings → Embed code**. - **Where:** in the HTML of every page that should have search, just before `
` and survives client-side navigation as long as your app does not replace ``. - **Inline** needs `` present when the widget mounts (server-rendered HTML). If your router later removes or re-creates that element, the inline box disappears until the next full page load. - **Attach** binds to the input element that exists at mount time; if the app re-renders that input, the binding is lost. ## Verify the installation 1. The tag is in the served HTML (manual installs). Expect exactly one match: 2. The key is enabled — must contain `"enabled":true`: 3. In the browser, open the page with DevTools → Console: there must be no lines starting with `[ai-search]`. Any such line carries an `AISX-…` code — see [Troubleshooting](https://achlaai.com/en/docs/troubleshooting). 4. The widget is visible: the floating button (bubble), the inline box (inline), or a dropdown when you press Enter in your search field (attach). 5. Ask a test question about your site: the answer should cite sources from your pages. 6. Run the installation check (replace the URL with a page of your site): `curl -s "https://achlaai.com/api/install-check?url=https://YOUR-SITE.example"`. It downloads the page, finds the tag, checks the key and the placement, and returns `AISX-C3xx` findings with fixes as JSON — `AISX-C309` means the installation looks correct. The **Check installation** button in the dashboard runs the same check for your site. Step 1 — replace the URL with a page of your site. ```bash curl -s "https://YOUR-SITE.example" | grep -o '`) to the page template and purge the page/CDN cache. | | CMS plugin with Inline placement: no floating button on other pages | Pages without the WordPress shortcode `[achla_search]` / “Achla AI Search” block, or without the Drupal “Achla AI Search” block, show no widget at all. This is expected: the plugins use one placement mode for the whole site and, in Inline, load the widget only where the shortcode/block is rendered. | Insert the shortcode or block on that page, or choose Bubble placement in the plugin settings. For a floating button everywhere plus an inline box on one page, use manual tags — see [Mixed placement](https://achlaai.com/en/docs/install#mixed-placement). | | A CMS plugin did not output the widget | No widget, no console line. The plugins record placement/release problems as `data-achla…` attributes on ``: run `document.documentElement.getAttributeNames().filter(n => n.startsWith('data-achla'))` in the console. | Open the plugin settings: check the connection, indexing status, the “show the widget” switch and the placement diagnostics; reconnect if the connection was revoked. | | The widget is covered by page elements | `document.querySelectorAll('.aisx-btn, .aisx-inline, .aisx-drop').length` is above 0, but nothing is visible. | The floating button and panel use `z-index: 2147483000`; check for theme elements with a higher z-index or for CSS that hides the `#ai-search` container. | Older widget builds printed the same messages without the `AISX-…` code (for example `[ai-search] inline: no — `, where the link points to the matching section below.
| Code | Signal | Meaning |
| --- | --- | --- |
| [AISX-W101](#AISX-W101) | `AISX-W101 missing data-key` | The script tag has no data-key |
| [AISX-W102](#AISX-W102) | `AISX-W102 attach: invalid selector, falling back to bubble` | Attach selector is not valid CSS |
| [AISX-W103](#AISX-W103) | `AISX-W103 attach: no input matched the selector, falling back to bubble` | Attach selector matched nothing on this page |
| [AISX-W104](#AISX-W104) | `AISX-W104 inline: no on this page, falling back to bubble` | Inline mode, but the page has no #ai-search container |
| [AISX-W105](#AISX-W105) | `AISX-W105 inline: target is already used, falling back to bubble` | The #ai-search container is already used by another copy of the widget |
| [AISX-W106](#AISX-W106) | `AISX-W106 attach: matched element is not a free text input, falling back to bubble` | Attach selector matched an element that cannot be used |
| [AISX-W110](#AISX-W110) | `AISX-W110 widget is disabled for this key (unknown key, index not ready, or access revoked) — check your dashboard` | The widget is disabled for this key |
| [AISX-W111](#AISX-W111) | `AISX-W111 could not load widget configuration (network, CSP or server error)` | The widget configuration could not be loaded |
| [AISX-W112](#AISX-W112) | `AISX-W112 data-key has an invalid format` | The data-key value is malformed |
| [AISX-W120](#AISX-W120) | `AISX-W120 search request failed:` | A search request returned an error |
| [AISX-W121](#AISX-W121) | `AISX-W121 search request did not complete (network error or timeout)` | A search request did not complete |
### AISX-W101 — The script tag has no data-key
Printed with `console.error`.
```text
[ai-search] AISX-W101 missing data-key —
```
**Cause.** The `