Support agents

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.

0.8mswarm query p50, on real S3
0.97vector recall@10, defaults
~33msarticle edit to searchable
$0compute for a quiet help center

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.

index the help center
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
answer a customer
# 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.
a key for one bot
# 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 platformA namespace per customer company (help-acme, help-globex). Your backend syncs their articles; their bot gets a key for their namespace only.
Articles + resolved ticketsBoth in one namespace, told apart by kind in metadata. Filter to articles for answers, to tickets for “has this happened before?”.
By product and languageMetadata like product, plan and lang narrows every query, text or vector, before any document is read.
Edits go live fastAn article fixed in the CMS is searchable about 33 ms after the write is stored. Writing the same id again replaces it.
What customers askLog 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.