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

# Bing IndexNow Integration

> Connect Bing IndexNow so Sight AI can ping Bing, Yandex, Seznam, and Naver the moment your content changes — including step-by-step setup for any custom site.

## Overview

IndexNow is an open protocol that lets you instantly notify search engines whenever a URL on your site is created, updated, or deleted. Instead of waiting for crawlers to find your changes, Sight AI pushes the URL straight to Bing's IndexNow endpoint — and Bing relays it to every other participating engine.

Once IndexNow is set up, Sight AI handles submissions for you automatically:

* New URLs from your sitemap are submitted as soon as we detect them
* Articles you publish through Sight AI are submitted the moment they sync to your CMS
* Updated URLs are re-submitted when they change

<Note>
  **Google does not participate in IndexNow.** Use the [Google Search Console integration](/integrations/google-search-console) for Google indexing. Run both for full search-engine coverage.
</Note>

### Participating search engines

A single IndexNow submission reaches all of these:

* **Bing** — Microsoft's search engine
* **Yandex** — Russia's largest search engine
* **Seznam** — Czech Republic's search engine
* **Naver** — South Korea's largest search engine

## How verification works

Bing won't accept submissions on behalf of a domain unless it can prove you own that domain. The proof is simple: you host a small text file at the root of your site that contains a unique key, and Bing fetches it whenever it accepts a submission.

The Sight AI flow is:

<Steps>
  <Step title="Generate a key in Sight AI">
    A 32-character alphanumeric key is created for your site. This becomes both the file *name* and the file *contents*.
  </Step>

  <Step title="Host the key file at your site root">
    The file must be reachable at `https://yourdomain.com/<your-key>.txt` and return the key as plain text.
  </Step>

  <Step title="Sight AI verifies the file is reachable">
    We fetch both the apex (`yourdomain.com`) and `www.yourdomain.com` variants. As long as one of them returns the exact key, you're verified.
  </Step>

  <Step title="Sight AI starts submitting URLs automatically">
    From now on every sitemap change and every published article triggers an IndexNow ping. No further action required.
  </Step>
</Steps>

## Before you start

You'll need three things — Bing Webmaster Tools is the one most people forget, so we cover it first.

