Outcome
Updates the supplied fields on One’s local applications D1 entry.
Before you start
- Verify the intended environment, authenticated identity and explicitly authorized ownership context.
- Discover the published apps: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.apps.update --detail --json
- id: Exact identifier retained from the corresponding create response or permitted list; dashboard ids and local application ids are distinct.
Request
PATCH /api/apps/{id}
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 | Optional | name | {"type":"string","minLength":1} |
description | Optional | description | {"type":"string","minLength":1} |
icon | Optional | icon | {"type":"string","minLength":1} |
required_permissions | Optional | required_permissions | {"type":"array","items":{"type":"string","minLength":1}} |
optional_permissions | Optional | optional_permissions | {"type":"array","items":{"type":"string","minLength":1}} |
base_url | Optional | base_url | {"type":"string","minLength":1} |
launch_url_template | Optional | launch_url_template | {"type":"string","minLength":1} |
category | Optional | category | {"type":"string","minLength":1} |
status | Optional | status | {"type":"string","enum":["active","inactive","maintenance"]} |
is_system_app | Optional | is_system_app | {"type":"boolean"} |
Interpret the response
Compare returned app.id and changed fields with the approved input. Neither launcher catalog read is a local-record read-back; no dedicated local get action is published.
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.apps.update --data @payload.json --json
topolo actions plan app_topolo_one.apps.update --data @payload.json --json
topolo actions call app_topolo_one.apps.update --data @payload.json --confirm --detail --json
MCP planning and execution use the same reviewed input:
{
"tool": "topolo_prepare_action",
"arguments": {
"actionId": "app_topolo_one.apps.update",
"input": {
"id": "edit-app",
"name": "New Name",
"status": "maintenance",
"required_permissions": [
"edit:write"
]
}
}
}
{
"tool": "topolo_call_action",
"arguments": {
"actionId": "app_topolo_one.apps.update",
"input": {
"id": "edit-app",
"name": "New Name",
"status": "maintenance",
"required_permissions": [
"edit:write"
]
},
"confirm": true,
"detail": true
}
}
Successful response · HTTP 200
Input · payload.json:
{
"id": "edit-app",
"name": "New Name",
"status": "maintenance",
"required_permissions": [
"edit:write"
]
}
Captured response:
{
"success": true,
"message": "Application updated successfully",
"app": {
"id": "edit-app",
"name": "New Name",
"description": "",
"icon": "",
"category": "storage",
"developer": "Unknown",
"version": "1.0.0",
"base_url": "https://e.topolo.app",
"launch_url_template": "",
"status": "maintenance",
"is_system_app": 0,
"required_permissions": [
"edit:write"
],
"optional_permissions": [],
"created_at": "2026-10-06 01:43:24",
"updated_at": "2026-10-06 01:43:24"
}
}
Compare returned app.id and changed fields with the approved input. Neither launcher catalog read is a local-record read-back; no dedicated local get action is published.
Successful response · HTTP 200
Input · payload.json:
{
"id": "full-edit",
"name": "Full",
"description": "d",
"icon": "I",
"required_permissions": [
"a:read"
],
"optional_permissions": [
"a:write"
],
"base_url": "https://full.topolo.app",
"launch_url_template": "https://full.topolo.app/{{user.org}}",
"category": "storage",
"status": "inactive",
"is_system_app": true
}
Captured response:
{
"success": true,
"message": "Application updated successfully",
"app": {
"id": "full-edit",
"name": "Full",
"description": "d",
"icon": "I",
"category": "storage",
"developer": "Unknown",
"version": "1.0.0",
"base_url": "https://full.topolo.app",
"launch_url_template": "https://full.topolo.app/{{user.org}}",
"status": "inactive",
"is_system_app": 1,
"required_permissions": [
"a:read"
],
"optional_permissions": [
"a:write"
],
"created_at": "2026-10-06 01:43:24",
"updated_at": "2026-10-06 01:43:24"
}
}
Compare returned app.id and changed fields with the approved input. Neither launcher catalog read is a local-record read-back; no dedicated local get action is published.
Refused request · HTTP 400 · http_error
Input · payload.json:
{
"id": "empty-update"
}
Captured response:
{
"error": "INVALID_REQUEST",
"message": "No update data provided"
}
Inspect the retained raw error body and request details before correcting or retrying; this SDK code groups multiple distinct handler refusals.
Refused request · HTTP 404 · http_error
Input · payload.json:
{
"id": "ghost",
"name": "Ghost"
}
Captured response:
{
"error": "NOT_FOUND",
"message": "Application not found after update"
}
Inspect the retained raw error body and request details before correcting or retrying; this SDK code groups multiple distinct handler refusals.
Refused request · HTTP 401 · auth_error
Input · payload.json:
{
"id": "edit-app",
"name": "New Name",
"status": "maintenance",
"required_permissions": [
"edit:write"
]
}
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
- Compare returned app.id and changed fields with the approved input. Neither launcher catalog read is a local-record read-back; no dedicated local get action is published.
Errors and recovery
http_error(HTTP 400): Inspect the retained raw error body and request details before correcting or retrying; this SDK code groups multiple distinct handler refusals.http_error(HTTP 404): Inspect the retained raw error body and request details before correcting or retrying; this SDK code groups multiple distinct handler refusals.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
Retain the previous local record before editing and reapply its reviewed fields through apps.update if needed.
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.