Corpus Quality · for developers

Find the documents that make your answers wrong, from the API.

Upload and ask in two calls, with no vector database or pipeline to build or run. Then check and score: the check names every pair of passages that disagree, the score ranks every document worst first. Both are one call each, computed when you call them, so they are current the moment an upload returns.

No card. Checks and scores are free on one collection of up to 500 documents, as often as you like.

Voxell’s research model, Ingot-8B-R3, ranks #1 for English on the public MTEB leaderboard (English v2). These calls run on Voxell’s production models: Turbo by default, and Pro, the larger one, where you switch it on.

Catch the refund conflict in one call

curl https://api.voxell.ai/v1/answers/support-kb/conflicts \
  -H "Authorization: Bearer $VOXELL_KEY"

# response, abridged to one of five
{
  "conflicts": [
    { "from": "support-kb/refund-policy.md#2",
      "to": "support-kb/macro-refund.md#0",
      "referent": "refund window",
      "rationale": "One passage says 30 days, the other 14 days. Neither is dated, so both cannot be current." },
    ...
  ]
}

support-kb is the collection’s name. A pair is not a conflict when the text itself says when each value applies (“until Feb 28”, “from Mar 1”): both are kept and search picks the one the question asks about.

The calls, with real responses

1

Add documents

The collection is created on first upload. Up to 256 documents per batch call; text and Markdown today. Upload a document again under the same name when it changes: it becomes a new version, and a fix applied to the old one is kept unless the new text changes that passage.

curl -X POST https://api.voxell.ai/v1/answers/support-kb/batch \
  -H "Authorization: Bearer $VOXELL_KEY" \
  -H "Content-Type: application/json" \
  -d '{"documents": [
        {"name": "refund-policy.md", "text": "..."},
        {"name": "macro-refund.md", "text": "..."}
      ]}'
2

Ask a question

mode is vectors by default: the ranked passages only, for when your own model writes the answer. With "mode": "answer" you get the answer and the passages it read (the API calls a passage a chunk). retrieval.health is about coverage only: weak or absent when the documents do not cover the question. When two passages it read disagree on a fact, the answer is held: held is true, answer carries a safe message instead of either value, and conflicts names both passages, so a staff tool can show the two side by side. Voxell holds it; your code decides what a held answer looks like. The collection’s owner settles it with one click from the email they get, and the next call returns the answer with held false. The check behind held runs as documents are uploaded, so a query made straight after an upload already sees it.

curl -X POST https://api.voxell.ai/v1/answers/support-kb/query \
  -H "Authorization: Bearer $VOXELL_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "How long do customers have to request a refund?",
       "mode": "answer", "top_k": 5}'

# response, abridged to two of the five passages
{
  "mode": "answer",
  "answer": "For the current refund window, please contact our support team.",
  "held": true,
  "chunks": [
    { "doc_id": "support-kb/macro-refund.md",
      "chunk_index": 0, "score": 0.89,
      "text": "Refunds are available within 14 days of purchase." },
    { "doc_id": "support-kb/refund-policy.md",
      "chunk_index": 2, "score": 0.88,
      "text": "Customers can request a full refund within 30 days of purchase." }
  ],
  "retrieval": { "health": "healthy", "top_score": 0.89 },
  "conflicts": [
    { "referent": "refund window",
      "from": "support-kb/refund-policy.md#2",
      "to": "support-kb/macro-refund.md#0" }
  ]
}
3

Score the collection

A 0–100 score for the collection and for every document, worst first, each with its reason and a recommended action. It explains why questions are missed: duplicates, fragments, passages too generic to rank.

curl -X POST https://api.voxell.ai/v1/answers/support-kb/vqs \
  -H "Authorization: Bearer $VOXELL_KEY"

# response, abridged
{
  "corpus_vqs": 70,
  "scored_docs": 1180,
  "scored_chunks": 10940,
  "per_doc": [
    { "name": "Macro: Password reset (v3)",
      "score": 21, "action": "review",
      "top_reason": "near-duplicate chunks detected — consider deduping" },
    ...
  ]
}

