Your written policy decides, not the model.
Corpus runs your team's rules over the facts your agent sends: same facts, same decision, same trace.
curl -X POST https://corpus.trysenda.xyz/v1/experts/deal-desk/query \ -H "Authorization: Bearer sk_corpus_ZBNd7jg2ZZlpXfpKPmv2UppUcYwK33FxYpzBpVkAgX8" \ -H "Content-Type: application/json" \ -d '{"goal":"discount_decision","facts":{"discount_pct":"18","deal_size_usd":"40000","customer_tier":"strategic"}}'- QuestionCan sales give this customer an 18% discount?
- Facts sentdiscount_pct = 18deal_size_usd = 40000customer_tier = strategic
- Rule that decidedstrategic_middiscount_pct <= 25 and deal_size_usd < 250000 and customer_tier = strategic
- Written inDeal desk policy v3
- AnswerApproveddiscount_decision = approved
{ "outcome": "resolved", "conclusion": "approved", "needs": null, "reason": null, "certainty": 1, "expert": {"id":"59390982-f382-4817-b2c5-19903520001b","name":"deal-desk","version":1,"graphHash":"72fd4a683dd96ce63cdc29448f75f66e"}, "trace": [ {"id":"s1","parentId":null,"kind":"goal","concept":"discount_decision","provenance":{"kind":"caller","field":"discount_decision"},"expert":"deal-desk","expertVersion":1}, {"id":"s2","parentId":"s1","kind":"fact","concept":"discount_pct","value":"18","provenance":{"kind":"caller","field":"discount_pct"},"expert":"deal-desk","expertVersion":1}, {"id":"s3","parentId":"s1","kind":"fact","concept":"deal_size_usd","value":"40000","provenance":{"kind":"caller","field":"deal_size_usd"},"expert":"deal-desk","expertVersion":1}, {"id":"s4","parentId":"s1","kind":"fact","concept":"customer_tier","value":"strategic","provenance":{"kind":"caller","field":"customer_tier"},"expert":"deal-desk","expertVersion":1}, {"id":"s5","parentId":"s1","kind":"rule","concept":"discount_decision","value":"approved","detail":"discount_pct <= 25 and deal_size_usd < 250000 and customer_tier = strategic","provenance":{"kind":"rule","ruleId":"strategic_mid","expert":"deal-desk","version":1},"expert":"deal-desk","expertVersion":1}, {"id":"s6","parentId":"s5","kind":"document","concept":"discount_decision","value":"approved","provenance":{"kind":"document","documentId":"81234e2f-203f-4801-a514-064ed4733301","version":3,"title":"Deal desk policy"},"expert":"deal-desk","expertVersion":1} ], "traceHash": "41173f97e161f239df5404ab9d6b98f1", "inputHash": "11105ef571be321fb181c501c40c00a7"}Outcome resolved, trace hash 41173f97e161f239df5404ab9d6b98f1
Every claim quotes your documents.
POST /v1/answers cites the document, version and a code-checked quote for each claim, or refuses with not_in_documents.
curl -X POST https://corpus.trysenda.xyz/v1/answers \ -H "Authorization: Bearer $CORPUS_KEY" \ -H "Content-Type: application/json" \ -d '{ "question": "What is the daily meal allowance on a full travel day?" }'{ "mode": "knowledge", "outcome": "resolved", "answer": "The daily meal allowance is USD 55 per full travel day.", "claims": [ { "text": "The daily meal allowance is USD 55 per full travel day.", "support": 0.97, "citations": [ { "title": "Travel and Expense Policy", "version": 2, "chunk": 4, "quote": "The daily meal allowance is USD 55 per full travel day." } ] } ], "unanswered": [], "reason": null, "confidence": 0.97}| Language | Correct outcome | Correct refusals | p50 |
|---|---|---|---|
| Englishmodel set free, 2026-09-26 | 16/17 | 6/6 | 13.7 s |
| Spanishmodel set free, 2026-09-26 | 15/17 | 6/6 | 12.4 s |
| Portuguese | pending | ||
Answerable, partial, unanswerable, ambiguous and superseded questions, run on our free development models.
Every answer shows the documents it came from.
Corpus reads your documents in order, keeps only what holds the question up and answers with the quote. If no document says it, it answers nothing, and that is the point.
- QuestionWhat is the daily meal allowance on a full travel day?
- Document readTravel and Expense Policy v1Says USD 45, but v2 replaced it. It does not count.
- Travel and Expense Policy v2Holds it up:
The daily meal allowance is USD 55 per full travel day.
- AnswerUSD 55 per full travel dayWith its quote and its document version, checked by code.
USD 55 per full travel day
Nothing is edited in place.
Old decisions replay on the version they read.
v2- Between 10% and 25%: review, whatever the tier.
v3- Between 10% and 25%, under $250,000: a strategic customer is approved automatically.
| step | on v2 | on v3 |
|---|---|---|
| 1 | goal discount_decision | goal discount_decision |
| 2 | discount_pct = 18 | discount_pct = 18 |
| 3 | deal_size_usd = 40000 | deal_size_usd = 40000 |
| 4 | rule mid_review = approved_with_review | customer_tier = strategic |
| 5 | document v2 | rule strategic_mid = approved |
| 6 | document v3 |
The same question on v3 diverges at step 4.
Replaying the v2 decision: {"matches":true,"divergedAt":null}
Experts, for the team that writes rules.
Typed concepts and rules citing document versions, built with forms and tables.
sample
| Test | Expects | Got | Result |
|---|---|---|---|
| 8% is approved | resolved: approved | resolved: approved | pass |
| 30% is refused | resolved: refused | resolved: refused | pass |
| 18% on $300,000 goes to review | resolved: approved_with_review | resolved: approved_with_review | pass |
| 18% with no tier asks for it | needs_facts | needs_facts | pass |
| Strategic 18% goes to review, as v2 said | resolved: approved_with_review | resolved: approved | fail |
Publish refused with tests_failed: 1 of 5 test(s) failed.
REST for your code, MCP for your agents.
One command behind both; OpenAPI generated from the route schemas.
claude mcp add --transport http corpus https://corpus.trysenda.xyz/mcp \ --header "Authorization: Bearer $CORPUS_KEY"- ask_corpus
- query_expert
- list_experts
- replay_decision
- search_documents
- list_tags
- get_document
- create_document
Scope lives on the key.
One sk_corpus_ key per agent or script, shown once, stored hashed.
- Experts
- Only the experts it names; any other returns
out_of_scope. - Tags
- Only documents under its tags are retrieved or cited.
- Rate
- Its own limit per minute. Revoke it and its calls stop.
Priced by what your agents use.
A decision is one query_expert call, whatever its outcome. An answer is one ask_corpus call for every two parts of its question. A page is 3,000 characters indexed. Reads, search and replay don't count.
| Basic | Pro | Enterprise | |
|---|---|---|---|
| Decisions a month | 25,000 | 250,000 | Agreed |
| Answers a month | 100 | 400 | Agreed |
| Pages indexed a month | 250 | 1,000 | Agreed |
| Monthly | $49 | $199 | From $799 |
| Yearly, two months free | $490 | $1,990 | Yearly contract |
| Get an API key | Get an API key | Contact us |
- BasicGet an API key
- ProGet an API key
- EnterpriseContact us
Every feature on every plan. No free plan. USD, before tax. Cancel anytime; access runs to the period's end.
What your volume costs
- Decisions a month
- 18,000
- Plan
- Basic $49 a month
- Per decision
- $0.0027
- Same answers on a frontier model
- $432 a month
- Same answers on a small, fast model
- $28.80 a month
Model list prices, 2026-09-27, USD per million tokens. For a frontier model: $4 in / $20 outFor a small, fast model: $0.2500 in / $1.50 out
A month is 30 days.
What developers ask first.
- Is the same question always the same answer?
- For decisions, yes: same expert version and facts, same trace hash. Document answers are reworded per call; their quotes are always checked.
- Isn't this retrieval over a vector database?
- Answers use full-text and vector search with a reranker, then drop any claim whose quote fails the code check or the judge. Decisions use no retrieval and no model.
- What happens when a fact is missing?
- You get
needs_facts, withneedsnaming each missing concept and its type. Branch on the outcome, never on prose. - Is there a free tier?
- No, and no trial. The playground and docs show every request and response before you pay.
Your first decision, with its trace.
Write a policy, publish an expert, mint a key and make your first call.
Want an agent that runs on it? Line