Web & PDF to Markdown API for AI Agents, Cited and Verified avatar

Web & PDF to Markdown API for AI Agents, Cited and Verified

Pricing

from $2.00 / 1,000 web page fetcheds

Go to Apify Store
Web & PDF to Markdown API for AI Agents, Cited and Verified

Web & PDF to Markdown API for AI Agents, Cited and Verified

Returns mainText, mainMarkdown, title, links, metadata, sourceSpans (citable paragraph offsets + SHA-256), contentSha256, fetch timestamp and an Ed25519-signed receipt per URL. Web pages, PDF, .docx. Batch or sync HTTP API. Failed URLs are free.

Pricing

from $2.00 / 1,000 web page fetcheds

Rating

0.0

(0)

Developer

LMH Solutions

LMH Solutions

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 hours ago

Last modified

Share

What you get per URL: mainText, mainMarkdown, title, links, metadata, sourceSpans (citable paragraph ids with offsets and a SHA-256 each), receipt.contentSha256 (hash of the raw bytes fetched), receipt.fetchedAt (timestamp), receipt.textSha256 and an Ed25519 signature over all of it. Use it as a batch Actor or as a synchronous HTTP API (Standby).

Convert any web page to Markdown, PDF to text and Word .docx to text: paste a list of URLs and get back one flat JSON item per URL (URL to JSON for LLMs) with clean text, Markdown, metadata and links, ready for an LLM, AI agent or RAG index. Failed URLs are free. Also usable as an MCP tool via Apify's hosted MCP server: https://mcp.apify.com/?actors=lmhsolutions/web-page-to-markdown-pdf-to-text.

Optional signed provenance: a completeness report (what the extractor dropped), a prompt-injection scan and an Ed25519-signed receipt proving what was fetched, when and how. As far as we know, no other top Store extractor signs its output.

Output (one item per URL, trimmed)

{
"url": "https://en.wikipedia.org/wiki/Sourdough",
"finalUrl": "https://en.wikipedia.org/wiki/Sourdough",
"httpStatus": 200,
"docType": "html",
"title": "Sourdough",
"lang": "en",
"mainText": "Sourdough is a type of bread made using ...",
"mainMarkdown": "Sourdough is a type of bread made using ...",
"links": [{ "url": "https://en.wikipedia.org/wiki/Bread", "text": "bread", "inMain": true }],
"metadata": { "description": "...", "canonical": "https://en.wikipedia.org/wiki/Sourdough" },
"billing": { "event": "page-fetched", "events": ["page-fetched", "signed-provenance"], "totalUsd": 0.033 },
"completeness": { "coverageScore": 0.995, "droppedSectionsCount": 2, "warnings": [] },
"security": { "riskLevel": "none", "injectionFindings": [] },
"sourceSpans": { "count": 14, "spans": [{ "id": "s1", "start": 0, "end": 212, "chars": 212, "sha256": "…", "kind": "paragraph", "preview": "Sourdough is a type of bread…" }] },
"receipt": { "contentSha256": "…", "outputSha256": "…", "textSha256": "…", "alg": "Ed25519", "keyId": "p2j-JX8i4uxGCZqSSDrd", "signature": "…" }
}

completeness, security, sourceSpans and receipt are only present with signedProvenance: true (the default). A failed URL is { "url": "...", "error": { "code": "...", "message": "..." } } and costs nothing.

Input

{ "urls": ["https://en.wikipedia.org/wiki/Sourdough", "https://arxiv.org/pdf/1706.03762"] }

Optional: signedProvenance (default true), sourcePackManifest (default false), markdown, links, maxLinks, includeDroppedText, jsonLd, sourceSpans (default true), injection (flag/strip), useApifyProxy, maxConcurrency. Verify mode: {"mode":"verify","receipts":[...],"responses":[...optional full items...],"manifest":{...optional...}}.

Pricing (pay per event)

