Skip to the page

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

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.
  1. 1. Get a SpecStream API key

    Get your key 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. 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
    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. 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
    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. 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. 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 has the details.

Next to Tavily, Firecrawl and the free options

Provider in the appSearchPage readsCustom address
firecrawl with the SpecStream address$1 per 1,000 searches of up to 10 results$0.80 per 1,000 pages with textYes, NUXT_WEB_SEARCH_API_BASE
firecrawl with Firecrawl's own APIFirecrawl's planFirecrawl's planYes
tavily (the default)Tavily's planTavily extractNo
parallelKeyless free tier, Server Mode only, shared rate limitsYesNo

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 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 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 [email protected].

More

SpecStream for Deep Research Web UI covers what it does in Deep Research Web UI on one page. Every other tool has its guide in Connect your tools. You see the most a request can cost before it starts, and the matches are paid from your balance. Billing has the details. For help, email [email protected].