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

# Deep Research Web UI

Deep Research Web UI takes a Firecrawl API base address, so its searches and page reads can run on the SpecStream Search API and Extract API. Set the provider to firecrawl and the base to https://api.specstream.ai/firecrawl, in Server Mode or in the browser settings.

[SpecStream for Deep Research Web UIAgent frameworks & builders](https://specstream.ai/integrations/deep-research-web-ui.md)

## What you need

-   Deep Research Web UI, from the Docker image `anotia/deep-research-web` or from source, with an AI provider set up as usual.
-   A SpecStream API key. New accounts start with $10 of credit, no card. [Create an account](https://specstream.ai/signup?utm_source=deep-research-web-ui).

1.  1

    ## 1. Get a SpecStream API key

    [Get your key](https://specstream.ai/workspace/search?route=firecrawl&utm_source=deep-research-web-ui&utm_medium=howto) on the Search API screen of your SpecStream workspace. The app sends it as a Bearer token, the way it sends a Firecrawl key.

2.  2

    ## 2. Server Mode: set four variables

    In Server Mode the keys stay on the server and users configure nothing. Set the search provider to `firecrawl`, put your SpecStream key in `NUXT_WEB_SEARCH_API_KEY`, and set `NUXT_WEB_SEARCH_API_BASE` to the SpecStream Firecrawl address. Keep your AI variables as they are:

    Shell

    ```bash
    docker run -p 3000:3000 \
      -e NUXT_PUBLIC_SERVER_MODE=true \
      -e NUXT_AI_API_KEY=your-ai-api-key \
      -e NUXT_PUBLIC_AI_PROVIDER=openai-compatible \
      -e NUXT_PUBLIC_AI_MODEL=gpt-4o-mini \
      -e NUXT_PUBLIC_WEB_SEARCH_PROVIDER=firecrawl \
      -e NUXT_WEB_SEARCH_API_KEY=YOUR_SPECSTREAM_KEY \
      -e NUXT_WEB_SEARCH_API_BASE=https://api.specstream.ai/firecrawl \
      anotia/deep-research-web:latest
    ```

3.  3

    ## 3. Or with an .env file

    Copy `.env.example` to `.env`, change these three lines, and start the container with `--env-file .env`. Write the address without `/v2`: the app's Firecrawl SDK adds `/v2/search` and `/v2/scrape` to it.

    .env

    ```bash
    NUXT_PUBLIC_WEB_SEARCH_PROVIDER=firecrawl
    NUXT_WEB_SEARCH_API_KEY=YOUR_SPECSTREAM_KEY
    NUXT_WEB_SEARCH_API_BASE=https://api.specstream.ai/firecrawl
    ```

4.  4

    ## 4. Client Mode: set it in Settings

    In Client Mode, each user sets the provider in the browser. Open **Settings** (the gear button), open the **Web Search Provider** section, and choose **Firecrawl**. Paste your SpecStream key into **API Key** and `https://api.specstream.ai/firecrawl` into **API Base URL**, then select **Save**. The settings are stored in your browser, and the browser calls SpecStream directly. The SpecStream address accepts calls from any web origin, so this works on a static deployment such as EdgeOne Pages too.

5.  5

    ## 5. Run a research and check it

    Start a research on something from this week. The search tree fills with results, and the report links its sources. Each call is in the request log of your SpecStream workspace with the route as its endpoint, and each charged reply carries an `X-Balance-Cents` header with your balance in cents.

## Why the Firecrawl setting

The app reads a custom API base only for `firecrawl` and `crw`. Its Tavily, Google PSE and You.com paths call fixed addresses, so the Firecrawl path is the one that can point at SpecStream. You keep the rest of the app as it is: the AI provider, the research depth and breadth, the history and the PDF export.

## What the app sends

-   Each search query is one `POST /firecrawl/v2/search` with `limit` 5 and `scrapeOptions` asking for `markdown`. SpecStream answers in Firecrawl's shape, `data.web[]` with `url`, `title`, `description` and `markdown`. When the research plan wants news, the app asks for `sources` news, and SpecStream runs a news search.
-   When the model wants to read a source in full, the app sends `POST /firecrawl/v2/scrape` with `formats` markdown and `onlyMainContent`. SpecStream answers with `data.markdown` and `data.metadata`. The app reads at most 2 pages per search node and 6 per research run, with a 20 second timeout each.
-   The app applies no language filter on the Firecrawl path. The **Query Language** setting still changes the language the model writes its queries in.

## Cost

Each search through the Firecrawl address is one Search API call at $1 per 1,000 searches of up to 10 results, the fast tier every drop-in address runs on. The app asks for 5 results, so every search is in that price. Each page read through `/v2/scrape` is one Extract API page at $0.80 per 1,000 pages, and a page with no text is not charged. Both come out of your balance with no quote and no approval. New accounts start with $10 of credit, no card. [Balance and billing](https://specstream.ai/docs/billing.md) has the details.

## Next to Tavily, Firecrawl and the free options

| Provider in the app | Search | Page reads | Custom address |
| --- | --- | --- | --- |
| `firecrawl` with the SpecStream address | $1 per 1,000 searches of up to 10 results | $0.80 per 1,000 pages with text | Yes, `NUXT_WEB_SEARCH_API_BASE` |
| `firecrawl` with Firecrawl's own API | Firecrawl's plan | Firecrawl's plan | Yes |
| `tavily` (the default) | Tavily's plan | Tavily extract | No |
| `parallel` | Keyless free tier, Server Mode only, shared rate limits | Yes | No |

## If searches fail

-   `401` with `missing_api_key`: the key did not reach SpecStream. Check `NUXT_WEB_SEARCH_API_KEY`, or the **API Key** field in Client Mode.
-   A `404` or an empty search tree: check that the base is `https://api.specstream.ai/firecrawl`, with no `/v2` and no trailing path.
-   `429` with `Retry-After`: the account used its calls for the minute, or search is busy. Wait that many seconds. Nothing is charged. A lower `NUXT_PUBLIC_WEB_SEARCH_CONCURRENCY_LIMIT`, 2 by default, sends fewer searches at once.
-   In Server Mode, the `NUXT_PUBLIC_` values and the keys are read when the server starts, so restart the container after a change.

## Other ways to use SpecStream

For a list with the same facts on every row, ask an assistant connected to the [SpecStream MCP server](https://specstream.ai/docs/mcp.md) at `https://api.specstream.ai/mcp`. That is Deep Search: priced per delivered row, with the most a run can cost shown before it starts. The [Firecrawl migration page](https://specstream.ai/migrate/firecrawl.md) lists every Firecrawl parameter the address applies.

## Switch back

Set `NUXT_WEB_SEARCH_API_BASE` back to empty, or clear **API Base URL**, and the app calls `https://api.firecrawl.dev` again. Then revoke the key in your SpecStream workspace. Questions go to [support@specstream.ai](mailto:support@specstream.ai).

## More

[SpecStream for Deep Research Web UI](https://specstream.ai/integrations/deep-research-web-ui.md) covers what it does in Deep Research Web UI 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).
