> SpecStream is the live web data engine for teams and agents. This is the Markdown copy of https://specstream.ai/docs/integrations/dsh-web-search-multi. Every page, with what SpecStream does and costs: https://specstream.ai/llms.txt

# dsh-web-search-multi

Enter `https://api.specstream.ai/searxng` as the SearXNG instance URL in dsh-web-search-multi, put your SpecStream key in the token box, and choose SearXNG as the preferred provider. DeepSeek Harness then searches through SpecStream's Search API, and your other engines stay as the fallback.

[SpecStream for dsh-web-search-multiCoding agents](https://specstream.ai/integrations/dsh-web-search-multi.md)

## What you need

-   DeepSeek Harness (dsh) and Node.js 20 or newer, with the plugin in the `web` profile: `dsh plugin --profile web add github:cinob/dsh-web-search-multi`.
-   A SpecStream key. [Get your key](https://specstream.ai/workspace/search?route=searxng&utm_source=dsh-web-search-multi&utm_medium=howto) on the Search API screen of your SpecStream workspace. New accounts start with $10 of credit, no card.

1.  1

    ## 1. Open the plugin's settings

    Run `dsh web` and open `http://127.0.0.1:3080`. Click **Settings** (the gear icon), then **多源 Web 搜索** (multi-source web search) in the sidebar.

2.  2

    ## 2. Fill in the SearXNG row

    Under **API 密钥与自建实例** (API keys and self-hosted instances), find **SearXNG (自建开源实例)**. In the instance URL box, the one that shows `实例 URL (如 http://127.0.0.1:8888)`, enter the address below. Leave `/search` off: the plugin adds `/search` and `format=json` itself.

    In the token box next to it, `访问 Token / 认证密钥 (选填)`, paste your SpecStream key. The plugin sends the token as a Bearer token, which is where SpecStream reads the key.

    Instance URL

    ```text
    https://api.specstream.ai/searxng
    ```

3.  3

    ## 3. Save

    Click **保存所有输入与密钥** (save all inputs and keys). The banner `✓ 配置已持久化保存并立即生效！` means the change is saved and applies from the next search, with no restart. The address goes to `~/.dsh/settings.yaml` and the token to `~/.dsh/.credentials.yaml`.

4.  4

    ## 4. Choose SearXNG as the preferred provider

    In **首选搜索提供方 (Preferred Provider)**, select **SearXNG (自建开源无限制)**. It saves on change.

    Do not leave it on **自动策略 (Auto)**. On Auto the plugin tries Tavily, Brave, Serper and Bocha when they have keys, then 360, Bing and Baidu, which need no key and are always on, and SearXNG only after all of them. So on Auto, SpecStream is almost never asked.

    Keep **启用自动平滑降级 (Auto Fallback)** on, and the other engines answer when a SpecStream search fails.

5.  5

    ## 5. Test it

    Under **在线连通性测试 & 搜索预览** (connection test and search preview), pick **SearXNG** in the list, type a query and click **发起测试** (run test). The result list shows titles and links from SpecStream. Then ask dsh about something from this week.

## Or set it with environment variables

With no address saved in the settings tab, the plugin reads `SEARXNG_URL` from the environment dsh starts with, and the token from `SEARXNG_TOKEN` when the credentials file has none. The preferred provider still has to be SearXNG, chosen in the settings tab.

## What the plugin sends, and what comes back

| dsh-web-search-multi sends | SpecStream |
| --- | --- |
| `GET {instance URL}/search?q=...&format=json` | `https://api.specstream.ai/searxng/search` |
| The token as `Authorization: Bearer`, as `X-Searxng-Token`, and as `token` and `auth` in the query | Reads the key from the Bearer token |
| Reads `results[].url`, `title`, `content` and `publishedDate`, and keeps the first 8 unless dsh asks for another count | SearXNG's JSON: `results[]` with `title`, `url` and `content`. `publishedDate` is null on most results |

## Why the SearXNG row is the way in

The plugin's Tavily, Brave, Serper and Bocha adapters call each provider's own address, written in the code, with no setting to change it. The SearXNG row is the one that takes an address, and its token box takes a key.

A self-hosted or public SearXNG instance answers this plugin only when JSON output is enabled in its `settings.yml`. SearXNG's docs say a format that is not enabled answers 403, and that many public instances turn these formats off. SpecStream answers every request in SearXNG's JSON shape, and the search runs on SpecStream's servers, so there is no instance to host and no engine list to keep unblocked.

## What each search costs

Each search the plugin sends to the SearXNG address is one Search API call on the fast tier: $1 per 1,000 searches of up to 10 results, a fifth of the default search's $5. The plugin sends no result count, so each call gets one page of 10 at that price, and a search that returns nothing costs nothing. Each test search in the settings tab is one search.

Searches come out of your balance with no quote and no approval. New accounts start with $10 of credit, no card. Questions go to [support@specstream.ai](mailto:support@specstream.ai).

## Limits and errors

-   When search is busy, SpecStream answers `429` with a `Retry-After` header and charges nothing. With Auto Fallback on, the next engine answers that search.
-   A key SpecStream does not accept answers `401`. The test shows `SearXNG search failed (401)` with SpecStream's message. Check the token, and that the key can search: keys made on the Search API screen can.
-   The token box is optional in the plugin, but SpecStream needs it. An instance URL with no token answers with a missing key error.

## Keep the key private

The token is kept in `~/.dsh/.credentials.yaml` with mode 0600, as the plugin's README says. The plugin also puts the token in the request address as `token` and `auth`, so it shows in the logs of any proxy dsh sends through. To end a key's access, revoke it under **API keys** in **Agents & API** in your workspace and make a new one.

## Read pages and get rows too

The same key reads pages with the [Extract API](https://specstream.ai/docs/extract-api.md) at $0.80 per 1,000 pages, and a page with no text is not charged. For a dataset, add SpecStream's MCP server at `https://api.specstream.ai/mcp` and ask for the records in plain words. Deep Search returns every match as structured rows at 5¢, 15¢ or $1 a row, under a maximum you approve. See [MCP](https://specstream.ai/docs/mcp.md). Other DeepSeek Harness plugins: [dsh-searxng](https://specstream.ai/docs/integrations/dsh-searxng.md) and [dsh-web-search-free](https://specstream.ai/docs/integrations/dsh-web-search-free.md).

## Remove

Run `dsh plugin --profile web remove dsh-web-search-multi`. Then revoke the key in your workspace if you no longer use it.

## More

[SpecStream for dsh-web-search-multi](https://specstream.ai/integrations/dsh-web-search-multi.md) covers what it does in dsh-web-search-multi on one page. Every other tool has its guide in [Connect your tools](https://specstream.ai/docs/integrations.md). You see the most a request can cost before it starts, and the matches are paid from your balance. [Billing](https://specstream.ai/docs/billing.md) has the details. For help, email [support@specstream.ai](mailto:support@specstream.ai).
