The web reading API that scores every page it returns

Any URL to Markdown, JSON or a screenshot for your agent, with a 0 to 1 render_quality and named deductions (anti_bot_challenge, login_wall, soft_404, unhydrated_shell) instead of a 200 wrapped around a Cloudflare page. MCP server, REST, CLI, n8n. Reads PDFs and Office files too.

$npx @enconvert/mcp setupCopy
Read the docs

Free while in beta. No card. 500 ops a month.

{"render_quality": 0.0, "status_code": 403, "deductions": {"empty_body": 0.7, "http_error": 0.7}, "warnings": ["crawl4ai flagged this page (Blocked by anti-bot protection: DataDome captcha); outputs were captured by our hooks and are returned anyway."], "billed": false}

Excerpt of a real /v2/perceive read of g2.com on 2026-09-17. DataDome answered 403 with an empty page: scored 0.00, reasons named, not billed.

Works withClaudeClaudeCursorCursorWindsurfWindsurfn8nn8nDifyDifyClawHubClawHub
The problem

Agents don't crash. They believe.

When a scraper hits a challenge page, a cookie wall, or an empty SPA shell, it rarely throws an error. It returns the wrong page as if it were content. Your agent reads it, trusts it, and confidently does the wrong thing. Nobody notices until a customer does.

requests.get(url)Silent lie
200 OK
<h1>Checking your browser
before accessing…</h1>

Your agent thinks this is the pricing table. It will quote it to your customer.

enconvert /v2/perceiveHonest verdict
render_quality: 0.00 · status_code: 403
deductions: {"empty_body":0.7,"http_error":0.7}
billed: false

Your agent knows it got blocked, and routes around it. That is the whole product.

Terminal · g2.com · two readers, 2026-09-17
$ curl -sA "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0 Safari/537.36" \
-o body.html -w "%{http_code}\n" https://www.g2.com/
403
$ curl -s https://api.enconvert.com/v2/perceive -H "X-API-Key: $KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.g2.com/", "outputs": ["markdown"]}'
{"render_quality": 0.0, "status_code": 403, "deductions": {"empty_body": 0.7, "http_error": 0.7}, "warnings": ["crawl4ai flagged this page (Blocked by anti-bot protection: DataDome captcha); outputs were captured by our hooks and are returned anyway."], "billed": false}

curl with a Chrome user agent gets a 403 and a DataDome captcha page. /v2/perceive returns the block as a block: render_quality 0.00, the deductions that fired (empty_body, http_error), and billed: false.

What you get

Every verb, live today. Every read scored.

The perception layer between your agent and the real world: every file it must open, every page it must read, through one server and one key.

POST /v2/perceive1 op · 1 key

Any URL into clean Markdown, JSON, or a screenshot. Real Chromium rendering; lazy-load and anti-bot handled. Every render scored 0.0 to 1.0.

url: "news.site/article"
format: markdown
render_quality: 0.93
Getting started

Your first honest read, in under a minute

You don't even have to think of a test case. We hand you the winning one.

01

Install

One command in Claude, Cursor or Windsurf. REST keys work everywhere else.

npx @enconvert/mcp setup
02

Point it at our fixture

A deliberately hostile page we host, so your first call is the impressive one.

https://fixtures.enconvert.com/hostile-spa
03

Read the receipt

Clean markdown comes back scored. Wire one alert on scores below 0.40 and silent failure is off your list.

"render_quality": 1.0

2,500+ conversions and reads through the keyless playground. In the public benchmark, 0 of 50 public URLs came back as a block page presented as content. Run it yourself.

What we don't do

We don't solve CAPTCHAs, run residential proxies, or get around paywalls. When a page looks blocked, the render ladder retries once with a hardened browser. If it is still blocked you get a score under 0.40 and the reason, not a 200, and you are not billed for it. robots.txt is honoured when you set respect_robots.

Why EnConvert

Retire the duct tape

The real competitor isn't another API. It's the pile of vendors and glue scripts you're babysitting right now.

The usual stack — monthly
A scraping API for pages · never says when it got blockedbill #1
A conversion SaaS for files · has never heard of MCPbill #2
A headless browser fleet · you babysit it at 2ambill #3
Chunking glue for RAG · it ate your weekendbill #4
Cron jobs and retries · holds it all together, barelybill #5
Total5 bills · 5 silent failure modes
EnConvert — monthly
One MCP server · pages and files, one keybill #1
Every read scored; blocks flagged, never hiddenincl.
URL to RAG-ready chunks in one callincl.
Rendering, retries and anti-bot handled for youincl.
Keys you can ship in frontend codeincl.
Total1 bill · a receipt for every read
Why trust us

You're about to depend on us. Here's why that's safe.

We can't hand you a wall of logos yet. We can hand you the things logos are a proxy for: security posture, honest failure modes, and a public record of shipping.

status.enconvert.com · /changelog
Pricing

Start free. Scale when your agent does.

One price everywhere: the numbers on this page are the numbers in the API and on the receipt.

Founding
$0
500 ops a month

Free while in beta. No card. 500 ops a month.

Convert, perceive, lookup, discoverrender_quality on every readNo credit card
Indie
$29/mo
3,000 ops a month

3,000 reads, 20 watchers, 45 conversion routes, $5 extraction credit.

20 watchers45 conversion routes, one op per file$5 extraction credit a month, rolls over$0.02 per extra op, opt-inEmail support
StudioMost teams start here
$99/mo
15,000 ops a month

For teams scaling an agent past the demo.

$15 AI credits a month, rolls overDedicated rendering pool$0.02 per extra op, opt-inPriority support
Production
$299/mo
50,000 ops a month

For when your agent is the product.

$40 AI credits a month, rolls over30-day artifact retention$0.02 per extra op, opt-inNamed support contact

Running past 50,000 ops a month, or need custom retention and terms? Talk to us.

FAQ

Something missing? The docs go deeper, and the founder answers email.

What exactly does render_quality measure?

A 0.0 to 1.0 score of how faithfully the page rendered before we read it. Challenge pages, empty SPA shells, partial lazy-loads and interstitials all pull it down. A low score comes back with a warnings array naming what we detected, and the full output is still returned so you decide what to trust, which means a bad read can never quietly enter your agent's context unnoticed.

What happens when a page blocks you?

You get the truth: a low score, a warnings array naming what we detected, and no garbage passed off as content. Sometimes the web wins. The product guarantee is that you will know when it does, in the same response, not from a customer three days later.

Is this production-ready?

The seven v2 verbs are live and production-hardened: SSRF screening on every URL, honest failure contracts, and a public status page and changelog you can watch before you commit. We publish what breaks and when we fix it.

How is this different from Firecrawl or CloudConvert?

They're good tools on one side of the boundary. Scraping APIs stop at pages; conversion APIs stop at files. Agents need both, so teams end up wiring two or three vendors together. EnConvert is one MCP server for both, with one bill, and it's the only layer that scores every read and refuses to pass off blocked pages as content.

Do I need a backend?

No. Public keys are domain-restricted, so they're safe to ship in client code. Secret keys exist for server-side work when you want them.

The web lies to your agent. EnConvert doesn't.

One MCP server for every file and every page, with a receipt for every read. Free while in beta. No card. 500 ops a month.

$ npx @enconvert/mcp setup