application · internal
TopoloP2P
Cross-organization capability network for human and agent business actions, approvals, immutable micro-ledgering, and TopoloPay-managed settlement.
Documentation map
- TopoloP2P — Public overview of Topolo's cross-organization capability network for human and agent business actions and settlement.
Authority and runtime
- System ID
topolo-p2p- App IDs
- app_topolo_p2p
- Owners
- platform, commerce-platform, ai-platform
- Repositories
- system-apps/TopoloP2P
- Hosts
- https://p2p.topolo.app, https://p2p.stg.topolo.us
- Dependencies
- topolo-auth, topolo-developers, topolo-agent, topolo-pay, topolo-notify, topolo-one, applications-packages
Security and data ownership
- Risk tier
- critical
- Tenant isolation
- mixed
- Privacy classification
- restricted
- Storage
- d1, external_provider
- Export and deletion
- planned
- Enterprise ready
- no
Source-derived capability inventory
Source revisions: system-apps/TopoloP2P@0ee9f3cb3b2f95f59806528354a9c86bf9226e23
Declared actions: 20 · API routes: 13 · UI routes: 6
{
"id": "topolo-p2p",
"name": "TopoloP2P",
"slug": "topolo-p2p",
"kind": "application",
"visibility": "public",
"repo_paths": [
"system-apps/TopoloP2P"
],
"source_revisions": [
{
"source_path": "system-apps/TopoloP2P",
"repository": "system-apps/TopoloP2P",
"revision": "0ee9f3cb3b2f95f59806528354a9c86bf9226e23",
"ref": "origin/staging"
}
],
"source_counts": {
"source_files": 50,
"test_files": 29,
"test_cases": 0,
"migration_files": 10,
"database_tables": 0,
"manifests": 1,
"deploy_targets": 2,
"actions": 20,
"mobile_contracts": 1,
"notifications": 9,
"package_manifests": 1,
"deployment_configs": 0
},
"manifests": [
{
"source_path": "system-apps/TopoloP2P/topolo.app.json",
"service_slug": "topolo-p2p",
"name": "topolo-p2p",
"app_id": "app_topolo_p2p",
"compatibility_date": "2026-04-23",
"primary_target": "web",
"environments": [
"development",
"production",
"staging"
],
"targets": [
{
"name": "api",
"kind": "worker",
"directory": "apps/api",
"main": "src/worker.ts",
"worker_name": "topolo-p2p-api",
"subdomain": null,
"healthcheck_path": "/api/health",
"variable_names": [
"AUTH_BASE_URL",
"ENVIRONMENT",
"P2P_PUBLIC_BASE_URL",
"TOPOLO_NOTIFY_URL",
"TOPOLO_PAY_URL",
"TOPOLO_SEED_APP_ID"
],
"secret_names": [],
"bindings": [
{
"kind": "d1",
"binding": "P2P_CORE_DB",
"target": null
},
{
"kind": "d1",
"binding": "P2P_RUNTIME_DB",
"target": null
},
{
"kind": "d1",
"binding": "P2P_LEDGER_DB",
"target": null
},
{
"kind": "d1",
"binding": "P2P_AUDIT_DB",
"target": null
}
]
},
{
"name": "web",
"kind": "worker",
"directory": "apps/web",
"main": "src/worker.ts",
"worker_name": "topolo-p2p",
"subdomain": "p2p",
"healthcheck_path": "/api/health",
"variable_names": [
"INSIGHTS_SITE_KEY"
],
"secret_names": [],
"bindings": [
{
"kind": "services",
"binding": "API",
"target": null
},
{
"kind": "services",
"binding": "API",
"target": null
},
{
"kind": "services",
"binding": "API",
"target": null
}
]
}
],
"notifications": [
"p2p.connection.accepted",
"p2p.connection.requested",
"p2p.connection.revoked",
"p2p.hold.placed",
"p2p.hold.released",
"p2p.policy.violation",
"p2p.settlement.completed",
"p2p.settlement.created",
"p2p.settlement.failed"
],
"notification_contract": {
"source_path": "topolo.notification-contracts.json",
"role": "producer",
"schema_version": 1,
"owner_app_id": "app_topolo_p2p",
"events": [
{
"type": "p2p.connection.accepted",
"version": 1,
"description": "A P2P connection was durably transitioned to active.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"connection_id",
"counterparty_organization_id",
"status",
"occurred_at",
"cta_url"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"connection_id": {
"type": "string",
"minLength": 1
},
"counterparty_organization_id": {
"type": "string",
"minLength": 1
},
"status": {
"const": "active"
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"cta_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "P2P connection accepted",
"body": "Connection with org_partner is active.",
"object_id": "conn_1",
"connection_id": "conn_1",
"counterparty_organization_id": "org_partner",
"status": "active",
"occurred_at": "2026-07-20T00:00:00.000Z",
"cta_url": "https://p2p.topolo.app/connections"
}
],
"dataClassification": "internal",
"sensitiveFields": [],
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^p2p:connection-active:"
}
},
{
"type": "p2p.connection.requested",
"version": 1,
"description": "A P2P connection request was durably persisted as pending.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"connection_id",
"counterparty_organization_id",
"status",
"occurred_at",
"cta_url"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"connection_id": {
"type": "string",
"minLength": 1
},
"counterparty_organization_id": {
"type": "string",
"minLength": 1
},
"status": {
"const": "pending"
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"cta_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "P2P connection requested",
"body": "Connection with org_partner is pending.",
"object_id": "conn_1",
"connection_id": "conn_1",
"counterparty_organization_id": "org_partner",
"status": "pending",
"occurred_at": "2026-07-20T00:00:00.000Z",
"cta_url": "https://p2p.topolo.app/connections"
}
],
"dataClassification": "internal",
"sensitiveFields": [],
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^p2p:connection-pending:"
}
},
{
"type": "p2p.connection.revoked",
"version": 1,
"description": "An active or pending P2P connection was durably revoked.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"connection_id",
"counterparty_organization_id",
"previous_status",
"status",
"occurred_at",
"cta_url"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"connection_id": {
"type": "string",
"minLength": 1
},
"counterparty_organization_id": {
"type": "string",
"minLength": 1
},
"previous_status": {
"type": "string",
"minLength": 1
},
"status": {
"const": "revoked"
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"cta_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "P2P connection revoked",
"body": "Connection with org_partner was revoked.",
"object_id": "conn_1",
"connection_id": "conn_1",
"counterparty_organization_id": "org_partner",
"previous_status": "active",
"status": "revoked",
"occurred_at": "2026-07-20T00:00:00.000Z",
"cta_url": "https://p2p.topolo.app/connections"
}
],
"dataClassification": "internal",
"sensitiveFields": [],
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^p2p:connection-revoked:"
}
},
{
"type": "p2p.hold.placed",
"version": 1,
"description": "A dispute durably created a new active P2P hold.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"hold_id",
"request_id",
"counterparty_organization_id",
"reason",
"status",
"occurred_at",
"cta_url"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"hold_id": {
"type": "string",
"minLength": 1
},
"request_id": {
"type": "string",
"minLength": 1
},
"counterparty_organization_id": {
"type": "string",
"minLength": 1
},
"reason": {
"type": "string",
"minLength": 1
},
"status": {
"const": "active"
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"cta_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "P2P hold placed",
"body": "A hold was placed on action req_1: delivery disputed.",
"object_id": "hold_1",
"hold_id": "hold_1",
"request_id": "req_1",
"counterparty_organization_id": "org_partner",
"reason": "delivery disputed",
"status": "active",
"occurred_at": "2026-07-20T00:00:00.000Z",
"cta_url": "https://p2p.topolo.app/actions/req_1"
}
],
"dataClassification": "confidential",
"sensitiveFields": [
"reason"
],
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^p2p:hold-placed:"
}
},
{
"type": "p2p.hold.released",
"version": 1,
"description": "An active or disputed P2P hold was durably released.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"hold_id",
"request_id",
"counterparty_organization_id",
"resolution",
"status",
"occurred_at",
"cta_url"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"hold_id": {
"type": "string",
"minLength": 1
},
"request_id": {
"type": "string",
"minLength": 1
},
"counterparty_organization_id": {
"type": "string",
"minLength": 1
},
"resolution": {
"enum": [
"buyer",
"seller"
]
},
"status": {
"const": "released"
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"cta_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "P2P hold released",
"body": "The hold on action req_1 was released to the seller.",
"object_id": "hold_1",
"hold_id": "hold_1",
"request_id": "req_1",
"counterparty_organization_id": "org_partner",
"resolution": "seller",
"status": "released",
"occurred_at": "2026-07-20T00:00:00.000Z",
"cta_url": "https://p2p.topolo.app/actions/req_1"
}
],
"dataClassification": "internal",
"sensitiveFields": [],
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^p2p:hold-released:"
}
},
{
"type": "p2p.policy.violation",
"version": 1,
"description": "A persisted P2P policy decision rejected an action request.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"decision_id",
"request_id",
"capability_id",
"counterparty_organization_id",
"rationale",
"occurred_at",
"cta_url"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"decision_id": {
"type": "string",
"minLength": 1
},
"request_id": {
"type": "string",
"minLength": 1
},
"capability_id": {
"type": "string",
"minLength": 1
},
"counterparty_organization_id": {
"type": "string",
"minLength": 1
},
"rationale": {
"type": "string",
"minLength": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"cta_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "P2P policy blocked an action",
"body": "The Print labels request was blocked: capability_blocked.",
"object_id": "policy_1",
"decision_id": "policy_1",
"request_id": "req_1",
"capability_id": "cap_print",
"counterparty_organization_id": "org_partner",
"rationale": "capability_blocked",
"occurred_at": "2026-07-20T00:00:00.000Z",
"cta_url": "https://p2p.topolo.app/actions/req_1"
}
],
"dataClassification": "confidential",
"sensitiveFields": [
"rationale"
],
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^p2p:policy-violation:"
}
},
{
"type": "p2p.settlement.completed",
"version": 1,
"description": "TopoloPay confirmed that a persisted P2P settlement completed.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"batch_id",
"counterparty_organization_id",
"total_minor",
"currency",
"status",
"pay_settlement_id",
"occurred_at",
"cta_url"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"batch_id": {
"type": "string",
"minLength": 1
},
"counterparty_organization_id": {
"type": "string",
"minLength": 1
},
"total_minor": {
"type": "integer",
"minimum": 1
},
"currency": {
"type": "string",
"minLength": 3,
"maxLength": 3
},
"status": {
"const": "paid"
},
"pay_settlement_id": {
"type": [
"string",
"null"
]
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"cta_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "P2P settlement completed",
"body": "2500 USD settled successfully.",
"object_id": "batch_1",
"batch_id": "batch_1",
"counterparty_organization_id": "org_partner",
"total_minor": 2500,
"currency": "USD",
"status": "paid",
"pay_settlement_id": "payset_1",
"occurred_at": "2026-07-20T00:00:00.000Z",
"cta_url": "https://p2p.topolo.app/settlements"
}
],
"dataClassification": "confidential",
"sensitiveFields": [
"total_minor"
],
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^p2p:settlement-completed:"
}
},
{
"type": "p2p.settlement.created",
"version": 1,
"description": "A P2P settlement batch and its Pay submission were durably persisted.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"batch_id",
"counterparty_organization_id",
"total_minor",
"currency",
"status",
"pay_settlement_id",
"occurred_at",
"cta_url"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"batch_id": {
"type": "string",
"minLength": 1
},
"counterparty_organization_id": {
"type": "string",
"minLength": 1
},
"total_minor": {
"type": "integer",
"minimum": 1
},
"currency": {
"type": "string",
"minLength": 3,
"maxLength": 3
},
"status": {
"enum": [
"pending",
"submitted"
]
},
"pay_settlement_id": {
"type": [
"string",
"null"
]
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"cta_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "P2P settlement created",
"body": "2500 USD was submitted for settlement.",
"object_id": "batch_1",
"batch_id": "batch_1",
"counterparty_organization_id": "org_partner",
"total_minor": 2500,
"currency": "USD",
"status": "submitted",
"pay_settlement_id": "payset_1",
"occurred_at": "2026-07-20T00:00:00.000Z",
"cta_url": "https://p2p.topolo.app/settlements"
}
],
"dataClassification": "confidential",
"sensitiveFields": [
"total_minor"
],
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^p2p:settlement-created:"
}
},
{
"type": "p2p.settlement.failed",
"version": 1,
"description": "A persisted P2P settlement failed during submission or Pay processing.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"batch_id",
"counterparty_organization_id",
"total_minor",
"currency",
"status",
"pay_settlement_id",
"occurred_at",
"cta_url"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"object_id": {
"type": "string",
"minLength": 1
},
"batch_id": {
"type": "string",
"minLength": 1
},
"counterparty_organization_id": {
"type": "string",
"minLength": 1
},
"total_minor": {
"type": "integer",
"minimum": 1
},
"currency": {
"type": "string",
"minLength": 3,
"maxLength": 3
},
"status": {
"const": "failed"
},
"pay_settlement_id": {
"type": [
"string",
"null"
]
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"cta_url": {
"type": "string",
"format": "uri"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "P2P settlement failed",
"body": "2500 USD failed to settle.",
"object_id": "batch_1",
"batch_id": "batch_1",
"counterparty_organization_id": "org_partner",
"total_minor": 2500,
"currency": "USD",
"status": "failed",
"pay_settlement_id": "payset_1",
"occurred_at": "2026-07-20T00:00:00.000Z",
"cta_url": "https://p2p.topolo.app/settlements"
}
],
"dataClassification": "confidential",
"sensitiveFields": [
"total_minor"
],
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^p2p:settlement-failed:"
}
}
]
},
"actions": [
{
"name": "widget.get",
"title": "Get widget summary",
"description": "Get the TopoloOne widget summary for this service.",
"method": "GET",
"path": "/api/widget",
"permission": "directory: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-p2p --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": "directory.capabilities.list",
"title": "List P2P capabilities",
"description": "List P2P directory capabilities.",
"method": "GET",
"path": "/api/directory/capabilities",
"authorizationMode": "public",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"limit": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List P2P capabilities.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"limit": 1
},
"cli_example": [
"topolo actions --service topolo-p2p --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/directory/capabilities",
"body": null
},
"effects": "Reads state through GET /api/directory/capabilities 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/directory/capabilities",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "directory.capabilities.get",
"title": "Get P2P capability",
"description": "Get one public P2P directory capability.",
"method": "GET",
"path": "/api/directory/capabilities/{capabilityId}",
"authorizationMode": "public",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"capabilityId": {
"type": "string",
"minLength": 1
}
},
"required": [
"capabilityId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"capabilityId": "example"
},
"cli_example": [
"topolo actions --service topolo-p2p --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/directory/capabilities/example",
"body": null
},
"effects": "Reads state through GET /api/directory/capabilities/{capabilityId} 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/directory/capabilities/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "connections.list",
"title": "List P2P connections",
"description": "List P2P connections.",
"method": "GET",
"path": "/api/connections",
"permission": "directory: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",
"description": "Response returned by List P2P connections.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-p2p --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/connections",
"body": null
},
"effects": "Reads state through GET /api/connections 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/connections",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "connections.create",
"title": "Create P2P connection",
"description": "Create a P2P connection.",
"method": "POST",
"path": "/api/connections",
"permission": "connections:write",
"authorizationMode": "static",
"readOnly": false,
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"counterparty_org_id": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"enum": [
"pending",
"active",
"suspended"
]
}
},
"required": [
"counterparty_org_id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create P2P connection.",
"additionalProperties": true
},
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"counterparty_org_id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-p2p --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/connections",
"body": {
"counterparty_org_id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/connections. 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/connections",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "connections.revoke",
"title": "Revoke P2P connection",
"description": "Revoke a P2P connection.",
"method": "DELETE",
"path": "/api/connections/{connectionId}",
"permission": "connections:write",
"authorizationMode": "static",
"readOnly": false,
"destructive": true,
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"connectionId": {
"type": "string",
"minLength": 1
}
},
"required": [
"connectionId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Revoke P2P connection.",
"additionalProperties": true
},
"agentAccess": "confirm",
"documentation": {
"example_input": {
"connectionId": "example"
},
"cli_example": [
"topolo actions --service topolo-p2p --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/connections/example",
"body": null
},
"effects": "May change state through DELETE /api/connections/{connectionId}. 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/connections/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "ledger.list",
"title": "List P2P ledger",
"description": "List P2P ledger entries.",
"method": "GET",
"path": "/api/ledger",
"permission": "ledger: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",
"description": "Response returned by List P2P ledger.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-p2p --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/ledger",
"body": null
},
"effects": "Reads state through GET /api/ledger 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/ledger",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "settlements.preview",
"title": "Preview settlements",
"description": "Preview P2P settlement batches.",
"method": "POST",
"path": "/api/settlements/preview",
"permission": "settlements:write",
"authorizationMode": "static",
"readOnly": false,
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"buyer_org_id": {
"type": "string",
"minLength": 1
},
"seller_org_id": {
"type": "string",
"minLength": 1
},
"currency": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Preview settlements.",
"additionalProperties": true
},
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"buyer_org_id": "00000000-0000-4000-8000-000000000000",
"seller_org_id": "00000000-0000-4000-8000-000000000000",
"currency": "USD"
},
"cli_example": [
"topolo actions --service topolo-p2p --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/settlements/preview",
"body": {
"buyer_org_id": "00000000-0000-4000-8000-000000000000",
"seller_org_id": "00000000-0000-4000-8000-000000000000",
"currency": "USD"
}
},
"effects": "May change state through POST /api/settlements/preview. 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/settlements/preview",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "settlements.create",
"title": "Create settlement",
"description": "Create a P2P settlement.",
"method": "POST",
"path": "/api/settlements/create",
"permission": "settlements:approve",
"authorizationMode": "static",
"readOnly": false,
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"buyer_org_id": {
"type": "string",
"minLength": 1
},
"seller_org_id": {
"type": "string",
"minLength": 1
},
"currency": {
"type": "string",
"minLength": 1
},
"trigger": {
"type": "string",
"enum": [
"threshold",
"schedule",
"manual",
"invoice",
"delivery"
]
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create settlement.",
"additionalProperties": true
},
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"buyer_org_id": "00000000-0000-4000-8000-000000000000",
"seller_org_id": "00000000-0000-4000-8000-000000000000",
"currency": "USD"
},
"cli_example": [
"topolo actions --service topolo-p2p --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/settlements/create",
"body": {
"buyer_org_id": "00000000-0000-4000-8000-000000000000",
"seller_org_id": "00000000-0000-4000-8000-000000000000",
"currency": "USD"
}
},
"effects": "May change state through POST /api/settlements/create. 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/settlements/create",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "policies.get",
"title": "Get P2P policy",
"description": "Get P2P policy.",
"method": "GET",
"path": "/api/policies",
"permission": "policy: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",
"description": "Response returned by Get P2P policy.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-p2p --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/policies",
"body": null
},
"effects": "Reads state through GET /api/policies 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/policies",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "policies.update",
"title": "Update P2P policy",
"description": "Update P2P policy.",
"method": "PUT",
"path": "/api/policies",
"permission": "policy:write",
"authorizationMode": "static",
"readOnly": false,
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"auto_approve_under_minor": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"agent_spend_limit_minor_per_day": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"human_approval_threshold_minor": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"unknown_counterparty_requires_approval": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "number"
},
{
"type": "string"
}
]
},
"blocked_capability_ids": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
{
"type": "string",
"minLength": 1
}
]
},
"trusted_counterparty_org_ids": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
},
{
"type": "string",
"minLength": 1
}
]
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update P2P policy.",
"additionalProperties": true
},
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"auto_approve_under_minor": 1,
"agent_spend_limit_minor_per_day": 1,
"human_approval_threshold_minor": 1
},
"cli_example": [
"topolo actions --service topolo-p2p --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/policies",
"body": {
"auto_approve_under_minor": 1,
"agent_spend_limit_minor_per_day": 1,
"human_approval_threshold_minor": 1
}
},
"effects": "May change state through PUT /api/policies. 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/policies",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "actions.list",
"title": "List P2P actions",
"description": "List P2P action requests.",
"method": "GET",
"path": "/api/actions",
"permission": "actions:invoke",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"limit": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 100
},
"state": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List P2P actions.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"limit": 1,
"state": "example"
},
"cli_example": [
"topolo actions --service topolo-p2p --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/actions",
"body": null
},
"effects": "Reads state through GET /api/actions 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/actions",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "actions.get",
"title": "Get P2P action",
"description": "Get one organization-scoped P2P action request and its lifecycle details.",
"method": "GET",
"path": "/api/actions/{requestId}",
"permission": "actions:invoke",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"requestId": {
"type": "string",
"minLength": 1
}
},
"required": [
"requestId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"requestId": "example"
},
"cli_example": [
"topolo actions --service topolo-p2p --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/actions/example",
"body": null
},
"effects": "Reads state through GET /api/actions/{requestId} 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/actions/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "actions.request",
"title": "Request P2P action",
"description": "Request a P2P action.",
"method": "POST",
"path": "/api/actions/request",
"permission": "actions:request",
"authorizationMode": "static",
"readOnly": false,
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"capability_id": {
"type": "string",
"minLength": 1
},
"idempotency_key": {
"type": "string",
"minLength": 1
},
"inputs": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "string",
"minLength": 1
}
]
}
},
"required": [
"capability_id",
"idempotency_key"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Request P2P action.",
"additionalProperties": true
},
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"capability_id": "00000000-0000-4000-8000-000000000000",
"idempotency_key": "example"
},
"cli_example": [
"topolo actions --service topolo-p2p --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/actions/request",
"body": {
"capability_id": "00000000-0000-4000-8000-000000000000",
"idempotency_key": "example"
}
},
"effects": "May change state through POST /api/actions/request. 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/actions/request",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "actions.respond",
"title": "Respond to P2P action",
"description": "Respond to a P2P action.",
"method": "POST",
"path": "/api/actions/{requestId}/respond",
"permission": "actions:respond",
"authorizationMode": "runtime",
"readOnly": false,
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"requestId": {
"type": "string",
"minLength": 1
},
"response": {
"type": "string",
"enum": [
"accepted",
"quoted",
"rejected",
"approved"
]
},
"quote": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "string",
"minLength": 1
}
]
},
"reason": {
"type": "string",
"minLength": 1
}
},
"required": [
"requestId",
"response"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Respond to P2P action.",
"additionalProperties": true
},
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"requestId": "example",
"response": "accepted"
},
"cli_example": [
"topolo actions --service topolo-p2p --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/actions/example/respond",
"body": {
"requestId": "example",
"response": "accepted"
}
},
"effects": "May change state through POST /api/actions/{requestId}/respond. 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/actions/*/respond",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "actions.complete",
"title": "Complete P2P action",
"description": "Complete a P2P action.",
"method": "POST",
"path": "/api/actions/{requestId}/complete",
"permission": "actions:respond",
"authorizationMode": "runtime",
"readOnly": false,
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"requestId": {
"type": "string",
"minLength": 1
},
"result": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "string",
"minLength": 1
}
]
}
},
"required": [
"requestId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Complete P2P action.",
"additionalProperties": true
},
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"requestId": "example"
},
"cli_example": [
"topolo actions --service topolo-p2p --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/actions/example/complete",
"body": {
"requestId": "example"
}
},
"effects": "May change state through POST /api/actions/{requestId}/complete. 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/actions/*/complete",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "actions.dispute",
"title": "Dispute P2P action",
"description": "Dispute a P2P action.",
"method": "POST",
"path": "/api/actions/{requestId}/dispute",
"permission": "actions:respond",
"authorizationMode": "runtime",
"readOnly": false,
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"requestId": {
"type": "string",
"minLength": 1
},
"reason": {
"type": "string",
"minLength": 1
}
},
"required": [
"requestId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Dispute P2P action.",
"additionalProperties": true
},
"destructive": false,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"requestId": "example"
},
"cli_example": [
"topolo actions --service topolo-p2p --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/actions/example/dispute",
"body": {
"requestId": "example"
}
},
"effects": "May change state through POST /api/actions/{requestId}/dispute. 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/actions/*/dispute",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "holds.release",
"title": "Release P2P hold",
"description": "Resolve a P2P hold to the buyer or seller and apply any required ledger counter-reversal.",
"method": "POST",
"path": "/api/holds/{holdId}/release",
"permission": "actions:respond",
"authorizationMode": "runtime",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"holdId": {
"type": "string",
"minLength": 1
},
"resolution": {
"type": "string",
"enum": [
"buyer",
"seller"
]
},
"reason": {
"type": "string",
"minLength": 1
}
},
"required": [
"holdId",
"resolution"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"holdId": "example",
"resolution": "buyer"
},
"cli_example": [
"topolo actions --service topolo-p2p --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/holds/example/release",
"body": {
"holdId": "example",
"resolution": "buyer"
}
},
"effects": "May change state through POST /api/holds/{holdId}/release. 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/holds/*/release",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "organizations.data.export",
"title": "Export organization P2P data",
"description": "Export the caller organization's P2P records across directory, runtime, ledger, and audit stores.",
"method": "GET",
"path": "/api/organizations/{organizationId}/data",
"permission": "privacy:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"organizationId": {
"type": "string",
"minLength": 1
}
},
"required": [
"organizationId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"organizationId": "example"
},
"cli_example": [
"topolo actions --service topolo-p2p --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/example/data",
"body": null
},
"effects": "Reads state through GET /api/organizations/{organizationId}/data 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",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "organizations.data.erase",
"title": "Erase organization P2P data",
"description": "Erase organization-owned P2P content while retaining immutable bilateral financial records required for ledger integrity.",
"method": "DELETE",
"path": "/api/organizations/{organizationId}/data",
"permission": "privacy:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"organizationId": {
"type": "string",
"minLength": 1
},
"confirmation": {
"type": "string",
"const": "ERASE"
}
},
"required": [
"organizationId",
"confirmation"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"organizationId": "example",
"confirmation": "ERASE"
},
"cli_example": [
"topolo actions --service topolo-p2p --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/example/data",
"body": null
},
"effects": "May change state through DELETE /api/organizations/{organizationId}/data. 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",
"evidence": "Matched to a served route extracted from canonical staging source."
}
}
],
"action_coverage": {
"status": "ok",
"served_routes": 26,
"matched_actions": 20,
"declared_unserved_actions": [],
"coverage_excluded_actions": [],
"uncatalogued_routes": [],
"ignored_routes": 6,
"configured_exclusions": 3,
"configuration_findings": [],
"notes": [
"2 manually-declared route(s)"
]
},
"runtime_contract_audit": {
"status": "verified",
"actions": 20,
"contracts": 20,
"contract_module": "topolo.action-contracts.mjs",
"validator_sources": [
"apps/api/src/worker.ts"
],
"authorization_sources": [
"apps/api/src/worker.ts"
],
"findings": []
}
}
],
"mobile_contracts": [
{
"source_path": "system-apps/TopoloP2P/topolo.mobile-experience.json",
"contract": {
"version": "2026-06-29",
"status": "approved",
"mode": "native_capability",
"appId": "app_topolo_p2p",
"localizationNamespace": "p2p",
"permissions": [
"directory:read",
"ledger:read"
],
"offlinePolicy": "read_through_cache",
"fallbackPath": "/capabilities",
"auth": {
"audience": "topolo-p2p",
"scopes": [
"directory:read",
"ledger:read"
]
},
"routes": [
{
"path": "/capabilities",
"apiPath": "/api/directory/capabilities",
"title": "Capabilities",
"titleKey": "p2p.mobile.routes.capabilities.title",
"template": "record.list",
"dataSource": "p2p.capabilities.list"
},
{
"path": "/connections",
"apiPath": "/api/connections",
"title": "Connections",
"titleKey": "p2p.mobile.routes.connections.title",
"template": "record.list",
"dataSource": "p2p.connections.list"
},
{
"path": "/ledger",
"apiPath": "/api/ledger",
"title": "Ledger",
"titleKey": "p2p.mobile.routes.ledger.title",
"template": "record.list",
"dataSource": "p2p.ledger.list"
}
]
}
}
],
"package_manifests": [],
"deployment_configs": [],
"source_signals": {
"api_routes": [
{
"method": "ALL",
"path": "*",
"source_path": "system-apps/TopoloP2P/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/health",
"source_path": "system-apps/TopoloP2P/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/health",
"source_path": "system-apps/TopoloP2P/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/directory/capabilities",
"source_path": "system-apps/TopoloP2P/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/p2p/internal/capabilities/sync",
"source_path": "system-apps/TopoloP2P/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/widget",
"source_path": "system-apps/TopoloP2P/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/connections",
"source_path": "system-apps/TopoloP2P/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/ledger",
"source_path": "system-apps/TopoloP2P/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/settlements/preview",
"source_path": "system-apps/TopoloP2P/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/settlements/create",
"source_path": "system-apps/TopoloP2P/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/policies",
"source_path": "system-apps/TopoloP2P/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/actions",
"source_path": "system-apps/TopoloP2P/apps/api/src/worker.ts"
},
{
"method": "LITERAL",
"path": "/api/actions/request",
"source_path": "system-apps/TopoloP2P/apps/api/src/worker.ts"
}
],
"ui_routes": [
{
"path": "/actions/${encodeURIComponent(requestId)}",
"source_path": "system-apps/TopoloP2P/apps/api/src/actions.ts"
},
{
"path": "/actions/${encodeURIComponent(action.request_id)}",
"source_path": "system-apps/TopoloP2P/apps/api/src/actions.ts"
},
{
"path": "/connections",
"source_path": "system-apps/TopoloP2P/apps/api/src/worker.ts"
},
{
"path": "/actions/${encodeURIComponent(hold.request_id)}",
"source_path": "system-apps/TopoloP2P/apps/api/src/worker.ts"
},
{
"path": "/settlements",
"source_path": "system-apps/TopoloP2P/apps/api/src/worker.ts"
},
{
"path": "/dashboard",
"source_path": "system-apps/TopoloP2P/apps/web/src/App.tsx"
}
],
"test_cases": [],
"database_tables": []
},
"documentation": {
"declared_paths": [
"applications/topolo-p2p",
"internal/apps/topolo-p2p",
"internal/platform/p2p-protocol",
"internal/platform/p2p-ledger-and-settlement"
],
"present_paths": [
"applications/topolo-p2p",
"internal/apps/topolo-p2p",
"internal/platform/p2p-protocol",
"internal/platform/p2p-ledger-and-settlement"
],
"missing_paths": [],
"human_reference": "/systems/topolo-p2p",
"machine_reference": "/machine/systems/topolo-p2p.json",
"action_examples": 20,
"action_schemas": 20
},
"source_findings": []
}