> For the complete documentation index, see [llms.txt](https://docs.aisera.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.aisera.com/aisera-platform/tenant-setup/aisera-platform-configuration/tenant-configuration-settings/public-search.md).

# Public Search

The **Settings > Configuration > Public Search** section controls how Aisera performs public web searches to supplement answers your internal knowledge base does not cover. It includes credentials and endpoint settings for each supported search engine, and controls how Aisera fetches and summarizes content from external knowledge base domains. These are tenant-level settings that apply across all bots in your tenant.

## Search engine configuration

These settings determine which search engine Aisera uses for public web searches and provide the credentials and endpoint configuration required for each engine to function.

### Search Engine

| **Type**    | Dropdown |
| ----------- | -------- |
| **Default** | Google   |

Selects which search engine Aisera uses when performing public web searches to supplement answers your internal knowledge base does not cover. When Aisera cannot answer a question from internal knowledge sources, it queries the configured search engine to retrieve relevant public web content. For Google to function, you must populate the **Google API Key** and **Google Engine ID** fields with valid credentials.

{% hint style="info" %}
A connector-based Google Search integration configured at the bot level takes precedence over this setting.
{% endhint %}

### Google Base URL

| **Type**    | Text field                    |
| ----------- | ----------------------------- |
| **Default** | `https://www.googleapis.com/` |

Sets the root endpoint Aisera uses when making requests to the Google Custom Search API. Change this only if your organization routes outbound API traffic through a proxy or gateway rather than calling Google's API directly. This field has no effect when a connector-based Google Search integration exists at the bot level.

{% hint style="warning" %}
Entering an invalid or empty URL causes public search to fail silently. There is no validation on this field.
{% endhint %}

### Google API Key

| **Type**    | Text field     |
| ----------- | -------------- |
| **Default** | Not configured |

The API key Aisera uses to authenticate with the Google Custom Search API when performing public web searches. This key applies across the conversation, neural search, and Retrieval-Augmented Generation (RAG) pipelines as the tenant-level credential for Google search. If this field is empty and you have not configured a bot-level connector integration, public search will not execute. You must also configure the **Google Engine ID** field for public search to function.

See also: [Google Engine ID](#google-engine-id)

### Google Engine ID

| **Type**    | Text field     |
| ----------- | -------------- |
| **Default** | Not configured |

Identifies the specific Google Programmable Search Engine Aisera queries when performing public web searches. You can scope each engine to specific sites, languages, or content filters in the Google Programmable Search Engine control panel. This field applies across the conversation, neural search, and RAG pipelines. If empty and you have not configured a bot-level connector integration, public search will not execute.

See also: [Google API Key](#google-api-key)

### Bing Base URL

| **Type**     | Text field                        |
| ------------ | --------------------------------- |
| **Default**  | `https://api.bing.microsoft.com/` |
| **Requires** | **Search Engine** set to Bing     |

Sets the root endpoint Aisera uses when making requests to the Microsoft Bing Search API. Change this only if your organization routes outbound API traffic through a proxy or gateway rather than calling Microsoft's API directly.

{% hint style="warning" %}
Clearing this field causes Bing search requests to fail. There is no fallback if the value is empty.&#x20;
{% endhint %}

See also: [Bing Subscription Key](#bing-subscription-key)

### Bing Subscription Key

| **Type**     | Text field                    |
| ------------ | ----------------------------- |
| **Default**  | Not configured                |
| **Requires** | **Search Engine** set to Bing |

The subscription key Aisera uses to authenticate with the Microsoft Bing Search API when performing public web searches via the Bing engine. If this field is empty, Bing search will not execute. Obtain this key from the Azure portal under your Bing Search resource.

### Tavily Base URL

| **Type**     | Text field                      |
| ------------ | ------------------------------- |
| **Default**  | `https://api.tavily.com`        |
| **Requires** | **Search Engine** set to Tavily |

Sets the root endpoint Aisera uses when making requests to the Tavily Search API. Change this only if your organization routes outbound API traffic through a proxy or gateway rather than calling Tavily's API directly.

{% hint style="warning" %}
&#x20;Clearing this field causes Tavily search requests to fail. There is no fallback if the value is empty.
{% endhint %}

See also: [Tavily API Key](#tavily-api-key)

### Tavily API Key

| **Type**     | Text field                      |
| ------------ | ------------------------------- |
| **Default**  | Not configured                  |
| **Requires** | **Search Engine** set to Tavily |

Authenticates Aisera with the Tavily Search API when performing public web searches via the Tavily engine. If this field is empty, Tavily search will not execute. Obtain this key from your Tavily account.

See also: [Tavily Base URL](#tavily-base-url)

## KB summarization

These settings control whether Aisera generates AI-summarized answers from fetched web articles, and how the content fetcher behaves when retrieving pages from specific domains.

### Enable KB Answer Summarization

| **Type**    | Checkbox |
| ----------- | -------- |
| **Default** | Enabled  |

When enabled, Aisera retrieves the full text of a public search result and passes it to an AI model alongside your original query to generate a focused answer. If the article content is not relevant to the query, Aisera does not show the result. When disabled, Aisera returns the short excerpt the search engine provides without fetching the article or invoking the AI model.

{% hint style="info" %}
Summarization only runs when a public search returns exactly one result. Multiple results bypass this step regardless of this setting.
{% endhint %}

### KB Content Fetcher Domain And Target Element Mappings

| **Type**    | JSON                                                             |
| ----------- | ---------------------------------------------------------------- |
| **Default** | Pre-configured entries for several common knowledge base domains |

Controls how Aisera waits for page content to load when fetching web articles during knowledge base (KB) answer summarization. For domains that use JavaScript to render their content, this configuration tells the headless browser which element to wait for before reading the page. Domains not present in the mapping use default timing: a 15,000 ms page load timeout, 5,000 ms locator timeout, and `DOMCONTENTLOADED` load strategy.

Configure this field when KB summarization is returning empty or incomplete content from a specific domain.

{% hint style="warning" %}
If this field contains invalid JSON, the mapping falls back to built-in defaults and no tenant-specific entries will apply.&#x20;
{% endhint %}

The default configuration includes entries for the following domains:

```json
{
  "kb.vmware.com": "//*[contains(@id, 'article_content')]",
  "support.microsoft.com": "//*[contains(@id, 'supArticleContent')]",
  "support.carta.com": "//*[contains(@class, 'article')]",
  "slack.com": "//*[contains(@class, 'content_col')]",
  "help.duo.com": "//*[contains(@class, 'test-id__section-content')]",
  "support.dave.com": "//*[contains(@class, 'article-content')]",
  "support.ringcentral.com": "//*[contains(@id, 'article-v2-root')]",
  "gap.com": "//article",
  "support.zoom.com": "//*[contains(@class, 'kb-wrapper')]"
}
```

#### JSON format

The value is either a locator string in simple format, or a configuration object in full format.

Simple format:

```json
{
  "support.example.com": "//*[contains(@id, 'article-body')]"
}
```

Full format:

```json
{
  "support.example.com": {
    "locator": "//*[contains(@id, 'article-body')]",
    "loadStrategy": "NETWORKIDLE",
    "pageLoadTimeoutMS": 20000,
    "locatorLoadTimeoutMS": 8000
  }
}
```

<table><thead><tr><th width="203">Field</th><th width="97">Type</th><th width="167">Default</th><th>Description</th></tr></thead><tbody><tr><td><code>locator</code></td><td>String</td><td><code>xpath=/html/body</code></td><td>Element to wait for before reading the page</td></tr><tr><td><code>loadStrategy</code></td><td>String</td><td><code>DOMCONTENTLOADED</code></td><td>Page load event to wait for during navigation</td></tr><tr><td><code>pageLoadTimeoutMS</code></td><td>Integer</td><td><code>15000</code></td><td>Maximum milliseconds to wait for the page to load</td></tr><tr><td><code>locatorLoadTimeoutMS</code></td><td>Integer</td><td><code>5000</code></td><td>Maximum milliseconds to wait for the locator element to appear</td></tr></tbody></table>

Valid `loadStrategy` values:

* `DOMCONTENTLOADED`: waits until the HTML is fully parsed. Fast and suitable for most static pages.
* `LOAD`: waits until the page and all resources have finished loading.
* `NETWORKIDLE`: waits until there are no active network connections for at least `500ms`. Use for pages that load article content via API calls after the initial render.
* `COMMIT`: waits only until the browser has received the first response bytes. Rarely needed.

The `locator` field accepts XPath expressions. Common patterns:

```
//*[@id='article-content']              Match by element ID
//*[contains(@id, 'article')]           Partial ID match
//*[contains(@class, 'kb-article')]     Match by CSS class
//article                               Match by element type
```

#### Finding the right locator

1. Open the target support article in a browser.
2. Right-click the main article body and select **Inspect**.
3. Look for an `id` or `class` attribute on the containing `<div>` or `<article>` element.
4. Use `//*[@id='exact-id-value']` for a stable ID, or `//*[contains(@class, 'class-name')]` for a class.

If Aisera is returning incomplete content for a domain, try switching to `NETWORKIDLE` and increasing `pageLoadTimeoutMS`. These pages typically load article content via JavaScript after the initial page load.

{% hint style="info" %}
The locator controls when Aisera reads the page, not what it extracts. Aisera always passes the full page content to the AI model.
{% endhint %}
