Topolo Docs Topolo Platform
Open workspace

Duplicate focused dashboard

Copies a visible dashboard and all saved-view semantics into a new view owned by the caller.

Outcome

Copies a visible dashboard and all saved-view semantics into a new view owned by the caller.

Before you start

  • Verify the intended environment, authenticated identity and explicitly authorized ownership context.
  • Discover the published dashboard:write permission and any required resource grant.
  • Approve the actual effects before confirming the unchanged planned request. Fixture identifiers, recipients and provider responses authorize no live operation.

Discover the target

topolo whoami --json
topolo actions get app_topolo_one.dashboard_layouts.duplicate --detail --json
  • id: Exact identifier retained from the corresponding create response or permitted list; dashboard ids and local application ids are distinct.

Request

POST /api/dashboard-layouts/{id}/duplicate

Inspect and test this action.

Input fields

FieldRequiredMeaningConstraints
idRequiredExact identifier retained from the corresponding create response or permitted list; dashboard ids and local application ids are distinct.{"type":"string","minLength":1}
nameRequiredname{"type":"string","minLength":1,"maxLength":100}
descriptionOptionaldescription{"type":"string","maxLength":500}

Inspect nested fields.

Interpret the response

Call app_topolo_one.dashboard_layouts.list and confirm the copy; the source is untouched.

Inspect the declared output schema and captured variants.

Worked examples

Actual exported One Worker with local Miniflare D1/KV. Authentication, application discovery, checkout, billing and remote widget providers are controlled synthetic responses; outbound access is sealed. No live provider outcome is established.

Save the reviewed input below as payload.json; substitute discovered identifiers and bind credential/resource context separately. CLI:

topolo actions validate app_topolo_one.dashboard_layouts.duplicate --data @payload.json --json
topolo actions plan app_topolo_one.dashboard_layouts.duplicate --data @payload.json --json
topolo actions call app_topolo_one.dashboard_layouts.duplicate --data @payload.json --confirm --detail --json

MCP planning and execution use the same reviewed input:

{
  "tool": "topolo_prepare_action",
  "arguments": {
    "actionId": "app_topolo_one.dashboard_layouts.duplicate",
    "input": {
      "id": "dashboard_c601634a-eaba-43fb-bfe6-99ca40878d4c",
      "name": "Fixture operations copy"
    }
  }
}
{
  "tool": "topolo_call_action",
  "arguments": {
    "actionId": "app_topolo_one.dashboard_layouts.duplicate",
    "input": {
      "id": "dashboard_c601634a-eaba-43fb-bfe6-99ca40878d4c",
      "name": "Fixture operations copy"
    },
    "confirm": true,
    "detail": true
  }
}

Successful response · HTTP 201

Input · payload.json:

{
  "id": "dashboard_c601634a-eaba-43fb-bfe6-99ca40878d4c",
  "name": "Fixture operations copy"
}

Captured response:

{
  "data": {
    "dashboard": {
      "id": "dashboard_25d42154-3509-4391-829e-8f023882f7d3",
      "ownerUserId": "user_int_1",
      "organizationId": "org_int_1",
      "scopeType": "organization",
      "scopeId": "org_int_1",
      "name": "Fixture operations copy",
      "description": "",
      "purpose": "custom",
      "timeContext": {
        "range": "30d",
        "comparison": "none",
        "timezone": "UTC"
      },
      "visibility": "private",
      "isDefault": false,
      "contributions": [],
      "analyses": [],
      "sharedUserIds": [],
      "canEdit": true,
      "createdAt": "2026-10-06T01:43:23.065Z",
      "updatedAt": "2026-10-06T01:43:23.065Z"
    }
  }
}

Call app_topolo_one.dashboard_layouts.list and confirm the copy; the source is untouched.

Refused request · HTTP 401 · auth_error

Input · payload.json:

{
  "id": "dashboard_3baf8d10-8eb7-4ae1-9cac-95aa398a0595",
  "name": "Fixture operations copy"
}

Captured response:

{
  "error": "Token validation failed"
}

Authenticate using the required credential type for this action; service-only actions require the registered Auth service identity.

Verify the result

  • Call app_topolo_one.dashboard_layouts.list and confirm the copy; the source is untouched.

Errors and recovery

  • personal_context_required (HTTP 403): Switch to the dashboard's Personal context before duplicating it. A duplicate retains the source ownership context.
  • dashboard_source_forbidden (HTTP 403): Remove the denied contribution or select a source owned by the active context. Discover the exact app workspace through Auth; a resource ID alone is not authorization.
  • dashboard_source_unavailable (HTTP 503): Source access could not be verified. No dashboard changes were saved. Retry after Auth workspace discovery is available.
  • dashboard_source_scope_unsupported (HTTP 422): This source ownership type is not supported by the current workspace contract. Personal and household workspace support must be explicitly available; do not substitute an organization ID.
  • dashboard_layout_name_conflict (HTTP 409): A dashboard with this name already exists in the scope. Choose another name.
  • not_found (HTTP 404): No layout with that id visible to the caller.
  • insufficient_permissions (HTTP 403): The caller does not hold the permission this action requires.
  • auth_error (HTTP 401): Authenticate using the required credential type for this action; service-only actions require the registered Auth service identity.

These are observed local refusals; inspect the raw error body because one SDK code can represent several handler messages. Preserve the request id when available.

Recovery boundary

Delete the copy; the original is unaffected.

  • Delete focused dashboard: Delete an owned dashboard and promote the most recently updated remaining dashboard when the default is removed.

Evidence

Actual exported One Worker with local Miniflare D1/KV. Authentication, application discovery, checkout, billing and remote widget providers are controlled synthetic responses; outbound access is sealed. No live provider outcome is established.