AI Demos Research — the structured-intelligence platform. Every verdict on these pages opens to the execution behind it.
Graded 17 October 2026

Can Upstage AI recover text from a cleanly scanned document?

Upstage AI recovered the text from the scanned page. The page had no text layer, and the Markdown returned every printed block correctly; the closing words were styled as a heading and the results came back as a pipe table.

1 of 1 test case passed

Every test case in this scenario has a result.

Pass rate100%1 of 1 gradable
Coverage1 of 1test case with a result
1PassDid everything it was expected to do.
0FailNo test case failed.
0Not gradableEvery result here could be graded.
0UntestedEvery test case in this scenario has a result.
The pass rate is a summary. The evidence is the test case below: what we sent, what we checked, what the tool returned, and the proof.

The test case

Each test case is judged on its own: Pass, Fail, Not gradable, or Untested. The scenario result above is based on this test case.

Clean scan — text recoveredPassEvidence
What we sent
InputDocument (PDF)
Scanned certificate page with printed text and signature
Open the PDF ↗
What the tool returned
JSON
[
  {
    "id": 0,
    "page": 1,
    "category": "paragraph",
    "content": {
      "html": "<p id='0' data-category='paragraph' style='font-size:22px'>Kirkhollow Analytical Laboratories Ltd</p>",
      "markdown": "Kirkhollow Analytical Laboratories Ltd",
      "text": ""
    },
    "coordinates": [
      {
        "x": 0.1089,
        "y": 0.0665
      },
      {
        "x": 0.5469,
        "y": 0.0665
      },
      {
        "x": 0.5469,
        "y": 0.0851
      },
      {
        "x": 0.1089,
        "y": 0.0851
      }
    ]
  },
  {
    "id": 1,
    "page": 1,
    "category": "header",
    "content": {
      "html": "<header id='1' style='font-size:14px'>Braithe Road, Vardenne BR7 2HD<br>01632 960118 · reception@kirkhollow-labs.example</header>",
      "markdown": "Braithe Road, Vardenne BR7 2HD\n01632 960118 · reception@kirkhollow-labs.example",
      "text": ""
    },
    "coordinates": [
      {
        "x": 0.1088,
        "y": 0.0897
      },
      {
        "x": 0.4498,
        "y": 0.0897
      },
      {
        "x": 0.4498,
        "y": 0.1166
      },
      {
        "x": 0.1088,
        "y": 0.1166
      }
    ]
  },
  {
    "id": 2,
    "page": 1,
    "category": "paragraph",
    "content": {
      "html": "<p id='2' data-category='paragraph' style='font-size:16px'>Ms R. Sandiman<br>Braithe Estuary Partnership<br>Estuary House, Vardenne Quay<br>Braithe BR3 4LN</p>",
      "markdown": "Ms R. Sandiman\nBraithe Estuary Partnership\nEstuary House, Vardenne Quay\nBraithe BR3 4LN",
      "text": ""
    },
    "coordinates": [
      {
        "x": 0.1089,
        "y": 0.1366
      },
      {
        "x": 0.3358,
        "y": 0.1366
      },
      {
        "x": 0.3358,
        "y": 0.1985
      },
      {
        "x": 0.1089,
        "y": 0.1985
      }
    ]
  },
  {
    "id": 3,
    "page": 1,
    "category": "paragraph",
    "content": {
      "html": "<br><p id='3' data-category='paragraph' style='font-size:16px'>Our reference: KAL-11938/26<br>Date of report: 4 February 2026</p>",
      "markdown": "Our reference: KAL-11938/26\nDate of report: 4 February 2026",
      "text": ""
    },
    "coordinates": [
      {
        "x": 0.6652,
        "y": 0.134
      },
      {
        "x": 0.8873,
        "y": 0.134
      },
      {
        "x": 0.8873,
        "y": 0.1671
      },
      {
        "x": 0.6652,
        "y": 0.1671
      }
    ]
  },
  {
    "id": 4,
    "page": 1,
    "category": "paragraph",
    "content": {
      "html": "<p id='4' data-category='paragraph' style='font-size:20px'>Certificate of analysis</p>",
      "markdown": "Certificate of analysis",
      "text": ""
    },
    "coordinates": [
      {
        "x": 0.1098,
        "y": 0.2221
      },
      {
        "x": 0.3085,
        "y": 0.2221
      },
      {
        "x": 0.3085,
        "y": 0.2392
      },
      {
        "x": 0.1098,
        "y": 0.2392
      }
    ]
  },
  {
    "id": 5,
    "page": 1,
    "category": "paragraph",
    "content": {
      "html": "<p id='5' data-category='paragraph' style='font-size:16px'>Dear Ms Sandiman</p>",
      "markdown": "Dear Ms Sandiman",
      "text": ""
    },
    "coordinates": [
      {
        "x": 0.1102,
        "y": 0.2522
      },
      {
        "x": 0.2552,
        "y": 0.2522
      },
      {
        "x": 0.2552,
        "y": 0.2665
      },
      {
        "x": 0.1102,
        "y": 0.2665
      }
    ]
  },
  {
    "id": 6,
    "page": 1,
    "category": "paragraph",
    "content": {
      "html": "<p id='6' data-category='paragraph' style='font-size:16px'>Thank you for the four water samples delivered to this laboratory on 28 January 2026. They were booked<br>in as batch KAL-11938 and analysed by the methods shown. The results below relate only to the samples<br>as received.</p>",
      "markdown": "Thank you for the four water samples delivered to this laboratory on 28 January 2026. They were booked\nin as batch KAL-11938 and analysed by the methods shown. The results below relate only to the samples\nas received.",
      "text": ""
    },
    "coordinates": [
      {
        "x": 0.1092,
        "y": 0.2746
      },
      {
        "x": 0.8811,
        "y": 0.2746
      },
      {
        "x": 0.8811,
        "y": 0.3254
      },
      {
        "x": 0.1092,
        "y": 0.3254
      }
    ]
  },
  {
    "id": 7,
    "page": 1,
    "category": "table",
    "content": {
      "html": "<table id='7' style='font-size:18px'><thead></thead><tbody><tr><td>Sampling point</td><td>Vardenne Channel, station VQ1</td></tr><tr><td>Date and time of sampling</td><td>27 January 2026, 09:40</td></tr><tr><td>Total suspended solids</td><t … [505 characters in the file]",
      "markdown": "| Sampling point | Vardenne Channel, station VQ1 |\n| --- | --- |\n| Date and time of sampling | 27 January 2026, 09:40 |\n| Total suspended solids | 41.6 mg/l (method KAL-M04) |\n| Chloride | 18,200 mg/l (method KAL-M11) |\n| Ammoniacal nitrogen | 0.42 mg/l (method KAL-M12) |\n| Dissolved organic carbon | 5.9 mg/l (method KAL-M22) |\n",
      "text": ""
    },
    "coordinates": [
      {
        "x": 0.1176,
        "y": 0.3432
      },
      {
        "x": 0.7085,
        "y": 0.3432
      },
      {
        "x": 0.7085,
        "y": 0.4517
      },
      {
        "x": 0.1176,
        "y": 0.4517
      }
    ]
  },
  {
    "id": 8,
    "page": 1,
    "category": "paragraph",
    "content": {
      "html": "<p id='8' data-category='paragraph' style='font-size:16px'>The suspended solids figure is higher than those reported for this station in December and January, which<br>were both below 30 mg/l. The samples were taken on the ebb, two days after the last placement at Kellow<br>Sands, and the result is consistent with that.</p>",
      "markdown": "The suspended solids figure is higher than those reported for this station in December and January, which\nwere both below 30 mg/l. The samples were taken on the ebb, two days after the last placement at Kellow\nSands, and the result is consistent with that.",
      "text": ""
    },
    "coordinates": [
      {
        "x": 0.1107,
        "y": 0.4604
      },
      {
        "x": 0.8845,
        "y": 0.4604
      },
      {
        "x": 0.8845,
        "y": 0.511
      },
      {
        "x": 0.1107,
        "y": 0.511
      }
    ]
  },
  {
    "id": 9,
    "page": 1,
    "category": "paragraph",
    "content": {
      "html": "<p id='9' data-category='paragraph' style='font-size:16px'>The remaining samples will be held until 4 March 2026 and destroyed after that date unless you ask us to<br>keep them.</p>",
      "markdown": "The remaining samples will be held until 4 March 2026 and destroyed after that date unless you ask us to\nkeep them.",
      "text": ""
    },
    "coordinates": [
      {
        "x": 0.1106,
        "y": 0.5264
      },
      {
        "x": 0.8798,
        "y": 0.5264
      },
      {
        "x": 0.8798,
        "y": 0.5616
      },
      {
        "x": 0.1106,
        "y": 0.5616
      }
    ]
  },
  {
    "id": 10,
    "page": 1,
    "category": "heading1",
    "content": {
      "html": "<h1 id='10' style='font-size:20px'>Yours sincerely</h1>",
      "markdown": "# Yours sincerely",
      "text": ""
    },
    "coordinates": [
      {
        "x": 0.1123,
        "y": 0.5885
      },
      {
        "x": 0.2317,
        "y": 0.5885
      },
      {
        "x": 0.2317,
        "y": 0.6044
      },
      {
        "x": 0.1123,
        "y": 0.6044
      }
    ]
  },
  {
    "id": 11,
    "page": 1,
    "category": "paragraph",
    "content": {
      "html": "<p id='11' data-category='paragraph' style='font-size:16px'>Dr A. J. Prosser<br>Laboratory Manager</p>",
      "markdown": "Dr A. J. Prosser\nLaboratory Manager",
      "text": ""
    },
    "coordinates": [
      {
        "x": 0.1122,
        "y": 0.6197
      },
      {
        "x": 0.3201,
        "y": 0.6197
      },
      {
        "x": 0.3201,
        "y": 0.6893
      },
      {
        "x": 0.1122,
        "y": 0.6893
      }
    ]
  },
  {
    "id": 12,
    "page": 1,
    "category": "footer",
    "content": {
      "html": "<footer id='12' style='font-size:14px'>Registered in England 2214887 · Results relate only to the samples as received</footer>",
      "markdown": "Registered in England 2214887 · Results relate only to the samples as received",
      "text": ""
    },
    "coordinates": [
      {
        "x": 0.1116,
        "y": 0.9267
      },
      {
        "x": 0.541,
        "y": 0.9267
      },
      {
        "x": 0.541,
        "y": 0.9406
      },
      {
        "x": 0.1116,
        "y": 0.9406
      }
    ]
  }
]

