Skip to main content
GET
Get Table Rows
Retrieve rows from a table artifact with cursor-based pagination. Supports server-side sorting, filtering with comparison operators, column projection, and total counts. Auth: optional. A standalone table with link or public visibility is readable anonymously. A private table needs the owner’s API key, the key of a member of a team it is shared to, or a bound operator session. A table in a workspace is readable by workspace members whose audience covers it, and by anyone when an internal editor has made it public (visibility: "link").

Path parameters

Query parameters

Any other query parameter is refused with 400 INVALID_FIELD, naming it. Sorting is type-aware: number columns sort numerically (not lexicographically), date columns sort chronologically, boolean columns sort by value. For columns with non-castable values, those rows sort as NULL (last). Ordering is total — the created_at, id tie-break is guaranteed — so cursors stay stable even when many rows share a sort value.

Filter operators

Comparisons use the column’s declared type, so filter.revenue=100 matches a stored 100.0, and date ranges compare chronologically rather than as strings. contains and starts always match raw text.
A filter, sort_by, or fields naming a column the table does not have returns 400 — it is not silently ignored. That keeps draft gating safe: a mistyped filter.published=true fails loudly instead of returning unpublished rows.The refusal says what would work: field names the parameter (sort_by, filter or fields) and available lists the table’s columns, for a sort followed by createdAt, updatedAt and id. On a very wide table the list is cut and availableTruncated is true; Get Artifact has the full schema.
Use fields on listing pages. A blog index needs slug,title,excerpt,image_url,publish_date — without projection it also transfers every post’s full markdown body.

Example response

Response fields

To fetch all rows, keep requesting with after={nextCursor} until nextCursor is null.

Errors