Quickstart
Create a key, score a paragraph, draft a passage and check it. About five minutes.
1Create a key
Sign in to the console with your email address, open API keys and create one. It is shown once. Put it in your shell:
export ETAL_API_KEY="etal_..."New accounts have a monthly allowance and a rate limit (see Models and limits). Nothing is billed.
2Score a paragraph with Sic
curl https://api.etal-labs.com/v1/detect \
-H "Authorization: Bearer $ETAL_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "sic", "text": "Notably, these findings underscore the need for larger, well-powered trials. It is important to note that adherence declined over time."}'The reply has one entry per sentence, the two thresholds, and the measured error rates:
{
"id": "dt_…", "object": "detection", "model": "sic-2026a",
"document": {"max_score": 0.9682, "above_strict": false, "above_sensitive": true,
"sentences": 2, "sentences_above_strict": 0, "sentences_above_sensitive": 2},
"thresholds": {"strict": 0.9946, "sensitive": 0.9544},
"sentences": [
{"start": 0, "end": 76, "text": "Notably, these findings …", "score": 0.9682, "label": "above_sensitive"},
{"start": 77, "end": 135, "text": "It is important to note …", "score": 0.9676, "label": "above_sensitive"}
],
"error_rates": {"human_texts_flagged": {"strict": {"research_papers": {"flagged": 4, "n": 7950, "rate": 0.0005}, "…": "…"}}, "…": "…"},
"usage": {"words": 20, "cost_usd": 0.0002}
}A score above a threshold is evidence. It is not a finding about who wrote the text; read Responsible use before you act on one.
3Draft a passage with QED
Give QED the points to cover, one per line, and two or three passages you have written so that it can follow your voice. Put every fact, number and citation you want in the notes. QED adds none of its own.
import os, httpx
r = httpx.post(
"https://api.etal-labs.com/v1/write",
headers={"Authorization": f"Bearer {os.environ['ETAL_API_KEY']}"},
timeout=120,
json={
"model": "qed",
"task": "compose",
"title": "Sleep deprivation and memory consolidation",
"brief": "- 64 adolescents and 60 adults, crossover design\n"
"- next-morning recall fell by 21% vs 12% (interaction p = 0.008)\n"
"- the age difference was gone at 48 h (p = 0.21)",
"voice": {"exemplars": [open("my_paragraph_1.txt").read(),
open("my_paragraph_2.txt").read()]},
"target_words": 120,
},
)
passage = r.json()["text"]4Check it against your notes
QED can still drop a number or sharpen a hedge. compare lists what differs between the source and the output. The deterministic checks are free; "judge": true adds a claim-by-claim reading for about half a cent.
check = httpx.post(
"https://api.etal-labs.com/v1/compare",
headers={"Authorization": f"Bearer {os.environ['ETAL_API_KEY']}"},
timeout=120,
json={"source": brief, "output": passage, "kind": "draft", "judge": True},
).json()
if not check["pass"]:
for w in check["warnings"]:
print(w) # e.g. {"type": "numbers_missing", "items": ["0.008"]}5Say that you used it
Text written with QED is AI-assisted, and most journals ask you to say so. POST /v1/disclosure drafts the statement from your own recent calls, in the form a journal asks for. Edit it; it is a draft, not a certificate.
Next
- The API reference has every field.
- The MCP server gives the same calls to Claude, Cursor and other agents, including a LaTeX-safe document rewrite.
- The playground needs no code at all.