Perplexideez
Set SEARXNG_URL to SpecStream's SearXNG address with your key in it, and perplexideez searches the web through SpecStream's Search API. There is no SearXNG container to run, no Valkey beside it, and no settings.yml to edit for JSON output.
What you need
- A perplexideez server you run with Docker Compose, Kubernetes or bare metal, with the Ollama or OpenAI compatible endpoint its README asks for.
- A SpecStream key. Get your key on the Search API screen of your SpecStream workspace. New accounts start with $10 of credit, no card.
- 1
1. Put your key in the address
perplexideez builds every search as
SEARXNG_URLfollowed by/search?format=json, and sends no key or header of its own. So the key goes in the path, as the address's last part. Put your key in place ofYOUR_SPECSTREAM_KEY, and end the address with no slash:SEARXNG_URL - 2
2. Set SEARXNG_URL in .env
In the
.envyou made fromdeploy/docker/.env.example, replace the SearXNG block.REDIS_URLis used only by the example SearXNG stack, so it can go too. On bare metal, set the same line in the.envthe app starts with..env - 3
3. Take SearXNG out of the Compose stack
The example
compose.ymlincludes./searxng.yml, which starts SearXNG and Valkey, and theperplexideezservice waits untilsearxngis healthy. Remove the include line and thesearxngentry underdepends_on. Keep the rest of the service as it is:deploy/docker/compose.yml - 4
4. Restart and ask
Run this in
deploy/docker. It recreates perplexideez with the new address and removes the SearXNG and Valkey containers:Then ask about something from this week. The Sources list under the answer shows the pages SpecStream returned.
Terminal
What perplexideez sends, and what comes back
| perplexideez sends | SpecStream |
|---|---|
GET {SEARXNG_URL}/search?format=json&q=... | https://api.specstream.ai/searxng/<key>/search, with the key read from the path |
format=json | Always answered in SearXNG's JSON shape. There is no format to turn on |
language=en, on every web search | Passed on as the search language |
Reads results[].title, url and content, and gives each content to the model as the text to answer from | SearXNG's JSON: results[] with title, url and content. publishedDate is null on most results |
Why a self-hosted SearXNG gets in the way
The perplexideez README warns that all requests to SearXNG fail unless JSON output is enabled, and that perplexideez is very likely to trigger SearXNG's limiter, so it advises turning the limiter off. SearXNG's own search API docs say a format that is not enabled answers 403, and that many public instances turn these formats off. A limiter that is off then sends every query from your server's address to public engines.
SpecStream answers every request in SearXNG's JSON shape, and the search runs on SpecStream's servers. There is no format to enable, no limiter to tune and no engine list to keep unblocked.
Related Images and Related Videos
perplexideez asks for images and videos by engine name (bing images, google images and youtube) and keeps only results that carry an image address or a video embed. SpecStream's SearXNG address answers an image search when the request carries categories=images, which perplexideez does not send, so these two panels stay hidden. The answer and its sources do not change.
What each message costs
Each search through 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. perplexideez sends no result count, so each search gets one page of 10 results, and a search that returns nothing costs nothing.
A message can send up to three searches: one for the answer, and one each for related images and related videos. perplexideez repeats the image and video searches on each new message of a chat while that chat holds none, so a message costs at most $0.003. A question that holds links is answered from those links and sends no web search for the answer.
Searches come out of your balance with no quote and no approval. New accounts start with $10 of credit, no card. Questions go to [email protected].
If answers fail
- perplexideez reads the reply as JSON with no status check, so a key SpecStream does not accept shows up as a failed answer. SpecStream answers
401for that key. Check that the whole key is the address's last part, with no slash after it, and that the key can search: keys made on the Search API screen can. - When search is busy, SpecStream answers
429with aRetry-Afterheader and charges nothing. perplexideez does not retry, so send the question again. - The address holds your key. Keep
.envout of git and out of shared Compose files, and in Kubernetes setSEARXNG_URLfrom a Secret. 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 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.
More
SpecStream for Perplexideez covers what it does in Perplexideez 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].