---
title: "Read one printed table"
method: GET
path: "/v1/blueprints/{blueprint_id}/tables/{table_id}"
tags: ["Blueprints / Drawing text"]
---

# Read one printed table

`GET /v1/blueprints/{blueprint_id}/tables/{table_id}`

## Request

- Base URL: `https://api.kamai.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.kamai.io/v1/blueprints/{blueprint_id}/tables/{table_id}`
- Auth: HTTP bearer

One printed table, by the `id` the table list gave: its header and rows as printed,
line breaks inside cells kept, as arrays (`format=rows`) or one markdown block
(`format=markdown`). Large schedules page by rows: follow `next_cursor` until it is
`null`; `total_rows` gives the full count.

An id that no longer exists answers 200 with `status: not_found` and a `reason`:
`re_extracted` (the sheet was read for tables again since the id was given; list the
tables for the new id) or `unknown`. `unavailable` means the tables could not be read
just now; retry. On a `lossy` table (read before the structured form existed) rows are
rebuilt from the markdown: line breaks in cells are flattened, short rows are padded and
there are no cell boxes.

404 when the sheet is not in one of your projects; 422 for a malformed table id (never
build or edit one), a bad `format`, or a cursor from another table or format.

## Path parameters

- `blueprint_id` string, required
- `table_id` string, required

## Query parameters

- `format` 'rows' | 'markdown': `rows` (default): `header` and `rows` as arrays, with each cell's box; use it when code needs cells, columns or positions. `markdown`: one markdown table, header repeated on every page; use it to show the table to a person or pass it to a language model.
- `cursor` string, nullable: `next_cursor` of the previous page of rows, with the same `format`.
- `limit` integer, nullable: Rows per page, 1..1000; 1,000 when left out.

## Response `200`

Successful Response

- PrintedTableResponse
  - `status` 'ok' | 'not_found' | 'unavailable', required: `ok`; `not_found`: no table has this id on this sheet now (see `reason`); `unavailable`: the tables could not be read just now, retry.
  - `table` PrintedTable: One table. `format=rows` gives `header`, `rows` and the boxes; `format=markdown` gives `markdown`.
    - `id` string, required: `{blueprint_id}.{rev}.t{n}`: this table in this extraction of the sheet. Use it exactly as returned; never build or edit one (a malformed id is a 422). It changes whenever the sheet is extracted again.
    - `blueprint_id` string, required: The sheet the table is printed on.
    - `title` string, nullable: The table's title as printed, or `null`.
    - `source` string, nullable: How the table was read: `pdf-text-layer` (the PDF's own text) or `ocr` (a scanned or image table); `unknown` otherwise.
    - `bbox` number[], nullable: Where the table sits, [x0, y0, x1, y1] in fractions (0..1) of the page; `null` when unknown.
    - `complete` boolean, nullable: `false` when the sheet's table reading did not finish, so tables (or the emptiness of an `empty` sheet) may be incomplete.
    - `coverage` TableCoverage
      - `cells_present` integer, required: Cells the extraction filled.
      - `cells_total` integer, required: Cells in the table's grid.
    - `degraded` boolean, nullable: `true` when the high-resolution re-read did not land, so the text is the coarser first reading.
    - `lossy` boolean, nullable: `true` when the sheet was extracted before the structured form existed: rows are rebuilt from the markdown, line breaks inside cells are flattened, short rows are padded, and there are no cell boxes.
    - `n_rows` integer, nullable: Data rows, header not counted.
    - `n_cols` integer, nullable: Columns.
    - `chars` integer, nullable: Size of the table's markdown in characters, a guide to its length.
    - `header` string[], nullable: Column headings as printed (`format=rows`).
    - `rows` array[], nullable: This page of rows, each as wide as `header`; line breaks inside cells are kept unless `lossy` (`format=rows`).
      - string[]
    - `header_boxes` array[], nullable: Each heading's box in page fractions, or `null` (always `null` when `lossy`).
      - number[], nullable
    - `cell_boxes` array[], nullable: Each cell's box in page fractions, parallel to `rows`, or `null` (always `null` when `lossy`).
      - array[]
        - number[], nullable
    - `markdown` string, nullable: This page of rows as one markdown table, header repeated on every page (`format=markdown`).
  - `total_rows` integer, nullable: All the table's rows, across pages.
  - `next_cursor` string, nullable: Pass it as `cursor` for the next rows, with the same `format`; `null` on the last page.
  - `reason` 're_extracted' | 'unknown', nullable: Why `not_found`: `re_extracted`, the sheet was read again since this id was given (list the tables for the new id); `unknown`, no such table on this sheet.
  - `note` string, nullable: A plain-English explanation: why `not_found`/`unavailable`, or what `lossy` means.
  - `table_id` string, nullable: The id asked for (on `not_found` and `unavailable`).

## Other responses

- `404`: The sheet is not in one of your projects.
- `422`: The request is refused. A malformed table id (never build or edit one), or a cursor from another table or format. These answer `{"detail": {"error", "details"}}`. A parameter or body field of the wrong type or out of its range is refused before the request is read, with `{"detail": [{"loc", "msg", "type"}, ...]}`.

---

[API](https://skmtc.dev/kamai/apis/kamai-api.md) · [All operations](https://skmtc.dev/kamai/apis/kamai-api/llms.txt) · [OpenAPI document](https://skmtc.dev/kamai/apis/kamai-api/revisions/78f938546270?raw)
