application · active
Topolo Forecast
Cash-flow and P&L forecasting product.
Documentation map
- Topolo Forecast — Public overview of the forecasting product for cash-flow, P&L, KPI, and multi-scenario planning workflows.
Authority and runtime
- System ID
topolo-forecast- App IDs
- app_topolo_forecast
- Owners
- finance-platform
- Repositories
- apps/TopoloForecast
- Hosts
- https://forecast.topolo.app, https://forecast-api.stg.topolo.us, https://forecast.stg.topolo.us
- Dependencies
- topolo-auth, topolo-one, applications-packages
Security and data ownership
- Risk tier
- standard
- Tenant isolation
- organization_scoped
- Privacy classification
- restricted
- Storage
- d1, external_provider, kv
- Export and deletion
- planned
- Enterprise ready
- no
Source-derived capability inventory
Source revisions: apps/TopoloForecast@e1e2cb0fb630c8da1d3fc157c568b6ec072ccc7a
Declared actions: 52 · API routes: 62 · UI routes: 18
{
"id": "topolo-forecast",
"name": "Topolo Forecast",
"slug": "topolo-forecast",
"kind": "application",
"visibility": "public",
"repo_paths": [
"apps/TopoloForecast"
],
"source_revisions": [
{
"source_path": "apps/TopoloForecast",
"repository": "apps/TopoloForecast",
"revision": "e1e2cb0fb630c8da1d3fc157c568b6ec072ccc7a",
"ref": "origin/staging"
}
],
"source_counts": {
"source_files": 188,
"test_files": 91,
"test_cases": 0,
"migration_files": 0,
"database_tables": 0,
"manifests": 1,
"deploy_targets": 2,
"actions": 52,
"mobile_contracts": 1,
"notifications": 6,
"package_manifests": 6,
"deployment_configs": 0
},
"manifests": [
{
"source_path": "apps/TopoloForecast/topolo.app.json",
"service_slug": "topolo-forecast",
"name": "topolo-forecast",
"app_id": "app_topolo_forecast",
"compatibility_date": "2026-04-10",
"primary_target": null,
"environments": [
"development",
"production",
"staging"
],
"targets": [
{
"name": "web",
"kind": "worker",
"directory": "apps/web",
"main": "src/worker.ts",
"worker_name": "topolo-forecast",
"subdomain": "forecast",
"healthcheck_path": null,
"variable_names": [
"AUTH_API_URL",
"INSIGHTS_SITE_KEY"
],
"secret_names": [],
"bindings": [
{
"kind": "services",
"binding": "API",
"target": null
}
]
},
{
"name": "api",
"kind": "worker",
"directory": "apps/api",
"main": "src/index.ts",
"worker_name": "topolo-forecast-api",
"subdomain": null,
"healthcheck_path": "/health",
"variable_names": [
"APP_ID",
"AUTH_BASE_URL",
"ENVIRONMENT",
"FORECAST_PUBLIC_BASE_URL",
"NEXUS_GATEWAY_URL",
"SERVICE_NAME",
"SERVICE_SLUG",
"TOPOLO_NOTIFY_URL",
"TOPOLO_SEED_APP_ID"
],
"secret_names": [],
"bindings": [
{
"kind": "d1",
"binding": "FORECAST_CONTROL_DB",
"target": null
},
{
"kind": "d1",
"binding": "FORECAST_PLAN_DB",
"target": null
},
{
"kind": "d1",
"binding": "FORECAST_CASH_DB",
"target": null
},
{
"kind": "d1",
"binding": "FORECAST_ACCESS_DB",
"target": null
},
{
"kind": "d1",
"binding": "FORECAST_AUDIT_DB",
"target": null
},
{
"kind": "kv",
"binding": "FS_CACHE",
"target": null
},
{
"kind": "durableObjects",
"binding": "CACHE_STORE",
"target": null
}
]
}
],
"notifications": [
"forecast.cash_threshold_breached",
"forecast.import.completed",
"forecast.import.failed",
"forecast.scenario.ready",
"forecast.schedule_rule.due",
"forecast.share.invited"
],
"notification_contract": {
"source_path": "topolo.notification-contracts.json",
"role": "producer",
"schema_version": 1,
"owner_app_id": "app_topolo_forecast",
"events": [
{
"type": "forecast.cash_threshold_breached",
"version": 1,
"description": "Forecast durably recorded a transition below a configured cash threshold.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"balance_cents",
"threshold_cents",
"severity",
"occurred_at",
"cta_url"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"balance_cents": {
"type": "integer"
},
"threshold_cents": {
"type": "integer"
},
"severity": {
"type": "string",
"enum": [
"low",
"critical"
]
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"cta_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Critical cash threshold breached",
"body": "Available cash is $500.00 against the $1,000.00 threshold.",
"object_id": "workspace_1",
"balance_cents": 50000,
"threshold_cents": 100000,
"severity": "critical",
"occurred_at": "2026-07-20T00:00:00.000Z",
"cta_url": "https://forecast.topolo.app/cash"
}
],
"dataClassification": "confidential",
"sensitiveFields": [
"balance_cents",
"threshold_cents"
],
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^forecast:cash-threshold:"
}
},
{
"type": "forecast.import.completed",
"version": 1,
"description": "A bounded forecast import and its terminal completed job were committed atomically.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"import_id",
"scenario_id",
"status",
"row_count",
"occurred_at",
"cta_url"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"import_id": {
"type": "string",
"minLength": 1
},
"scenario_id": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"const": "completed"
},
"row_count": {
"type": "integer",
"minimum": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"cta_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Forecast import completed",
"body": "24 forecast rows were imported.",
"object_id": "forecast_import_1",
"import_id": "forecast_import_1",
"scenario_id": "scenario_1",
"status": "completed",
"row_count": 24,
"occurred_at": "2026-07-20T00:00:00.000Z",
"cta_url": "https://forecast.topolo.app/imports/forecast_import_1"
}
],
"dataClassification": "internal",
"sensitiveFields": [],
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^forecast:import-completed:"
}
},
{
"type": "forecast.import.failed",
"version": 1,
"description": "A rejected forecast import was persisted as a terminal failed job.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"import_id",
"scenario_id",
"status",
"row_count",
"error",
"occurred_at",
"cta_url"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"import_id": {
"type": "string",
"minLength": 1
},
"scenario_id": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"const": "failed"
},
"row_count": {
"type": "integer",
"const": 0
},
"error": {
"type": "string",
"minLength": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"cta_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Forecast import failed",
"body": "Import must contain between 1 and 500 entries.",
"object_id": "forecast_import_2",
"import_id": "forecast_import_2",
"scenario_id": "scenario_1",
"status": "failed",
"row_count": 0,
"error": "Import must contain between 1 and 500 entries.",
"occurred_at": "2026-07-20T00:00:00.000Z",
"cta_url": "https://forecast.topolo.app/imports/forecast_import_2"
}
],
"dataClassification": "internal",
"sensitiveFields": [
"error"
],
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^forecast:import-failed:"
}
},
{
"type": "forecast.scenario.ready",
"version": 1,
"description": "A new forecast scenario and its ready notification were committed atomically.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"scenario_id",
"scenario_name",
"base_scenario_id",
"status",
"occurred_at",
"cta_url"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"scenario_id": {
"type": "string",
"minLength": 1
},
"scenario_name": {
"type": "string",
"minLength": 1
},
"base_scenario_id": {
"type": [
"string",
"null"
]
},
"status": {
"type": "string",
"const": "ready"
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"cta_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Forecast scenario is ready",
"body": "FY27 plan is ready for planning.",
"object_id": "scenario_1",
"scenario_id": "scenario_1",
"scenario_name": "FY27 plan",
"base_scenario_id": null,
"status": "ready",
"occurred_at": "2026-07-20T00:00:00.000Z",
"cta_url": "https://forecast.topolo.app/scenarios/scenario_1"
}
],
"dataClassification": "internal",
"sensitiveFields": [],
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^forecast:scenario-ready:"
}
},
{
"type": "forecast.schedule_rule.due",
"version": 1,
"description": "A due schedule-rule delivery was claimed once and persisted with its notification.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"rule_id",
"rule_name",
"scenario_id",
"coa_id",
"amount_cents",
"due_date",
"occurred_at",
"cta_url"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"rule_id": {
"type": "string",
"minLength": 1
},
"rule_name": {
"type": [
"string",
"null"
]
},
"scenario_id": {
"type": "string",
"minLength": 1
},
"coa_id": {
"type": "string",
"minLength": 1
},
"amount_cents": {
"type": "integer"
},
"due_date": {
"type": "string",
"format": "date"
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"cta_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Forecast schedule rule is due",
"body": "Monthly payroll is due today.",
"object_id": "rule_1",
"rule_id": "rule_1",
"rule_name": "Monthly payroll",
"scenario_id": "scenario_1",
"coa_id": "coa_payroll",
"amount_cents": -2500000,
"due_date": "2026-07-20",
"occurred_at": "2026-07-20T00:00:00.000Z",
"cta_url": "https://forecast.topolo.app/schedule-rules"
}
],
"dataClassification": "confidential",
"sensitiveFields": [
"amount_cents"
],
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^forecast:schedule-rule-due:"
}
},
{
"type": "forecast.share.invited",
"version": 1,
"description": "A workspace member was durably attached to a newly created Forecast share.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"share_id",
"share_name",
"invited_by_user_id",
"permission_level",
"occurred_at",
"cta_url"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"share_id": {
"type": "string",
"minLength": 1
},
"share_name": {
"type": "string",
"minLength": 1
},
"invited_by_user_id": {
"type": "string",
"minLength": 1
},
"permission_level": {
"type": "string",
"enum": [
"read",
"collaborate"
]
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"cta_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Forecast share invitation",
"body": "Alex invited you to Board pack.",
"object_id": "share_1",
"share_id": "share_1",
"share_name": "Board pack",
"invited_by_user_id": "user_alex",
"permission_level": "read",
"occurred_at": "2026-07-20T00:00:00.000Z",
"cta_url": "https://forecast.topolo.app/shared/token"
}
],
"dataClassification": "confidential",
"sensitiveFields": [
"cta_url"
],
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^forecast:share-invited:"
}
}
]
},
"actions": [
{
"name": "widget.get",
"title": "Get widget summary",
"description": "Get the TopoloOne widget summary for this service.",
"method": "GET",
"path": "/api/widget",
"permission": "dashboard:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/widget",
"body": null
},
"effects": "Reads state through GET /api/widget without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/widget",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "coa.get",
"title": "Get chart of accounts",
"description": "Get Forecast chart of accounts.",
"method": "GET",
"path": "/api/v1/{workspace}/coa",
"permission": "forecasts:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspace"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get chart of accounts.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspace": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/v1/example/coa",
"body": null
},
"effects": "Reads state through GET /api/v1/{workspace}/coa without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/v1/*/coa",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "workspaces.set_active_scenario",
"title": "Set active scenario",
"description": "Set the active Forecast workspace scenario.",
"method": "PATCH",
"path": "/api/v1/workspaces/{id}/active-scenario",
"permission": "workspace:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"scenarioId": {
"type": "string",
"minLength": 1
}
},
"required": [
"id",
"scenarioId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Set active scenario.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000",
"scenarioId": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "PATCH",
"path": "/api/v1/workspaces/00000000-0000-4000-8000-000000000000/active-scenario",
"body": {
"id": "00000000-0000-4000-8000-000000000000",
"scenarioId": "example"
}
},
"effects": "May change state through PATCH /api/v1/workspaces/{id}/active-scenario. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PATCH /api/v1/workspaces/*/active-scenario",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "workspaces.delete",
"title": "Delete workspace",
"description": "Delete a Forecast workspace.",
"method": "DELETE",
"path": "/api/v1/workspaces/{id}",
"permission": "workspace:delete",
"authorizationMode": "static",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete workspace.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "DELETE",
"path": "/api/v1/workspaces/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "May change state through DELETE /api/v1/workspaces/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/v1/workspaces/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "workspace_shares.list",
"title": "List workspace shares",
"description": "List Forecast workspace shares.",
"method": "GET",
"path": "/api/v1/workspaces/{workspaceId}/shares",
"permission": "forecasts:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspaceId": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspaceId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List workspace shares.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspaceId": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/v1/workspaces/example/shares",
"body": null
},
"effects": "Reads state through GET /api/v1/workspaces/{workspaceId}/shares without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/v1/workspaces/*/shares",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "workspace_shares.create",
"title": "Create workspace share",
"description": "Create a Forecast workspace share.",
"method": "POST",
"path": "/api/v1/workspaces/{workspaceId}/shares",
"permission": "forecasts:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspaceId": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"description": {
"type": "string",
"minLength": 1
},
"permission_level": {
"type": "string",
"enum": [
"read",
"collaborate"
]
},
"expires_at": {
"type": "string",
"minLength": 1
},
"max_accesses": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"recipient_user_id": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspaceId",
"name"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create workspace share.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspaceId": "example",
"name": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/v1/workspaces/example/shares",
"body": {
"workspaceId": "example",
"name": "example"
}
},
"effects": "May change state through POST /api/v1/workspaces/{workspaceId}/shares. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/v1/workspaces/*/shares",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "workspace_shares.update",
"title": "Update workspace share",
"description": "Update a Forecast workspace share.",
"method": "PATCH",
"path": "/api/v1/workspaces/{workspaceId}/shares/{shareId}",
"permission": "forecasts:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspaceId": {
"type": "string",
"minLength": 1
},
"shareId": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"description": {
"type": "string",
"minLength": 1
},
"permission_level": {
"type": "string",
"enum": [
"read",
"collaborate"
]
},
"is_active": {
"type": "boolean"
},
"expires_at": {
"type": "string",
"minLength": 1
},
"max_accesses": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"workspaceId",
"shareId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update workspace share.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspaceId": "example",
"shareId": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "PATCH",
"path": "/api/v1/workspaces/example/shares/example",
"body": {
"workspaceId": "example",
"shareId": "example"
}
},
"effects": "May change state through PATCH /api/v1/workspaces/{workspaceId}/shares/{shareId}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PATCH /api/v1/workspaces/*/shares/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "workspace_shares.delete",
"title": "Delete workspace share",
"description": "Delete a Forecast workspace share.",
"method": "DELETE",
"path": "/api/v1/workspaces/{workspaceId}/shares/{shareId}",
"permission": "forecasts:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspaceId": {
"type": "string",
"minLength": 1
},
"shareId": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspaceId",
"shareId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete workspace share.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspaceId": "example",
"shareId": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "DELETE",
"path": "/api/v1/workspaces/example/shares/example",
"body": null
},
"effects": "May change state through DELETE /api/v1/workspaces/{workspaceId}/shares/{shareId}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/v1/workspaces/*/shares/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "share_settings.get",
"title": "Get share settings",
"description": "Get Forecast workspace share settings.",
"method": "GET",
"path": "/api/v1/workspaces/{workspaceId}/share-settings",
"permission": "settings:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspaceId": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspaceId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get share settings.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspaceId": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/v1/workspaces/example/share-settings",
"body": null
},
"effects": "Reads state through GET /api/v1/workspaces/{workspaceId}/share-settings without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/v1/workspaces/*/share-settings",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "share_settings.update",
"title": "Update share settings",
"description": "Update Forecast workspace share settings.",
"method": "PATCH",
"path": "/api/v1/workspaces/{workspaceId}/share-settings",
"permission": "settings:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspaceId": {
"type": "string",
"minLength": 1
},
"sharing_enabled": {
"type": "boolean"
},
"default_permission_level": {
"type": "string",
"enum": [
"read",
"collaborate"
]
},
"default_expiry_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"max_active_shares": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"require_password": {
"type": "boolean"
},
"allowed_domains": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
"custom_branding_enabled": {
"type": "boolean"
},
"custom_logo_url": {
"type": "string",
"minLength": 1
},
"custom_title": {
"type": "string",
"minLength": 1
},
"custom_description": {
"type": "string",
"minLength": 1
},
"analytics_enabled": {
"type": "boolean"
}
},
"required": [
"workspaceId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update share settings.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspaceId": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "PATCH",
"path": "/api/v1/workspaces/example/share-settings",
"body": {
"workspaceId": "example"
}
},
"effects": "May change state through PATCH /api/v1/workspaces/{workspaceId}/share-settings. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PATCH /api/v1/workspaces/*/share-settings",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "scenarios.list",
"title": "List scenarios",
"description": "List Forecast scenarios.",
"method": "GET",
"path": "/api/v1/{workspace}/scenarios",
"permission": "forecasts:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspace"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List scenarios.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspace": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/v1/example/scenarios",
"body": null
},
"effects": "Reads state through GET /api/v1/{workspace}/scenarios without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/v1/*/scenarios",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "scenarios.create",
"title": "Create scenario",
"description": "Create a Forecast scenario in a platform-authorized workspace, including the first scenario for a newly created workspace.",
"method": "POST",
"path": "/api/v1/{workspace}/scenarios",
"permission": "forecasts:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"base_scenario_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"workspace",
"name"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Created Forecast scenario.",
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"workspace_id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id",
"name",
"workspace_id"
],
"additionalProperties": true
},
"message": {
"type": "string"
}
},
"required": [
"success",
"data"
],
"additionalProperties": true
},
"agentContract": {
"docsUrl": "https://docs.topolo.app/applications/forecast",
"resource": {
"kind": "scenario",
"idPath": "$.data.id"
},
"effects": [
"Creates a planning scenario in the selected platform-authorized Forecast workspace. This is the bootstrap action for a newly created workspace."
],
"errors": [
{
"status": 403,
"code": "action_permission_required",
"recovery": "Use a credential with forecasts:write access to the selected Forecast workspace."
}
],
"verify": [
"Call scenarios.list with the same workspace and confirm the returned list contains $.data.id and the requested name."
],
"nextActionIds": [
"app_topolo_forecast.scenarios.list",
"app_topolo_forecast.coa.create",
"app_topolo_forecast.cash_accounts.create"
],
"examples": [
{
"title": "Create the base operating plan",
"input": {
"workspace": "ws_forecast_northstar",
"name": "Northstar FY27 Base Plan"
}
}
],
"recovery": {
"mode": "compensating_action",
"actionId": "app_topolo_forecast.scenarios.delete",
"requiresSnapshot": false,
"instructions": "Archive the created scenario only after confirming no dependent planning data should be retained."
}
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "ws_forecast_northstar",
"name": "Northstar FY27 Base Plan"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/v1/ws_forecast_northstar/scenarios",
"body": {
"workspace": "ws_forecast_northstar",
"name": "Northstar FY27 Base Plan"
}
},
"effects": "Creates a planning scenario in the selected platform-authorized Forecast workspace. This is the bootstrap action for a newly created workspace.",
"verification": [
"Call scenarios.list with the same workspace and confirm the returned list contains $.data.id and the requested name."
],
"recovery": [
{
"mode": "compensating_action",
"actionId": "app_topolo_forecast.scenarios.delete",
"requiresSnapshot": false,
"instructions": "Archive the created scenario only after confirming no dependent planning data should be retained."
},
"403 action_permission_required: Use a credential with forecasts:write access to the selected Forecast workspace."
],
"docs_url": "https://docs.topolo.app/applications/forecast",
"resource": {
"kind": "scenario",
"idPath": "$.data.id"
},
"next_action_ids": [
"app_topolo_forecast.scenarios.list",
"app_topolo_forecast.coa.create",
"app_topolo_forecast.cash_accounts.create"
],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/v1/*/scenarios",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "scenarios.update",
"title": "Update scenario",
"description": "Update a Forecast scenario.",
"method": "PATCH",
"path": "/api/v1/{workspace}/scenarios/{scenarioId}",
"permission": "forecasts:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"scenarioId": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"archived": {
"type": "boolean"
}
},
"required": [
"workspace",
"scenarioId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update scenario.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"scenarioId": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "PATCH",
"path": "/api/v1/example/scenarios/example",
"body": {
"workspace": "example",
"scenarioId": "example"
}
},
"effects": "May change state through PATCH /api/v1/{workspace}/scenarios/{scenarioId}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PATCH /api/v1/*/scenarios/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "scenarios.duplicate",
"title": "Duplicate scenario",
"description": "Duplicate a Forecast scenario.",
"method": "POST",
"path": "/api/v1/{workspace}/scenarios/{scenarioId}/duplicate",
"permission": "forecasts:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"scenarioId": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspace",
"scenarioId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Duplicate scenario.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"scenarioId": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/v1/example/scenarios/example/duplicate",
"body": {
"workspace": "example",
"scenarioId": "example"
}
},
"effects": "May change state through POST /api/v1/{workspace}/scenarios/{scenarioId}/duplicate. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/v1/*/scenarios/*/duplicate",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "scenarios.delete",
"title": "Delete scenario",
"description": "Delete a Forecast scenario.",
"method": "DELETE",
"path": "/api/v1/{workspace}/scenarios/{scenarioId}",
"permission": "forecasts:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"scenarioId": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspace",
"scenarioId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete scenario.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"scenarioId": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "DELETE",
"path": "/api/v1/example/scenarios/example",
"body": null
},
"effects": "May change state through DELETE /api/v1/{workspace}/scenarios/{scenarioId}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/v1/*/scenarios/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "coa.create",
"title": "Create chart account",
"description": "Create a Forecast chart of accounts entry.",
"method": "POST",
"path": "/api/v1/{workspace}/coa",
"permission": "forecasts:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"type": {
"type": "string",
"enum": [
"income",
"cos",
"opex",
"calc"
]
},
"trend_factor": {
"type": "number"
},
"parentId": {
"type": "string",
"minLength": 1
},
"order_index": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"workspace",
"name",
"type"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create chart account.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"name": "example",
"type": "income"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/v1/example/coa",
"body": {
"workspace": "example",
"name": "example",
"type": "income"
}
},
"effects": "May change state through POST /api/v1/{workspace}/coa. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/v1/*/coa",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "coa.update",
"title": "Update chart account",
"description": "Update a Forecast chart of accounts entry.",
"method": "PATCH",
"path": "/api/v1/{workspace}/coa/{id}",
"permission": "forecasts:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"type": {
"type": "string",
"enum": [
"income",
"cos",
"opex",
"calc"
]
},
"trend_factor": {
"type": "number",
"minimum": -10,
"maximum": 10
},
"parentId": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspace",
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update chart account.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "PATCH",
"path": "/api/v1/example/coa/00000000-0000-4000-8000-000000000000",
"body": {
"workspace": "example",
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through PATCH /api/v1/{workspace}/coa/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PATCH /api/v1/*/coa/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "coa.delete",
"title": "Delete chart account",
"description": "Delete a Forecast chart of accounts entry.",
"method": "DELETE",
"path": "/api/v1/{workspace}/coa/{id}",
"permission": "forecasts:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"id": {
"type": "string",
"minLength": 1
},
"force": {
"type": "boolean"
}
},
"required": [
"workspace",
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete chart account.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "DELETE",
"path": "/api/v1/example/coa/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "May change state through DELETE /api/v1/{workspace}/coa/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/v1/*/coa/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "daily.get",
"title": "Get daily entries",
"description": "Get Forecast daily entries for a period.",
"method": "GET",
"path": "/api/v1/{workspace}/daily/{period}",
"permission": "transactions:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"period": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}$"
}
},
"required": [
"workspace",
"period"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get daily entries.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspace": "example",
"period": "2026-01"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/v1/example/daily/2026-01",
"body": null
},
"effects": "Reads state through GET /api/v1/{workspace}/daily/{period} without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/v1/*/daily/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "daily.annual.get",
"title": "Get annual daily entries",
"description": "Get Forecast daily entries for a year.",
"method": "GET",
"path": "/api/v1/{workspace}/daily/annual/{year}",
"permission": "transactions:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"year": {
"type": "string",
"pattern": "^\\d{4}$"
}
},
"required": [
"workspace",
"year"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get annual daily entries.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspace": "example",
"year": "2026"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/v1/example/daily/annual/2026",
"body": null
},
"effects": "Reads state through GET /api/v1/{workspace}/daily/annual/{year} without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/v1/*/daily/annual/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "daily.upsert",
"title": "Upsert daily entry",
"description": "Upsert a Forecast daily entry.",
"method": "PUT",
"path": "/api/v1/{workspace}/daily",
"permission": "transactions:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"coaId": {
"type": "string",
"minLength": 1
},
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"amountCents": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"isActual": {
"type": "boolean"
},
"note": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspace",
"coaId",
"date",
"amountCents"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Upsert daily entry.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"coaId": "example",
"date": "2026-01-01",
"amountCents": 1
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "PUT",
"path": "/api/v1/example/daily",
"body": {
"workspace": "example",
"coaId": "example",
"date": "2026-01-01",
"amountCents": 1
}
},
"effects": "May change state through PUT /api/v1/{workspace}/daily. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/v1/*/daily",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "daily.bulk_upsert",
"title": "Bulk upsert daily entries",
"description": "Bulk upsert Forecast daily entries.",
"method": "PUT",
"path": "/api/v1/{workspace}/daily/bulk",
"permission": "transactions:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"entries": {
"minItems": 1,
"maxItems": 100,
"type": "array",
"items": {
"type": "object",
"properties": {
"coaId": {
"type": "string",
"minLength": 1
},
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"amountCents": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"isActual": {
"type": "boolean"
},
"note": {
"type": "string",
"minLength": 1
}
},
"required": [
"coaId",
"date",
"amountCents"
],
"additionalProperties": false
}
}
},
"required": [
"workspace",
"entries"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Bulk upsert daily entries.",
"additionalProperties": true
},
"agentContract": {
"docsUrl": "https://docs.topolo.app/applications/forecast",
"resource": {
"kind": "daily_entry_batch",
"idPath": "data"
},
"effects": [
"Creates or replaces up to 100 Forecast daily entries in the workspace's active scenario, keyed by chart-of-account id and date."
],
"errors": [
{
"status": 500,
"code": "BULK_DAILY_ENTRY_SAVE_ERROR",
"recovery": "Preserve the submitted entries and request id, then retry only after the Forecast service reports healthy; entries already written remain upsert-safe by workspace, scenario, chart-of-account id, and date."
}
],
"verify": [
"Call daily.annual.get for every affected year in the same workspace and compare each submitted chart-of-account id, date, amountCents, isActual, and note."
],
"nextActionIds": [
"app_topolo_forecast.daily.annual.get"
],
"examples": [
{
"title": "Upsert one monthly planning entry",
"input": {
"workspace": "operating-plan",
"entries": [
{
"coaId": "account-revenue",
"date": "2026-10-01",
"amountCents": 6500000,
"isActual": false,
"note": "Base-case monthly forecast"
}
]
}
}
]
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "operating-plan",
"entries": [
{
"coaId": "account-revenue",
"date": "2026-10-01",
"amountCents": 6500000,
"isActual": false,
"note": "Base-case monthly forecast"
}
]
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "PUT",
"path": "/api/v1/operating-plan/daily/bulk",
"body": {
"workspace": "operating-plan",
"entries": [
{
"coaId": "account-revenue",
"date": "2026-10-01",
"amountCents": 6500000,
"isActual": false,
"note": "Base-case monthly forecast"
}
]
}
},
"effects": "Creates or replaces up to 100 Forecast daily entries in the workspace's active scenario, keyed by chart-of-account id and date.",
"verification": [
"Call daily.annual.get for every affected year in the same workspace and compare each submitted chart-of-account id, date, amountCents, isActual, and note."
],
"recovery": [
"500 BULK_DAILY_ENTRY_SAVE_ERROR: Preserve the submitted entries and request id, then retry only after the Forecast service reports healthy; entries already written remain upsert-safe by workspace, scenario, chart-of-account id, and date."
],
"docs_url": "https://docs.topolo.app/applications/forecast",
"resource": {
"kind": "daily_entry_batch",
"idPath": "data"
},
"next_action_ids": [
"app_topolo_forecast.daily.annual.get"
],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/v1/*/daily/bulk",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "imports.run",
"title": "Import forecast entries",
"description": "Persist a bounded batch of Forecast entries and its terminal import result.",
"method": "POST",
"path": "/api/v1/{workspace}/imports",
"permission": "forecasts:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"entries": {
"minItems": 1,
"maxItems": 500,
"type": "array",
"items": {
"type": "object",
"properties": {
"coaId": {
"type": "string",
"minLength": 1
},
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"amountCents": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"isActual": {
"type": "boolean"
},
"note": {
"type": "string",
"minLength": 1
}
},
"required": [
"coaId",
"date",
"amountCents"
],
"additionalProperties": false
}
}
},
"required": [
"workspace",
"entries"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Import forecast entries.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"entries": [
{
"coaId": "example",
"date": "2026-01-01",
"amountCents": 1
}
]
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/v1/example/imports",
"body": {
"workspace": "example",
"entries": [
{
"coaId": "example",
"date": "2026-01-01",
"amountCents": 1
}
]
}
},
"effects": "May change state through POST /api/v1/{workspace}/imports. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/v1/*/imports",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "summary.month.get",
"title": "Get monthly summary",
"description": "Get Forecast monthly summary.",
"method": "GET",
"path": "/api/v1/{workspace}/summary/month/{period}",
"permission": "reports:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"period": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}$"
}
},
"required": [
"workspace",
"period"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get monthly summary.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspace": "example",
"period": "2026-01"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/v1/example/summary/month/2026-01",
"body": null
},
"effects": "Reads state through GET /api/v1/{workspace}/summary/month/{period} without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/v1/*/summary/month/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "summary.year.get",
"title": "Get yearly summary",
"description": "Get Forecast yearly summary.",
"method": "GET",
"path": "/api/v1/{workspace}/summary/year/{period}",
"permission": "reports:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"period": {
"type": "string",
"pattern": "^\\d{4}$"
}
},
"required": [
"workspace",
"period"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get yearly summary.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspace": "example",
"period": "2026"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/v1/example/summary/year/2026",
"body": null
},
"effects": "Reads state through GET /api/v1/{workspace}/summary/year/{period} without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/v1/*/summary/year/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "forecast.get",
"title": "Get forecast",
"description": "Get Forecast projection for a period.",
"method": "GET",
"path": "/api/v1/{workspace}/forecast/{period}",
"permission": "forecasts:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"period": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}$"
},
"depth": {
"type": "integer",
"minimum": 1,
"maximum": 36
}
},
"required": [
"workspace",
"period"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get forecast.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspace": "example",
"period": "2026-01"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/v1/example/forecast/2026-01",
"body": null
},
"effects": "Reads state through GET /api/v1/{workspace}/forecast/{period} without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/v1/*/forecast/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "openclaw.events.list",
"title": "List OpenClaw events",
"description": "List Forecast OpenClaw events.",
"method": "GET",
"path": "/api/v1/{workspace}/openclaw/events",
"permission": "reports:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"category": {
"type": "string",
"minLength": 1
},
"since": {
"type": "string",
"minLength": 1
},
"scenarioId": {
"type": "string",
"minLength": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 200
}
},
"required": [
"workspace"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List OpenClaw events.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspace": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/v1/example/openclaw/events",
"body": null
},
"effects": "Reads state through GET /api/v1/{workspace}/openclaw/events without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/v1/*/openclaw/events",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "openclaw.forecast_health.get",
"title": "Get forecast health",
"description": "Get Forecast OpenClaw health.",
"method": "GET",
"path": "/api/v1/{workspace}/openclaw/forecast-health",
"permission": "reports:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"period": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}$"
},
"depth": {
"type": "integer",
"minimum": 1,
"maximum": 36
},
"stale_after_hours": {
"type": "integer",
"minimum": 1,
"maximum": 720
}
},
"required": [
"workspace"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get forecast health.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspace": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/v1/example/openclaw/forecast-health",
"body": null
},
"effects": "Reads state through GET /api/v1/{workspace}/openclaw/forecast-health without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/v1/*/openclaw/forecast-health",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "openclaw.report_status.create",
"title": "Create report status",
"description": "Create Forecast OpenClaw report status.",
"method": "POST",
"path": "/api/v1/{workspace}/openclaw/report-status",
"permission": "forecasts:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"enum": [
"queued",
"running",
"succeeded",
"failed",
"stale"
]
},
"runId": {
"type": "string",
"minLength": 1
},
"scenarioId": {
"type": "string",
"minLength": 1
},
"period": {
"type": "string",
"minLength": 1
},
"format": {
"type": "string",
"minLength": 1
},
"scheduledFor": {
"type": "string",
"minLength": 1
},
"startedAt": {
"type": "string",
"minLength": 1
},
"completedAt": {
"type": "string",
"minLength": 1
},
"artifactUrl": {
"type": "string",
"minLength": 1
},
"error": {
"type": "string",
"minLength": 1
},
"metadata": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"workspace",
"name",
"status"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create report status.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"name": "example",
"status": "queued"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/v1/example/openclaw/report-status",
"body": {
"workspace": "example",
"name": "example",
"status": "queued"
}
},
"effects": "May change state through POST /api/v1/{workspace}/openclaw/report-status. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/v1/*/openclaw/report-status",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "openclaw.export_status.create",
"title": "Create export status",
"description": "Create Forecast OpenClaw export status.",
"method": "POST",
"path": "/api/v1/{workspace}/openclaw/export-status",
"permission": "forecasts:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"enum": [
"queued",
"running",
"succeeded",
"failed",
"stale"
]
},
"runId": {
"type": "string",
"minLength": 1
},
"scenarioId": {
"type": "string",
"minLength": 1
},
"period": {
"type": "string",
"minLength": 1
},
"format": {
"type": "string",
"minLength": 1
},
"scheduledFor": {
"type": "string",
"minLength": 1
},
"startedAt": {
"type": "string",
"minLength": 1
},
"completedAt": {
"type": "string",
"minLength": 1
},
"artifactUrl": {
"type": "string",
"minLength": 1
},
"error": {
"type": "string",
"minLength": 1
},
"metadata": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"workspace",
"name",
"status"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create export status.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"name": "example",
"status": "queued"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/v1/example/openclaw/export-status",
"body": {
"workspace": "example",
"name": "example",
"status": "queued"
}
},
"effects": "May change state through POST /api/v1/{workspace}/openclaw/export-status. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/v1/*/openclaw/export-status",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "cash_accounts.list",
"title": "List cash accounts",
"description": "List Forecast cash accounts.",
"method": "GET",
"path": "/api/v1/{workspace}/cash-accounts",
"permission": "settings:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspace"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List cash accounts.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspace": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/v1/example/cash-accounts",
"body": null
},
"effects": "Reads state through GET /api/v1/{workspace}/cash-accounts without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/v1/*/cash-accounts",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "cash_accounts.create",
"title": "Create cash account",
"description": "Create a workspace-level Forecast cash account. A scenario is not required.",
"method": "POST",
"path": "/api/v1/{workspace}/cash-accounts",
"permission": "settings:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"account_name": {
"type": "string",
"minLength": 1
},
"account_type": {
"type": "string",
"enum": [
"checking",
"savings",
"investment",
"cash",
"credit_card",
"other"
]
},
"starting_balance_cents": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"display_order": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"workspace",
"account_name",
"account_type"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Created Forecast cash account.",
"properties": {
"success": {
"type": "boolean"
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"workspace_id": {
"type": "string",
"minLength": 1
},
"account_name": {
"type": "string",
"minLength": 1
},
"account_type": {
"type": "string"
}
},
"required": [
"id",
"workspace_id",
"account_name",
"account_type"
],
"additionalProperties": true
}
},
"required": [
"success",
"data"
],
"additionalProperties": true
},
"agentContract": {
"docsUrl": "https://docs.topolo.app/applications/forecast",
"resource": {
"kind": "cash_account",
"idPath": "$.data.id"
},
"effects": [
"Creates a workspace-level cash account and initializes its current balance from starting_balance_cents."
],
"errors": [
{
"status": 403,
"code": "action_permission_required",
"recovery": "Use a credential with settings:write access to the selected Forecast workspace."
}
],
"verify": [
"Call cash_accounts.list with the same workspace and confirm the returned list contains $.data.id, account_name, account_type, and starting balance."
],
"nextActionIds": [
"app_topolo_forecast.cash_accounts.list"
],
"examples": [
{
"title": "Create an operating account",
"input": {
"workspace": "ws_forecast_northstar",
"account_name": "Northstar Operating Account",
"account_type": "checking",
"starting_balance_cents": 1850000,
"display_order": 1
}
}
],
"recovery": {
"mode": "compensating_action",
"actionId": "app_topolo_forecast.cash_accounts.delete",
"requiresSnapshot": false,
"instructions": "Delete the created account only after confirming it has no cash-flow entries that must be retained."
}
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "ws_forecast_northstar",
"account_name": "Northstar Operating Account",
"account_type": "checking",
"starting_balance_cents": 1850000,
"display_order": 1
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/v1/ws_forecast_northstar/cash-accounts",
"body": {
"workspace": "ws_forecast_northstar",
"account_name": "Northstar Operating Account",
"account_type": "checking",
"starting_balance_cents": 1850000,
"display_order": 1
}
},
"effects": "Creates a workspace-level cash account and initializes its current balance from starting_balance_cents.",
"verification": [
"Call cash_accounts.list with the same workspace and confirm the returned list contains $.data.id, account_name, account_type, and starting balance."
],
"recovery": [
{
"mode": "compensating_action",
"actionId": "app_topolo_forecast.cash_accounts.delete",
"requiresSnapshot": false,
"instructions": "Delete the created account only after confirming it has no cash-flow entries that must be retained."
},
"403 action_permission_required: Use a credential with settings:write access to the selected Forecast workspace."
],
"docs_url": "https://docs.topolo.app/applications/forecast",
"resource": {
"kind": "cash_account",
"idPath": "$.data.id"
},
"next_action_ids": [
"app_topolo_forecast.cash_accounts.list"
],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/v1/*/cash-accounts",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "cash_accounts.update",
"title": "Update cash account",
"description": "Update a Forecast cash account.",
"method": "PATCH",
"path": "/api/v1/{workspace}/cash-accounts/{accountId}",
"permission": "settings:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"accountId": {
"type": "string",
"minLength": 1
},
"account_name": {
"type": "string",
"minLength": 1
},
"account_type": {
"type": "string",
"enum": [
"checking",
"savings",
"investment",
"cash",
"credit_card",
"other"
]
},
"starting_balance_cents": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"current_balance_cents": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"is_active": {
"type": "boolean"
},
"display_order": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"workspace",
"accountId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update cash account.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"accountId": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "PATCH",
"path": "/api/v1/example/cash-accounts/example",
"body": {
"workspace": "example",
"accountId": "example"
}
},
"effects": "May change state through PATCH /api/v1/{workspace}/cash-accounts/{accountId}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PATCH /api/v1/*/cash-accounts/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "cash_accounts.delete",
"title": "Delete cash account",
"description": "Delete a Forecast cash account.",
"method": "DELETE",
"path": "/api/v1/{workspace}/cash-accounts/{accountId}",
"permission": "settings:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"accountId": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspace",
"accountId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete cash account.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"accountId": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "DELETE",
"path": "/api/v1/example/cash-accounts/example",
"body": null
},
"effects": "May change state through DELETE /api/v1/{workspace}/cash-accounts/{accountId}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/v1/*/cash-accounts/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "cash_flow.get",
"title": "Get cash flow",
"description": "Get Forecast cash flow for a period.",
"method": "GET",
"path": "/api/v1/{workspace}/cash-flow/{period}",
"permission": "transactions:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"period": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}$"
}
},
"required": [
"workspace",
"period"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get cash flow.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspace": "example",
"period": "2026-01"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/v1/example/cash-flow/2026-01",
"body": null
},
"effects": "Reads state through GET /api/v1/{workspace}/cash-flow/{period} without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/v1/*/cash-flow/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "cash_flow.create",
"title": "Create cash flow entry",
"description": "Create a Forecast cash flow entry.",
"method": "POST",
"path": "/api/v1/{workspace}/cash-flow",
"permission": "transactions:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"cash_account_id": {
"type": "string",
"minLength": 1
},
"entry_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"amount_cents": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"description": {
"type": "string",
"minLength": 1
},
"category": {
"type": "string",
"enum": [
"revenue",
"expense",
"transfer",
"adjustment",
"starting_balance"
]
},
"p_and_l_account_id": {
"type": "string",
"minLength": 1
},
"transfer_account_id": {
"type": "string",
"minLength": 1
},
"transfer_group_id": {
"type": "string",
"minLength": 1
},
"is_actual": {
"type": "boolean"
}
},
"required": [
"workspace",
"cash_account_id",
"entry_date",
"amount_cents",
"category"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create cash flow entry.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"cash_account_id": "00000000-0000-4000-8000-000000000000",
"entry_date": "2026-01-01",
"amount_cents": 1,
"category": "revenue"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/v1/example/cash-flow",
"body": {
"workspace": "example",
"cash_account_id": "00000000-0000-4000-8000-000000000000",
"entry_date": "2026-01-01",
"amount_cents": 1,
"category": "revenue"
}
},
"effects": "May change state through POST /api/v1/{workspace}/cash-flow. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/v1/*/cash-flow",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "cash_flow.update",
"title": "Update cash flow entry",
"description": "Update a Forecast cash flow entry.",
"method": "PATCH",
"path": "/api/v1/{workspace}/cash-flow/{entryId}",
"permission": "transactions:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"entryId": {
"type": "string",
"minLength": 1
},
"entry_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"amount_cents": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"description": {
"type": "string",
"minLength": 1
},
"category": {
"type": "string",
"enum": [
"revenue",
"expense",
"transfer",
"adjustment",
"starting_balance"
]
},
"p_and_l_account_id": {
"type": "string",
"minLength": 1
},
"transfer_account_id": {
"type": "string",
"minLength": 1
},
"transfer_group_id": {
"type": "string",
"minLength": 1
},
"is_actual": {
"type": "boolean"
}
},
"required": [
"workspace",
"entryId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update cash flow entry.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"entryId": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "PATCH",
"path": "/api/v1/example/cash-flow/example",
"body": {
"workspace": "example",
"entryId": "example"
}
},
"effects": "May change state through PATCH /api/v1/{workspace}/cash-flow/{entryId}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PATCH /api/v1/*/cash-flow/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "cash_flow.delete",
"title": "Delete cash flow entry",
"description": "Delete a Forecast cash flow entry.",
"method": "DELETE",
"path": "/api/v1/{workspace}/cash-flow/{entryId}",
"permission": "transactions:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"entryId": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspace",
"entryId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete cash flow entry.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"entryId": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "DELETE",
"path": "/api/v1/example/cash-flow/example",
"body": null
},
"effects": "May change state through DELETE /api/v1/{workspace}/cash-flow/{entryId}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/v1/*/cash-flow/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "cash_settings.get",
"title": "Get cash settings",
"description": "Get Forecast cash settings.",
"method": "GET",
"path": "/api/v1/{workspace}/cash-settings",
"permission": "settings:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspace"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get cash settings.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspace": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/v1/example/cash-settings",
"body": null
},
"effects": "Reads state through GET /api/v1/{workspace}/cash-settings without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/v1/*/cash-settings",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "cash_settings.update",
"title": "Update cash settings",
"description": "Update Forecast cash settings.",
"method": "PATCH",
"path": "/api/v1/{workspace}/cash-settings",
"permission": "settings:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"low_cash_warning_cents": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"critical_cash_warning_cents": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"auto_generate_forecasts": {
"type": "boolean"
},
"workspace_profile": {
"type": "string",
"enum": [
"business",
"personal"
]
}
},
"required": [
"workspace"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update cash settings.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "PATCH",
"path": "/api/v1/example/cash-settings",
"body": {
"workspace": "example"
}
},
"effects": "May change state through PATCH /api/v1/{workspace}/cash-settings. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PATCH /api/v1/*/cash-settings",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "schedule_rules.list",
"title": "List schedule rules",
"description": "List Forecast schedule rules.",
"method": "GET",
"path": "/api/v1/{workspace}/schedule-rules",
"permission": "settings:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"scenario_id": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspace"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List schedule rules.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspace": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/v1/example/schedule-rules",
"body": null
},
"effects": "Reads state through GET /api/v1/{workspace}/schedule-rules without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/v1/*/schedule-rules",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "schedule_rules.create",
"title": "Create schedule rule",
"description": "Create a Forecast schedule rule.",
"method": "POST",
"path": "/api/v1/{workspace}/schedule-rules",
"permission": "settings:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"scenario_id": {
"type": "string",
"minLength": 1
},
"coa_id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"amount_cents": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"pattern_type": {
"type": "string",
"minLength": 1
},
"pattern_config": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"end_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"is_active": {
"type": "boolean"
}
},
"required": [
"workspace"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create schedule rule.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/v1/example/schedule-rules",
"body": {
"workspace": "example"
}
},
"effects": "May change state through POST /api/v1/{workspace}/schedule-rules. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/v1/*/schedule-rules",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "schedule_rules.update",
"title": "Update schedule rule",
"description": "Update a Forecast schedule rule.",
"method": "PUT",
"path": "/api/v1/{workspace}/schedule-rules/{ruleId}",
"permission": "settings:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"ruleId": {
"type": "string",
"minLength": 1
},
"scenario_id": {
"type": "string",
"minLength": 1
},
"coa_id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"amount_cents": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"pattern_type": {
"type": "string",
"minLength": 1
},
"pattern_config": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"end_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"is_active": {
"type": "boolean"
}
},
"required": [
"workspace",
"ruleId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update schedule rule.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"ruleId": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "PUT",
"path": "/api/v1/example/schedule-rules/example",
"body": {
"workspace": "example",
"ruleId": "example"
}
},
"effects": "May change state through PUT /api/v1/{workspace}/schedule-rules/{ruleId}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/v1/*/schedule-rules/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "schedule_rules.delete",
"title": "Delete schedule rule",
"description": "Delete a Forecast schedule rule.",
"method": "DELETE",
"path": "/api/v1/{workspace}/schedule-rules/{ruleId}",
"permission": "settings:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"ruleId": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspace",
"ruleId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete schedule rule.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"ruleId": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "DELETE",
"path": "/api/v1/example/schedule-rules/example",
"body": null
},
"effects": "May change state through DELETE /api/v1/{workspace}/schedule-rules/{ruleId}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/v1/*/schedule-rules/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "shares.list",
"title": "Shares List",
"description": "Call GET /api/v1/{workspace}/shares.",
"method": "GET",
"path": "/api/v1/{workspace}/shares",
"permission": "forecasts:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspace"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Shares List.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspace": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/v1/example/shares",
"body": null
},
"effects": "Reads state through GET /api/v1/{workspace}/shares without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/v1/*/shares",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "shares.create",
"title": "Shares Create",
"description": "Call POST /api/v1/{workspace}/shares.",
"method": "POST",
"path": "/api/v1/{workspace}/shares",
"permission": "forecasts:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"description": {
"type": "string",
"minLength": 1
},
"permission_level": {
"type": "string",
"enum": [
"read",
"collaborate"
]
},
"expires_at": {
"type": "string",
"minLength": 1
},
"max_accesses": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"recipient_user_id": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspace",
"name"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Shares Create.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"name": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "POST",
"path": "/api/v1/example/shares",
"body": {
"workspace": "example",
"name": "example"
}
},
"effects": "May change state through POST /api/v1/{workspace}/shares. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/v1/*/shares",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "shares.update",
"title": "Shares Update",
"description": "Call PATCH /api/v1/{workspace}/shares/{shareId}.",
"method": "PATCH",
"path": "/api/v1/{workspace}/shares/{shareId}",
"permission": "forecasts:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"shareId": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string",
"minLength": 1
},
"description": {
"type": "string",
"minLength": 1
},
"permission_level": {
"type": "string",
"enum": [
"read",
"collaborate"
]
},
"is_active": {
"type": "boolean"
},
"expires_at": {
"type": "string",
"minLength": 1
},
"max_accesses": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"workspace",
"shareId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Shares Update.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"shareId": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "PATCH",
"path": "/api/v1/example/shares/example",
"body": {
"workspace": "example",
"shareId": "example"
}
},
"effects": "May change state through PATCH /api/v1/{workspace}/shares/{shareId}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PATCH /api/v1/*/shares/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "shares.delete",
"title": "Shares Delete",
"description": "Call DELETE /api/v1/{workspace}/shares/{shareId}.",
"method": "DELETE",
"path": "/api/v1/{workspace}/shares/{shareId}",
"permission": "forecasts:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"shareId": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspace",
"shareId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Shares Delete.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example",
"shareId": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "DELETE",
"path": "/api/v1/example/shares/example",
"body": null
},
"effects": "May change state through DELETE /api/v1/{workspace}/shares/{shareId}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/v1/*/shares/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "shares.settings.get",
"title": "Shares Settings Get",
"description": "Call GET /api/v1/{workspace}/share-settings.",
"method": "GET",
"path": "/api/v1/{workspace}/share-settings",
"permission": "settings:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspace"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Shares Settings Get.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspace": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/v1/example/share-settings",
"body": null
},
"effects": "Reads state through GET /api/v1/{workspace}/share-settings without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/v1/*/share-settings",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "shares.settings.update",
"title": "Shares Settings Update",
"description": "Call PATCH /api/v1/{workspace}/share-settings.",
"method": "PATCH",
"path": "/api/v1/{workspace}/share-settings",
"permission": "settings:write",
"authorizationMode": "static",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspace": {
"type": "string",
"minLength": 1
},
"sharing_enabled": {
"type": "boolean"
},
"default_permission_level": {
"type": "string",
"enum": [
"read",
"collaborate"
]
},
"default_expiry_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"max_active_shares": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"require_password": {
"type": "boolean"
},
"allowed_domains": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
"custom_branding_enabled": {
"type": "boolean"
},
"custom_logo_url": {
"type": "string",
"minLength": 1
},
"custom_title": {
"type": "string",
"minLength": 1
},
"custom_description": {
"type": "string",
"minLength": 1
},
"analytics_enabled": {
"type": "boolean"
}
},
"required": [
"workspace"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Shares Settings Update.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspace": "example"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "PATCH",
"path": "/api/v1/example/share-settings",
"body": {
"workspace": "example"
}
},
"effects": "May change state through PATCH /api/v1/{workspace}/share-settings. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PATCH /api/v1/*/share-settings",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "organizations.data.export",
"title": "Export organization data",
"description": "Export all Forecast data owned by the authenticated organization without share credential material.",
"method": "GET",
"path": "/api/organizations/data/export",
"permission": "privacy:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --json"
],
"http_example": {
"method": "GET",
"path": "/api/organizations/data/export",
"body": null
},
"effects": "Reads state through GET /api/organizations/data/export without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/organizations/data/export",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "organizations.data.erase",
"title": "Erase organization data",
"description": "Permanently erase all Forecast data and workspace-scoped caches owned by the authenticated organization while retaining backups under policy.",
"method": "DELETE",
"path": "/api/organizations/data/erase",
"permission": "privacy:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"confirmation": {
"type": "string",
"const": "ERASE"
}
},
"required": [
"confirmation"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"confirmation": "ERASE"
},
"cli_example": [
"topolo actions --service topolo-forecast --json",
"topolo actions get <action-id> --json",
"topolo actions validate <action-id> --data @payload.json --json",
"topolo actions plan <action-id> --data @payload.json --json",
"topolo actions call <action-id> --data @payload.json --confirm --json"
],
"http_example": {
"method": "DELETE",
"path": "/api/organizations/data/erase",
"body": null
},
"effects": "May change state through DELETE /api/organizations/data/erase. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/organizations/data/erase",
"evidence": "Matched to a served route extracted from canonical staging source."
}
}
],
"action_coverage": {
"status": "ok",
"served_routes": 63,
"matched_actions": 52,
"declared_unserved_actions": [],
"coverage_excluded_actions": [],
"uncatalogued_routes": [],
"ignored_routes": 11,
"configured_exclusions": 9,
"configuration_findings": [],
"notes": []
},
"runtime_contract_audit": {
"status": "verified",
"actions": 52,
"contracts": 52,
"contract_module": "topolo.action-contracts.mjs",
"validator_sources": [
"apps/api/src/index.ts"
],
"authorization_sources": [
"apps/api/src/index.ts"
],
"findings": []
}
}
],
"mobile_contracts": [
{
"source_path": "apps/TopoloForecast/topolo.mobile-experience.json",
"contract": {
"version": "2026-07-24",
"status": "approved",
"mode": "native_capability",
"appId": "app_topolo_forecast",
"localizationNamespace": "forecast",
"permissions": [
"settings:read",
"settings:write",
"forecasts:read",
"forecasts:write",
"workspace:read",
"workspace:write",
"workspace:delete"
],
"offlinePolicy": "read_through_cache",
"fallbackPath": "/dashboard/workspace",
"auth": {
"audience": "topolo-forecast",
"scopes": [
"settings:read",
"settings:write",
"forecasts:read",
"forecasts:write",
"workspace:read",
"workspace:write",
"workspace:delete"
]
},
"routes": [
{
"path": "/dashboard/workspace",
"apiPath": "/api/widget",
"title": "Forecast",
"titleKey": "forecast.mobile.routes.workspace.title",
"template": "record.detail",
"dataSource": "forecast.widget.get"
},
{
"path": "/chart-of-accounts",
"apiPath": "/api/v1/:workspace/coa",
"title": "Chart of accounts",
"titleKey": "forecast.mobile.routes.chartOfAccounts.title",
"template": "record.list",
"dataSource": "coa.get",
"detailRoute": "/chart-of-accounts/:id",
"actions": [
{
"id": "forecast.coa.create",
"title": "Create account",
"titleKey": "forecast.mobile.actions.accountCreate.title",
"type": "record.create",
"permission": "forecasts:write",
"method": "POST",
"path": "/api/v1/:workspace/coa",
"fields": [
{
"key": "name",
"label": "Name",
"type": "text",
"required": true
},
{
"key": "type",
"label": "Account type",
"type": "text",
"required": true
},
{
"key": "trend_factor",
"label": "Trend factor",
"type": "number"
},
{
"key": "parentId",
"label": "Parent account",
"type": "text"
},
{
"key": "order_index",
"label": "Order",
"type": "number"
}
]
},
{
"id": "forecast.coa.update",
"title": "Update account",
"titleKey": "forecast.mobile.actions.accountUpdate.title",
"type": "record.update",
"permission": "forecasts:write",
"method": "PATCH",
"path": "/api/v1/:workspace/coa/:id",
"fields": [
{
"key": "name",
"label": "Name",
"type": "text"
},
{
"key": "type",
"label": "Account type",
"type": "text"
},
{
"key": "trend_factor",
"label": "Trend factor",
"type": "number"
},
{
"key": "parentId",
"label": "Parent account",
"type": "text"
}
]
},
{
"id": "forecast.coa.delete",
"title": "Delete account",
"titleKey": "forecast.mobile.actions.accountDelete.title",
"type": "record.delete",
"permission": "forecasts:write",
"method": "DELETE",
"path": "/api/v1/:workspace/coa/:id"
}
]
}
],
"notes": "The native shell owns canonical workspace selection and Topolo Auth owns list/create/rename/default. Forecast exposes the selected workspace summary and app-local domain actions only."
}
}
],
"package_manifests": [],
"deployment_configs": [],
"source_signals": {
"api_routes": [
{
"method": "LITERAL",
"path": "/clear",
"source_path": "apps/TopoloForecast/apps/api/src/durable-objects/cache-store.ts"
},
{
"method": "GET",
"path": "/health",
"source_path": "apps/TopoloForecast/apps/api/src/index.ts"
},
{
"method": "GET",
"path": "/widget",
"source_path": "apps/TopoloForecast/apps/api/src/index.ts"
},
{
"method": "GET",
"path": "/organizations/data/export",
"source_path": "apps/TopoloForecast/apps/api/src/index.ts"
},
{
"method": "DELETE",
"path": "/organizations/data/erase",
"source_path": "apps/TopoloForecast/apps/api/src/index.ts"
},
{
"method": "GET",
"path": "/v1/:workspace/health",
"source_path": "apps/TopoloForecast/apps/api/src/index.ts"
},
{
"method": "GET",
"path": "/test",
"source_path": "apps/TopoloForecast/apps/api/src/router.ts"
},
{
"method": "GET",
"path": "/:workspace/cash-accounts",
"source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
},
{
"method": "POST",
"path": "/:workspace/cash-accounts",
"source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
},
{
"method": "PATCH",
"path": "/:workspace/cash-accounts/:accountId",
"source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
},
{
"method": "DELETE",
"path": "/:workspace/cash-accounts/:accountId",
"source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
},
{
"method": "GET",
"path": "/:workspace/cash-flow/:period",
"source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
},
{
"method": "POST",
"path": "/:workspace/cash-flow",
"source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
},
{
"method": "PATCH",
"path": "/:workspace/cash-flow/:entryId",
"source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
},
{
"method": "DELETE",
"path": "/:workspace/cash-flow/:entryId",
"source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
},
{
"method": "GET",
"path": "/:workspace/cash-settings",
"source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
},
{
"method": "PATCH",
"path": "/:workspace/cash-settings",
"source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
},
{
"method": "GET",
"path": "/:workspace/schedule-rules",
"source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
},
{
"method": "POST",
"path": "/:workspace/schedule-rules",
"source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
},
{
"method": "PUT",
"path": "/:workspace/schedule-rules/:ruleId",
"source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
},
{
"method": "DELETE",
"path": "/:workspace/schedule-rules/:ruleId",
"source_path": "apps/TopoloForecast/apps/api/src/routes/cash.ts"
},
{
"method": "GET",
"path": "/:workspace/coa",
"source_path": "apps/TopoloForecast/apps/api/src/routes/coa.ts"
},
{
"method": "POST",
"path": "/:workspace/coa",
"source_path": "apps/TopoloForecast/apps/api/src/routes/coa.ts"
},
{
"method": "PATCH",
"path": "/:workspace/coa/:id",
"source_path": "apps/TopoloForecast/apps/api/src/routes/coa.ts"
},
{
"method": "DELETE",
"path": "/:workspace/coa/:id",
"source_path": "apps/TopoloForecast/apps/api/src/routes/coa.ts"
},
{
"method": "GET",
"path": "/:workspace/daily/:period",
"source_path": "apps/TopoloForecast/apps/api/src/routes/daily-entries.ts"
},
{
"method": "GET",
"path": "/:workspace/daily/annual/:year",
"source_path": "apps/TopoloForecast/apps/api/src/routes/daily-entries.ts"
},
{
"method": "PUT",
"path": "/:workspace/daily",
"source_path": "apps/TopoloForecast/apps/api/src/routes/daily-entries.ts"
},
{
"method": "PUT",
"path": "/:workspace/daily/bulk",
"source_path": "apps/TopoloForecast/apps/api/src/routes/daily-entries.ts"
},
{
"method": "POST",
"path": "/:workspace/imports",
"source_path": "apps/TopoloForecast/apps/api/src/routes/imports.ts"
},
{
"method": "GET",
"path": "/:workspace/shares",
"source_path": "apps/TopoloForecast/apps/api/src/routes/legacy-workspace-shares.ts"
},
{
"method": "POST",
"path": "/:workspace/shares",
"source_path": "apps/TopoloForecast/apps/api/src/routes/legacy-workspace-shares.ts"
},
{
"method": "PATCH",
"path": "/:workspace/shares/:shareId",
"source_path": "apps/TopoloForecast/apps/api/src/routes/legacy-workspace-shares.ts"
},
{
"method": "DELETE",
"path": "/:workspace/shares/:shareId",
"source_path": "apps/TopoloForecast/apps/api/src/routes/legacy-workspace-shares.ts"
},
{
"method": "GET",
"path": "/:workspace/share-settings",
"source_path": "apps/TopoloForecast/apps/api/src/routes/legacy-workspace-shares.ts"
},
{
"method": "PATCH",
"path": "/:workspace/share-settings",
"source_path": "apps/TopoloForecast/apps/api/src/routes/legacy-workspace-shares.ts"
},
{
"method": "GET",
"path": "/:workspace/openclaw/events",
"source_path": "apps/TopoloForecast/apps/api/src/routes/openclaw.ts"
},
{
"method": "GET",
"path": "/:workspace/openclaw/forecast-health",
"source_path": "apps/TopoloForecast/apps/api/src/routes/openclaw.ts"
},
{
"method": "POST",
"path": "/:workspace/openclaw/report-status",
"source_path": "apps/TopoloForecast/apps/api/src/routes/openclaw.ts"
},
{
"method": "POST",
"path": "/:workspace/openclaw/export-status",
"source_path": "apps/TopoloForecast/apps/api/src/routes/openclaw.ts"
},
{
"method": "GET",
"path": "/v1/:workspace/scenarios",
"source_path": "apps/TopoloForecast/apps/api/src/routes/scenarios.ts"
},
{
"method": "POST",
"path": "/v1/:workspace/scenarios",
"source_path": "apps/TopoloForecast/apps/api/src/routes/scenarios.ts"
},
{
"method": "PATCH",
"path": "/v1/:workspace/scenarios/:scenarioId",
"source_path": "apps/TopoloForecast/apps/api/src/routes/scenarios.ts"
},
{
"method": "POST",
"path": "/v1/:workspace/scenarios/:scenarioId/duplicate",
"source_path": "apps/TopoloForecast/apps/api/src/routes/scenarios.ts"
},
{
"method": "DELETE",
"path": "/v1/:workspace/scenarios/:scenarioId",
"source_path": "apps/TopoloForecast/apps/api/src/routes/scenarios.ts"
},
{
"method": "GET",
"path": "/shared/:shareToken",
"source_path": "apps/TopoloForecast/apps/api/src/routes/shared-access.ts"
},
{
"method": "GET",
"path": "/shared/:shareToken/coa",
"source_path": "apps/TopoloForecast/apps/api/src/routes/shared-access.ts"
},
{
"method": "GET",
"path": "/shared/:shareToken/daily/:period",
"source_path": "apps/TopoloForecast/apps/api/src/routes/shared-access.ts"
},
{
"method": "GET",
"path": "/shared/:shareToken/daily/annual/:year",
"source_path": "apps/TopoloForecast/apps/api/src/routes/shared-access.ts"
},
{
"method": "PUT",
"path": "/shared/:shareToken/daily",
"source_path": "apps/TopoloForecast/apps/api/src/routes/shared-access.ts"
},
{
"method": "GET",
"path": "/shared/:shareToken/schedule-rules",
"source_path": "apps/TopoloForecast/apps/api/src/routes/shared-access.ts"
},
{
"method": "GET",
"path": "/:workspace/summary/month/:period",
"source_path": "apps/TopoloForecast/apps/api/src/routes/summary-forecast.ts"
},
{
"method": "GET",
"path": "/:workspace/summary/year/:period",
"source_path": "apps/TopoloForecast/apps/api/src/routes/summary-forecast.ts"
},
{
"method": "GET",
"path": "/:workspace/forecast/:period",
"source_path": "apps/TopoloForecast/apps/api/src/routes/summary-forecast.ts"
},
{
"method": "GET",
"path": "/v1/workspaces/:workspaceId/shares",
"source_path": "apps/TopoloForecast/apps/api/src/routes/workspace-shares.ts"
},
{
"method": "POST",
"path": "/v1/workspaces/:workspaceId/shares",
"source_path": "apps/TopoloForecast/apps/api/src/routes/workspace-shares.ts"
},
{
"method": "PATCH",
"path": "/v1/workspaces/:workspaceId/shares/:shareId",
"source_path": "apps/TopoloForecast/apps/api/src/routes/workspace-shares.ts"
},
{
"method": "DELETE",
"path": "/v1/workspaces/:workspaceId/shares/:shareId",
"source_path": "apps/TopoloForecast/apps/api/src/routes/workspace-shares.ts"
},
{
"method": "GET",
"path": "/v1/workspaces/:workspaceId/share-settings",
"source_path": "apps/TopoloForecast/apps/api/src/routes/workspace-shares.ts"
},
{
"method": "PATCH",
"path": "/v1/workspaces/:workspaceId/share-settings",
"source_path": "apps/TopoloForecast/apps/api/src/routes/workspace-shares.ts"
},
{
"method": "PATCH",
"path": "/v1/workspaces/:id/active-scenario",
"source_path": "apps/TopoloForecast/apps/api/src/routes/workspaces.ts"
},
{
"method": "DELETE",
"path": "/v1/workspaces/:id",
"source_path": "apps/TopoloForecast/apps/api/src/routes/workspaces.ts"
}
],
"ui_routes": [
{
"path": "/cash",
"source_path": "apps/TopoloForecast/apps/api/src/forecast-notifications.ts"
},
{
"path": "/schedule-rules",
"source_path": "apps/TopoloForecast/apps/api/src/forecast-notifications.ts"
},
{
"path": "/imports/${encodeURIComponent(importId)}",
"source_path": "apps/TopoloForecast/apps/api/src/routes/imports.ts"
},
{
"path": "/scenarios/${encodeURIComponent(scenarioId)}",
"source_path": "apps/TopoloForecast/apps/api/src/routes/scenarios.ts"
},
{
"path": "/shared/${encodeURIComponent(token)}",
"source_path": "apps/TopoloForecast/apps/api/src/routes/workspace-shares.ts"
},
{
"path": "/month/:yearMonth",
"source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
},
{
"path": "/annual/:year",
"source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
},
{
"path": "/dashboard",
"source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
},
{
"path": "/dashboard/:year",
"source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
},
{
"path": "/scenarios",
"source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
},
{
"path": "/settings",
"source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
},
{
"path": "/settings/:section",
"source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
},
{
"path": "/getting-started",
"source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
},
{
"path": "/error/:code?",
"source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
},
{
"path": "/shared/:shareToken",
"source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
},
{
"path": "/shared/:shareToken/month/:yearMonth",
"source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
},
{
"path": "/shared/:shareToken/annual/:year",
"source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
},
{
"path": "/shared/:shareToken/dashboard/:year",
"source_path": "apps/TopoloForecast/apps/web/src/App.tsx"
}
],
"test_cases": [],
"database_tables": []
},
"documentation": {
"declared_paths": [
"internal/apps/forecast",
"applications/forecast"
],
"present_paths": [
"internal/apps/forecast",
"applications/forecast"
],
"missing_paths": [],
"human_reference": "/systems/topolo-forecast",
"machine_reference": "/machine/systems/topolo-forecast.json",
"action_examples": 52,
"action_schemas": 52
},
"source_findings": []
}