Skip to content
POST /public/dashboard/{token}/widget/{key}/export

No session; the token is the credential. Body `{ format: "csv" | "ndjson", vc?, filters? }`: `vc` the controls as JSON (not base64), `filters` the view's `f.<key>` values as a `{ key: value }` map. The same gates and 404s as the data route, plus 403 export_not_allowed unless the author set viewer_controls.export. Streams every matching row read as the publisher (no protected field, members as "A member", the column pick applied), with Content-Disposition and Cache-Control no-store. More than 1,000,000 rows, or any failure mid-stream, aborts the connection (an NDJSON export ends with an {"_error":...} line), so a short file never looks complete. 6 exports per link and 2 per viewer per minute (429 rate_limited). Nothing is saved to Files and nothing is audited.

Path Parameters

tokenstring
required·

The unguessable link token

keystring
required·

The table widget key

Query Parameters

tzstring

IANA zone for dates; an invalid one reads as UTC.

Request Body

filtersRecord<string, any>
formatstring
Possible values:
csvndjson
vcRecord<string, any>
curl -X POST 'https://api.elaichi.ai/public/dashboard/<token>/widget/<key>/export' \
  -H 'Content-Type: application/json' \
  -d '{"format":"csv","vc":{},"filters":{}}'
const body = {
  "format": "csv",
  "vc": {},
  "filters": {}
};

const response = await fetch('https://api.elaichi.ai/public/dashboard/<token>/widget/<key>/export', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify(body),
});

const data = await response.json();
console.log(data);
import os
import requests

url = "https://api.elaichi.ai/public/dashboard/<token>/widget/<key>/export"
headers = {
    "Content-Type": "application/json",
}
payload = {
    "format": "csv",
    "vc": {},
    "filters": {}
}

response = requests.post(url, headers=headers, json=payload)
print(response.json())