Raw API response with OCR and parsed elements

Copied from Output file (JSON), elements · an excerpt

Open the whole JSON file ↗
Output file (Markdown)
Markdown output of the recovered page text
Markdown43 lines
Kirkhollow Analytical Laboratories Ltd

Braithe Road, Vardenne BR7 2HD
01632 960118 · reception@kirkhollow-labs.example

Ms R. Sandiman
Braithe Estuary Partnership
Estuary House, Vardenne Quay
Braithe BR3 4LN

Our reference: KAL-11938/26
Date of report: 4 February 2026

Certificate of analysis

Dear Ms Sandiman

Thank you for the four water samples delivered to this laboratory on 28 January 2026. They were booked
in as batch KAL-11938 and analysed by the methods shown. The results below relate only to the samples
as received.

| Sampling point | Vardenne Channel, station VQ1 |
| --- | --- |
| Date and time of sampling | 27 January 2026, 09:40 |
| Total suspended solids | 41.6 mg/l (method KAL-M04) |
| Chloride | 18,200 mg/l (method KAL-M11) |
| Ammoniacal nitrogen | 0.42 mg/l (method KAL-M12) |
| Dissolved organic carbon | 5.9 mg/l (method KAL-M22) |


The suspended solids figure is higher than those reported for this station in December and January, which
were both below 30 mg/l. The samples were taken on the ebb, two days after the last placement at Kellow
Sands, and the result is consistent with that.

