Outcome
Archive an empty granted canonical Voice workspace, then remove its local identity mirror.
Before you start
- Verify the exact authenticated identity, environment and approved organization context before preparing the request.
- The published application permission is workspace:delete. Discover a granted canonical Voice workspace and bind its exact id. A supplied id does not grant access.
- Authorize all documented effects before CLI --confirm or MCP confirm:true. Local events, canonical archival and organization erasure have distinct scope.
Discover the target
topolo whoami --json
topolo actions get app_topolo_voice.workspaces.delete --detail --json
topolo resources topolo-voice --json
topolo workspaces list topolo-voice --json
- Select the actual granted resource id as VOICE_WORKSPACE_ID; synthetic fixture ids authorize no live operation.
- Use the same canonical workspace id in input.workspaceId and the bound resource. Verify emptiness and Auth eligibility before archival.
Request
DELETE /api/workspaces/{workspaceId}
Save the exact action input as payload.json. Set VOICE_WORKSPACE_ID from granted canonical resource discovery. Validate it and inspect the exact path, query and body before executing.
Inspect and test this action in the signed action console.
Input fields
| Field | Required | Type | Meaning and constraints |
|---|---|---|---|
workspaceId | Required | string | Exact workspace id from canonical granted discovery; must match the separately bound resource and have an empty local mirror. {"minLength":1} |
The complete input and response schemas are available in the action console and through CLI/MCP action discovery.
Effects
- Requires the exact granted workspace id to match the path, a local mirror, and zero calls/provider failures/recordings/transcripts/voicemails.
- Requests canonical Auth archival first. A refusal leaves the mirror unchanged; only successful Auth archival is followed by local mirror deletion.
- Returns HTTP 204 with no body; it does not return a workspace object or JSON null. Auth archive and local deletion are separate operations, not one transaction.
Interpret the response
No new reusable resource identifier is returned. Retain the exact input and approved organization/workspace context for verification.
The server returns HTTP 204 with no body. Topolo SDK, CLI and MCP expose this bodyless success as an empty string. The raw capture and SDK result are shown separately.
Treat an actual 204 and empty body as the acknowledgement. Verify the canonical workspace is archived through authorized platform workspace discovery. Do not infer a response id. Retain input workspaceId and check both canonical state and the local mirror after a timeout or interrupted sequence.
Worked examples
Actual worker and isolated migrated D1; synthetic Auth identity, nondefault workspace grants and archive transport. Notify and Nexus are disabled. No live telephony, remote audio or transcript hosting/deletion is tested. Refused examples explain boundaries; do not execute them as successful workflows.
minimal · Refused request · HTTP 404
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_minimal"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 404:
{
"error": "workspace_not_found"
}
HTTP 404. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
minimal · Refused request · HTTP 403
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_other"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 403:
{
"error": "forbidden"
}
HTTP 403. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
minimal · Refused request · HTTP 409
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_minimal"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 409:
{
"error": "workspace_not_empty"
}
HTTP 409. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
minimal · Refused request · HTTP 409
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_minimal"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 409:
{
"error": "workspace_archive_refused"
}
HTTP 409. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
minimal · Refused request · HTTP 502
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_minimal"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 502:
{
"error": "workspace_archive_refused"
}
HTTP 502. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
minimal · Successful request · HTTP 204
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_minimal"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
topolo actions call app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --confirm --detail --json
MCP tool and arguments:
{
"tool": "topolo_call_action",
"arguments": {
"actionId": "app_topolo_voice.workspaces.delete",
"input": {
"workspaceId": "ws_voice_minimal"
},
"resourceType": "workspace",
"resourceId": "<id returned by granted resource discovery>",
"confirm": true
}
}
Captured response · HTTP 204:
(empty response body)
HTTP 204. Treat an actual 204 and empty body as the acknowledgement. Verify the canonical workspace is archived through authorized platform workspace discovery. Do not infer a response id. Retain input workspaceId and check both canonical state and the local mirror after a timeout or interrupted sequence.
Topolo SDK action result:
""
minimal · Refused request · HTTP 404
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_minimal"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 404:
{
"error": "workspace_not_found"
}
HTTP 404. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
workflow · Refused request · HTTP 404
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_workflow"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 404:
{
"error": "workspace_not_found"
}
HTTP 404. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
workflow · Refused request · HTTP 403
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_other"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 403:
{
"error": "forbidden"
}
HTTP 403. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
workflow · Refused request · HTTP 409
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_workflow"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 409:
{
"error": "workspace_not_empty"
}
HTTP 409. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
workflow · Refused request · HTTP 409
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_workflow"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 409:
{
"error": "workspace_archive_refused"
}
HTTP 409. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
workflow · Refused request · HTTP 502
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_workflow"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 502:
{
"error": "workspace_archive_refused"
}
HTTP 502. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
workflow · Successful request · HTTP 204
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_workflow"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
topolo actions call app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --confirm --detail --json
MCP tool and arguments:
{
"tool": "topolo_call_action",
"arguments": {
"actionId": "app_topolo_voice.workspaces.delete",
"input": {
"workspaceId": "ws_voice_workflow"
},
"resourceType": "workspace",
"resourceId": "<id returned by granted resource discovery>",
"confirm": true
}
}
Captured response · HTTP 204:
(empty response body)
HTTP 204. Treat an actual 204 and empty body as the acknowledgement. Verify the canonical workspace is archived through authorized platform workspace discovery. Do not infer a response id. Retain input workspaceId and check both canonical state and the local mirror after a timeout or interrupted sequence.
Topolo SDK action result:
""
workflow · Refused request · HTTP 404
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_workflow"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 404:
{
"error": "workspace_not_found"
}
HTTP 404. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
privacy · Refused request · HTTP 404
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_privacy"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 404:
{
"error": "workspace_not_found"
}
HTTP 404. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
privacy · Refused request · HTTP 403
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_other"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 403:
{
"error": "forbidden"
}
HTTP 403. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
privacy · Refused request · HTTP 409
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_privacy"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 409:
{
"error": "workspace_not_empty"
}
HTTP 409. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
privacy · Refused request · HTTP 409
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_privacy"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 409:
{
"error": "workspace_archive_refused"
}
HTTP 409. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
privacy · Refused request · HTTP 502
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_privacy"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 502:
{
"error": "workspace_archive_refused"
}
HTTP 502. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
privacy · Successful request · HTTP 204
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_privacy"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
topolo actions call app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --confirm --detail --json
MCP tool and arguments:
{
"tool": "topolo_call_action",
"arguments": {
"actionId": "app_topolo_voice.workspaces.delete",
"input": {
"workspaceId": "ws_voice_privacy"
},
"resourceType": "workspace",
"resourceId": "<id returned by granted resource discovery>",
"confirm": true
}
}
Captured response · HTTP 204:
(empty response body)
HTTP 204. Treat an actual 204 and empty body as the acknowledgement. Verify the canonical workspace is archived through authorized platform workspace discovery. Do not infer a response id. Retain input workspaceId and check both canonical state and the local mirror after a timeout or interrupted sequence.
Topolo SDK action result:
""
privacy · Refused request · HTTP 404
Actual local worker response and migrated D1. Auth identity/grants/archive are simulated. Notify and metering are disabled; no telephony or remote audio/transcript provider is contacted. Fixture identifiers authorize no live action.
Input · payload.json:
{
"workspaceId": "ws_voice_privacy"
}
CLI:
topolo actions validate app_topolo_voice.workspaces.delete --data @payload.json --json
topolo actions plan app_topolo_voice.workspaces.delete --resource-type workspace --resource-id "$VOICE_WORKSPACE_ID" --data @payload.json --json
Captured response · HTTP 404:
{
"error": "workspace_not_found"
}
HTTP 404. The actual handler refused this request. Inspect the exact cause and current state before deciding whether to retry.
Verify the result
- Treat an actual 204 and empty body as the acknowledgement. Verify the canonical workspace is archived through authorized platform workspace discovery.
- Do not infer a response id. Retain input workspaceId and check both canonical state and the local mirror after a timeout or interrupted sequence.
Errors and recovery
workspace_not_found(HTTP 404): No local identity mirror exists. Discover a granted canonical workspace; archival does not create its mirror.forbidden(HTTP 403): The path workspace does not match the granted resource. Stop and correct the intended authorized target; do not change credentials to bypass this refusal.workspace_not_empty(HTTP 409): Preserve the local call/failure/artifact metadata. Archive only a genuinely empty workspace; organization erasure requires its own privacy purpose and authorization.workspace_archive_refused(HTTP 409): Canonical Auth refused or failed archival. Inspect canonical workspace status/default eligibility and the retained local mirror before deciding on a retry.workspace_archive_refused(HTTP 502): Canonical Auth refused or failed archival. Inspect canonical workspace status/default eligibility and the retained local mirror before deciding on a retry.organization_required(HTTP 403): The authenticated request has no organization. Stop and establish the approved owning organization; supplied workspace ids do not create membership.
Auth, resource resolution and published input validation can refuse a request before its handler. Retain the actual error, request id and approved context. A plain-text HTTP 500 is surfaced by CLI/MCP as http_error; that transport code is not a structured Voice handler error.
Recovery boundary
Voice publishes no restore action. Default/status eligibility is decided by Auth. Do not erase organization data merely to make a workspace empty; preserve records or obtain independent privacy authorization.
Evidence
Actual worker and isolated migrated D1; synthetic Auth identity, nondefault workspace grants and archive transport. Notify and Nexus are disabled. No live telephony, remote audio or transcript hosting/deletion is tested.