application · active
Topolo Device Platform
Topolo platform-owned TopoloFeed delivery, analytics, Android playback, and device-side app-catalog consumption surfaces.
Documentation map
- TopoloCommerce — Public overview of the multi-vertical commerce platform for venue operations, guest runtimes, and staff execution.
- Topolo Device Platform — Public overview of Topolo's device distribution, feed delivery, analytics, Android playback, and provisioning surfaces.
- Topolo Feed — Public overview of Topolo Feed in the Topolo application suite.
Authority and runtime
- System ID
topolo-device-platform- App IDs
- app_topolo_feed
- Owners
- device-platform
- Repositories
- apps/TopoloFeed
- Hosts
- https://feed.topolo.app, https://feed-api.topolo.app, https://topolo-feed-assets.topolo.app, https://feed-analytics-api.topolo.app, https://feed.stg.topolo.us, https://feed-api.stg.topolo.us, https://feed-analytics-api.stg.topolo.us
- Dependencies
- topolo-auth, topolo-mdm, topolo-developers
Security and data ownership
- Risk tier
- high
- Tenant isolation
- service_local
- Privacy classification
- restricted
- Storage
- analytics_engine, d1, kv, r2
- Export and deletion
- planned
- Enterprise ready
- no
Source-derived capability inventory
Source revisions: apps/TopoloFeed@deab96cb4917fd854dbd9f87e2bf944b242ce2c5
Declared actions: 14 · API routes: 19 · UI routes: 6
{
"id": "topolo-device-platform",
"name": "Topolo Device Platform",
"slug": "topolo-device-platform",
"kind": "application",
"visibility": "public",
"repo_paths": [
"apps/TopoloFeed"
],
"source_revisions": [
{
"source_path": "apps/TopoloFeed",
"repository": "apps/TopoloFeed",
"revision": "deab96cb4917fd854dbd9f87e2bf944b242ce2c5",
"ref": "origin/staging"
}
],
"source_counts": {
"source_files": 56,
"test_files": 34,
"test_cases": 0,
"migration_files": 15,
"database_tables": 0,
"manifests": 1,
"deploy_targets": 3,
"actions": 14,
"mobile_contracts": 1,
"notifications": 3,
"package_manifests": 4,
"deployment_configs": 0
},
"manifests": [
{
"source_path": "apps/TopoloFeed/topolo.app.json",
"service_slug": "topolo-device-platform",
"name": "TopoloFeed",
"app_id": "app_topolo_feed",
"compatibility_date": "2025-05-01",
"primary_target": "web",
"environments": [
"development",
"production",
"staging"
],
"targets": [
{
"name": "web",
"kind": "worker",
"directory": "apps/web",
"main": "src/worker.ts",
"worker_name": "topolo-feed-web",
"subdomain": "feed",
"healthcheck_path": null,
"variable_names": [
"AUTH_API_URL",
"INSIGHTS_SITE_KEY"
],
"secret_names": [],
"bindings": [
{
"kind": "services",
"binding": "API",
"target": null
},
{
"kind": "services",
"binding": "ANALYTICS",
"target": null
}
]
},
{
"name": "analytics",
"kind": "worker",
"directory": "apps/analytics",
"main": "src/index.ts",
"worker_name": "topolo-feed-analytics-api",
"subdomain": "feed-analytics-api",
"healthcheck_path": "/health",
"variable_names": [
"AUTH_API_URL",
"ENVIRONMENT",
"FEED_PUBLIC_BASE_URL",
"NEXUS_GATEWAY_URL",
"RATE_LIMIT_ENABLED",
"RATE_LIMIT_PERIOD",
"RATE_LIMIT_REQUESTS",
"TOPOLO_NOTIFY_URL"
],
"secret_names": [],
"bindings": [
{
"kind": "kv",
"binding": "TOPOLO_FEED_CONFIG",
"target": null
},
{
"kind": "kv",
"binding": "TOPOLO_STATE",
"target": null
},
{
"kind": "d1",
"binding": "IMPRESSIONS_DB",
"target": null
},
{
"kind": "d1",
"binding": "DEVICES_DB",
"target": null
},
{
"kind": "d1",
"binding": "OPS_DB",
"target": null
},
{
"kind": "d1",
"binding": "REPORTING_DB",
"target": null
},
{
"kind": "secretsStore",
"binding": "PLATFORM_AT_REST_MASTER_ENCRYPTION_KEY_STORE",
"target": null
},
{
"kind": "secretsStore",
"binding": "PLATFORM_AT_REST_MASTER_ENCRYPTION_KEY_PREVIOUS_STORE",
"target": null
}
]
},
{
"name": "api",
"kind": "worker",
"directory": "apps/api",
"main": "src/index.ts",
"worker_name": "topolo-feed-api",
"subdomain": "feed-api",
"healthcheck_path": "/health",
"variable_names": [
"AUTH_API_URL",
"ENVIRONMENT",
"NEXUS_GATEWAY_URL"
],
"secret_names": [],
"bindings": [
{
"kind": "kv",
"binding": "TOPOLO_FEED_CONFIG",
"target": null
},
{
"kind": "kv",
"binding": "TOPOLO_STATE",
"target": null
},
{
"kind": "d1",
"binding": "REPORTING_DB",
"target": null
},
{
"kind": "secretsStore",
"binding": "PLATFORM_AT_REST_MASTER_ENCRYPTION_KEY_STORE",
"target": null
},
{
"kind": "secretsStore",
"binding": "PLATFORM_AT_REST_MASTER_ENCRYPTION_KEY_PREVIOUS_STORE",
"target": null
}
]
}
],
"notifications": [
"feed.digest.ready",
"feed.engagement.anomaly_detected",
"feed.source.sync_failed"
],
"notification_contract": {
"source_path": "topolo.notification-contracts.json",
"role": "producer",
"schema_version": 1,
"owner_app_id": "app_topolo_feed",
"events": [
{
"type": "feed.digest.ready",
"version": 1,
"description": "A durable Feed engagement digest was generated for a workspace reporting window.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"occurred_at",
"payload"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"surface": {
"enum": [
"notification",
"action"
]
},
"action_kind": {
"enum": [
"open",
"review",
"approve",
"resolve",
"complete"
]
},
"action_status": {
"type": "string"
},
"priority": {
"enum": [
"low",
"normal",
"high",
"urgent"
]
},
"cta_url": {
"type": "string",
"format": "uri"
},
"cta_label": {
"type": "string"
},
"category": {
"type": "string"
},
"severity": {
"enum": [
"info",
"success",
"warning",
"critical"
]
},
"object_type": {
"type": "string"
},
"object_id": {
"type": "string",
"minLength": 1
},
"thread_key": {
"type": "string"
},
"dedupe_key": {
"type": "string"
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"payload": {
"type": "object"
}
},
"additionalProperties": true
},
"examples": [
{
"title": "Feed digest is ready",
"body": "Your Feed engagement digest has finished processing.",
"object_id": "digest_123",
"occurred_at": "2026-07-19T12:00:00.000Z",
"payload": {
"digest_id": "digest_123",
"window_start": 1000,
"window_end": 2000,
"summary": []
}
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^feed:digest:"
},
"sensitiveFields": []
},
{
"type": "feed.engagement.anomaly_detected",
"version": 1,
"description": "A durable workspace completion-rate check crossed its configured anomaly threshold.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"occurred_at",
"payload"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"surface": {
"enum": [
"notification",
"action"
]
},
"action_kind": {
"enum": [
"open",
"review",
"approve",
"resolve",
"complete"
]
},
"action_status": {
"type": "string"
},
"priority": {
"enum": [
"low",
"normal",
"high",
"urgent"
]
},
"cta_url": {
"type": "string",
"format": "uri"
},
"cta_label": {
"type": "string"
},
"category": {
"type": "string"
},
"severity": {
"enum": [
"info",
"success",
"warning",
"critical"
]
},
"object_type": {
"type": "string"
},
"object_id": {
"type": "string",
"minLength": 1
},
"thread_key": {
"type": "string"
},
"dedupe_key": {
"type": "string"
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"payload": {
"type": "object"
}
},
"additionalProperties": true
},
"examples": [
{
"title": "Feed engagement needs attention",
"body": "Completion rate fell to 42%.",
"object_id": "anomaly_123",
"occurred_at": "2026-07-19T12:00:00.000Z",
"payload": {
"anomaly_id": "anomaly_123",
"metric": "completion_rate",
"observed_value": 42,
"threshold_value": 70,
"window_start": 1000,
"window_end": 2000
}
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^feed:anomaly:"
},
"sensitiveFields": []
},
{
"type": "feed.source.sync_failed",
"version": 1,
"description": "A registered Feed content source reached a durable failed synchronization result.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"occurred_at",
"payload"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"surface": {
"enum": [
"notification",
"action"
]
},
"action_kind": {
"enum": [
"open",
"review",
"approve",
"resolve",
"complete"
]
},
"action_status": {
"type": "string"
},
"priority": {
"enum": [
"low",
"normal",
"high",
"urgent"
]
},
"cta_url": {
"type": "string",
"format": "uri"
},
"cta_label": {
"type": "string"
},
"category": {
"type": "string"
},
"severity": {
"enum": [
"info",
"success",
"warning",
"critical"
]
},
"object_type": {
"type": "string"
},
"object_id": {
"type": "string",
"minLength": 1
},
"thread_key": {
"type": "string"
},
"dedupe_key": {
"type": "string"
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"payload": {
"type": "object"
}
},
"additionalProperties": true
},
"examples": [
{
"title": "Feed source sync failed: Partner catalog",
"body": "Feed could not refresh this content source.",
"object_id": "source_123",
"occurred_at": "2026-07-19T12:00:00.000Z",
"payload": {
"source_id": "source_123",
"sync_run_id": "sync_123",
"reason": "source_http_503",
"failed_at": "2026-07-19T12:00:00.000Z"
}
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^feed:source-sync:"
},
"sensitiveFields": []
}
]
},
"actions": [
{
"name": "widget.get",
"title": "Get widget summary",
"description": "Get the TopoloOne widget summary for Feed.",
"method": "GET",
"path": "/api/widget",
"permission": "feed:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"description": "Response returned by Get widget summary.",
"additionalProperties": true
},
"target": "api",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-device-platform --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": "analytics.summary.get",
"title": "Get feed analytics summary",
"description": "Summarize impressions for the active Feed workspace and optional time range.",
"method": "GET",
"path": "/api/analytics/summary",
"permission": "analytics:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspaceId": {
"type": "string",
"minLength": 1
},
"workspace_id": {
"type": "string",
"minLength": 1
},
"start_time": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"end_time": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"ad_id_pattern": {
"type": "string"
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"description": "Response returned by Get feed analytics summary.",
"additionalProperties": true
},
"target": "analytics",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspaceId": "example",
"workspace_id": "00000000-0000-4000-8000-000000000000",
"start_time": 1
},
"cli_example": [
"topolo actions --service topolo-device-platform --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/analytics/summary",
"body": null
},
"effects": "Reads state through GET /api/analytics/summary 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/analytics/summary",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "analytics.engagement.get",
"title": "Get feed engagement",
"description": "Get completion, interaction, and duration metrics for the active Feed workspace.",
"method": "GET",
"path": "/api/analytics/engagement",
"permission": "analytics:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspaceId": {
"type": "string",
"minLength": 1
},
"workspace_id": {
"type": "string",
"minLength": 1
},
"start_time": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"end_time": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"ad_id_pattern": {
"type": "string"
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"description": "Response returned by Get feed engagement.",
"additionalProperties": true
},
"target": "analytics",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspaceId": "example",
"workspace_id": "00000000-0000-4000-8000-000000000000",
"start_time": 1
},
"cli_example": [
"topolo actions --service topolo-device-platform --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/analytics/engagement",
"body": null
},
"effects": "Reads state through GET /api/analytics/engagement 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/analytics/engagement",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "analytics.devices.list",
"title": "List feed devices",
"description": "List devices observed in the active Feed workspace.",
"method": "GET",
"path": "/api/analytics/devices",
"permission": "analytics:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspaceId": {
"type": "string",
"minLength": 1
},
"workspace_id": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"description": "Response returned by List feed devices.",
"additionalProperties": true
},
"target": "analytics",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspaceId": "example",
"workspace_id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-device-platform --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/analytics/devices",
"body": null
},
"effects": "Reads state through GET /api/analytics/devices 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/analytics/devices",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "workspaces.delete",
"title": "Delete feed workspace",
"description": "Delete an empty non-default Feed workspace.",
"method": "DELETE",
"path": "/api/analytics/feed/workspaces/{workspaceId}",
"permission": "workspace:delete",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspaceId": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspaceId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"description": "Response returned by Delete feed workspace.",
"additionalProperties": true
},
"target": "analytics",
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspaceId": "example"
},
"cli_example": [
"topolo actions --service topolo-device-platform --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/analytics/feed/workspaces/example",
"body": null
},
"effects": "May change state through DELETE /api/analytics/feed/workspaces/{workspaceId}. 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/analytics/feed/workspaces/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "analytics.digest.generate",
"title": "Generate feed digest",
"description": "Persist an engagement digest for the active Feed workspace and emit its ready event.",
"method": "POST",
"path": "/api/analytics/digests",
"permission": "feed:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"windowStart": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"windowEnd": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"windowStart",
"windowEnd"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"description": "Response returned by Generate feed digest.",
"additionalProperties": true
},
"target": "analytics",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"agentContract": {
"docsUrl": "https://docs.topolo.app/applications/feed",
"resource": {
"kind": "feed_digest",
"idPath": "$.digest.id"
},
"effects": [
"Creates a workspace-scoped engagement digest and emits the feed.digest.ready notification event."
],
"errors": [
{
"status": 400,
"code": "invalid_reporting_window",
"recovery": "Choose a windowEnd greater than windowStart and retry."
},
{
"status": 403,
"code": "forbidden",
"recovery": "Use a credential with feed:write access to the selected Feed workspace."
}
],
"verify": [
"Confirm the response contains $.digest.id for the selected reporting window."
],
"examples": [
{
"input": {
"windowStart": 1,
"windowEnd": 2
},
"expected": "A persisted Feed engagement digest for the selected reporting window."
}
]
},
"documentation": {
"example_input": {
"windowStart": 1,
"windowEnd": 2
},
"cli_example": [
"topolo actions --service topolo-device-platform --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/analytics/digests",
"body": {
"windowStart": 1,
"windowEnd": 2
}
},
"effects": "Creates a workspace-scoped engagement digest and emits the feed.digest.ready notification event.",
"verification": [
"Confirm the response contains $.digest.id for the selected reporting window."
],
"recovery": [
"400 invalid_reporting_window: Choose a windowEnd greater than windowStart and retry.",
"403 forbidden: Use a credential with feed:write access to the selected Feed workspace."
],
"docs_url": "https://docs.topolo.app/applications/feed",
"resource": {
"kind": "feed_digest",
"idPath": "$.digest.id"
},
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/analytics/digests",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "analytics.anomaly.check",
"title": "Check feed engagement anomaly",
"description": "Evaluate a completion-rate threshold and persist a detected workspace anomaly.",
"method": "POST",
"path": "/api/analytics/anomaly-checks",
"permission": "feed:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"windowStart": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"windowEnd": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"minimumCompletionRate": {
"type": "number",
"minimum": 0,
"maximum": 100
}
},
"required": [
"windowStart",
"windowEnd",
"minimumCompletionRate"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"description": "Response returned by Check feed engagement anomaly.",
"additionalProperties": true
},
"target": "analytics",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"agentContract": {
"docsUrl": "https://docs.topolo.app/applications/feed",
"resource": {
"kind": "feed_engagement_anomaly",
"idPath": "$.anomaly.id"
},
"effects": [
"Evaluates the workspace completion rate and persists an anomaly when it is below minimumCompletionRate."
],
"errors": [
{
"status": 400,
"code": "invalid_reporting_window",
"recovery": "Choose a windowEnd greater than windowStart and retry."
},
{
"status": 403,
"code": "forbidden",
"recovery": "Use a credential with feed:write access to the selected Feed workspace."
}
],
"verify": [
"Confirm $.observedValue is present and, when below the threshold, $.anomaly.id identifies the persisted anomaly."
],
"examples": [
{
"input": {
"windowStart": 1,
"windowEnd": 2,
"minimumCompletionRate": 75
},
"expected": "A Feed anomaly-check result for the selected reporting window and threshold."
}
]
},
"documentation": {
"example_input": {
"windowStart": 1,
"windowEnd": 2,
"minimumCompletionRate": 75
},
"cli_example": [
"topolo actions --service topolo-device-platform --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/analytics/anomaly-checks",
"body": {
"windowStart": 1,
"windowEnd": 2,
"minimumCompletionRate": 75
}
},
"effects": "Evaluates the workspace completion rate and persists an anomaly when it is below minimumCompletionRate.",
"verification": [
"Confirm $.observedValue is present and, when below the threshold, $.anomaly.id identifies the persisted anomaly."
],
"recovery": [
"400 invalid_reporting_window: Choose a windowEnd greater than windowStart and retry.",
"403 forbidden: Use a credential with feed:write access to the selected Feed workspace."
],
"docs_url": "https://docs.topolo.app/applications/feed",
"resource": {
"kind": "feed_engagement_anomaly",
"idPath": "$.anomaly.id"
},
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/analytics/anomaly-checks",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "devices.credential.rotate",
"title": "Rotate feed device credential",
"description": "Issue a new one-time credential for a device in the active Feed workspace and invalidate its previous credential.",
"method": "POST",
"path": "/api/analytics/devices/{deviceId}/credential",
"permission": "feed:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"deviceId": {
"type": "string",
"minLength": 1
}
},
"required": [
"deviceId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"description": "Response returned by Rotate feed device credential.",
"additionalProperties": true
},
"target": "analytics",
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"deviceId": "example"
},
"cli_example": [
"topolo actions --service topolo-device-platform --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/analytics/devices/example/credential",
"body": {
"deviceId": "example"
}
},
"effects": "May change state through POST /api/analytics/devices/{deviceId}/credential. 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/analytics/devices/*/credential",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sources.list",
"title": "List feed sources",
"description": "List registered content sources in the active Feed workspace.",
"method": "GET",
"path": "/api/analytics/sources",
"permission": "feed:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspaceId": {
"type": "string",
"minLength": 1
},
"workspace_id": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"description": "Response returned by List feed sources.",
"additionalProperties": true
},
"target": "analytics",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {
"workspaceId": "example",
"workspace_id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-device-platform --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/analytics/sources",
"body": null
},
"effects": "Reads state through GET /api/analytics/sources 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/analytics/sources",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sources.create",
"title": "Create feed source",
"description": "Register an HTTPS content source in the active Feed workspace.",
"method": "POST",
"path": "/api/analytics/sources",
"permission": "feed:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"endpointUrl": {
"type": "string",
"format": "uri",
"pattern": "^https:\\/\\/.*"
}
},
"required": [
"name",
"endpointUrl"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"description": "Response returned by Create feed source.",
"additionalProperties": true
},
"target": "analytics",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"name": "example",
"endpointUrl": "https://example.com"
},
"cli_example": [
"topolo actions --service topolo-device-platform --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/analytics/sources",
"body": {
"name": "example",
"endpointUrl": "https://example.com"
}
},
"effects": "May change state through POST /api/analytics/sources. 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/analytics/sources",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "privacy.export",
"title": "Export Feed organization data",
"description": "Export all Feed records for the authenticated organization with protected fields decrypted for the requester.",
"method": "GET",
"path": "/api/privacy",
"permission": "workspace:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"description": "Response returned by Export Feed organization data.",
"additionalProperties": true
},
"target": "analytics",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-device-platform --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/privacy",
"body": null
},
"effects": "Reads state through GET /api/privacy 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/privacy",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "privacy.delete",
"title": "Erase Feed organization data",
"description": "Permanently erase Feed records for the authenticated organization and retain only a hashed erasure receipt.",
"method": "DELETE",
"path": "/api/privacy",
"permission": "workspace:delete",
"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
},
"outputSchema": {
"type": "object",
"description": "Response returned by Erase Feed organization data.",
"additionalProperties": true
},
"target": "analytics",
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"confirmation": "ERASE"
},
"cli_example": [
"topolo actions --service topolo-device-platform --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/privacy",
"body": null
},
"effects": "May change state through DELETE /api/privacy. 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/privacy",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "privacy.protection.canary",
"title": "Check Feed data protection",
"description": "Verify protected Feed D1 and KV fields decrypt and report any remaining plaintext records.",
"method": "GET",
"path": "/api/privacy/protection/canary",
"permission": "workspace:read",
"authorizationMode": "static",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"description": "Response returned by Check Feed data protection.",
"additionalProperties": true
},
"target": "analytics",
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-device-platform --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/privacy/protection/canary",
"body": null
},
"effects": "Reads state through GET /api/privacy/protection/canary 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/privacy/protection/canary",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "sources.sync",
"title": "Sync feed source",
"description": "Refresh one registered Feed source and persist its terminal sync result.",
"method": "POST",
"path": "/api/analytics/sources/{sourceId}/sync",
"permission": "feed:write",
"authorizationMode": "static",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"sourceId": {
"type": "string",
"minLength": 1
}
},
"required": [
"sourceId"
],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"description": "Response returned by Sync feed source.",
"additionalProperties": true
},
"target": "analytics",
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"sourceId": "example"
},
"cli_example": [
"topolo actions --service topolo-device-platform --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/analytics/sources/example/sync",
"body": {
"sourceId": "example"
}
},
"effects": "May change state through POST /api/analytics/sources/{sourceId}/sync. 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/analytics/sources/*/sync",
"evidence": "Matched to a served route extracted from canonical staging source."
}
}
],
"action_coverage": {
"status": "ok",
"served_routes": 20,
"matched_actions": 14,
"declared_unserved_actions": [],
"coverage_excluded_actions": [],
"uncatalogued_routes": [],
"ignored_routes": 6,
"configured_exclusions": 3,
"configuration_findings": [],
"notes": []
},
"runtime_contract_audit": {
"status": "verified",
"actions": 14,
"contracts": 14,
"contract_module": "topolo.action-contracts.mjs",
"validator_sources": [
"apps/analytics/src/index.ts",
"apps/api/src/index.ts"
],
"authorization_sources": [
"apps/analytics/src/index.ts",
"apps/api/src/index.ts"
],
"findings": []
}
}
],
"mobile_contracts": [
{
"source_path": "apps/TopoloFeed/topolo.mobile-experience.json",
"contract": {
"version": "2026-07-03",
"status": "approved",
"mode": "native_capability",
"appId": "app_topolo_feed",
"localizationNamespace": "feed",
"permissions": [
"feed:read"
],
"offlinePolicy": "read_through_cache",
"fallbackPath": "/dashboard/devices",
"auth": {
"audience": "topolo-feed",
"scopes": [
"feed:read"
],
"orgContext": "required"
},
"routes": [
{
"path": "/dashboard/devices",
"apiPath": "/api/widget",
"title": "Devices",
"titleKey": "feed.mobile.routes.devices.title",
"template": "record.list",
"dataSource": "feed.devices.list",
"detailRoute": "/dashboard/media"
},
{
"path": "/dashboard/media",
"apiPath": "/api/widget",
"title": "Media feed",
"titleKey": "feed.mobile.routes.media.title",
"template": "record.detail",
"dataSource": "feed.media.detail"
}
]
}
}
],
"package_manifests": [],
"deployment_configs": [],
"source_signals": {
"api_routes": [
{
"method": "DELETE",
"path": "/analytics/feed/workspaces/:workspaceId",
"source_path": "apps/TopoloFeed/apps/analytics/src/index.ts"
},
{
"method": "GET",
"path": "/privacy",
"source_path": "apps/TopoloFeed/apps/analytics/src/index.ts"
},
{
"method": "DELETE",
"path": "/privacy",
"source_path": "apps/TopoloFeed/apps/analytics/src/index.ts"
},
{
"method": "GET",
"path": "/privacy/protection/canary",
"source_path": "apps/TopoloFeed/apps/analytics/src/index.ts"
},
{
"method": "POST",
"path": "/analytics",
"source_path": "apps/TopoloFeed/apps/analytics/src/index.ts"
},
{
"method": "GET",
"path": "/analytics/summary",
"source_path": "apps/TopoloFeed/apps/analytics/src/index.ts"
},
{
"method": "GET",
"path": "/analytics/engagement",
"source_path": "apps/TopoloFeed/apps/analytics/src/index.ts"
},
{
"method": "GET",
"path": "/analytics/devices",
"source_path": "apps/TopoloFeed/apps/analytics/src/index.ts"
},
{
"method": "POST",
"path": "/analytics/digests",
"source_path": "apps/TopoloFeed/apps/analytics/src/index.ts"
},
{
"method": "POST",
"path": "/analytics/anomaly-checks",
"source_path": "apps/TopoloFeed/apps/analytics/src/index.ts"
},
{
"method": "POST",
"path": "/analytics/devices/:deviceId/credential",
"source_path": "apps/TopoloFeed/apps/analytics/src/index.ts"
},
{
"method": "POST",
"path": "/analytics/sources",
"source_path": "apps/TopoloFeed/apps/analytics/src/index.ts"
},
{
"method": "GET",
"path": "/analytics/sources",
"source_path": "apps/TopoloFeed/apps/analytics/src/index.ts"
},
{
"method": "POST",
"path": "/analytics/sources/:sourceId/sync",
"source_path": "apps/TopoloFeed/apps/analytics/src/index.ts"
},
{
"method": "GET",
"path": "/health",
"source_path": "apps/TopoloFeed/apps/analytics/src/index.ts"
},
{
"method": "GET",
"path": "/health",
"source_path": "apps/TopoloFeed/apps/api/src/index.ts"
},
{
"method": "GET",
"path": "/api/widget",
"source_path": "apps/TopoloFeed/apps/api/src/index.ts"
},
{
"method": "GET",
"path": "/",
"source_path": "apps/TopoloFeed/apps/api/src/index.ts"
},
{
"method": "GET",
"path": "/api/:deviceId",
"source_path": "apps/TopoloFeed/apps/api/src/index.ts"
}
],
"ui_routes": [
{
"path": "/dashboard",
"source_path": "apps/TopoloFeed/apps/web/src/App.tsx"
},
{
"path": "/dashboard/devices",
"source_path": "apps/TopoloFeed/apps/web/src/App.tsx"
},
{
"path": "/dashboard/media",
"source_path": "apps/TopoloFeed/apps/web/src/App.tsx"
},
{
"path": "/dashboard/getting-started",
"source_path": "apps/TopoloFeed/apps/web/src/App.tsx"
},
{
"path": "/settings",
"source_path": "apps/TopoloFeed/apps/web/src/App.tsx"
},
{
"path": "/settings/:section",
"source_path": "apps/TopoloFeed/apps/web/src/App.tsx"
}
],
"test_cases": [],
"database_tables": []
},
"documentation": {
"declared_paths": [
"applications/device-platform",
"internal/apps/device-platform",
"applications/feed",
"internal/apps/feed"
],
"present_paths": [
"applications/device-platform",
"internal/apps/device-platform",
"applications/feed",
"internal/apps/feed"
],
"missing_paths": [],
"human_reference": "/systems/topolo-device-platform",
"machine_reference": "/machine/systems/topolo-device-platform.json",
"action_examples": 14,
"action_schemas": 14
},
"source_findings": []
}