Retrieval for help-center bots that finds the error code.
Your backend writes each help center’s articles and tickets to its own namespace. The bot searches only that one, by exact text, regex, filters or meaning. Quiet help centers cost only what they store.
From recorded runs, with how each was measured, on the benchmarks page.
One namespace per help center
Hosting bots for many companies? Each one’s articles, macros and tickets go in a namespace of its own, made by the first write. A help center nobody is asking about costs only its bytes in S3.
Error codes and order numbers, found exactly
Customers paste E401, SKU-88-B and ACME-1042. Embeddings blur those; literal and regex search doesn’t. Vectors cover the questions asked in their own words, in the same API.
A bot sees only its own company
Give each bot a read-only key limited to its namespace. Every other company’s data answers 404, exactly as if it didn’t exist, so a prompt injection can’t reach it.
Your backend writes, the bot searches
The agent doesn’t have to write anything. Sync articles from your CMS with the API or the Python and TypeScript clients; the bot only reads.
HC=https://api.skimmerdb.com/v1/namespaces/help-acme # one per help center # your backend writes articles (with an embedding you computed) curl $HC/docs -H "Authorization: Bearer $ADMIN" -d '{ "docs": [{"id": "kb-218", "text": "Fixing error E401 when signing in on mobile ...", "meta": {"kind": "article", "product": "mobile", "lang": "en"}, "vector": [0.12, -0.03, ...]}]}' # or load last year's resolved tickets in one call curl "$HC/import?format=ndjson&id=ticket&text=subject,body" \ -H "Authorization: Bearer $ADMIN" --data-binary @tickets.ndjson
# the customer typed an error code: find it exactly curl $HC/search -H "Authorization: Bearer $BOT" -d '{ "q": "E401", "filter": {"lang": "en"}}' # a question in their own words: by meaning, same filters curl $HC/search -H "Authorization: Bearer $BOT" -d '{ "vector": [0.08, 0.11, ...], "filter": {"kind": ["article", "macro"], "product": "mobile"}, "limit": 6}'
Isolation the bot can’t talk its way past
Most retrieval setups put every customer in one index and trust a tenant_id filter in your code. Here the boundary is the key: the bot’s key can read one namespace and nothing else.
- Read-only. A bot can search its help center; it can’t write to it or delete from it.
- Invisible neighbours. Other namespaces answer exactly like names nobody has.
- Capped. Requests a second, queries and writes a period, per key.
# the bot for Acme's help center: read-only, Acme's namespace only
curl https://api.skimmerdb.com/v1/keys -H "Authorization: Bearer $ADMIN" -d '{
"name": "acme support bot", "scope": "read",
"namespaces": ["help-acme"], "rate_per_s": 20}'Support patterns
| Support platform | A namespace per customer company (help-acme, help-globex). Your backend syncs their articles; their bot gets a key for their namespace only. |
| Articles + resolved tickets | Both in one namespace, told apart by kind in metadata. Filter to articles for answers, to tickets for “has this happened before?”. |
| By product and language | Metadata like product, plan and lang narrows every query, text or vector, before any document is read. |
| Edits go live fast | An article fixed in the CMS is searchable about 33 ms after the write is stored. Writing the same id again replaces it. |
| What customers ask | Log the bot’s questions to a second namespace and run SQL over them: the most asked topics, the error codes with no article. |
Questions
What does SkimmerDB do in a help-center chatbot?
It is the retrieval step. Your backend writes the help center’s articles, macros and tickets; when a customer asks something, the bot searches them by exact text, regex, metadata filters or vector similarity, and passes the best passages to the model that writes the answer. Chunking and the model call stay in your code.
Do I need embeddings?
No. Text and regex search need nothing but the text, and they are what finds an error code, an order number or a product name. Add an embedding to each document (from OpenAI, Voyage, Cohere or your own model) when you want questions matched by meaning too; text and vectors work on the same copy.
I host chatbots for many companies. How do I keep their data apart?
Give each company its own namespace and its bot a key limited to it, read-only. A namespace outside a key’s reach answers exactly like one that doesn’t exist, over the REST API and MCP alike. Caps per key limit each bot’s rate, queries and writes a period.
What does a quiet help center cost?
Only its storage: $0.10 per GB-month on pro, and the free plan includes 1 GB. A namespace nobody is asking about runs no server or process of its own; its first query after a long sleep reads from object storage in a round trip or two.
How fast is it?
About 0.8 ms at the median for a warm text query on real S3 in our benchmarks, and recall@10 of 0.97 for vector search with the defaults. A namespace read cold from object storage answers in tens of milliseconds. Every answer says whether it was warm or cold.
Can I import an existing knowledge base?
Yes: up to 2 GB of CSV, NDJSON or Parquet in one call, with the columns you name as text and the rest as metadata to filter on. Writes of up to 10,000 documents at a time keep it in sync after that.
Give every help center its own index
Free up to 1 GB stored and 100k queries a month. No card to start.