Skip to main content
GET
List Canvases

Authorizations

Authorization
string
header
required

API key from Settings > Developer > REST API

Headers

Moda-Version
enum<string>
default:2026-05-01

Calendar-dated API version pin. New integrations should pin 2026-05-01 to opt into the newest response shapes. For back-compat the server also accepts requests with no header and resolves them to the current default (today: 2026-04-12); that default advances on each sunset date. Any unsupported value returns 400 unsupported_version.

Available options:
2026-04-12,
2026-05-01
Example:

"2026-05-01"

Query Parameters

cursor
string | null

Opaque pagination cursor. Pass the next_cursor from the previous response. Omit on the first request.

limit
integer
default:20

Max canvases per page. Defaults to 20, caps at 100.

Required range: 1 <= x <= 100

Response

Successful Response

Cursor-paginated canvas list response (ENG-2377).

Callers pass ?cursor= on subsequent requests; next_cursor is null when there are no more rows. returned and has_more are derived server-side; total stays null on this lane (the doc-kind filter reads un-indexed JSONB, making an exact count as expensive as a full scan) — rely on has_more. See /api/versioning for the legacy-to-cursor migration map.

data
CanvasItem · object[]
required

Canvases in this page, newest first.

next_cursor
string | null

Opaque cursor to pass as ?cursor= on the next request. null means you've reached the end of the collection.

returned
integer
default:0

Number of items in this page (always len(data); derived server-side).

has_more
boolean
default:false

true when more items exist beyond this page — keep requesting with next_cursor until this is false. Never trust len(data) < limit alone.

limit
integer | null

The effective page-size limit this response was computed with.

total
integer | null

True total number of items in the collection (after filters), when the endpoint can count cheaply. null on log/search lanes — use has_more there.