The remaining samples will be held until 4 March 2026 and destroyed after that date unless you ask us to
keep them.

# Yours sincerely

Dr A. J. Prosser
Laboratory Manager

Registered in England 2214887 · Results relate only to the samples as received
Open the Markdown file ↗
Expected vs. Found
✓Expected: Visible text is recovered accuratelyFound: It recovered the printed text block by block and left out the handwritten signature.
Why this result

The page was image-only, so recovery depended on OCR. The Markdown matched the printed page block by block, including the reference, dates, results, closing, sign-off and footer; the handwritten signature was left out.

Also observed in this test case

Heading style. The closing words are formatted as a heading instead of a paragraph.

Table layout. The results are returned as a two-column pipe table, matching the page's label-and-value layout.

Tested by Chandresh Bisht · evidence dated 9 September 2026

Configuration and setup

How this tool was set up for the run and what the test needed in place. Each row is a fact from the run's records; a fact the records do not hold is left out, not guessed.

Software that produced the output
Upstage AI
Build or version
document-parse-260630 (API 2.0)
Plan or tier
free tier
Surface
API
Set up before the run
A short scanned image-only PDF with ordinary text had to be sent as the complete document in one pass, using the default pipeline without per-tool tuning.
OCR
on
Pipeline
default pipeline, single pass
Tested
9 September 2026 · Chandresh Bisht

