REST API: check text against its source in one call.
Send the source (what the text must not exceed) and the text. You get each sentence's claim strength, an overclaim probability, and a zone — block, review or ok — using the same calibrated thresholds as the live demo.
curl -s https://d174bz5yly61n4.cloudfront.net/v1/check \
-H "Authorization: Bearer YOUR_KEY" -H "content-type: application/json" \
-d '{"source": "Statin use was associated with a lower incidence of dementia.",
"text": "Statins prevent dementia. Researchers studied 30,000 adults."}'
import requests
r = requests.post("https://d174bz5yly61n4.cloudfront.net/v1/check",
headers={"Authorization": "Bearer YOUR_KEY"},
json={"source": "Statin use was associated with a lower incidence of dementia.",
"text": "Statins prevent dementia. Researchers studied 30,000 adults."})
for s in r.json()["sentences"]:
print(s["zone"], s["overclaim"], s["sentence"]) # block 0.8 Statins prevent dementia.
const r = await fetch("https://d174bz5yly61n4.cloudfront.net/v1/check", {
method: "POST",
headers: { "Authorization": "Bearer YOUR_KEY", "content-type": "application/json" },
body: JSON.stringify({ source: "Statin use was associated with a lower incidence of dementia.",
text: "Statins prevent dementia. Researchers studied 30,000 adults." }) });
const { verdict, sentences } = await r.json();
Try your key right here
Get a key above first.
Endpoints and limits
| Endpoint | Does | Per key per day |
|---|---|---|
POST /v1/check | Decider verdict per sentence, no language model | 300 · free |
POST /v1/rewrite | Check, then Claude fixes blocked sentences; Decider verifies each fix | 20 |
POST /v1/calibrate | Your labelled pairs → a threshold with a stated false-flag rate | 3 jobs |
GET /v1/jobs/{id} | Calibration result | — |
GET /v1/usage | Your usage today | — |
Up to 25 sentences per check, 12 per rewrite. Full schema in the interactive API reference. Limits reset at 00:00 UTC.
MCP connector: give your agent a claim-fidelity tool.
HypeCheck speaks the Model Context Protocol at https://d174bz5yly61n4.cloudfront.net/mcp with two tools: check_claims and suggest_rewrites. Use the same key.
# pip install strands-agents httpx (tested with strands-agents 1.61, mcp 2.1) import httpx from mcp.client.streamable_http import streamable_http_client from strands import Agent from strands.tools.mcp import MCPClient hypecheck = MCPClient(lambda: streamable_http_client( "https://d174bz5yly61n4.cloudfront.net/mcp", http_client=httpx.AsyncClient(headers={"Authorization": "Bearer YOUR_KEY"}, timeout=120))) with hypecheck: agent = Agent(tools=hypecheck.list_tools_sync(), system_prompt="Before you publish a summary, call check_claims with the source and your draft.") agent("Source: 'Statin use was associated with less dementia.' Draft: 'Statins prevent dementia.' Check it.") # → "Verdict: BLOCKED. The draft jumps from an association to direct causation…"
// claude_desktop_config.json (uses the mcp-remote bridge for header auth) { "mcpServers": { "hypecheck": { "command": "npx", "args": ["mcp-remote", "https://d174bz5yly61n4.cloudfront.net/mcp", "--header", "Authorization: Bearer YOUR_KEY"] } } }
// .kiro/settings/mcp.json or .cursor/mcp.json { "mcpServers": { "hypecheck": { "url": "https://d174bz5yly61n4.cloudfront.net/mcp", "headers": { "Authorization": "Bearer YOUR_KEY" } } } }
Bring your own data: calibrate the gate on your own domain.
Our thresholds were fitted on health press releases. If your text is different — legal summaries, product docs, clinical notes — send 10 to 60 of your own labelled pairs and get a threshold with a stated false-flag rate, computed by split conformal prediction.
Try it with your own pairs
One pair per line: source | text | faithful or overclaim. Or upload a CSV with those three columns.
Prefer the API? Same thing with curl
curl -s https://d174bz5yly61n4.cloudfront.net/v1/calibrate \ -H "Authorization: Bearer YOUR_KEY" -H "content-type: application/json" \ -d '{"alpha": 0.2, "pairs": [ {"source": "Use was associated with lower risk.", "derived": "Users had lower risk.", "label": "faithful"}, {"source": "Use was associated with lower risk.", "derived": "It prevents disease.", "label": "overclaim"}, ... 10 to 60 pairs ... ]}' # → {"job": "…", "poll": "/v1/jobs/…"} then GET the poll URL: # → {"status": "done", "result": {"threshold": 0.44, "guarantee": "…at most 20% of faithful sentences are flagged", …}}
Use the threshold with the open-source gate: ClaimFidelityGate(..., threshold=0.44) — see decision_pattern/.
Bring your own AWS: run the whole thing in your own account.
For sensitive text that shouldn't leave your account, deploy HypeCheck with one click. Your drafts, your Amazon Bedrock, your Strands Decider.
In the console choose Upload a template file, pick the file, keep the defaults and create. Or from a terminal:
aws cloudformation create-stack --stack-name hypecheck --template-body file://hypecheck-stack.yaml --capabilities CAPABILITY_IAM aws cloudformation describe-stacks --stack-name hypecheck --query "Stacks[0].Outputs"
Tested end to end on 2026-10-17: stack created, page and API healthy about 15 minutes later. View the template
- One EC2 instance (CPU by default, GPU if you choose) running Strands Decider and the web app
- An IAM role limited to invoking Anthropic models on Bedrock, plus Systems Manager access (no SSH key needed)
- A security group open on port 80 only
- The daily HypeWatch job and the same API and MCP endpoints, on your own URL
You need Claude model access enabled in Amazon Bedrock. The instance bills by the hour (c7i.4xlarge ≈ $0.71/h); delete the stack to stop it.
Privacy and limits
- We store a one-way hash of each key and daily counters. No email, no name, no IP address (a short hash is kept for one day to limit key creation).
- Text you send is processed and discarded; it is not logged or used for training.
- Rewrites use Claude on Amazon Bedrock under AWS's terms; checks never leave our server.
- This is a hackathon service with no uptime guarantee. For anything important, use Bring your own AWS.