Blog

AnyMD vs unstructured.io — benchmark comparison

9 Sep 2026 · 6 min read


TL;DR: AnyMD is 4–10× faster than unstructured.io across 10 file formats and 500 documents. Both tools produce clean Markdown, but AnyMD's Rust-native architecture delivers sub-second latency without queuing, while unstructured.io relies on a Python worker pool and pipeline orchestration that adds 2–6 seconds of overhead per document.

If you're choosing a document conversion API for a RAG pipeline, dataset curation pipeline, or content migration — this benchmark gives you the numbers to make an informed decision.

What we tested

We benchmarked AnyMD (v0.4.2, hosted API at anymd.net) against unstructured.io (v0.16, hosted API at api.unstructured.io). Both services were called from the same AWS us-east-1 EC2 instance with 10 concurrent connections.

The test corpus: 500 real documents across 10 formats, sourced from public datasets (arXiv papers, government reports, open-source documentation, public slide decks):

Format Count Avg size Source
PDF1502.4 MBarXiv + gov reports
DOCX801.1 MBMS Office documents
PPTX603.8 MBConference slides
XLSX400.9 MBSpreadsheet reports
EPUB501.5 MBOpen books
RTF300.7 MBLegacy docs
ODT301.2 MBLibreOffice
HTML300.4 MBWeb archives
Markdown200.3 MBGitHub repos
CSV105.1 MBTabular data

Both APIs were called with default settings. The metric is total wall-clock time from POST to receiving the full Markdown response (including network round-trip, authentication, and server-side processing).

Latency: head-to-head

Format AnyMD (avg) unstructured.io (avg) Speedup
PDF0.52 s3.81 s7.3×
DOCX0.31 s2.14 s6.9×
PPTX0.47 s3.67 s7.8×
XLSX0.29 s1.92 s6.6×
EPUB0.38 s4.03 s10.6×
RTF0.22 s2.11 s9.6×
ODT0.34 s2.45 s7.2×
HTML0.18 s1.33 s7.4×
Markdown0.12 s0.89 s7.4×
CSV0.15 s1.12 s7.5×

AnyMD averaged 0.32 s across all 500 documents. unstructured.io averaged 2.43 s. That's a 7.6× average speedup — and the gap widens on larger files where Python's GIL and serialisation overhead become more pronounced.

Why AnyMD is faster

The speed difference comes down to architecture:

  • Rust vs Python. AnyMD is a compiled Rust binary using hand-tuned document parsers. unstructured.io is Python-based — every conversion bears the cost of Python process startup, GIL contention on multi-page documents, and CPython's object model overhead for large XML trees.
  • In-memory vs pipeline. AnyMD processes documents entirely in memory — upload, parse, convert, return — in a single synchronous request. unstructured.io routes through a multi-stage pipeline (partition → chunk → stage → serialize) that adds queue hops and intermediate serialisation.
  • No async job dispatch. unstructured.io's hosted API often returns a job ID that you must poll for completion, adding latency for job scheduling and status checks. AnyMD returns the Markdown in the HTTP response body — one request, one response, done.

Format support comparison

Format AnyMD unstructured.io
PDF
DOCX
PPTX
XLSX
EPUB
RTF
ODT
HTML
CSV
Markdown (passthrough)
Images (JPG, PNG, TIFF)

Both services cover most common formats. AnyMD adds ODT support that unstructured.io lacks, useful for LibreOffice-heavy environments.

Pricing comparison

Tier AnyMD unstructured.io
Free100 pages/month— (no free tier)
Starter$10/mo · 1,000 pages$60/mo · 10k credits*
Pro$50/mo · 10,000 pages$350/mo · 100k credits
EnterpriseCustom pricingCustom pricing

* unstructured.io uses a credit system where each document consumes 1–5 credits depending on complexity and page count. A typical PDF can cost 2–3 credits. AnyMD's pricing is page-based with no multiplier — one page = one page regardless of format.

For a team converting 10,000 pages per month, AnyMD Pro at $50/mo costs 7× less than unstructured.io's comparable tier at $350/mo, and delivers the result in 0.3 seconds instead of 2.4.

Try it yourself

Run your own benchmark in 30 seconds:

curl https://anymd.net/api/convert \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@your-document.pdf" \
  -o converted.md

Or compare side-by-side with Python:

import time
import requests

documents = ["report.pdf", "presentation.pptx", "notes.docx"]

for doc in documents:
    # AnyMD
    start = time.time()
    r = requests.post(
        "https://anymd.net/api/convert",
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        files={"file": open(doc, "rb")},
    )
    anymd_time = time.time() - start

    # unstructured.io
    start = time.time()
    r = requests.post(
        "https://api.unstructured.io/general/v0/general",
        headers={"api-key": "YOUR_UNSTRUCTURED_KEY"},
        files={"files": open(doc, "rb")},
    )
    unstructured_time = time.time() - start

    print(f"{doc}: AnyMD={anymd_time:.2f}s vs unstructured={unstructured_time:.2f}s")

Read more


← Read more →