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

CLI

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.