EventWhenPrice (Apify FREE plan)Top tier (DIAMOND)
page-fetchedone HTML page fetched and cleaned$0.003$0.0015
document-extractedone PDF or .docx extracted$0.006$0.003
signed-provenance (add-on)per extracted item, when signedProvenance is on (default)$0.03$0.015
source-pack-manifest (add-on)once per run, when sourcePackManifest is on and at least one URL succeeded$0.10$0.05
receipt-verifiedper receipt or manifest checked in verify mode$0.001$0.001
Failed URL, 4xx/5xx page, cookie/login wall or bot challengefreefree

Bronze, Silver, Gold and Platinum plans get prices in between. Plus Apify's standard tiny Actor-start fee. Examples (FREE plan): 100 web pages with provenance = $3.30; 100 pages with signedProvenance: false = $0.30; 20 PDFs plus a manifest = $0.82. The Actor respects your maximum cost per run: it reserves budget before each URL, stops cleanly when the next item would exceed it, and lists skipped URLs in the run summary (key-value store RUN_SUMMARY).

Synchronous API (Standby mode)

No run to start and no dataset to poll: send one HTTP request, get one JSON back. Same events and prices as batch mode (cheap base fetch, plus the verified/cited add-on unless you turn it off). Failed URLs are free.

# verified + cited (page-fetched + signed-provenance)
curl -H "Authorization: Bearer $APIFY_TOKEN" \
"https://lmhsolutions--web-page-to-markdown-pdf-to-text.apify.actor/extract?url=https://en.wikipedia.org/wiki/Sourdough"
# cheap base fetch only (page-fetched)
curl -H "Authorization: Bearer $APIFY_TOKEN" \
"https://lmhsolutions--web-page-to-markdown-pdf-to-text.apify.actor/extract?url=https://arxiv.org/pdf/1706.03762&signedProvenance=false"
# JSON body, and receipt verification
curl -X POST -H "Authorization: Bearer $APIFY_TOKEN" -H "content-type: application/json" \
-d '{"url":"https://example.com","links":false}' https://lmhsolutions--web-page-to-markdown-pdf-to-text.apify.actor/extract
curl -X POST -H "Authorization: Bearer $APIFY_TOKEN" -H "content-type: application/json" \
-d '{"receipt":{...},"response":{...optional full item...}}' https://lmhsolutions--web-page-to-markdown-pdf-to-text.apify.actor/verify

Query/body options: url (required), signedProvenance, markdown, links, maxLinks, jsonLd, sourceSpans, includeDroppedText, injection. GET / lists endpoints and prices for free. HTTP 200 = delivered and charged; 4xx/5xx = not charged (422 means the URL loaded but had no extractable text, an error page or a wall). The first request after idle can take a few seconds (cold start). Standby runs also use some platform compute while waiting for requests, per Apify's Standby billing rules.

Citing with source spans

sourceSpans.spans[i] gives [start, end) offsets into normalizeText(mainText), the exact text hashed into the signed receipt.textSha256. To check a citation: slice the normalized text, SHA-256 it, compare with span.sha256; then verify the receipt signature. An agent can quote s7 and a reviewer can prove that passage came from that URL at that time.

Compared with apify/rag-web-browser (features only)

RAG Web Browser is Apify's own, widely used tool and the better choice if you need Google search plus fetch in one call or a full headless browser for JavaScript-heavy pages and collapsed sections. This Actor does not search and does not run a browser. Where it differs:

This Actorapify/rag-web-browser
Web search built inNo (you pass URLs)Yes (Google)
Headless browser for JS pagesNo (plain HTTP; flags js_rendered_likely)Yes, or plain HTTP mode
PDF and .docx to textYesNot listed in its README
Synchronous HTTP API (Standby)YesYes
Raw-content hash + timestamp per pageYes, signedLoad time in output; no hash listed
Citable source spans with per-span hashesYesNo
Ed25519-signed receipt + verify endpointYesNo
Completeness score + dropped-section reportYesNo
Prompt-injection scan / stripYesNo
Open sourceNoYes

