Read one live page of a public table
/public/dashboard/{token}/widget/{key}/data
No session; the token is the credential. Only on a link with `live_tables: true`, for a table over a collection row query that the snapshot shows (the widgets carrying `table_page`). Read live with the publisher's access and every public scrub (no protected field, members as "A member"). `vc` is base64url JSON of at most 4,096 bytes, `{ q?, where?, sort?, columns? }`, checked against the table's viewer_controls as for a signed-in viewer; `columns` picks a subset of `table_controls.columns`. `f.<key>` pairs are read as on the view. `cursor` is the sealed `table_page.next_cursor` of the previous page; send the same `vc` (columns may differ) and `f.*` with it. A link that does not answer, live tables off, a widget the snapshot does not show and a publisher who can no longer read for the link are all 404 not_found. 400 viewer_control_invalid { details.issues } for a control off the allowlist or an unknown column; 400 invalid_request for a bad cursor. A page nobody asked for in the last 5 minutes counts against the link's table budget (60 per minute, 20 per viewer; 429 rate_limited with Retry-After).
Path Parameters
The unguessable link token
The table widget key
Query Parameters
IANA zone for dates; an invalid one reads as UTC.
Response Body
Every column the viewer may show or hide with vc.columns.
2 properties
2 properties
curl -X GET 'https://api.elaichi.ai/public/dashboard/<token>/widget/<key>/data' \
-H 'Content-Type: application/json'const response = await fetch('https://api.elaichi.ai/public/dashboard/<token>/widget/<key>/data', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
});
const data = await response.json();
console.log(data);import os
import requests
url = "https://api.elaichi.ai/public/dashboard/<token>/widget/<key>/data"
headers = {
"Content-Type": "application/json",
}
response = requests.get(url, headers=headers)
print(response.json())