Run it in CI

Keep a staging collection that mirrors live. Upload the documents a change touched to it, then fail the build if conflicts went up from your baseline or the score fell below your bar. Both calls are computed on request, so they see the upload you just made. Pick the bar from your own first score: the sample company’s collections run from 36 to 91. Neither check needs test questions, so they work from day one. A second collection for staging is on the $100 plan, which checks every collection; on a free key, run the same two calls on your one collection after each upload.

# 1. upload what this change touched to the staging collection,
#    a standing copy of live (created on its first upload)
curl -s -X POST https://api.voxell.ai/v1/answers/support-kb-staging/batch \
  -H "Authorization: Bearer $VOXELL_KEY" \
  -H "Content-Type: application/json" -d @changed-docs.json

# 2. fail if conflicts rose from the committed baseline,
#    or the score fell below 80
conflicts=$(curl -s \
  https://api.voxell.ai/v1/answers/support-kb-staging/conflicts \
  -H "Authorization: Bearer $VOXELL_KEY" | jq '.conflicts | length')
score=$(curl -s -X POST \
  https://api.voxell.ai/v1/answers/support-kb-staging/vqs \
  -H "Authorization: Bearer $VOXELL_KEY" | jq '.corpus_vqs')
[ "$conflicts" -le "$(cat .voxell/conflicts.baseline)" ] \
  && [ "$(printf '%.0f' "$score")" -ge 80 ] || exit 1

What a vector database will not tell you

You can build upload-and-ask yourself with any embedding model and pgvector. This is what you would still have to build:

Embeddings and a vector databaseVoxell
Search over your documents, with the passages it readYesYes
Conflicting facts found across documents, both passages named–Yes
A 0–100 score for every document and collection, with the reason–Yes
Test questions your owners approve, compared like for like after every change–Yes
Fixes tried on a copy and re-scored before they ship, every version kept–Yes
A flag on every answer when the documents do not cover the question–Yes

Search runs on Voxell’s own production models: Turbo (1,024 dimensions) by default, and Pro (2,560 dimensions), the larger search model, where a collection’s owner switches it on. Answers are written by Gemini on Google Vertex AI, from the passages search returned. The examples here are the sample company’s; on your key, every number is measured on your own documents. If you leave, your documents and every fixed version download through the API.

Which number to watch

Conflicts

A count, from /conflicts. Zero is the only good number; each one is an answer that depends on luck.

VQS, the grade

The Vector Quality Score: 0–100 from /vqs, for the collection and each document. The dashboard shows it as the grade (A is 90+). It says what to fix first. Gate CI on it from day one.

Found

Once your owners approve test questions in the dashboard (not a day-one number): how many find their passage among the 5 an answer is written from, the default top_k. This is the headline for your manager.

Ranked first, nDCG@10

The stricter versions of Found: the right passage first, and credit for how high it ranks in the top 10. 1.00 means it always came first.

Limits and price

Free key

Free · no card

50 answers a month, 1 Space and 100 requests a minute. Checks and scores run free on one collection of up to 500 documents, as often as you like. (Storage itself has room for about 5,000 documents; the 500 is the limit for the free checks.)

Get a free API key

Answers at volume

$20/month, or $15 billed yearly

10,000 answers a month for your product or a Space, all three search models (Turbo, Pro and Ultra), and checks and scores still on your one free collection. On the pricing page this plan is called Precision.

See the plan

Checks on everything

$100/month, cancel anytime

50,000 answers a month, and checks and scores on every collection, not just the first. Past the included answers on any paid plan, a $25 top-up buys about 16,667 more.

Start now

A team

$80/person/month, billed yearly

Usage pools across the team: each premium seat adds 50,000 answers a month and each standard seat ($15) adds 10,000. Your product’s calls draw on the pool and need no seat.

Cost at your size

Rate-limited calls return 429; retry with backoff. A call past your included answers with no top-up credit returns 402, never a surprise bill. How we measure latency · Security and buying