# 2026-10-25: API 1.39

The `read_pdf` step returns the tables of a PDF as data, billed by the pages it reads.

## Added

- **dsl:** The [`read_pdf`](https://docs.kaab.ist/reference/dsl/actions/read-pdf) step reads the tables of a PDF the job is on or has downloaded: cells as verbatim strings, a table that continues over pages as one table, with `max_pages`, `include_text` and `into: "vars"`. See [documents and PDFs](https://docs.kaab.ist/concepts/documents-and-pdfs).
- **pricing:** A `read_pdf` costs one credit for every started 50 pages it read, counted as compute and shown as `PDF reading` in the job's cost lines. `POST /v1/jobs/estimate` includes it, and a replay of a stored run reads the PDF again at no charge.
- **api:** The error `pdf_source_missing` (`422`, not retryable): a `read_pdf` step had no PDF to read.
- **api:** The warning `pdf_pages_truncated`: a reading stopped at its `max_pages`; `count` and `of` say how many pages were read of how many.
- **dsl:** Lint warning `W010`: a `read_pdf` with no earlier `goto` or `download` that could produce a PDF.
- **api:** `cache.max_age` applies to a program that goes to a PDF and reads it with `read_pdf`.
