Share a Redash dashboard with someone who has no Redash account
Redash is where a lot of teams' operating numbers live, and it has the same structural problem every internal BI tool has: the dashboard is behind a login that is behind a data-source connection.
So sharing it with someone outside the analytics group means one of:
- Provision a seat — and grant them access to a data source that answers a great deal more than the one question they had.
- Turn on the public share link — an unauthenticated URL for anyone who gets it, still executing against live data.
- Screenshot it — which is what actually happens, weekly, forever.
Publish a snapshot instead
Redash's API gives you the result set directly:
# last cached results for a query
curl -fsS "https://redash.internal/api/queries/412/results.json?api_key=$QUERY_API_KEY" \
> results.json
Use a query API key rather than your personal one — Redash scopes it to that single query, so the credential in your job cannot read anything else.
Render it and publish:
jq -r '
.query_result.data as $d |
"<h1>Weekly ops</h1><table><tr>" +
($d.columns | map("<th>\(.friendly_name)</th>") | join("")) + "</tr>" +
($d.rows | map("<tr>" + (to_entries | map("<td>\(.value)</td>") | join("")) + "</tr>") | join("")) +
"</table><p>As of \(.query_result.retrieved_at)</p>"
' results.json > report.html
curl -fsS -X POST "https://commareports.com/api/v1/reports" \
-H "Authorization: Bearer $COMMA_API_TOKEN" \
-H "Content-Type: application/json" \
-d "$(jq -n --rawfile html report.html \
--arg t "Weekly ops — $(date +%F)" '{title: $t, html: $html}')"
Include the retrieved_at timestamp. A dashboard screenshot with no date on it
is the most common way a stale number gets into a decision.
Several queries, one report
A Redash dashboard is a set of queries. Fetch each and concatenate the rendered fragments into one page — the reader gets the dashboard's content as a single document rather than a link tree they cannot follow without an account.
Charts render the same way: reuse the query result to drive a Chart.js or Plotly figure in the same page, and the snapshot keeps the visual shape people recognize.
Keep it current
# in cron, or a scheduled CI job
curl -fsS "https://redash.internal/api/queries/412/results.json?api_key=$QUERY_API_KEY" > results.json
# …render report.html…
curl -fsS -X PATCH "https://commareports.com/api/v1/reports/$REPORT_ID" \
-H "Authorization: Bearer $COMMA_API_TOKEN" \
-H "Content-Type: application/json" \
-d "$(jq -n --rawfile html report.html \
--arg t "Weekly ops — $(date +%F)" '{title: $t, html: $html}')"
This is the part that ends the weekly screenshot. The stakeholder's bookmark resolves to current numbers, and the revision list is the history — which the Redash dashboard itself does not keep, since it shows whatever the query returns today.
Access
Reports are private by default. Domain-gated access (anyone at
partner.com) is usually right for an external stakeholder — no seat to
provision, no shared password, and it stops working when they leave. Team
for internal readers. See the sharing model.
Compare that to a Redash public share link, which is a bearer URL: whoever it is forwarded to has it, permanently.
What review adds
- Anchored threads on a number, so the explanation lives with it — see commenting on HTML.
- Revisions, so "was that number different last month?" is answerable.
- No data-source exposure — the reader gets results, not query access.
Limits
- Entry HTML: 5 MB. A snapshot of aggregate numbers is kilobytes; publish aggregates, not raw exports.
- 60 requests/minute per token.
Try it
Comma is free — unlimited reports, unlimited commenters, unlimited revision history.