Explore Readable

API, MCP and CLI

Code brackets and a terminal connect to a document.

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.

toolWhat it does
deslopStrips filler, hedging, recap paragraphs and stock phrases from AI-written text, optionally toward your own voice.
slop-checkScores 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.
simplifyRewrites to the reading level of the person who has to understand it, and explains the terms they will meet.
shortenCuts a document to the length you set without dropping a number, date, condition or deadline.
explainLeaves 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.pdf

Body

fieldtype
toolstringdeslop (default), slop-check, simplify, shorten or explain.
textstringThe text to work on.
urlstringA public web page to read instead.
voicestringDe-slop: a sample of your own writing to match. Replaces your saved voice profile for this call.
voice_profilebooleanDe-slop: edit toward the voice profile saved on your account page. Default true; false edits without it.
length0.2–0.9Shorten: the share of the original to keep. Default 0.5.
audiencestringSimplify, Explain: who should understand it (list below).
readerstringSimplify, Explain: your own description of the reader.
level0–5Simplify, Explain: target difficulty. Default 2 (Plain).
output_languagestring"source" keeps the language; any language name translates.
streambooleanStream 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

  • general General audience
  • customers Customers
  • patients Patients
  • second-language Second-language reader
  • young Young reader
  • newcomer New to the field
  • decision-maker Decision-maker
  • specialist Specialist

Levels

  • 0 Very simple (A1–A2)
  • 1 Simple (A2–B1)
  • 2 Plain (B1–B2)
  • 3 Standard (B2–C1)
  • 4 Advanced (C1)
  • 5 Expert (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-…" }'
Or with the context inline
{ "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" } }
fieldtype
urlstringA public web page to review.
textstringA draft instead (Markdown).
workspacestringThe id of one of your workspaces.
contextobjectInstead of workspace: name, audience, positioning, facts, voice, goals, proof.
streambooleanNDJSON 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 …"
}
kindFinding
unsupportedClaim the facts do not support
unclear-ctaUnclear call to action
vagueToo generic for this audience
off-positioningBlurs the positioning
off-goalWorks against the page's goal
jargonJargon this audience will not know
off-voiceOff the tone of voice
repeatsRepeats 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 Code
claude mcp add --transport http readable https://readable.md/mcp \
  --header "Authorization: Bearer $READABLE_API_KEY"
Cursor, Windsurf and other clients (mcp.json)
{
  "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 editor

readable 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.

GitHub Actions: check the Markdown a pull request changes
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 $files

Errors

Errors return { "error": { "code": "…", "message": "…" } }. In MCP, a failed tool call is a result with isError and the same message.

statuscode
400invalid_requestThe body could not be used.
400invalid_sourceThe text, page or PDF could not be read.
401unauthorizedMissing, unknown or revoked key.
403bannedThe account is suspended.
404not_foundReview: no workspace with that id on your account.
429quotaNot enough pages left this billing cycle.
429rateToo many runs in the last minute.
500internalThe run failed on our side. It is not counted.