# Changelog of PDF Text Extractor - Markdown, Tables & RAG Chunks (`readable_slash/pdf-text-extractor-structured`) Actor

- **URL**: https://apify.com/readable_slash/pdf-text-extractor-structured/changelog.md
- **Full Actor documentation**: https://apify.com/readable_slash/pdf-text-extractor-structured.md

## Changelog

All notable changes to this Actor. Newest first. Numbers are Apify build
numbers within version 0.1.

### 0.1.11 — 2026-08-19

#### Changed

- **The example input now demonstrates RAG chunking.** With `chunkForRag:
  false` in the prefill, a first run left the **RAG chunks** view on the Output
  tab empty — and the heading-breadcrumb chunk is this Actor's real
  differentiator, the feature it ranks **#3 for `pdf chunking`** and **#3 for
  `chunk pdf for llm`** on. Demonstrating it in the demo run is the point.

  **API behaviour is unchanged.** `prefill` drives only the pre-populated form
  and the daily health check; `default` still governs API callers and remains
  `chunkForRag: false`. Billing is per page extracted either way.

  The prefill also sets `outputFormat: "both"`. This Actor writes `markdown`
  **or** `text` depending on that field, never both unless asked — so the
  previous `markdown` prefill left the **Plain text** view empty for exactly
  the same reason. Verified on a live run: all four views now carry data in
  every column except `error`, which is empty because nothing failed.

  Guarded by `test_prefill_exercises_every_dataset_view`.

### 0.1.10 — 2026-08-19

#### Fixed

- **The run's Output tab in Apify Console could not display results.** It
  showed *"Cannot load data from dataset. Reason: Expected property `clean` to
  be of type `boolean` but received type `string`"* — from this Actor's first
  build onwards.

  The output schema passed `?clean=true` in its dataset template. The Console
  parses that query string into a typed options object, where `clean` is a
  boolean, so the string `"true"` failed validation. Runs always succeeded and
  the data was always correct; only the display was broken — on the first screen
  a user sees after their first run.

  Dataset templates now use only the documented `?view=` parameter, and the
  Actor exposes an output per view: full dataset, Markdown, Plain text and RAG
  chunks. A regression test refuses any other query parameter.

### 0.1.9 — 2026-08-19

#### Added

- **Three more dataset views — Markdown, Plain text and RAG chunks** — beside
  the existing Overview.

  Apify lets a published task choose which dataset view renders on its public
  landing page, and those pages are indexed by Google and readable by AI agents
  as markdown. One generic view meant every task page would have shown the same
  table; each use case can now show the output that actually matters to it.

### 0.1.8 — 2026-08-19

#### Added

- **A step-by-step "How to use it", an FAQ, and a link to the author's other
  Actor.** Apify's README guidance names all three; Actor recommendation
  "won't recommend a completely different Actor from the same creator", so
  cross-linking has to be done by hand.

  The FAQ answers what a run costs, what happens when one document in a batch
  fails, why a scanned PDF returns nothing, and how the output differs from a
  naive text extractor — measured, not asserted.

### 0.1.7 — 2026-08-19

#### Added

- **The dataset schema now describes all 13 output fields**, with types,
  enums and per-field descriptions, alongside the table view it already had.

  Apify's hosted MCP server infers a structured output schema for every Actor
  tool so an AI agent knows what it will get back *before* it calls. Field-level
  descriptions also feed the "congruency" category of the Actor quality score,
  which ranks both Store search and the agent-facing `search-actors` tool.

  Guarded by a test asserting that every field the Actor pushes is documented,
  so the schema cannot drift away from the code.

### 0.1.6 — 2026-08-19

#### Changed

- **The example input now lists two files on independent hosts.** Apify runs
  every Actor daily against its input-schema `prefill` and expects a
  **Succeeded** run with a non-empty dataset. Three consecutive failures flag
  the Actor `under maintenance`; continued failures eventually deprecate it.

  The example previously pointed at a single arxiv.org file, so an outage at
  one host — not any fault in the Actor — could have flagged or deprecated it.
  A second file on unrelated infrastructure (an IRS form) is now included, and
  because a failed document is isolated rather than fatal, one host being
  unreachable no longer fails the run.

  Both files are already part of the real-document regression corpus, so the
  example now shows a research paper and a government form — two of the shapes
  the extractor is most often given.

### 0.1.0–0.1.5 — 2026-08-19

#### Added

- Initial release. PDF to clean Markdown with real tables and heading
  structure, plus RAG-ready chunks carrying heading breadcrumbs.
- Two-part pricing — per document and per page — because extraction cost scales
  with pages, not files. A flat per-file price goes loss-making above roughly
  134 pages.
- Scanned PDFs are detected and flagged rather than silently returning nothing.
- Failed documents are isolated from the rest of the batch and charged nothing.

#### Changed

- Memory capped at 1024 MB after profiling showed a 113–177 MB peak. Apify
  bills memory × time, so this cut run cost roughly 5×.
- pdfplumber page caches are released after each page. Peak RSS fell from
  \~900 MB to ~162 MB on a 103-page report and no longer accumulates across a
  batch. Extraction output is byte-identical.
