API, MCP and CLI
Every tool in the app, from your code, your terminal or an AI agent. Same fact check, same pages as the app: a page is 500 words, the API, MCP server and CLI draw on your plan's pages, and slop checks are free.
Start
Create a key on your account page (every plan, Free included) and send it as a bearer token.
Authorization: Bearer rdbl_…Tools
Pick a tool with tool in the REST API, the tool name in MCP, or the command in the CLI.
| tool | What it does |
|---|---|
| deslop | Strips filler, hedging, recap paragraphs and stock phrases from AI-written text, optionally toward your own voice. |
| slop-check | Scores a text and marks the sentences that read as machine-written, with the reason for each. No rewrite, and it never uses up a page. Free. |
| simplify | Rewrites to the reading level of the person who has to understand it, and explains the terms they will meet. |
| shorten | Cuts a document to the length you set without dropping a number, date, condition or deadline. |
| explain | Leaves the text as it is and adds a short plain explanation next to each piece of jargon. |
REST API
POST /transform
curl https://readable.md/api/v1/transform \
-H "Authorization: Bearer $READABLE_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "tool": "deslop", "text": "In today’s fast-paced world…" }'For a PDF, send multipart/form-data with a file field (up to 15 MB) and the other fields as form fields.
curl https://readable.md/api/v1/transform \
-H "Authorization: Bearer $READABLE_API_KEY" \
-F tool=shorten -F length=0.4 -F file=@report.pdfBody
| field | type | |
|---|---|---|
| tool | string | deslop (default), slop-check, simplify, shorten or explain. |
| text | string | The text to work on. |
| url | string | A public web page to read instead. |
| voice | string | De-slop: a sample of your own writing to match. Replaces your saved voice profile for this call. |
| voice_profile | boolean | De-slop: edit toward the voice profile saved on your account page. Default true; false edits without it. |
| length | 0.2–0.9 | Shorten: the share of the original to keep. Default 0.5. |
| audience | string | Simplify, Explain: who should understand it (list below). |
| reader | string | Simplify, Explain: your own description of the reader. |
| level | 0–5 | Simplify, Explain: target difficulty. Default 2 (Plain). |
| output_language | string | "source" keeps the language; any language name translates. |
| stream | boolean | Stream NDJSON events as passages finish. |
Send exactly one of text, url or a file.
Response
{
"id": "5f0c…",
"share_url": "https://readable.md/r/5f0c…",
"summary": "107 → 29 words · 6 padded sentences fixed · every fact kept · 2.4 s",
"settings": { "tool": "deslop", … },
"stats": { "wordsBefore": 107, "wordsAfter": 29, "slopBefore": 6, … },
"blocks": [ { "id": "b1", "original": "…", "output": "…", "status": "rewritten",
"findings": [ { "text": "…", "kind": "filler" } ], … } ],
"markdown": "…"
}status is unchanged, rewritten, removed (every sentence was padding) or kept-original (no rewrite passed the fact check).
GET /usage
curl https://readable.md/api/v1/usage -H "Authorization: Bearer $READABLE_API_KEY"
{ "plan": "pro", "pages_used": 7, "pages_limit": 35,
"pages_per_run": 25, "words_per_page": 500,
"period_start": "2026-09-14T09:12:00.000Z",
"renews_at": "2026-10-14T09:12:00.000Z" }Audiences
generalGeneral audiencecustomersCustomerspatientsPatientssecond-languageSecond-language readeryoungYoung readernewcomerNew to the fielddecision-makerDecision-makerspecialistSpecialist
Levels
0Very simple (A1–A2)1Simple (A2–B1)2Plain (B1–B2)3Standard (B2–C1)4Advanced (C1)5Expert (C2)
Review
Review a page or a draft against a workspace: your audience, positioning, facts, voice, goals and proof. Each finding has the quote, the reason and checked fixes. Nothing is rewritten. Pages count as for the other tools.
GET /workspaces
curl https://readable.md/api/v1/workspaces -H "Authorization: Bearer $READABLE_API_KEY"
{ "workspaces": [ { "id": "3f9a2c71-…", "name": "Readable",
"updated_at": "2026-09-25T15:40:00.000Z" } ] }POST /review
curl https://readable.md/api/v1/review \
-H "Authorization: Bearer $READABLE_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "url": "https://example.com", "workspace": "3f9a2c71-…" }'{ "text": "# Unlock the power of AI-driven writing\n\n…",
"context": { "name": "Readable",
"audience": "Founders and marketers at small B2B software companies",
"facts": "Tools: De-slop, Slop check, … Free: 6 pages a month.",
"goals": "Get visitors to try a tool and sign up" } }| field | type | |
|---|---|---|
| url | string | A public web page to review. |
| text | string | A draft instead (Markdown). |
| workspace | string | The id of one of your workspaces. |
| context | object | Instead of workspace: name, audience, positioning, facts, voice, goals, proof. |
| stream | boolean | NDJSON events (also Accept: application/x-ndjson). |
Response (a real run)
{
"id": "b07e5d12-…",
"workspace": { "id": "3f9a2c71-…", "name": "Readable" },
"summary": {
"line": "4 findings in 4 blocks · 4 high · 4 with checked fixes",
"bySeverity": { "high": 4, "medium": 0, "low": 0 },
"page": { "purposeClear": 0.07, "nextStepClear": 0.29 }
},
"findings": [ {
"quote": "Readable is the ultimate all-in-one AI platform … Trusted by
10,000+ companies worldwide.",
"kind": "unsupported", "severity": "high", "role": "paragraph",
"reason": "This says Readable is an all-in-one AI writing platform, but
the facts say it reviews existing text and checks rewrites …",
"fixes": [
{ "id": "f-b2-1", "text": "Readable checks your copy against the
original, so you can rewrite with AI and
keep the facts in place." }, …
]
}, … ],
"markdown": "# Review\n\n4 findings in 4 blocks …"
}| kind | Finding |
|---|---|
| unsupported | Claim the facts do not support |
| unclear-cta | Unclear call to action |
| vague | Too generic for this audience |
| off-positioning | Blurs the positioning |
| off-goal | Works against the page's goal |
| jargon | Jargon this audience will not know |
| off-voice | Off the tone of voice |
| repeats | Repeats a neighbouring block |
Streamed events: review-start, diagnosed, finding, page, then done (the response above) or error.
MCP server
Readable is a remote MCP server (Streamable HTTP) at https://readable.md/mcp. It offers deslop, slop_check, simplify, shorten and explain, so an agent can clean its own drafts before you read them, plus review and list_workspaces.
claude mcp add --transport http readable https://readable.md/mcp \
--header "Authorization: Bearer $READABLE_API_KEY"{
"mcpServers": {
"readable": {
"url": "https://readable.md/mcp",
"headers": { "Authorization": "Bearer rdbl_…" }
}
}
}Command line
readable-md needs Node 20 or newer and has no dependencies. Markdown goes to stdout, the summary line to stderr, so it fits in pipes.
npm i -g readable-md
readable login # paste your key once
readable deslop draft.md > clean.md
pbpaste | readable check # free
readable shorten report.pdf --length 0.4 --out short.md
readable simplify --url https://example.com/terms --audience customers
readable explain spec.md --level 1
readable workspaces # ids for --workspace
readable review https://example.com --workspace <id>
readable review draft.md --context product.json --fail-on high # exit 5
readable mcp # print MCP setup for your editorreadable check also gates CI. Give it several files and --max-slop (0 to 100, the share of sentences flagged): it prints one line per file and a pass/fail summary, and exits 4 when a file scores over the threshold. Slop checks use 0 pages, so every pull request can run one.
name: Docs slop check
on:
pull_request:
paths: ["**/*.md"]
jobs:
readable:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Check changed Markdown
env:
READABLE_API_KEY: ${{ secrets.READABLE_API_KEY }}
run: |
files=$(git diff --name-only --diff-filter=AM "origin/${{ github.base_ref }}...HEAD" -- '*.md')
[ -z "$files" ] || npx --yes readable-md check --max-slop 30 $filesErrors
Errors return { "error": { "code": "…", "message": "…" } }. In MCP, a failed tool call is a result with isError and the same message.
| status | code | |
|---|---|---|
| 400 | invalid_request | The body could not be used. |
| 400 | invalid_source | The text, page or PDF could not be read. |
| 401 | unauthorized | Missing, unknown or revoked key. |
| 403 | banned | The account is suspended. |
| 404 | not_found | Review: no workspace with that id on your account. |
| 429 | quota | Not enough pages left this billing cycle. |
| 429 | rate | Too many runs in the last minute. |
| 500 | internal | The run failed on our side. It is not counted. |