<CardGroup cols={3}>
  <Card title="A Bing Webmaster Tools account with your site added" icon="user-check">
    Free, takes \~2 minutes. Required by Bing — see the [step-by-step below](#prerequisite-bing-webmaster-tools).
  </Card>

  <Card title="Your site already added to Sight AI" icon="globe">
    The IndexNow setup lives at **Integrations → Bing IndexNow** and operates on the active workspace.
  </Card>

  <Card title="A way to upload a file to your site root" icon="upload">
    Or, on platforms that block root uploads, the ability to add a redirect from `/<key>.txt` to a hosted asset.
  </Card>
</CardGroup>

### Prerequisite: Bing Webmaster Tools

Bing won't accept IndexNow submissions for a domain until that domain is registered and verified inside **Bing Webmaster Tools** — it's a separate Microsoft product from Sight AI, and there's no way to skip it. The good news is the setup is short:

<Steps>
  <Step title="Create a free Bing Webmaster Tools account">
    Go to [bing.com/webmasters](https://www.bing.com/webmasters/about) and sign in with a Microsoft, Google, or Facebook account. If you already have a Microsoft account (Outlook, Hotmail, Xbox, etc.) you can use that.
  </Step>

  <Step title="Add your site and verify ownership">
    Once you're in, click **Add a site** in the top-left dropdown and enter your full site URL (with `https://` and the correct `www`/non-`www` variant). Bing offers four ways to verify ownership — XML file, meta tag, CNAME DNS record, or auto-import from Google Search Console (the easiest, if you already have GSC connected).

    Microsoft's official walkthrough covers every verification method in detail: [Add and Verify your site — Bing Webmaster Tools](https://www.bing.com/webmasters/help/add-and-verify-site-12184f8b).

    <Tip>
      If you've already connected Google Search Console (see the [GSC integration guide](/integrations/google-search-console)), use the **"Import from Google Search Console"** option in Bing — it pulls the property over and verifies it for you in one click. No file uploads or DNS changes needed.
    </Tip>
  </Step>

  <Step title="Confirm the site shows as verified in Bing Webmaster Tools">
    A green checkmark next to your domain in the left-hand site picker means you're done. Now you can come back to Sight AI and start the IndexNow setup.
  </Step>
</Steps>

<Warning>
  **Bing Webmaster Tools is a Microsoft product — Sight AI cannot help with issues inside it.** If you get stuck creating the account, verifying ownership, or anything else *inside* Bing Webmaster Tools, those questions need to go to Microsoft. The right channels are:

  * [Microsoft's official Bing Webmaster Tools help center](https://www.bing.com/webmasters/help/help-center-661b2d18) — searchable docs for every BWT feature
  * [Bing Webmaster Support — Raise a support request](https://www.bing.com/webmasters/help/webmaster-support-24ab5ebf) — direct contact form for BWT engineers

  Once your site shows as verified inside Bing Webmaster Tools, **everything below this point is something we can absolutely help with** — email `support@trysight.ai`.
</Warning>

## Setup by site type

In Sight AI, open **Integrations → Bing IndexNow**, pick your workspace, and select the path that matches your site:

<Tabs>
  <Tab title="WordPress">
    The Sight AI WordPress plugin handles IndexNow for you. If you've already installed the plugin (see the [WordPress integration guide](/integrations/wordpress)), pick **WordPress** in the IndexNow setup, generate a key, and the plugin will host the file automatically.

    If you're hosting WordPress yourself and want to do it manually:

    <Steps>
      <Step title="Download the key file from Sight AI">
        It will be named `<your-key>.txt` and contain only the key.
      </Step>

      <Step title="Upload it to your WordPress site root">
        Use FTP/SFTP, cPanel File Manager, or a plugin like **WP File Manager**. The file must sit at the same level as `wp-config.php` and `index.php` — **not** inside `/wp-content`, `/wp-admin`, or any other subdirectory.
      </Step>

      <Step title="Confirm it's reachable">
        Open `https://yourdomain.com/<your-key>.txt` in your browser. You should see the key as plain text — nothing else.
      </Step>

      <Step title="Click Verify in Sight AI">
        Once verified, Sight AI starts pinging IndexNow on your behalf.
      </Step>
    </Steps>
  </Tab>

  <Tab title="Webflow">
    Webflow doesn't let you upload a `.txt` file directly to the site root, so the workflow uses the Webflow **Assets** panel plus a **301 redirect**. Sight AI ships a built-in wizard that walks you through it screen by screen.

    1. In **Integrations → Bing IndexNow**, pick **Webflow**.
    2. Click **I'm registered with Bing Webmaster — continue**.
    3. Follow the five-step wizard:
       1. Download the key file
       2. Upload it to **Webflow → Assets**
       3. Right-click the asset and **Copy link**
       4. Add a **301 redirect** under **Site Settings → Publishing → 301 Redirects** with **Old path** = `/<your-key>.txt` and **Redirect to path** = the asset URL you copied
       5. **Publish** your Webflow site, then click **Verify IndexNow Key**

    <Tip>
      The redirect makes `https://yourdomain.com/<your-key>.txt` resolve to the file in Webflow's CDN. Sight AI follows the redirect during verification.
    </Tip>
  </Tab>

  <Tab title="Custom / All other sites">
    Pick **All other sites** in the setup flow, then follow the platform-specific instructions in the [next section](#custom-site-setup). This covers Vercel, Netlify, Cloudflare Pages, GitHub Pages, Apache, Nginx, IIS, S3, static-site generators, Framer, Ghost, Shopify, Squarespace, Wix, and anything else that lets you serve a file at the site root.
  </Tab>
</Tabs>

## Custom site setup

This section is the deep dive for any site that isn't WordPress or Webflow. The goal is the same in every case: make `https://yourdomain.com/<your-key>.txt` return your key as plain text.

<Note>
  **Make sure you've completed the [Bing Webmaster Tools prerequisite](#prerequisite-bing-webmaster-tools) above before starting.** If your domain isn't verified in BWT, IndexNow submissions will silently fail no matter how perfect the key file is. The setup is just two steps: create a free account at [bing.com/webmasters](https://www.bing.com/webmasters/about) and follow [Microsoft's "Add and Verify your site" guide](https://www.bing.com/webmasters/help/add-and-verify-site-12184f8b).
</Note>

### Step 1 — Generate the key in Sight AI

1. Open **Integrations → Bing IndexNow**.
2. Pick your workspace.
3. Select **All other sites**.
4. Confirm you've registered with Bing Webmaster Tools.
5. Click **Generate IndexNow key**. Sight AI creates a 32-character key for you.
6. Click **Download key file**. You'll get a file like `aB3xZ9k7…q2P.txt` whose contents are just the 32-character key — nothing else.

<Warning>
  **The file must contain ONLY the key.** No leading/trailing spaces, no blank lines, no `<html>` wrapper, no UTF-8 BOM. Bing rejects files that don't byte-for-byte match the key.
</Warning>

### Step 2 — Understand "site root"

"Site root" means the file is reachable directly under your domain — *not* under any path segment. Test against this rule:

| URL                                                | At root? |
| -------------------------------------------------- | -------- |
| `https://example.com/abc123.txt`                   | ✅ Yes    |
| `https://example.com/abc123.txt/` (trailing slash) | ❌ No     |
| `https://example.com/static/abc123.txt`            | ❌ No     |
| `https://example.com/public/abc123.txt`            | ❌ No     |
| `https://example.com/.well-known/abc123.txt`       | ❌ No     |
| `https://example.com/blog/abc123.txt`              | ❌ No     |

If you can serve a `robots.txt` or `sitemap.xml` from your site, you can serve the IndexNow key file the same way and at the same place.

### Step 3 — Host the file (pick your platform)

<AccordionGroup>
  <Accordion title="Vercel / Next.js" icon="triangle">
    Drop the file into your project's `public/` directory:

    ```
    your-project/
      public/
        abc123…q2P.txt   ← your downloaded file goes here
    ```

    Anything in `public/` is served from the root, so after deploying it'll be reachable at `https://yourdomain.com/abc123…q2P.txt`.

    Commit, push, wait for the deploy to finish, then click **Verify** in Sight AI.

    <Tip>
      In the Pages Router, `public/` works the same way. In the App Router, this is still the right place — don't put it inside `app/`.
    </Tip>
  </Accordion>

  <Accordion title="Netlify" icon="bolt">
    Add the file to whichever directory Netlify publishes from (commonly `public/`, `dist/`, `build/`, or `_site/`). Check **Site settings → Build & deploy → Continuous deployment → Publish directory** if you're not sure.

    For a static site:

    ```
    your-site/
      public/
        abc123…q2P.txt
    ```

    Deploy the site, then verify in Sight AI.

    If you can't drop a file into the build, you can instead add a redirect to `_redirects`:

    ```
    /abc123…q2P.txt    https://your-cdn.example.com/abc123…q2P.txt    200
    ```

    The `200` rewrite (not a `301`) keeps the URL as `yourdomain.com/...` so Bing accepts it.
  </Accordion>

  <Accordion title="Cloudflare Pages" icon="cloud">
    Cloudflare Pages serves the contents of your build output directly. Add the key file alongside your other static assets in the directory that becomes the site root (often `public/`, `dist/`, or the project root for fully static sites). Push and let Pages rebuild.

    To verify locally before deploying, run `wrangler pages dev` and hit `http://localhost:8788/<key>.txt`.
  </Accordion>

  <Accordion title="GitHub Pages" icon="github">
    1. In your repository, drop the `<key>.txt` file at the root of the branch GitHub Pages serves from (usually `main` or `gh-pages`, in the directory configured under **Settings → Pages**).
    2. Commit and push.
    3. Wait for the Pages build to finish (check the **Actions** tab).
    4. Verify by opening `https://your-username.github.io/<key>.txt` (or your custom domain).

    <Note>
      If you use Jekyll, Jekyll will ignore files starting with `_`. Your key won't start with `_`, but if you also keep a `.nojekyll` file at the root, you're guaranteed the file will be served as-is.
    </Note>
  </Accordion>

  <Accordion title="Astro / Hugo / Jekyll / Eleventy / Gatsby" icon="code">
    Static-site generators all expose a folder whose contents are copied to the site root unchanged:

    | Generator     | Drop the file in                                                       |
    | ------------- | ---------------------------------------------------------------------- |
    | **Astro**     | `public/`                                                              |
    | **Hugo**      | `static/`                                                              |
    | **Jekyll**    | site root (any file with no front matter)                              |
    | **Eleventy**  | the directory listed under `passthroughCopy` (often `public/` or root) |
    | **Gatsby**    | `static/`                                                              |
    | **Next.js**   | `public/`                                                              |
    | **SvelteKit** | `static/`                                                              |
    | **Nuxt**      | `public/`                                                              |

    Rebuild and deploy, then verify in Sight AI.
  </Accordion>

  <Accordion title="Apache (cPanel / shared hosting / VPS)" icon="server">
    1. Use FTP/SFTP, cPanel **File Manager**, or `scp` to upload `<key>.txt` to your `DocumentRoot` — the same directory that contains your `index.html` or `index.php`.
    2. Make sure the file's permissions are `644` so the web server can read it (`chmod 644 <key>.txt`).
    3. If you have an aggressive `.htaccess` rewrite that routes everything through a single PHP entrypoint, add an exception so the `.txt` file is served directly:

       ```apache theme={null}
       RewriteEngine On
       RewriteRule ^[a-zA-Z0-9-]+\.txt$ - [L]
       ```

       Place this **above** your existing rewrite rules.
    4. Verify in your browser, then click **Verify** in Sight AI.
  </Accordion>

  <Accordion title="Nginx" icon="server">
    Upload `<key>.txt` to your site's web root (whatever `root` points to in your `server` block).

    If your config has a SPA-style catch-all like `try_files $uri $uri/ /index.html`, that catch-all will swallow the `.txt` request and return your HTML page. Add an explicit location block above the catch-all so the key file is served as-is:

    ```nginx theme={null}
    location ~* ^/[a-zA-Z0-9-]+\.txt$ {
      add_header Content-Type text/plain;
      try_files $uri =404;
    }
    ```

    Reload Nginx (`sudo nginx -s reload`) and verify.
  </Accordion>

  <Accordion title="IIS (Windows hosting)" icon="windows">
    1. Copy `<key>.txt` into the site's physical directory (the one mapped under **Sites → your-site → Basic Settings → Physical path**).
    2. In **IIS Manager → MIME Types**, confirm `.txt` is mapped to `text/plain` (it is by default).
    3. If your `web.config` rewrites everything to a single handler, add a precondition above the rewrite:

       ```xml theme={null}
       <rule name="IndexNowKey" stopProcessing="true">
         <match url="^[a-zA-Z0-9-]+\.txt$" />
         <action type="None" />
       </rule>
       ```
    4. Verify in your browser, then in Sight AI.
  </Accordion>

  <Accordion title="Amazon S3 + CloudFront" icon="aws">
    1. Upload `<key>.txt` to the S3 bucket that backs your CloudFront distribution. Place it at the bucket root, not inside any prefix.
    2. Set the object's **Content-Type** to `text/plain` (the upload UI lets you set this; via CLI: `--content-type text/plain`).
    3. Make sure the object is publicly readable, or that your bucket policy allows the CloudFront OAI/OAC to read it.
    4. If CloudFront has aggressive caching for `.txt` files, **invalidate** the path: `/<key>.txt`.
    5. Verify the URL responds, then click **Verify** in Sight AI.
  </Accordion>

  <Accordion title="Cloudflare Workers / Workers Sites" icon="cloud">
    For Workers Sites, drop the file into the directory listed under `[site] bucket` in `wrangler.toml` (commonly `public/`).

    For a hand-written Worker, add an early route that returns the key as plain text:

    ```js theme={null}
    export default {
      async fetch(request) {
        const url = new URL(request.url);
        if (url.pathname === "/abc123…q2P.txt") {
          return new Response("abc123…q2P", {
            headers: { "Content-Type": "text/plain" },
          });
        }
        // …rest of your worker
      },
    };
    ```

    Replace both occurrences of `abc123…q2P` with your actual key.
  </Accordion>

  <Accordion title="Framer" icon="palette">
    Framer doesn't let you upload arbitrary files to the site root, so the cleanest path is to use the Sight AI Framer plugin which handles indexing for you (see the [Framer integration guide](/integrations/framer)).

    If you don't want to use the plugin, you can use a Custom Code embed plus a redirect through your DNS provider, but in practice we recommend the plugin — IndexNow setup is one of the things it's designed to manage.
  </Accordion>

  <Accordion title="Ghost" icon="ghost">
    On a self-hosted Ghost install, place `<key>.txt` in `content/files/` (it will be served at `https://yourdomain.com/content/files/<key>.txt`, which is **not** the root) — so instead use a small Express/Nginx reverse-proxy rule above Ghost:

    ```nginx theme={null}
    location ~* ^/[a-zA-Z0-9-]+\.txt$ {
      alias /var/www/ghost/content/files/$1.txt;
    }
    ```

    For Ghost Pro (managed hosting), root file uploads aren't supported. Contact Ghost support to host the key file or move IndexNow management into Cloudflare in front of Ghost using a Worker (see Cloudflare Workers above).
  </Accordion>

  <Accordion title="Shopify" icon="shopify">
    Shopify doesn't allow root file uploads on the storefront, but you can serve the key file through a redirect:

    1. In Shopify admin, go to **Online Store → Navigation → URL Redirects**.
    2. Click **Create URL redirect**.
    3. **Redirect from**: `/<your-key>.txt`
    4. **Redirect to**: a public URL where the file lives (e.g., a Files entry — upload the `.txt` through **Settings → Files**, copy the CDN URL, paste it here).
    5. Save, then verify in Sight AI.

    <Note>
      Shopify converts redirects to 301s. Sight AI follows redirects during verification, and Bing's verifier follows them too, so this is supported.
    </Note>
  </Accordion>

  <Accordion title="Squarespace" icon="square">
    Squarespace doesn't expose root file uploads on most plans. Two options:

    1. **Code Injection (Business plan and above):** doesn't help here because Code Injection runs inside HTML pages, not as a standalone file. Skip this option.
    2. **URL redirects:** Squarespace lets you create URL mappings under **Settings → Advanced → URL Mappings**. The syntax is `/<your-key>.txt -> https://your-cdn.example.com/<your-key>.txt 301`. Host the file on any public URL (S3, GitHub Pages, etc.) and redirect to it.

    If neither option works on your plan, IndexNow setup isn't possible on Squarespace — Sight AI's [Google Search Console integration](/integrations/google-search-console) still works as a fallback.
  </Accordion>

  <Accordion title="Wix" icon="puzzle-piece">
    Wix doesn't allow custom files at the site root and doesn't support arbitrary 301 redirects to external URLs for non-Wix paths, so IndexNow setup typically isn't possible on Wix.

    If your site is on **Wix Studio with a custom domain**, you can sometimes use the Wix CLI to upload to the root — contact Wix support to confirm your plan supports it.

    For most Wix users, fall back to the [Google Search Console integration](/integrations/google-search-console) — it doesn't require any file hosting.
  </Accordion>

  <Accordion title="Custom Express / Node / FastAPI / Django / Rails app" icon="code">
    Add a single early route that returns the key as plain text. Example for Express:

    ```js theme={null}
    app.get("/abc123…q2P.txt", (req, res) => {
      res.type("text/plain").send("abc123…q2P");
    });
    ```

    Make sure this route is registered **before** any catch-all middleware (404 handler, SPA fallback, etc.). Replace both occurrences with your actual key.

    Same idea for FastAPI:

    ```python theme={null}
    from fastapi.responses import PlainTextResponse

    @app.get("/abc123…q2P.txt", response_class=PlainTextResponse)
    def indexnow_key():
        return "abc123…q2P"
    ```
  </Accordion>
</AccordionGroup>

### Step 4 — Confirm the file is reachable

Before clicking Verify in Sight AI, sanity-check the file from your terminal:

```bash theme={null}
curl -i https://yourdomain.com/<your-key>.txt
```

You want a response that looks like this:

```
HTTP/2 200
content-type: text/plain
content-length: 32

aB3xZ9k7…q2P
```

The exact `content-type` doesn't have to be `text/plain` — `application/octet-stream` and others work too — but the **status must be 200** and the **body must be exactly your key** with no extras.

Run the same check on the `www` variant if your site uses it:

```bash theme={null}
curl -i https://www.yourdomain.com/<your-key>.txt
```

Sight AI tries both during verification, so you only need one of them to work.

### Step 5 — Verify in Sight AI

Back in **Integrations → Bing IndexNow**, click **Verify connection**. Sight AI will:

1. Fetch `https://yourdomain.com/<your-key>.txt`
2. If that fails, try `https://www.yourdomain.com/<your-key>.txt`
3. Compare the response body (after trimming whitespace) to your key
4. On success: mark the integration as verified, immediately submit your existing sitemap URLs, and start pinging IndexNow on every future change

If verification fails, jump to the [Troubleshooting](#troubleshooting) section — it covers every error message we surface.

## After verification

Once verified, IndexNow runs entirely in the background:

* **New sitemap URLs** — picked up by Sight AI's hourly sitemap check and submitted as a batch
* **New articles** — submitted the moment they sync to your CMS
* **Updated content** — re-submitted when the URL appears again in your sitemap with a new `lastmod`
* **No rate limits to worry about** — Sight AI batches up to 10,000 URLs per IndexNow request and Bing accepts them all
* **No further action required from you** — the key file just needs to stay reachable

You can review every submission under [Indexing Activity](/indexing/monitoring).

<Tip>
  **Leave the key file in place forever.** Bing periodically re-verifies ownership by re-fetching the file. If you delete it, future submissions will start failing silently.
</Tip>

## Troubleshooting

When verification fails, Sight AI returns one of the messages below. Each section maps the message to its likely cause and the exact fix.

### "Key file not accessible — HTTP 404"

The most common failure. Bing tried to fetch `https://yourdomain.com/<your-key>.txt` and your server returned 404.

**Causes and fixes:**

* **The file isn't at the root.** Check `curl -I https://yourdomain.com/<your-key>.txt` — if you get 404, but a path like `https://yourdomain.com/static/<your-key>.txt` returns 200, you uploaded it to the wrong directory. Move it to the root.
* **Your build process didn't include the file.** If you committed it to source but didn't push, or your build folder doesn't include the static files directory, the file won't ship. Confirm the file is in the deployed output (open the URL in a browser tab — incognito to avoid caching).
* **A SPA catch-all is swallowing the request.** If you ship a single-page app, your server is probably returning `index.html` for every unknown path. The text response will look like HTML, not your key. See the Apache/Nginx/IIS sections above for how to add a precondition that lets `.txt` files through.
* **You're testing the wrong host.** Sight AI tries both `apex` and `www`. Check both manually.

### "Key file content mismatch"

Sight AI fetched the file successfully but the body didn't match your key.

**Causes and fixes:**

* **The file has extra characters.** Open the file in a hex-aware editor (`xxd <key>.txt | head` on macOS/Linux). The bytes should be only `[a-zA-Z0-9]` — no spaces, no newlines, no UTF-8 BOM (`ef bb bf` at the start).
* **You uploaded the wrong file.** If you regenerated the key in Sight AI and forgot to re-download, your hosted file is stale. Click **Download key file** again and re-upload.
* **A CDN is rewriting the response.** Some CDNs minify or wrap text responses. Disable rewrite rules for this path or set caching to bypass.
* **Your server returned an error page with HTTP 200.** Some hosts return a "soft 404" — a 200 status with an HTML error body. Check the actual body of the response (not just the status code).

### "DNS resolution failed — the domain could not be found"

Sight AI couldn't resolve the host at all.

**Causes and fixes:**

* The site host stored on your workspace doesn't match a real domain. Open **Site Settings → General** and confirm the domain is correct.
* The domain just changed nameservers and DNS hasn't propagated. Wait 15–30 minutes and try again.
* A typo: `example.con` vs `example.com`.

### "TLS/SSL certificate error"

Sight AI reached the server but couldn't establish a secure connection.

**Causes and fixes:**

* Your SSL certificate is expired or doesn't cover the host you're verifying (e.g., the cert covers `example.com` but you're verifying `www.example.com`).
* Your server is using an outdated cipher Sight AI doesn't accept. Renew the cert from your hosting provider or run [SSL Labs' test](https://www.ssllabs.com/ssltest/) to diagnose.

### "Connection refused" / "Connection reset"

Your server actively rejected Sight AI's request, usually because of a WAF rule or bot-detection layer.

**Causes and fixes:**

* **Cloudflare Bot Fight Mode / WAF:** allow-list Sight AI's verifier in **Cloudflare → Security → WAF** by exempting requests for `*.txt` paths, or temporarily set Bot Fight Mode to off, verify, then re-enable.
* **Vercel firewall rules:** add an allow rule for the `<key>.txt` path.
* **Server fail2ban / rate limiter:** check your access logs for blocks on Sight AI's verifier (User-Agent contains `Mozilla/5.0`).

### "Request timeout — unable to access the key file"

Your server took longer than 10 seconds to respond.

**Causes and fixes:**

* The server is overloaded or cold-starting. Wait a few seconds and retry.
* The file is being generated dynamically and that handler is slow. Serve it as a true static asset instead.

### Verification succeeded but submissions are still failing

Verification passed but the [Indexing Activity](/indexing/monitoring) page shows submissions failing.

**Causes and fixes:**

* **Your domain isn't registered in Bing Webmaster Tools.** This is the silent killer — Sight AI's verification only checks that the key file is reachable; it doesn't (and can't) check whether you've also added the site to BWT. If you skipped the [BWT prerequisite](#prerequisite-bing-webmaster-tools), Bing will accept the IndexNow request but discard it on its end. Go to [bing.com/webmasters](https://www.bing.com/webmasters/about), add your site, and verify ownership using [Microsoft's guide](https://www.bing.com/webmasters/help/add-and-verify-site-12184f8b).
* **You moved or deleted the key file after verifying.** Bing re-verifies ownership periodically. Re-upload the file to the root.
* **The submitted URL host doesn't match the verified host.** If your sitemap returns `https://www.example.com/page` but you verified `example.com` (apex only), Bing rejects the submission. The fix is in the *sitemap*, not IndexNow — make your sitemap consistently use the same host you verified, or set the canonical host on your site so both work.
* **The page returns a non-2xx status.** Bing's crawler will follow the IndexNow ping but won't index a URL that returns 4xx or 5xx. Check that the page actually loads.

### How to ask for help

For anything **inside Bing Webmaster Tools** (creating the account, verifying ownership, settings inside BWT, indexing decisions Bing makes about your URLs), Sight AI can't see what's happening on Microsoft's side — those go to Microsoft directly:

* [Bing Webmaster Tools Help Center](https://www.bing.com/webmasters/help/help-center-661b2d18)
* [Raise a Bing Webmaster Support request](https://www.bing.com/webmasters/help/webmaster-support-24ab5ebf)

For anything on **the Sight AI side** (verification fails, key file logic, submission status, sitemap-host mismatch, our integration UI), email `support@trysight.ai` with:

* The exact error text from the verification panel
* The output of `curl -i https://yourdomain.com/<your-key>.txt`
* The output of `curl -i https://www.yourdomain.com/<your-key>.txt`
* A screenshot of the **Integrations → Bing IndexNow** page
* Confirmation that the domain shows as verified inside Bing Webmaster Tools

That's almost always enough to diagnose in a single round-trip.

## Key reference

For anyone bringing their own key (under **Use my own key** in the Sight AI UI), it must conform to the IndexNow spec:

| Rule               | Allowed                                                          |
| ------------------ | ---------------------------------------------------------------- |
| Length             | 8 to 128 characters                                              |
| Allowed characters | `a-z`, `A-Z`, `0-9`, `-` (hyphen)                                |
| **Not** allowed    | underscores, dots, slashes, spaces, any other punctuation        |
| File name          | exactly `<key>.txt` (case-sensitive — keep the `.txt` lowercase) |
| File contents      | exactly the key, no whitespace, no newline, no BOM               |
| File location      | site root only                                                   |

If you let Sight AI generate the key, it always meets these rules.

## Disconnect or regenerate

You can manage the integration at any time from **Integrations → Bing IndexNow**:

* **Regenerate key** — issues a new key and clears the verified flag. You'll need to re-upload a new file and re-verify. Use this if your old key was leaked or you want to rotate it.
* **Use my own key** — replace the auto-generated key with one you brought from elsewhere (e.g., one already used with another tool that submits to IndexNow).
* **Disconnect** — removes the IndexNow key for the workspace, stops automatic submissions, and clears the verified flag. The file on your server is harmless to leave behind, but you can also delete it.

## Next steps

* [Set up Google Search Console](/integrations/google-search-console) — for Google indexing (IndexNow doesn't cover Google)
* [Monitor your indexing activity](/indexing/monitoring) — see every IndexNow submission, status, and error
* [Learn how Sight AI handles indexing end-to-end](/indexing/how-it-works)
* [Enable Autopilot](/autopilot/how-autopilot-works) — let Sight AI generate, publish, and submit articles for you on a schedule
