Updated March 2026
Yes. Upload a CSV file, get a dashboard URL. Three API calls total.
Step 1: Presign the upload. POST /api/dashboards/upload with your filename and file size in bytes. You get back an uploadUrl and a csvObjectId.
Step 2: PUT your CSV file to the uploadUrl. This uploads directly to storage -- the file doesn't pass through Sutrena's servers. Include the headers from the uploadHeaders field in the presign response.
Step 3: Create the dashboard. POST /api/dashboards with the csvObjectId, a title, and your DSL definition. Sutrena parses the CSV, detects column types (string, number, date), pre-aggregates the data according to your widget definitions, and returns a dashboard URL.
Limits: 10MB per CSV file, 100,000 rows, 50 columns. These are hard limits. For larger datasets, pre-aggregate in your pipeline before uploading.
The dashboard renders instantly because data is pre-aggregated at creation time. No query runs when someone opens the URL. This also means the dashboard is static -- it shows exactly the data you uploaded. No auto-refresh, no live updates. Upload a new CSV and create a new dashboard to update.
Type detection is automatic. Columns that look like numbers become numeric (summable, chartable). Columns that look like dates become temporal. For date columns, use the $column:day, $column:week, or $column:month syntax in groupBy to bucket by time period. Everything else is treated as categorical.
What Sutrena cannot do with CSV dashboards: no joins across multiple CSVs, no SQL queries, no computed columns. If you need those, use a proper BI tool like Metabase or Grafana connected to your database. Sutrena handles the simple case -- upload a file, get a visual dashboard -- well. For numeric aggregation, metric cards support sum(field), avg(field), min(field), and max(field) in addition to count(*). Chart widgets accept an optional aggregate field for the same expressions.
# Step 1: Presign the CSV upload
curl -X POST https://sutrena.com/api/dashboards/upload \
-H "Authorization: Bearer st_live_your_key" \
-H "Content-Type: application/json" \
-d '{ "filename": "sales.csv", "sizeBytes": 245000 }'
# Step 2: Upload the file to the presigned URL
curl -X PUT "$UPLOAD_URL" \
-H "Content-Type: text/csv" \
--data-binary @sales.csv
# Step 3: Create the dashboard with the csvObjectId
curl -X POST https://sutrena.com/api/dashboards \
-H "Authorization: Bearer st_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"title": "Sales Dashboard",
"csvObjectId": "'"$CSV_OBJECT_ID"'",
"isPublic": true,
"dsl": {
"version": 1,
"widgets": [
{ "type": "metric_card", "title": "Total Rows", "value": "count(*)" },
{ "type": "metric_card", "title": "Total Revenue", "value": "sum(amount)" },
{ "type": "bar_chart", "title": "Revenue by Region", "groupBy": "region", "aggregate": "sum(amount)" },
{ "type": "line_chart", "title": "Sales Over Time", "groupBy": "$date:month" },
{ "type": "data_table", "title": "Raw Data", "columns": ["date", "region", "amount"], "limit": 50 }
]
}
}'