Comparison based on each Actor's public README as of November 2026; check their page for changes.

Why signed provenance

  • Completeness report. coverageScore (0–1), dropped and uncertain sections (with clause flags for payment, liability and deadline text), and warnings such as js_rendered_likely, needs_ocr, headers_footers_dropped.
  • Prompt-injection scan. Hidden text and "ignore previous instructions" patterns are flagged or stripped. riskLevel is none, low, medium or high.
  • Signed receipt. Covers URL, final URL, time, HTTP status, raw-bytes SHA-256, output SHA-256, normalized-text SHA-256, extractor versions and fetch provenance (redirect chain, direct or proxy, detected walls).
  • Source-pack manifest. One signed list of every item's URL, outputSha256, textSha256 and receipt id, so a whole RAG corpus or evidence pack can be checked in one step. Saved as dataset row kind: "source-pack-manifest" and key-value record SOURCE_PACK_MANIFEST.
  • Source spans. Paragraph-level citation ids with offsets and per-span SHA-256, bound to the signed text hash.
  • Verify mode. Re-check receipts, full items and manifests later at $0.001 per check.

Features

  • HTML via Readability, PDF via pdf.js (unpdf), Word via mammoth. Markdown, links, JSON-LD and metadata.
  • Cookie/consent walls, login walls and bot challenges (Cloudflare, DataDome, AWS WAF, …) are detected and not charged.
  • Blocks private and metadata IPs (SSRF), with size and time limits. Failed URLs return an error item instead of crashing the run.

How completeness works

coverageScore is the share of meaningful visible text (by words) whose word trigrams appear in the extracted title, byline and main text. Navigation, cookie banners and footers are excluded and reported. A score below about 0.8, or js_rendered_likely, means you should not trust the text as the whole page.

Verifying a receipt yourself

  • Public key (Ed25519, JWK): {"kty":"OKP","crv":"Ed25519","x":"W7fo3MOr-WnJe__hpWGTHlhucxLhhp_LCKGvTLBlAMc"}, keyId p2j-JX8i4uxGCZqSSDrd.
  • Steps:
    1. Take receipt and remove signature.
    2. Serialize to canonical JSON (recursively sorted keys, no whitespace).
    3. Prepend page-to-json-receipt-v1\n.
    4. Verify the base64url signature with the key above.
  • Check the output: compute outputSha256 as the SHA-256 of the canonical JSON of the item without receipt. Compute textSha256 from mainText after the documented normalization (receipt.textCanonicalization).
  • Or skip the steps: run this Actor with mode: "verify".

Verifying a manifest yourself

Remove signature from the manifest, serialize the rest to canonical JSON, prepend page-to-json-source-pack-manifest-v1\n and verify the base64url Ed25519 signature with the same public key. A receiptId is the SHA-256 hex of the canonical JSON of the full receipt (signature included).

Limitations

  • No JavaScript rendering. Single-page apps are flagged js_rendered_likely, and coverage is capped at 0.1.
  • No OCR. Scanned PDF pages are flagged, not read.
  • No login, no cookies, no CAPTCHA solving. Walls are detected and reported, not bypassed.
  • Public URLs only. Private and internal addresses are blocked.
  • Size and time limits apply per URL. Truncation is flagged in the receipt.

FAQ

  • Do I need the signed provenance? No. Set signedProvenance: false for plain text, Markdown, metadata and links at the base price only.
  • Why was a URL free? It failed, returned 4xx/5xx, or hit a wall or bot challenge. billing.notChargedReason says which.
  • Can I use a proxy? Yes, set useApifyProxy: true (charged as normal Apify proxy usage). The receipt records method: "proxy".
  • Is the receipt proof the site said this? It proves that this Actor fetched these bytes from this URL at this time and produced this output. It does not prove the site's content is true.
  • Standby mode? Not in v1. For low-latency single calls, use the HTTP API version of Page to JSON.