Skip to main content
A parse returns the document two ways: a ready-to-use markdown string, and a content_list of typed blocks in reading order for when you need structure or position. Pick whichever fits.

The shape, recapped

content_list is a flat list across the whole document; each block carries a type, type-specific content fields, a page_idx (which page it’s on, 0-based), and a bbox (position). See the API reference for the full field list.

Just use the Markdown

For most uses — feeding an LLM, indexing for search, displaying the document — you don’t need the blocks at all. The markdown field is the whole document already assembled, with headings, inline tables and equations, and image links:
Reach for content_list only when you need to filter by block type or work with positions.

Filter blocks by type

Because every block is typed, pulling out one kind of content is a filter. For example, collect every table (table content comes through as HTML in table_body):
The field you read depends on the type: text blocks (and titles, headers, footers) use text; equation uses text (LaTeX); image/chart use img_path and content; list uses list_items; code uses code_body. Headings are text blocks that also carry a text_level (1–4), so you can pull just the titles:

Use bounding boxes

Each bbox is [x_min, y_min, x_max, y_max], scaled to 0–1000 of the page (not pixels), with the origin at the top-left. Because they’re relative, they work at any resolution — divide by 1000 and multiply by your rendered page’s pixel size, for example to crop a figure:
Coordinates are relative to the block’s own page, so use block["page_idx"] to pick the right rendered page before applying them.