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
Input fields
| Field | Required | Meaning | Constraints |
|---|---|---|---|
id | Required | Exact identifier retained from the corresponding create response or permitted list; dashboard ids and local application ids are distinct. | {"type":"string","minLength":1} |
name | Required | name | {"type":"string","minLength":1,"maxLength":100} |
description | Optional | description | {"type":"string","maxLength":500} |
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.
Related actions
- 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.