apache/superset · error
No dashboard found for uuid ${sourceUuid}
Error message
No dashboard found for uuid ${sourceUuid} What it means
Thrown by createDashboardFromSnapshot when resolveEntityId('dashboard', sourceUuid) returns null, i.e. the backend could not resolve the given dashboard UUID to an existing dashboard row. Forking a dashboard version requires the source dashboard to still exist because the copy endpoint works off its id. The UUID usually comes from the version-history entry of the dashboard being viewed.
Source
Thrown at superset-frontend/src/features/versionHistory/api.ts:285
/**
* Forks a dashboard version into a new dashboard via the copy endpoint;
* returns the new dashboard id. The copy endpoint derives the new
* dashboard's chart associations from the `positions` key of
* `json_metadata`, so the fork references (shares, not duplicates)
* exactly the charts present in the snapshot's layout. Slots whose chart
* no longer resolves are swapped for the same markdown placeholder the
* preview renders — the copy endpoint would silently skip their chart
* associations, leaving dead slots in the forked layout.
*/
export async function createDashboardFromSnapshot(
sourceUuid: string,
snapshot: DashboardVersionSnapshot,
name: string,
): Promise<number> {
const sourceId = await resolveEntityId('dashboard', sourceUuid);
if (sourceId === null) {
throw new Error(`No dashboard found for uuid ${sourceUuid}`);
}
const metadata: JsonObject = snapshot.json_metadata
? JSON.parse(snapshot.json_metadata)
: {};
// Always send `positions`, even empty. The copy endpoint rebuilds the new
// dashboard's layout and chart associations from this key; omitting it
// leaves the copy with the *source's current* charts, so forking a version
// that had no layout would produce today's dashboard under a historical
// name.
metadata.positions = {};
if (snapshot.position_json) {
let positions: JsonObject = JSON.parse(snapshot.position_json);
const chartIds = new Set<number>();
Object.values(positions).forEach(item => {
const chartId = layoutChartId(item as JsonObject);
if (chartId !== null) {
chartIds.add(chartId);
}View on GitHub (pinned to f4587218dd)
Solutions
- Verify the source dashboard exists: GET /api/v1/dashboard/{sourceUuid} returns 200 before attempting the fork.
- Re-create or restore the deleted source dashboard, then retry the fork.
- Check the logged-in user has can_read access to the dashboard (the resolve call is permission-scoped).
- In the UI, surface a friendly toast ('Source dashboard no longer exists') instead of the raw thrown error.
Example fix
// before
const id = await createDashboardFromSnapshot(sourceUuid, snapshot, name);
// after
const exists = await SupersetClient.get({ endpoint: `/api/v1/dashboard/${sourceUuid}` }).then(r => r.status === 200).catch(() => false);
if (!exists) {
addDangerToast(t('The source dashboard for this version no longer exists'));
return;
}
const id = await createDashboardFromSnapshot(sourceUuid, snapshot, name); Defensive patterns
Strategy: validation
Validate before calling
import SupersetClient from '@superset-ui/core';
async function dashboardUuidExists(uuid: string): Promise<boolean> {
try {
const r = await SupersetClient.get({ endpoint: `/api/v1/dashboard/${uuid}` });
return r.status === 200;
} catch {
return false;
}
}
if (!(await dashboardUuidExists(sourceUuid))) {
// show friendly message instead of forking
} Type guard
function isDashboardRef(uuid: unknown): uuid is string {
return typeof uuid === 'string' && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(uuid);
} Try / catch
try {
const newId = await createDashboardFromSnapshot(sourceUuid, snapshot, name);
} catch (e) {
if (e instanceof Error && e.message.startsWith('No dashboard found')) {
addDangerToast(t('Source dashboard no longer exists; cannot fork this version'));
return;
}
throw e;
} Prevention
- Before offering 'fork to new dashboard' in the UI, verify the source dashboard is still readable.
- Never reuse version-history payloads across environments without the backing dashboard rows.
- Log the sourceUuid when the fork fails to correlate with deletion/permission events.
When it happens
Trigger: Calling createDashboardFromSnapshot (version history 'restore/fork to new dashboard') with a sourceUuid that is deleted, truncated, or belongs to another deployment; importing version-history data without the backing dashboard; typos in the uuid parameter.
Common situations: Dashboard was deleted after versions were recorded; database restored/migrated losing the row; user lacks read access so the lookup endpoint returns not-found; stale URL or bookmark pointing at an old dashboard id.
Related errors
- Dashboard %(dashboard_id)s not found
- Dataset schema is invalid, caused by: %(error)s
- Received unexpected response status (${response.status}) whi
- This version does not record a visualization type and datase
- A valid color scheme is required
AI-assisted analysis of apache/superset@f4587218dd (2026-08-14).
Data as JSON: /api/errors/77d6bb107b1f966f.
Report an issue: GitHub.