How this scenario is graded

How we decide Pass, Fail and Not gradable. The same rules apply to every tool tested on this scenario.

How results are decided

Each test case gets one result per tool: Pass, Fail or Not gradable. A test case we haven't run yet shows Untested. There are no partial results.

The rules
  • Pass: the tool did everything the test expected, and nothing it said contradicts the correct answer.
  • Fail: at least one expected behaviour clearly didn't happen; the test case's result says which one and quotes the tool.
  • Not gradable: our evidence couldn't settle the outcome (for example a record we needed is missing). It is never counted as a fail, and the test case's result says what's missing.

Where this sits in the benchmark

This page is one cell of a larger study: one tool, one scenario. Only this benchmark's frame appears here.

History of this result

What has happened to this result since it was first published. Runs and grades are never overwritten: a retest or a re-grade publishes a new result and keeps the earlier one readable.

from the publication record
11 November 2026First publishedConverting a complex PDF into clean Markdown with a hosted API v1

Act on this result

Nothing filed here edits the run or the grade. A challenge opens a review, and a review can produce a new run or a re-grade — which becomes the current result and leaves this one in the history.

This matches what I see

You run the same kind of test against your own setup and get the same behaviour.

Agree →
This does not match

Yours behaves differently. Tell us what you got, with a screenshot if you have one.

Disagree →
Point out an issue

Something here is wrong — a reference value, a transcription, a grade.

Report an issue →
Request a retest

On a newer build, a larger dataset, or your own setup.

Request a retest →
We have fixed this

Tell us what changed and we schedule a rerun of the failing test case. The old result stays as history.

Vendor notice →
Filed against this evidenceNothing yet. Challenges, counter-evidence and fix notices appear here with their outcome, and stay on the page after they are resolved.
Cite this result
aidemos.com/benchmarks/pdf-to-markdown-apis/results/upstage-ai/a-cleanly-scanned-document · 1 pass · 0 fail · coverage 1/1 · graded 2026-10-17

The same record is available as structured data through the AI Demos MCP server, with the counts, the coverage and every per-test-case reason carried as fields.

Verify the proof files

These files support this result. Open a file to inspect the original evidence.

Input · Document (PDF) ↗application/pdf · 747 KB
Output file (JSON) ↗application/json · 13 KB
Output file (Markdown) ↗text/markdown · 1 KB
File fingerprints (SHA-256)

A fingerprint identifies the exact file used for this result.

Input · Document (PDF)a459554d58b9480b19bb3a63598c500b961c3ad377492d18ff227bb439e1f68c
Output file (JSON)4cb9b7b7dda194a36955113da700333c6d28f9c692aee264935ebf800f9fa4c0
Output file (Markdown)6cd3edf23b8307aa0e5b9dc25fb7255f251001ad6ef922be00c65aa199886600