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

  1. Verify the source dashboard exists: GET /api/v1/dashboard/{sourceUuid} returns 200 before attempting the fork.
  2. Re-create or restore the deleted source dashboard, then retry the fork.
  3. Check the logged-in user has can_read access to the dashboard (the resolve call is permission-scoped).
  4. 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

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


AI-assisted analysis of apache/superset@f4587218dd (2026-08-14). Data as JSON: /api/errors/77d6bb107b1f966f. Report an issue: GitHub.