API REFERENCE
One endpoint, every check
Send text and a check type, pick a depth, get JSON back with a receipt URL. Single runs one model and is free once a day per check. Council runs four models from four vendors and maps where they disagree. Deep adds two critics and a mediator. The CLI and the MCP server call exactly this.
Base URL https://truestandard.ai
Authentication
Create a personal access token under Settings → API tokens and send it as a bearer token. Tokens carry the cli scope and are tied to your account's credits. Anonymous calls get a 401.
curl https://truestandard.ai/api/v1/me \ -H "Authorization: Bearer ts_live_…"Create a token →
Check types
This table is read from the server at render time, so it is the catalog as of now. GET /api/v1/checks returns the same list as JSON; any alias below works in the URL.
GET /api/v1/checks
| Type | Aliases | Depths | Input | Credits (council / deep) |
|---|---|---|---|---|
ai-humanizer |
slop, humanizer |
single · council | 50–2,000 chars | 1 / |
pre-mortem-generator |
premortem, pre-mortem |
single · council · deep | 50–5,000 chars | 1 / 3 |
claim-checker |
claims, claim, factcheck |
single · council · deep | 50–5,000 chars | 1 / 3 |
citation-checker |
citations, citation |
single · council · deep | 50–5,000 chars | 1 / 3 |
sycophancy-detector |
sycophancy |
single · council | 50–5,000 chars | 1 / |
compare |
compare-answers |
single · council · deep | 50–2,000 chars | 1 / 3 |
red-team |
redteam |
single · council · deep | 50–5,000 chars | 1 / 3 |
review |
verify, verification |
council · deep | any length; draft text | 1 / 3 |
Depths
You pick the depth on every call. Nothing is auto-detected.
Single depth=single
One model: the check's bake-off winner. Free, 1 run a day per check per IP address. A second run the same day returns 429.
Council depth=council
Four fast models from four vendors in parallel. The response carries each model's answer, an agreement score and the list of disagreements. Floor: 1 credit, then priced by tokens.
Models
GPT · Claude · Gemini · Grok
Deep depth=deep
Four pro models answer; then two low-self-preference critics and a mediator settle it. Runs as a job: you get a 202 with a status URL and poll it. Floor: 3 credits. Plan on two minutes.
Models
GPT · Claude · Gemini · Grok
Run a check
POST to /api/v1/checks/:type with input and depth. Council and deep need credits; single needs nothing but a token. This response is a real single run of the claim check, copied from the server unedited.
Request
curl -X POST https://truestandard.ai/api/v1/checks/claims \
-H "Authorization: Bearer ts_live_…" \
-H "Content-Type: application/json" \
-d '{"input": "The Berlin Wall fell in November 1989, and East and West Germany formally reunified the following year.", "depth": "single"}'
Response (200)
{
"status": "completed",
"tool": "claim-checker",
"depth": "single",
"mode": "single_model",
"data": {
"claim": "The Berlin Wall fell in November 1989, and East and West Germany formally reunified the following year.",
"verdict": "verified",
"confidence": "high",
"explanation": "The Berlin Wall fell on November 9, 1989. Formal reunification (German Unity Day) took place less than a year later on October 3, 1990. The timeline is spot on.",
"publish_safe": true,
"correct_version": null,
"shareability_risk": "low",
"source_assessment": "No source is explicitly cited in the claim, but the dates are historically documented and undisputed facts."
},
"models": [
"Gemini"
],
"duration": 1.77,
"receipt": {
"id": "JV0k-5ap",
"url": "https://truestandard.ai/check/JV0k-5ap",
"shared": false
},
"remaining": 0
}
Deep runs are polled
A deep call answers 202 with an id and a status URL. Poll it every few seconds until status is completed or failed; the completed payload is the same shape as a synchronous run, with credits_used and balance filled in.
POST /api/v1/checks/premortem {"input": "…", "depth": "deep"}
→ 202 {"status": "pending", "id": "EaSCTdqM", "tool": "pre-mortem-generator", "depth": "deep",
"status_url": "https://truestandard.ai/api/v1/checks/EaSCTdqM"}
GET /api/v1/checks/EaSCTdqM
→ 200 {"status": "processing", …} keep polling
→ 200 {"status": "completed", "data": {…}, "models": [...], "credits_used": 3, "balance": 196, "receipt": {…}}
→ 200 {"status": "failed", "error": "…"} nothing charged
Review: the composed check
POST /api/v1/checks/review sends a whole draft through the claim and citation checks, and returns one verdict with a publish-safe count and a public report. One check type per run: for slop, sycophancy or a premortem, call that check on its own. Council or deep only. It answers 202; poll GET /api/v1/verifications/:id. At deep the server may first ask clarifying questions; POST /api/v1/clarifications returns them.
POST /api/v1/checks/review
{"content": "…the whole draft…", "depth": "council", "context": "creator"}
→ 202 {"id": "…", "status": "pending", "depth": "council"}
GET /api/v1/verifications/:id
→ 200 {"status": "completed", "verdict": "…", "publish_safe": {"safe": 7, "total": 9},
"consensus_score": 0.78, "model_responses": [...],
"credits_used": 1, "balance": 198}
Errors
Every error is { error, message } plus context fields. The error string is what the CLI turns into an exit code, so an agent can branch on it without parsing prose.
| error | HTTP | CLI exit | What to do |
|---|---|---|---|
not_authenticated |
401 | 11 | Missing or revoked token. Create one under API tokens. |
insufficient_credits |
402 | 12 | Run was not charged. balance, needed and checkout_url are in the body; add credits or use depth single. |
rate_limited |
429 | 13 | Today's free single run for this check is used. Use council or wait for tomorrow. |
invalid_input |
422 | 1 | Input outside the check's length limits. The message names the limit. |
invalid_depth |
422 | 1 | Depth is not one of the three depths, or the check does not run at it. |
not_found |
404 | 1 | Unknown check type. types[] in the body lists what the server knows. |
server_error |
502 | 14 | A model or the job failed. Nothing was charged. Retry once. |
From the CLI
The CLI is the same API with auth and polling handled for you. JSON goes to stdout, progress to stderr.
curl -fsSL https://truestandard.ai/install.sh | sh truestandard auth login truestandard check --list truestandard check claims "The Berlin Wall fell in November 1989." --depth single truestandard check citations --file draft.md --depth council truestandard check review --file draft.md --depth deep
From Claude Code, Cursor and other MCP agents
truestandard mcp serves the checks as MCP tools over stdio: check_claims, check_citations, check_slop, check_sycophancy, premortem, red_team, compare_answers, review, a generic check and list_checks. Each returns the JSON above as text, receipt URL included. An out-of-credits or rate-limited call, or one without a token, comes back as a tool error that says what to do, so the agent stops instead of retrying.
Claude Code
claude mcp add truestandard \ -- truestandard mcp
Cursor (.cursor/mcp.json)
{
"mcpServers": {
"truestandard": {
"command": "truestandard",
"args": ["mcp"]
}
}
}
Codex (~/.codex/config.toml)
[mcp_servers.truestandard] command = "truestandard" args = ["mcp"]
Older paths
POST /api/v1/tools/:slug/generate and POST /api/v1/verifications keep working; they are aliases of the endpoints above. POST /api/v1/generate returns every model's raw answer to a prompt with no check applied.