application · active
TopoloCRM
CRM workflows, records, and SDR inbox/control-plane services exposed through the platform auth layer.
Documentation map
- TopoloCRM — Public overview of the CRM service, pipeline surface, SDR inbox control plane, and developer-key access model.
- Topolo Forms — Public overview of Topolo Forms, the Topolo general forms and public submission application.
Authority and runtime
- System ID
topolo-crm- App IDs
- app_topolo_crm
- Owners
- crm
- Repositories
- apps/TopoloCRM
- Hosts
- https://crm.topolo.app, https://crm-api.stg.topolo.us, https://crm.stg.topolo.us
- Dependencies
- topolo-auth, topolo-one, applications-packages
Security and data ownership
- Risk tier
- high
- Tenant isolation
- organization_scoped
- Privacy classification
- restricted
- Storage
- d1, external_provider, kv, r2
- Export and deletion
- planned
- Enterprise ready
- no
Source-derived capability inventory
Source revisions: apps/TopoloCRM@7b79b9768344e095e72f71c7f6d1a8dad22a156e
Declared actions: 134 · API routes: 8 · UI routes: 36
{
"id": "topolo-crm",
"name": "TopoloCRM",
"slug": "topolo-crm",
"kind": "application",
"visibility": "public",
"repo_paths": [
"apps/TopoloCRM"
],
"source_revisions": [
{
"source_path": "apps/TopoloCRM",
"repository": "apps/TopoloCRM",
"revision": "7b79b9768344e095e72f71c7f6d1a8dad22a156e",
"ref": "origin/staging"
}
],
"source_counts": {
"source_files": 217,
"test_files": 133,
"test_cases": 0,
"migration_files": 0,
"database_tables": 0,
"manifests": 1,
"deploy_targets": 2,
"actions": 134,
"mobile_contracts": 1,
"notifications": 9,
"package_manifests": 3,
"deployment_configs": 0
},
"manifests": [
{
"source_path": "apps/TopoloCRM/topolo.app.json",
"service_slug": "topolo-crm",
"name": "topolo-crm",
"app_id": "app_topolo_crm",
"compatibility_date": "2026-04-10",
"primary_target": null,
"environments": [
"production",
"staging"
],
"targets": [
{
"name": "web",
"kind": "worker",
"directory": "apps/web",
"main": "src/worker.ts",
"worker_name": "topolo-crm-app",
"subdomain": "crm",
"healthcheck_path": null,
"variable_names": [
"AUTH_API_URL",
"INSIGHTS_SITE_KEY"
],
"secret_names": [],
"bindings": [
{
"kind": "services",
"binding": "API",
"target": null
},
{
"kind": "services",
"binding": "API",
"target": null
}
]
},
{
"name": "api",
"kind": "worker",
"directory": "apps/api",
"main": "index.ts",
"worker_name": "topolo-crm-api",
"subdomain": null,
"healthcheck_path": "/health",
"variable_names": [
"account_id",
"API_KEY_HASH_ITERATIONS",
"API_KEY_PREFIX",
"CRM_PUBLIC_BASE_URL",
"ENVIRONMENT",
"NEXUS_GATEWAY_URL",
"NODE_ENV",
"SALT_ROUNDS",
"TOPOLO_AUTH_URL",
"TOPOLO_NOTIFY_URL",
"TOPOLO_SEED_APP_ID"
],
"secret_names": [],
"bindings": [
{
"kind": "d1",
"binding": "CRM_CONTROL_DB",
"target": null
},
{
"kind": "d1",
"binding": "CRM_DIRECTORY_DB",
"target": null
},
{
"kind": "d1",
"binding": "CRM_PIPELINE_DB",
"target": null
},
{
"kind": "d1",
"binding": "CRM_REAL_ESTATE_DB",
"target": null
},
{
"kind": "d1",
"binding": "CRM_PORTAL_DB",
"target": null
},
{
"kind": "d1",
"binding": "CRM_AUDIT_DB",
"target": null
},
{
"kind": "r2",
"binding": "crm_attachments",
"target": null
},
{
"kind": "kv",
"binding": "CRM_KV",
"target": null
}
]
}
],
"notifications": [
"crm.deal.stage_changed",
"crm.lead.assigned",
"crm.offer.received",
"crm.offer.status_changed",
"crm.portal_sync.failed",
"crm.showing.scheduled",
"crm.task.assigned",
"crm.task.due",
"crm.transaction.milestone_due"
],
"notification_contract": {
"source_path": "topolo.notification-contracts.json",
"role": "producer",
"schema_version": 1,
"owner_app_id": "app_topolo_crm",
"events": [
{
"type": "crm.deal.stage_changed",
"version": 1,
"description": "A deal moved between pipeline stages.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"object_id",
"occurred_at"
],
"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
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"actor_id": {
"type": "string"
},
"actor_display_name": {
"type": "string"
},
"recipient_email": {
"type": "string",
"format": "email"
},
"thread_key": {
"type": "string"
},
"expires_at": {
"type": "string",
"format": "date-time"
},
"action_context": {
"type": "object"
}
},
"additionalProperties": true
},
"examples": [
{
"title": "A deal moved between pipeline stages.",
"body": "Open the owning app to review this event.",
"object_id": "object_123",
"occurred_at": "2026-07-17T00:00:00.000Z"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^crm:deal-stage:"
},
"sensitiveFields": []
},
{
"type": "crm.lead.assigned",
"version": 1,
"description": "CRM recorded the durable lead assigned transition.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"surface",
"priority",
"category",
"severity",
"object_type",
"object_id",
"occurred_at",
"thread_key"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"surface": {
"const": "notification"
},
"priority": {
"const": "high"
},
"category": {
"const": "crm"
},
"severity": {
"const": "info"
},
"object_type": {
"const": "lead"
},
"object_id": {
"type": "string",
"minLength": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"thread_key": {
"type": "string",
"minLength": 1
},
"cta_url": {
"type": "string",
"format": "uri"
},
"cta_label": {
"type": "string",
"minLength": 1
},
"previous_status": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"minLength": 1
},
"due_at": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "New lead assigned: Ada Lovelace",
"body": "A portal lead was assigned to you in CRM.",
"object_id": "lead_123",
"thread_key": "crm:lead:lead_123",
"surface": "notification",
"priority": "high",
"category": "crm",
"severity": "info",
"object_type": "lead",
"occurred_at": "2026-07-22T00:00:00.000Z",
"cta_url": "https://crm.stg.topolo.us/leads/lead_123",
"cta_label": "Open in CRM"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^crm:lead-assigned:"
}
},
{
"type": "crm.offer.received",
"version": 1,
"description": "CRM recorded the durable offer received transition.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"surface",
"priority",
"category",
"severity",
"object_type",
"object_id",
"occurred_at",
"thread_key",
"status"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"surface": {
"const": "notification"
},
"priority": {
"const": "high"
},
"category": {
"const": "crm"
},
"severity": {
"const": "info"
},
"object_type": {
"const": "offer"
},
"object_id": {
"type": "string",
"minLength": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"thread_key": {
"type": "string",
"minLength": 1
},
"cta_url": {
"type": "string",
"format": "uri"
},
"cta_label": {
"type": "string",
"minLength": 1
},
"previous_status": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"minLength": 1
},
"due_at": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Offer received: Northstar",
"body": "A USD offer was recorded for review.",
"object_id": "offer_123",
"thread_key": "crm:offer:offer_123",
"status": "draft",
"surface": "notification",
"priority": "high",
"category": "crm",
"severity": "info",
"object_type": "offer",
"occurred_at": "2026-07-22T00:00:00.000Z",
"cta_url": "https://crm.stg.topolo.us/offers/offer_123",
"cta_label": "Open in CRM"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^crm:offer-received:"
}
},
{
"type": "crm.offer.status_changed",
"version": 1,
"description": "CRM recorded the durable offer status changed transition.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"surface",
"priority",
"category",
"severity",
"object_type",
"object_id",
"occurred_at",
"thread_key",
"previous_status",
"status"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"surface": {
"const": "notification"
},
"priority": {
"const": "normal"
},
"category": {
"const": "crm"
},
"severity": {
"const": "info"
},
"object_type": {
"const": "offer"
},
"object_id": {
"type": "string",
"minLength": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"thread_key": {
"type": "string",
"minLength": 1
},
"cta_url": {
"type": "string",
"format": "uri"
},
"cta_label": {
"type": "string",
"minLength": 1
},
"previous_status": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"minLength": 1
},
"due_at": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Offer status changed to accepted",
"body": "Northstar moved from pending to accepted.",
"object_id": "offer_123",
"thread_key": "crm:offer:offer_123",
"previous_status": "pending",
"status": "accepted",
"surface": "notification",
"priority": "normal",
"category": "crm",
"severity": "info",
"object_type": "offer",
"occurred_at": "2026-07-22T00:00:00.000Z",
"cta_url": "https://crm.stg.topolo.us/offers/offer_123",
"cta_label": "Open in CRM"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^crm:offer-status:"
}
},
{
"type": "crm.portal_sync.failed",
"version": 1,
"description": "CRM recorded the durable portal sync failed transition.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"surface",
"priority",
"category",
"severity",
"object_type",
"object_id",
"occurred_at",
"thread_key"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"surface": {
"const": "notification"
},
"priority": {
"const": "high"
},
"category": {
"const": "crm"
},
"severity": {
"const": "critical"
},
"object_type": {
"const": "portal_sync"
},
"object_id": {
"type": "string",
"minLength": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"thread_key": {
"type": "string",
"minLength": 1
},
"cta_url": {
"type": "string",
"format": "uri"
},
"cta_label": {
"type": "string",
"minLength": 1
},
"previous_status": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"minLength": 1
},
"due_at": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Portal sync failed: Northstar",
"body": "The portal rejected the listing sync.",
"object_id": "sync_123",
"thread_key": "crm:listing:listing_123",
"surface": "notification",
"priority": "high",
"category": "crm",
"severity": "critical",
"object_type": "portal_sync",
"occurred_at": "2026-07-22T00:00:00.000Z",
"cta_url": "https://crm.stg.topolo.us/portal-syncs/sync_123",
"cta_label": "Open in CRM"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^crm:portal-sync-failed:"
}
},
{
"type": "crm.showing.scheduled",
"version": 1,
"description": "CRM recorded the durable showing scheduled transition.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"surface",
"priority",
"category",
"severity",
"object_type",
"object_id",
"occurred_at",
"thread_key",
"due_at"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"surface": {
"const": "notification"
},
"priority": {
"const": "normal"
},
"category": {
"const": "crm"
},
"severity": {
"const": "info"
},
"object_type": {
"const": "showing"
},
"object_id": {
"type": "string",
"minLength": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"thread_key": {
"type": "string",
"minLength": 1
},
"cta_url": {
"type": "string",
"format": "uri"
},
"cta_label": {
"type": "string",
"minLength": 1
},
"previous_status": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"minLength": 1
},
"due_at": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Showing scheduled: Northstar",
"body": "A property showing was scheduled.",
"object_id": "showing_123",
"thread_key": "crm:showing:showing_123",
"due_at": "2026-07-23T10:00:00.000Z",
"surface": "notification",
"priority": "normal",
"category": "crm",
"severity": "info",
"object_type": "showing",
"occurred_at": "2026-07-22T00:00:00.000Z",
"cta_url": "https://crm.stg.topolo.us/showings/showing_123",
"cta_label": "Open in CRM"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^crm:showing-scheduled:"
}
},
{
"type": "crm.task.assigned",
"version": 1,
"description": "CRM recorded the durable task assigned transition.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"surface",
"priority",
"category",
"severity",
"object_type",
"object_id",
"occurred_at",
"thread_key"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"surface": {
"const": "notification"
},
"priority": {
"const": "normal"
},
"category": {
"const": "crm"
},
"severity": {
"const": "info"
},
"object_type": {
"const": "task"
},
"object_id": {
"type": "string",
"minLength": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"thread_key": {
"type": "string",
"minLength": 1
},
"cta_url": {
"type": "string",
"format": "uri"
},
"cta_label": {
"type": "string",
"minLength": 1
},
"previous_status": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"minLength": 1
},
"due_at": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Task assigned: Follow up",
"body": "A CRM task was assigned to you.",
"object_id": "task_123",
"thread_key": "crm:task:task_123",
"surface": "notification",
"priority": "normal",
"category": "crm",
"severity": "info",
"object_type": "task",
"occurred_at": "2026-07-22T00:00:00.000Z",
"cta_url": "https://crm.stg.topolo.us/tasks/task_123",
"cta_label": "Open in CRM"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^crm:task-assigned:"
}
},
{
"type": "crm.task.due",
"version": 1,
"description": "CRM recorded the durable task due transition.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"surface",
"priority",
"category",
"severity",
"object_type",
"object_id",
"occurred_at",
"thread_key",
"due_at"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"surface": {
"const": "notification"
},
"priority": {
"const": "high"
},
"category": {
"const": "crm"
},
"severity": {
"const": "warning"
},
"object_type": {
"const": "task"
},
"object_id": {
"type": "string",
"minLength": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"thread_key": {
"type": "string",
"minLength": 1
},
"cta_url": {
"type": "string",
"format": "uri"
},
"cta_label": {
"type": "string",
"minLength": 1
},
"previous_status": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"minLength": 1
},
"due_at": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Task due: Follow up",
"body": "A CRM task assigned to you is due.",
"object_id": "task_123",
"thread_key": "crm:task:task_123",
"due_at": "2026-07-23T10:00:00.000Z",
"surface": "notification",
"priority": "high",
"category": "crm",
"severity": "warning",
"object_type": "task",
"occurred_at": "2026-07-22T00:00:00.000Z",
"cta_url": "https://crm.stg.topolo.us/tasks/task_123",
"cta_label": "Open in CRM"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^crm:task-due:"
}
},
{
"type": "crm.transaction.milestone_due",
"version": 1,
"description": "CRM recorded the durable transaction milestone due transition.",
"status": "published",
"payloadSchema": {
"type": "object",
"required": [
"title",
"body",
"surface",
"priority",
"category",
"severity",
"object_type",
"object_id",
"occurred_at",
"thread_key",
"due_at"
],
"properties": {
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"surface": {
"const": "notification"
},
"priority": {
"const": "high"
},
"category": {
"const": "crm"
},
"severity": {
"const": "warning"
},
"object_type": {
"const": "transaction_milestone"
},
"object_id": {
"type": "string",
"minLength": 1
},
"occurred_at": {
"type": "string",
"format": "date-time"
},
"thread_key": {
"type": "string",
"minLength": 1
},
"cta_url": {
"type": "string",
"format": "uri"
},
"cta_label": {
"type": "string",
"minLength": 1
},
"previous_status": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string",
"minLength": 1
},
"due_at": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": false
},
"examples": [
{
"title": "Milestone due: Exchange",
"body": "A transaction milestone assigned to your team is due.",
"object_id": "milestone_123",
"thread_key": "crm:transaction:transaction_123",
"due_at": "2026-07-23T10:00:00.000Z",
"surface": "notification",
"priority": "high",
"category": "crm",
"severity": "warning",
"object_type": "transaction_milestone",
"occurred_at": "2026-07-22T00:00:00.000Z",
"cta_url": "https://crm.stg.topolo.us/transaction-milestones/milestone_123",
"cta_label": "Open in CRM"
}
],
"dataClassification": "internal",
"recipients": {
"modes": [
"organization_member"
],
"externalAddress": "forbidden"
},
"idempotency": {
"required": true,
"pattern": "^crm:milestone-due:"
}
}
]
},
"actions": [
{
"name": "contacts.list",
"title": "List contacts",
"description": "List contacts.",
"target": "api",
"method": "GET",
"path": "/api/contacts",
"permission": "contacts:read",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"q": {
"type": "string"
},
"company": {
"type": "string"
},
"company_id": {
"type": "string"
},
"page": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"sort_by": {
"type": "string"
},
"sort_order": {
"type": "string"
},
"job_title": {
"type": "string"
},
"employment_role": {
"type": "string"
},
"seniority": {
"type": "string"
},
"lead_status": {
"type": "string"
},
"lifecycle_stage": {
"type": "string"
},
"lead_score_min": {
"type": "number"
},
"lead_score_max": {
"type": "number"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"country": {
"type": "string"
},
"has_email": {
"type": "boolean"
},
"has_phone": {
"type": "boolean"
},
"has_mobile_phone": {
"type": "boolean"
},
"created_after": {
"type": "string"
},
"created_before": {
"type": "string"
},
"updated_after": {
"type": "string"
},
"updated_before": {
"type": "string"
},
"tags": {
"type": "string"
}
},
"additionalProperties": false
},
"readOnly": true,
"outputSchema": {
"type": "object",
"description": "Response returned by List contacts.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"q": "example",
"company": "example",
"company_id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/contacts",
"body": null
},
"effects": "Reads state through GET /api/contacts 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/contacts",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "contacts.get",
"title": "Get contacts",
"description": "Get one contacts record.",
"target": "api",
"method": "GET",
"path": "/api/contacts/{id}",
"permission": "contacts:read",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"readOnly": true,
"outputSchema": {
"type": "object",
"description": "Response returned by Get contacts.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/contacts/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "Reads state through GET /api/contacts/{id} 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/contacts/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "contacts.create",
"title": "Create contacts",
"description": "Create contacts.",
"target": "api",
"method": "POST",
"path": "/api/contacts",
"permission": "contacts:write",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"first": {
"type": "string"
},
"middle_name": {
"type": "string"
},
"last": {
"type": "string"
},
"salutation": {
"type": "string"
},
"suffix": {
"type": "string"
},
"email": {
"type": "string"
},
"stageId": {
"type": "string"
},
"phone": {
"type": "string"
},
"mobile_phone": {
"type": "string"
},
"company": {
"type": "string"
},
"company_id": {
"type": "string"
},
"tags": {
"type": "string"
},
"external_id": {
"type": "string"
},
"external_profile_url": {
"type": "string"
},
"instagram_url": {
"type": "string"
},
"tiktok_url": {
"type": "string"
},
"youtube_url": {
"type": "string"
},
"x_url": {
"type": "string"
},
"github_url": {
"type": "string"
},
"job_title": {
"type": "string"
},
"employment_role": {
"type": "string"
},
"seniority": {
"type": "string"
},
"department": {
"type": "string"
},
"lead_status": {
"type": "string"
},
"lifecycle_stage": {
"type": "string"
},
"contact_accuracy_grade": {
"type": "string"
},
"education_level": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"country": {
"type": "string"
},
"postal_code": {
"type": "string"
},
"address": {
"type": "string"
},
"linkedin_url": {
"type": "string"
},
"website_url": {
"type": "string"
},
"audience_primary_platform": {
"type": "string"
},
"audience_primary_url": {
"type": "string"
},
"audience_primary_handle": {
"type": "string"
},
"audience_follower_count_last_updated": {
"type": "string"
},
"audience_niche": {
"type": "string"
},
"company_domain": {
"type": "string"
},
"company_size": {
"type": "string"
},
"linkedin_headline": {
"type": "string"
},
"linkedin_about": {
"type": "string"
},
"linkedin_recent_experience": {
"type": "string"
},
"linkedin_inferred_timezone": {
"type": "string"
},
"linkedin_captured_at": {
"type": "string"
},
"latest_traffic_source": {
"type": "string"
},
"original_traffic_source": {
"type": "string"
},
"first_touch_campaign": {
"type": "string"
},
"last_touch_campaign": {
"type": "string"
},
"contact_owner": {
"type": "string"
},
"hubspot_team": {
"type": "string"
},
"traffic_source_date": {
"type": "string"
},
"original_traffic_drill_down_1": {
"type": "string"
},
"original_traffic_drill_down_2": {
"type": "string"
},
"latest_traffic_drill_down_1": {
"type": "string"
},
"latest_traffic_drill_down_2": {
"type": "string"
},
"lead_score": {
"type": "number"
},
"audience_follower_count": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"linkedin_followers": {
"type": "number"
},
"linkedin_connections": {
"type": "number"
},
"social_profiles": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"properties": {
"platform": {
"type": "string"
},
"url": {
"type": "string"
},
"handle": {
"type": "string"
},
"follower_count": {
"type": "number"
},
"follower_count_last_updated": {
"type": "string"
},
"is_primary": {
"type": "boolean"
}
},
"required": [
"platform",
"url"
],
"additionalProperties": false
}
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"requiresConfirmation": true,
"outputSchema": {
"type": "object",
"description": "Response returned by Create contacts.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"first": "example",
"middle_name": "example",
"last": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/contacts",
"body": {
"first": "example",
"middle_name": "example",
"last": "example"
}
},
"effects": "May change state through POST /api/contacts. 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/contacts",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "contacts.update",
"title": "Update contacts",
"description": "Update one contacts record.",
"target": "api",
"method": "PUT",
"path": "/api/contacts/{id}",
"permission": "contacts:write",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"first": {
"type": "string"
},
"middle_name": {
"type": "string"
},
"last": {
"type": "string"
},
"salutation": {
"type": "string"
},
"suffix": {
"type": "string"
},
"email": {
"type": "string"
},
"stageId": {
"type": "string"
},
"phone": {
"type": "string"
},
"mobile_phone": {
"type": "string"
},
"company": {
"type": "string"
},
"company_id": {
"type": "string"
},
"tags": {
"type": "string"
},
"external_id": {
"type": "string"
},
"external_profile_url": {
"type": "string"
},
"instagram_url": {
"type": "string"
},
"tiktok_url": {
"type": "string"
},
"youtube_url": {
"type": "string"
},
"x_url": {
"type": "string"
},
"github_url": {
"type": "string"
},
"job_title": {
"type": "string"
},
"employment_role": {
"type": "string"
},
"seniority": {
"type": "string"
},
"department": {
"type": "string"
},
"lead_status": {
"type": "string"
},
"lifecycle_stage": {
"type": "string"
},
"contact_accuracy_grade": {
"type": "string"
},
"education_level": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"country": {
"type": "string"
},
"postal_code": {
"type": "string"
},
"address": {
"type": "string"
},
"linkedin_url": {
"type": "string"
},
"website_url": {
"type": "string"
},
"audience_primary_platform": {
"type": "string"
},
"audience_primary_url": {
"type": "string"
},
"audience_primary_handle": {
"type": "string"
},
"audience_follower_count_last_updated": {
"type": "string"
},
"audience_niche": {
"type": "string"
},
"company_domain": {
"type": "string"
},
"company_size": {
"type": "string"
},
"linkedin_headline": {
"type": "string"
},
"linkedin_about": {
"type": "string"
},
"linkedin_recent_experience": {
"type": "string"
},
"linkedin_inferred_timezone": {
"type": "string"
},
"linkedin_captured_at": {
"type": "string"
},
"latest_traffic_source": {
"type": "string"
},
"original_traffic_source": {
"type": "string"
},
"first_touch_campaign": {
"type": "string"
},
"last_touch_campaign": {
"type": "string"
},
"contact_owner": {
"type": "string"
},
"hubspot_team": {
"type": "string"
},
"traffic_source_date": {
"type": "string"
},
"original_traffic_drill_down_1": {
"type": "string"
},
"original_traffic_drill_down_2": {
"type": "string"
},
"latest_traffic_drill_down_1": {
"type": "string"
},
"latest_traffic_drill_down_2": {
"type": "string"
},
"lead_score": {
"type": "number"
},
"audience_follower_count": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"linkedin_followers": {
"type": "number"
},
"linkedin_connections": {
"type": "number"
},
"social_profiles": {
"anyOf": [
{
"type": "array",
"items": {
"type": "object",
"properties": {
"platform": {
"type": "string"
},
"url": {
"type": "string"
},
"handle": {
"type": "string"
},
"follower_count": {
"type": "number"
},
"follower_count_last_updated": {
"type": "string"
},
"is_primary": {
"type": "boolean"
}
},
"required": [
"platform",
"url"
],
"additionalProperties": false
}
},
{
"type": "null"
}
]
}
},
"required": [
"id"
],
"additionalProperties": false
},
"requiresConfirmation": true,
"outputSchema": {
"type": "object",
"description": "Response returned by Update contacts.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/contacts/00000000-0000-4000-8000-000000000000",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through PUT /api/contacts/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/contacts/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "contacts.delete",
"title": "Delete contacts",
"description": "Delete one contacts record.",
"target": "api",
"method": "DELETE",
"path": "/api/contacts/{id}",
"permission": "contacts:write",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"destructive": true,
"requiresConfirmation": true,
"outputSchema": {
"type": "object",
"description": "Response returned by Delete contacts.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/contacts/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "May change state through DELETE /api/contacts/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/contacts/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "companies.list",
"title": "List companies",
"description": "List companies.",
"method": "GET",
"path": "/api/companies",
"permission": "companies:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"search": {
"type": "string"
},
"page": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List companies.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"search": "example",
"page": 1,
"limit": 1
},
"cli_example": [
"topolo actions --service topolo-crm --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/companies",
"body": null
},
"effects": "Reads state through GET /api/companies 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/companies",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "companies.create",
"title": "Create companies",
"description": "Create companies.",
"method": "POST",
"path": "/api/companies",
"permission": "companies:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"website": {
"type": "string"
},
"domain": {
"type": "string"
},
"phone": {
"type": "string"
},
"fax": {
"type": "string"
},
"email": {
"type": "string"
},
"address": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"postal_code": {
"type": "string"
},
"country": {
"type": "string"
},
"industry": {
"type": "string"
},
"employee_range": {
"type": "string"
},
"revenue_range": {
"type": "string"
},
"primary_sub_industry": {
"type": "string"
},
"linkedin_url": {
"type": "string"
},
"external_id": {
"type": "string"
},
"external_profile_url": {
"type": "string"
},
"logo_url": {
"type": "string"
},
"ticker": {
"type": "string"
},
"size": {
"type": "string"
},
"founded_year": {
"type": "number"
},
"employee_count": {
"type": "number"
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create companies.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"name": "example",
"description": "example",
"website": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/companies",
"body": {
"name": "example",
"description": "example",
"website": "example"
}
},
"effects": "May change state through POST /api/companies. 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/companies",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "companies.get",
"title": "Get companies",
"description": "Get one companies record.",
"method": "GET",
"path": "/api/companies/{id}",
"permission": "companies:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get companies.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/companies/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "Reads state through GET /api/companies/{id} 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/companies/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "companies.update",
"title": "Update companies",
"description": "Update one companies record.",
"method": "PUT",
"path": "/api/companies/{id}",
"permission": "companies:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"website": {
"type": "string"
},
"domain": {
"type": "string"
},
"phone": {
"type": "string"
},
"fax": {
"type": "string"
},
"email": {
"type": "string"
},
"address": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"postal_code": {
"type": "string"
},
"country": {
"type": "string"
},
"industry": {
"type": "string"
},
"employee_range": {
"type": "string"
},
"revenue_range": {
"type": "string"
},
"primary_sub_industry": {
"type": "string"
},
"linkedin_url": {
"type": "string"
},
"external_id": {
"type": "string"
},
"external_profile_url": {
"type": "string"
},
"logo_url": {
"type": "string"
},
"ticker": {
"type": "string"
},
"size": {
"type": "string"
},
"founded_year": {
"type": "number"
},
"employee_count": {
"type": "number"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update companies.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/companies/00000000-0000-4000-8000-000000000000",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through PUT /api/companies/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/companies/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "companies.delete",
"title": "Delete companies",
"description": "Delete one companies record.",
"method": "DELETE",
"path": "/api/companies/{id}",
"permission": "companies:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete companies.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/companies/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "May change state through DELETE /api/companies/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/companies/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "deals.list",
"title": "List deals",
"description": "List deals.",
"method": "GET",
"path": "/api/deals",
"permission": "deals:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"page": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"search": {
"type": "string"
},
"stage_id": {
"type": "string"
},
"pipeline_id": {
"type": "string"
},
"owner_id": {
"type": "string"
},
"company_id": {
"type": "string"
},
"contact_id": {
"type": "string"
},
"min_amount": {
"type": "number"
},
"max_amount": {
"type": "number"
},
"currency": {
"type": "string"
},
"min_probability": {
"type": "number"
},
"max_probability": {
"type": "number"
},
"expected_close_after": {
"type": "string"
},
"expected_close_before": {
"type": "string"
},
"created_after": {
"type": "string"
},
"created_before": {
"type": "string"
},
"updated_after": {
"type": "string"
},
"updated_before": {
"type": "string"
},
"sort_by": {
"type": "string"
},
"sort_order": {
"type": "string"
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List deals.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"page": 1,
"limit": 1,
"search": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/deals",
"body": null
},
"effects": "Reads state through GET /api/deals 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/deals",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "deals.create",
"title": "Create deals",
"description": "Create deals.",
"method": "POST",
"path": "/api/deals",
"permission": "deals:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"owner_id": {
"type": "string"
},
"company_id": {
"type": "string"
},
"contact_id": {
"type": "string"
},
"currency": {
"type": "string"
},
"pipeline_id": {
"type": "string"
},
"stage_id": {
"type": "string"
},
"expected_close_date": {
"type": "string"
},
"amount_cents": {
"type": "number"
},
"amount": {
"type": "number"
},
"probability": {
"type": "number"
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create deals.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"name": "example",
"description": "example",
"owner_id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/deals",
"body": {
"name": "example",
"description": "example",
"owner_id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/deals. 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/deals",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "deals.get",
"title": "Get deals",
"description": "Get one deals record.",
"method": "GET",
"path": "/api/deals/{id}",
"permission": "deals:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get deals.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/deals/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "Reads state through GET /api/deals/{id} 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/deals/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "deals.update",
"title": "Update deals",
"description": "Update one deals record.",
"method": "PUT",
"path": "/api/deals/{id}",
"permission": "deals:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string"
},
"description": {
"type": "string"
},
"owner_id": {
"type": "string"
},
"company_id": {
"type": "string"
},
"contact_id": {
"type": "string"
},
"currency": {
"type": "string"
},
"pipeline_id": {
"type": "string"
},
"stage_id": {
"type": "string"
},
"expected_close_date": {
"type": "string"
},
"amount_cents": {
"type": "number"
},
"amount": {
"type": "number"
},
"probability": {
"type": "number"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update deals.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/deals/00000000-0000-4000-8000-000000000000",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through PUT /api/deals/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/deals/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "deals.delete",
"title": "Delete deals",
"description": "Delete one deals record.",
"method": "DELETE",
"path": "/api/deals/{id}",
"permission": "deals:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete deals.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/deals/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "May change state through DELETE /api/deals/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/deals/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "deals.stage.update",
"title": "Update deal stage",
"description": "Update a CRM deal stage.",
"method": "PUT",
"path": "/api/deals/{id}/stage",
"permission": "deals:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"stageId": {
"type": "string",
"minLength": 1
}
},
"required": [
"id",
"stageId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update deal stage.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000",
"stageId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/deals/00000000-0000-4000-8000-000000000000/stage",
"body": {
"id": "00000000-0000-4000-8000-000000000000",
"stageId": "example"
}
},
"effects": "May change state through PUT /api/deals/{id}/stage. 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/deals/*/stage",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "deals.history.get",
"title": "Get deal history",
"description": "Get CRM deal history.",
"method": "GET",
"path": "/api/deals/{id}/history",
"permission": "deals:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get deal history.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/deals/00000000-0000-4000-8000-000000000000/history",
"body": null
},
"effects": "Reads state through GET /api/deals/{id}/history 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/deals/*/history",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "deals.pipeline_board.get",
"title": "Get deal pipeline board",
"description": "Get CRM deal pipeline board.",
"method": "GET",
"path": "/api/deals/pipeline/{pipelineId}/board",
"permission": "deals:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"pipelineId": {
"type": "string",
"minLength": 1
},
"page": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"required": [
"pipelineId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get deal pipeline board.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"pipelineId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/deals/pipeline/example/board",
"body": null
},
"effects": "Reads state through GET /api/deals/pipeline/{pipelineId}/board 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/deals/pipeline/*/board",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "pipeline.list",
"title": "List pipelines",
"description": "List CRM pipelines.",
"method": "GET",
"path": "/api/pipeline",
"permission": "pipeline:read",
"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 pipelines.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-crm --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/pipeline",
"body": null
},
"effects": "Reads state through GET /api/pipeline 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/pipeline",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "pipeline.get",
"title": "Get pipeline",
"description": "Get a CRM pipeline.",
"method": "GET",
"path": "/api/pipeline/{pipelineId}",
"permission": "pipeline:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"pipelineId": {
"type": "string",
"minLength": 1
}
},
"required": [
"pipelineId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get pipeline.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"pipelineId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/pipeline/example",
"body": null
},
"effects": "Reads state through GET /api/pipeline/{pipelineId} 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/pipeline/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "pipeline.board.get",
"title": "Get pipeline board",
"description": "Get a CRM pipeline board.",
"method": "GET",
"path": "/api/pipeline/{pipelineId}/board",
"permission": "pipeline:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"pipelineId": {
"type": "string",
"minLength": 1
},
"page": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"required": [
"pipelineId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get pipeline board.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"pipelineId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/pipeline/example/board",
"body": null
},
"effects": "Reads state through GET /api/pipeline/{pipelineId}/board 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/pipeline/*/board",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "pipeline.stages.list",
"title": "List pipeline stages",
"description": "List CRM pipeline stages.",
"method": "GET",
"path": "/api/pipeline/{pipelineId}/stages",
"permission": "pipeline:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"pipelineId": {
"type": "string",
"minLength": 1
}
},
"required": [
"pipelineId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List pipeline stages.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"pipelineId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/pipeline/example/stages",
"body": null
},
"effects": "Reads state through GET /api/pipeline/{pipelineId}/stages 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/pipeline/*/stages",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "pipeline.structure.get",
"title": "Get pipeline structure",
"description": "Get CRM pipeline structure.",
"method": "GET",
"path": "/api/pipeline/{pipelineId}/structure",
"permission": "pipeline:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"pipelineId": {
"type": "string",
"minLength": 1
}
},
"required": [
"pipelineId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get pipeline structure.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"pipelineId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/pipeline/example/structure",
"body": null
},
"effects": "Reads state through GET /api/pipeline/{pipelineId}/structure 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/pipeline/*/structure",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "pipeline.contact.status.get",
"title": "Get contact pipeline status",
"description": "Get CRM contact pipeline status.",
"method": "GET",
"path": "/api/pipeline/{contactId}/status",
"permission": "pipeline:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"contactId": {
"type": "string",
"minLength": 1
}
},
"required": [
"contactId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get contact pipeline status.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"contactId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/pipeline/example/status",
"body": null
},
"effects": "Reads state through GET /api/pipeline/{contactId}/status 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/pipeline/*/status",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "pipeline.contact.history.get",
"title": "Get contact pipeline history",
"description": "Get CRM contact pipeline history.",
"method": "GET",
"path": "/api/pipeline/{contactId}/history",
"permission": "pipeline:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"contactId": {
"type": "string",
"minLength": 1
}
},
"required": [
"contactId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get contact pipeline history.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"contactId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/pipeline/example/history",
"body": null
},
"effects": "Reads state through GET /api/pipeline/{contactId}/history 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/pipeline/*/history",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "pipeline.contact.add",
"title": "Add contact to pipeline",
"description": "Add a CRM contact to a pipeline.",
"method": "POST",
"path": "/api/pipeline/{contactId}/add",
"permission": "pipeline:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"contactId": {
"type": "string",
"minLength": 1
},
"stageId": {
"type": "string",
"minLength": 1
}
},
"required": [
"contactId",
"stageId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Add contact to pipeline.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"contactId": "example",
"stageId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/pipeline/example/add",
"body": {
"contactId": "example",
"stageId": "example"
}
},
"effects": "May change state through POST /api/pipeline/{contactId}/add. 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/pipeline/*/add",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "pipeline.contact.move",
"title": "Move contact in pipeline",
"description": "Move a CRM contact in a pipeline.",
"method": "PUT",
"path": "/api/pipeline/{contactId}/move",
"permission": "pipeline:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"contactId": {
"type": "string",
"minLength": 1
},
"stageId": {
"type": "string",
"minLength": 1
}
},
"required": [
"contactId",
"stageId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Move contact in pipeline.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"contactId": "example",
"stageId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/pipeline/example/move",
"body": {
"contactId": "example",
"stageId": "example"
}
},
"effects": "May change state through PUT /api/pipeline/{contactId}/move. 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/pipeline/*/move",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "pipeline.contact.remove",
"title": "Remove contact from pipeline",
"description": "Remove a CRM contact from a pipeline.",
"method": "DELETE",
"path": "/api/pipeline/{contactId}/remove",
"permission": "pipeline:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"contactId": {
"type": "string",
"minLength": 1
}
},
"required": [
"contactId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Remove contact from pipeline.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"contactId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/pipeline/example/remove",
"body": null
},
"effects": "May change state through DELETE /api/pipeline/{contactId}/remove. 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/pipeline/*/remove",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "pipeline.stages.update",
"title": "Update pipeline stage",
"description": "Update a CRM pipeline stage.",
"method": "PUT",
"path": "/api/pipeline/stages/{stageId}",
"permission": "pipeline:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"stageId": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string"
},
"color": {
"type": "string"
},
"position": {
"type": "number"
}
},
"required": [
"stageId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update pipeline stage.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"stageId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/pipeline/stages/example",
"body": {
"stageId": "example"
}
},
"effects": "May change state through PUT /api/pipeline/stages/{stageId}. 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/pipeline/stages/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "properties.list",
"title": "List properties",
"description": "List properties.",
"method": "GET",
"path": "/api/properties",
"permission": "properties:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"search": {
"type": "string"
},
"status": {
"type": "string"
},
"property_type": {
"type": "string"
},
"assigned_agent_id": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"country": {
"type": "string"
},
"beds_min": {
"type": "number"
},
"beds_max": {
"type": "number"
},
"baths_min": {
"type": "number"
},
"baths_max": {
"type": "number"
},
"sqft_min": {
"type": "number"
},
"sqft_max": {
"type": "number"
},
"created_after": {
"type": "string"
},
"updated_after": {
"type": "string"
},
"sort_by": {
"type": "string"
},
"sort_order": {
"type": "string"
},
"page": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List properties.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"search": "example",
"status": "example",
"property_type": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/properties",
"body": null
},
"effects": "Reads state through GET /api/properties 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/properties",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "properties.create",
"title": "Create properties",
"description": "Create properties.",
"method": "POST",
"path": "/api/properties",
"permission": "properties:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"property_type": {
"type": "string"
},
"status": {
"type": "string"
},
"address_line1": {
"type": "string"
},
"address_line2": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"postal_code": {
"type": "string"
},
"country": {
"type": "string"
},
"furnishing_status": {
"type": "string"
},
"owner_contact_id": {
"type": "string"
},
"owner_company_id": {
"type": "string"
},
"assigned_agent_id": {
"type": "string"
},
"primary_photo_bytes_asset_id": {
"type": "string"
},
"latitude": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"longitude": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"beds": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"baths": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"sqft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"lot_size": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"year_built": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"parking_spaces": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create properties.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"property_type": "example",
"status": "example",
"address_line1": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/properties",
"body": {
"property_type": "example",
"status": "example",
"address_line1": "example"
}
},
"effects": "May change state through POST /api/properties. 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/properties",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "properties.get",
"title": "Get properties",
"description": "Get one properties record.",
"method": "GET",
"path": "/api/properties/{id}",
"permission": "properties:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get properties.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/properties/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "Reads state through GET /api/properties/{id} 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/properties/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "properties.update",
"title": "Update properties",
"description": "Update one properties record.",
"method": "PUT",
"path": "/api/properties/{id}",
"permission": "properties:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"property_type": {
"type": "string"
},
"status": {
"type": "string"
},
"address_line1": {
"type": "string"
},
"address_line2": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"postal_code": {
"type": "string"
},
"country": {
"type": "string"
},
"furnishing_status": {
"type": "string"
},
"owner_contact_id": {
"type": "string"
},
"owner_company_id": {
"type": "string"
},
"assigned_agent_id": {
"type": "string"
},
"primary_photo_bytes_asset_id": {
"type": "string"
},
"latitude": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"longitude": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"beds": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"baths": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"sqft": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"lot_size": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"year_built": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"parking_spaces": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update properties.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/properties/00000000-0000-4000-8000-000000000000",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through PUT /api/properties/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/properties/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "properties.delete",
"title": "Delete properties",
"description": "Delete one properties record.",
"method": "DELETE",
"path": "/api/properties/{id}",
"permission": "properties:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete properties.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/properties/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "May change state through DELETE /api/properties/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/properties/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "listings.list",
"title": "List listings",
"description": "List listings.",
"method": "GET",
"path": "/api/listings",
"permission": "listings:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"search": {
"type": "string"
},
"property_id": {
"type": "string"
},
"listing_type": {
"type": "string"
},
"internal_status": {
"type": "string"
},
"city": {
"type": "string"
},
"state": {
"type": "string"
},
"country": {
"type": "string"
},
"price_min": {
"type": "number"
},
"price_max": {
"type": "number"
},
"canonical_completeness_min": {
"type": "number"
},
"canonical_completeness_max": {
"type": "number"
},
"created_after": {
"type": "string"
},
"updated_after": {
"type": "string"
},
"page": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List listings.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"search": "example",
"property_id": "00000000-0000-4000-8000-000000000000",
"listing_type": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/listings",
"body": null
},
"effects": "Reads state through GET /api/listings 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/listings",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "listings.create",
"title": "Create listings",
"description": "Create listings.",
"method": "POST",
"path": "/api/listings",
"permission": "listings:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"property_id": {
"type": "string"
},
"listing_type": {
"type": "string"
},
"internal_status": {
"type": "string"
},
"title": {
"type": "string"
},
"currency": {
"type": "string"
},
"permit_number": {
"type": "string"
},
"reference_code": {
"type": "string"
},
"description_short": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"description_long": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"price_amount": {
"type": "number"
},
"availability_date": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create listings.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"property_id": "00000000-0000-4000-8000-000000000000",
"listing_type": "example",
"internal_status": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/listings",
"body": {
"property_id": "00000000-0000-4000-8000-000000000000",
"listing_type": "example",
"internal_status": "example"
}
},
"effects": "May change state through POST /api/listings. 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/listings",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "listings.get",
"title": "Get listings",
"description": "Get one listings record.",
"method": "GET",
"path": "/api/listings/{id}",
"permission": "listings:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get listings.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/listings/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "Reads state through GET /api/listings/{id} 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/listings/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "listings.update",
"title": "Update listings",
"description": "Update one listings record.",
"method": "PUT",
"path": "/api/listings/{id}",
"permission": "listings:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"property_id": {
"type": "string"
},
"listing_type": {
"type": "string"
},
"internal_status": {
"type": "string"
},
"title": {
"type": "string"
},
"currency": {
"type": "string"
},
"permit_number": {
"type": "string"
},
"reference_code": {
"type": "string"
},
"description_short": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"description_long": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"price_amount": {
"type": "number"
},
"availability_date": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update listings.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/listings/00000000-0000-4000-8000-000000000000",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through PUT /api/listings/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/listings/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "listings.delete",
"title": "Delete listings",
"description": "Delete one listings record.",
"method": "DELETE",
"path": "/api/listings/{id}",
"permission": "listings:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete listings.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/listings/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "May change state through DELETE /api/listings/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/listings/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "listings.validate",
"title": "Validate listing",
"description": "Validate a CRM listing.",
"method": "POST",
"path": "/api/listings/{id}/validate",
"permission": "listings:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"property_id": {
"type": "string"
},
"listing_type": {
"type": "string"
},
"internal_status": {
"type": "string"
},
"title": {
"type": "string"
},
"currency": {
"type": "string"
},
"permit_number": {
"type": "string"
},
"reference_code": {
"type": "string"
},
"description_short": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"description_long": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"price_amount": {
"type": "number"
},
"availability_date": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Validate listing.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/listings/00000000-0000-4000-8000-000000000000/validate",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/listings/{id}/validate. 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/listings/*/validate",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "listings.publications.list",
"title": "List listing publications",
"description": "List CRM listing publications.",
"method": "GET",
"path": "/api/listings/{id}/publications",
"permission": "listings:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List listing publications.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/listings/00000000-0000-4000-8000-000000000000/publications",
"body": null
},
"effects": "Reads state through GET /api/listings/{id}/publications 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/listings/*/publications",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_connections.list",
"title": "List portal connections",
"description": "List portal connections.",
"method": "GET",
"path": "/api/portal-connections",
"permission": "portal_connections:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"search": {
"type": "string"
},
"status": {
"type": "string"
},
"portal_key": {
"type": "string"
},
"page": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List portal connections.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"search": "example",
"status": "example",
"portal_key": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/portal-connections",
"body": null
},
"effects": "Reads state through GET /api/portal-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/portal-connections",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_connections.create",
"title": "Create portal connections",
"description": "Create portal connections.",
"method": "POST",
"path": "/api/portal-connections",
"permission": "portal_connections:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"portal_key": {
"type": "string"
},
"account_name": {
"type": "string"
},
"connector_type": {
"type": "string"
},
"auth_type": {
"type": "string"
},
"credentials_ref": {
"type": "string"
},
"market_region": {
"type": "string"
},
"status": {
"type": "string"
},
"connector_config": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create portal connections.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"portal_key": "example",
"account_name": "example",
"connector_type": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/portal-connections",
"body": {
"portal_key": "example",
"account_name": "example",
"connector_type": "example"
}
},
"effects": "May change state through POST /api/portal-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/portal-connections",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_connections.get",
"title": "Get portal connections",
"description": "Get one portal connections record.",
"method": "GET",
"path": "/api/portal-connections/{id}",
"permission": "portal_connections:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get portal connections.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/portal-connections/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "Reads state through GET /api/portal-connections/{id} 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/portal-connections/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_connections.update",
"title": "Update portal connections",
"description": "Update one portal connections record.",
"method": "PUT",
"path": "/api/portal-connections/{id}",
"permission": "portal_connections:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"portal_key": {
"type": "string"
},
"account_name": {
"type": "string"
},
"connector_type": {
"type": "string"
},
"auth_type": {
"type": "string"
},
"credentials_ref": {
"type": "string"
},
"market_region": {
"type": "string"
},
"status": {
"type": "string"
},
"connector_config": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "null"
}
]
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update portal connections.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/portal-connections/00000000-0000-4000-8000-000000000000",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through PUT /api/portal-connections/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/portal-connections/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_connections.delete",
"title": "Delete portal connections",
"description": "Delete one portal connections record.",
"method": "DELETE",
"path": "/api/portal-connections/{id}",
"permission": "portal_connections:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete portal connections.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/portal-connections/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "May change state through DELETE /api/portal-connections/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/portal-connections/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_connections.health_check",
"title": "Run portal connection health check",
"description": "Run a CRM portal connection health check.",
"method": "POST",
"path": "/api/portal-connections/{id}/health-check",
"permission": "portal_connections:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"portal_key": {
"type": "string"
},
"account_name": {
"type": "string"
},
"connector_type": {
"type": "string"
},
"auth_type": {
"type": "string"
},
"credentials_ref": {
"type": "string"
},
"market_region": {
"type": "string"
},
"status": {
"type": "string"
},
"connector_config": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "null"
}
]
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Run portal connection health check.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/portal-connections/00000000-0000-4000-8000-000000000000/health-check",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/portal-connections/{id}/health-check. 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/portal-connections/*/health-check",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_connections.disable",
"title": "Disable portal connection",
"description": "Disable a CRM portal connection.",
"method": "POST",
"path": "/api/portal-connections/{id}/disable",
"permission": "portal_connections:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"portal_key": {
"type": "string"
},
"account_name": {
"type": "string"
},
"connector_type": {
"type": "string"
},
"auth_type": {
"type": "string"
},
"credentials_ref": {
"type": "string"
},
"market_region": {
"type": "string"
},
"status": {
"type": "string"
},
"connector_config": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "null"
}
]
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Disable portal connection.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/portal-connections/00000000-0000-4000-8000-000000000000/disable",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/portal-connections/{id}/disable. 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/portal-connections/*/disable",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_leads.list",
"title": "List portal leads",
"description": "List CRM portal leads.",
"method": "GET",
"path": "/api/portal-leads",
"permission": "portal_leads:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"search": {
"type": "string"
},
"portal_key": {
"type": "string"
},
"ingestion_status": {
"type": "string"
},
"page": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List portal leads.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"search": "example",
"portal_key": "example",
"ingestion_status": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/portal-leads",
"body": null
},
"effects": "Reads state through GET /api/portal-leads 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/portal-leads",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_leads.get",
"title": "Get portal lead",
"description": "Get a CRM portal lead.",
"method": "GET",
"path": "/api/portal-leads/{id}",
"permission": "portal_leads:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get portal lead.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/portal-leads/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "Reads state through GET /api/portal-leads/{id} 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/portal-leads/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_leads.match",
"title": "Match portal lead",
"description": "Match a CRM portal lead.",
"method": "POST",
"path": "/api/portal-leads/{id}/match",
"permission": "portal_leads:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"contact_id": {
"type": "string"
},
"create_if_missing": {
"type": "boolean"
},
"create_deal": {
"type": "boolean"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Match portal lead.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/portal-leads/00000000-0000-4000-8000-000000000000/match",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/portal-leads/{id}/match. 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/portal-leads/*/match",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_leads.create_contact",
"title": "Create contact from portal lead",
"description": "Create a CRM contact from a portal lead.",
"method": "POST",
"path": "/api/portal-leads/{id}/create-contact",
"permission": "portal_leads:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"first": {
"type": "string"
},
"last": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create contact from portal lead.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/portal-leads/00000000-0000-4000-8000-000000000000/create-contact",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/portal-leads/{id}/create-contact. 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/portal-leads/*/create-contact",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_leads.create_deal",
"title": "Create deal from portal lead",
"description": "Create a CRM deal from a portal lead.",
"method": "POST",
"path": "/api/portal-leads/{id}/create-deal",
"permission": "portal_leads:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string"
},
"amount_cents": {
"type": "number"
},
"currency": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create deal from portal lead.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/portal-leads/00000000-0000-4000-8000-000000000000/create-deal",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/portal-leads/{id}/create-deal. 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/portal-leads/*/create-deal",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "lead_routing.rules.list",
"title": "List lead routing rules",
"description": "List CRM lead routing rules.",
"method": "GET",
"path": "/api/lead-routing/rules",
"permission": "portal_leads:read",
"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 lead routing rules.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-crm --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/lead-routing/rules",
"body": null
},
"effects": "Reads state through GET /api/lead-routing/rules without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/lead-routing/rules",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "lead_routing.rules.create",
"title": "Create lead routing rule",
"description": "Create a CRM lead routing rule.",
"method": "POST",
"path": "/api/lead-routing/rules",
"permission": "portal_leads:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"type": "string"
},
"portal_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"assigned_agent_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"fallback_owner_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"auto_create_task": {
"type": "boolean"
},
"task_title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"active": {
"type": "boolean"
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create lead routing rule.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"name": "example",
"portal_key": "example",
"assigned_agent_id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/lead-routing/rules",
"body": {
"name": "example",
"portal_key": "example",
"assigned_agent_id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/lead-routing/rules. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "POST /api/lead-routing/rules",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "lead_routing.rules.update",
"title": "Update lead routing rule",
"description": "Update a CRM lead routing rule.",
"method": "PUT",
"path": "/api/lead-routing/rules/{id}",
"permission": "portal_leads:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string"
},
"portal_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"assigned_agent_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"fallback_owner_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"auto_create_task": {
"type": "boolean"
},
"task_title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"active": {
"type": "boolean"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update lead routing rule.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/lead-routing/rules/00000000-0000-4000-8000-000000000000",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through PUT /api/lead-routing/rules/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/lead-routing/rules/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "tasks.list",
"title": "List tasks",
"description": "List tasks.",
"method": "GET",
"path": "/api/tasks",
"permission": "tasks:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"search": {
"type": "string"
},
"status": {
"type": "string"
},
"priority": {
"type": "string"
},
"entity_type": {
"type": "string"
},
"entity_id": {
"type": "string"
},
"owner_id": {
"type": "string"
},
"page": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List tasks.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"search": "example",
"status": "example",
"priority": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/tasks",
"body": null
},
"effects": "Reads state through GET /api/tasks 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/tasks",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "tasks.create",
"title": "Create tasks",
"description": "Create tasks.",
"method": "POST",
"path": "/api/tasks",
"permission": "tasks:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"status": {
"type": "string"
},
"priority": {
"type": "string"
},
"entity_type": {
"type": "string"
},
"entity_id": {
"type": "string"
},
"owner_id": {
"type": "string"
},
"due_at": {
"type": "string"
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create tasks.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"title": "example",
"description": "example",
"status": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/tasks",
"body": {
"title": "example",
"description": "example",
"status": "example"
}
},
"effects": "May change state through POST /api/tasks. 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/tasks",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "tasks.update",
"title": "Update tasks",
"description": "Update one tasks record.",
"method": "PUT",
"path": "/api/tasks/{id}",
"permission": "tasks:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"title": {
"type": "string"
},
"description": {
"type": "string"
},
"status": {
"type": "string"
},
"priority": {
"type": "string"
},
"entity_type": {
"type": "string"
},
"entity_id": {
"type": "string"
},
"owner_id": {
"type": "string"
},
"due_at": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update tasks.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/tasks/00000000-0000-4000-8000-000000000000",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through PUT /api/tasks/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/tasks/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "tasks.delete",
"title": "Delete tasks",
"description": "Delete one tasks record.",
"method": "DELETE",
"path": "/api/tasks/{id}",
"permission": "tasks:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete tasks.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/tasks/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "May change state through DELETE /api/tasks/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/tasks/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "showings.list",
"title": "List showings",
"description": "List showings.",
"method": "GET",
"path": "/api/showings",
"permission": "showings:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"search": {
"type": "string"
},
"property_id": {
"type": "string"
},
"listing_id": {
"type": "string"
},
"status": {
"type": "string"
},
"assigned_agent_id": {
"type": "string"
},
"page": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List showings.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"search": "example",
"property_id": "00000000-0000-4000-8000-000000000000",
"listing_id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/showings",
"body": null
},
"effects": "Reads state through GET /api/showings 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/showings",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "showings.create",
"title": "Create showings",
"description": "Create showings.",
"method": "POST",
"path": "/api/showings",
"permission": "showings:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"property_id": {
"type": "string"
},
"listing_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"portal_lead_event_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"attendee_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"attendee_email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"attendee_phone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"scheduled_at": {
"type": "number"
},
"duration_minutes": {
"type": "number"
},
"status": {
"type": "string"
},
"outcome": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"assigned_agent_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create showings.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"property_id": "00000000-0000-4000-8000-000000000000",
"listing_id": "00000000-0000-4000-8000-000000000000",
"portal_lead_event_id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/showings",
"body": {
"property_id": "00000000-0000-4000-8000-000000000000",
"listing_id": "00000000-0000-4000-8000-000000000000",
"portal_lead_event_id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/showings. 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/showings",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "showings.get",
"title": "Get showings",
"description": "Get one showings record.",
"method": "GET",
"path": "/api/showings/{id}",
"permission": "showings:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get showings.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/showings/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "Reads state through GET /api/showings/{id} 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/showings/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "showings.update",
"title": "Update showings",
"description": "Update one showings record.",
"method": "PUT",
"path": "/api/showings/{id}",
"permission": "showings:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"property_id": {
"type": "string"
},
"listing_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"portal_lead_event_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"attendee_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"attendee_email": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"attendee_phone": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"scheduled_at": {
"type": "number"
},
"duration_minutes": {
"type": "number"
},
"status": {
"type": "string"
},
"outcome": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"assigned_agent_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update showings.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/showings/00000000-0000-4000-8000-000000000000",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through PUT /api/showings/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/showings/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "showings.delete",
"title": "Delete showings",
"description": "Delete one showings record.",
"method": "DELETE",
"path": "/api/showings/{id}",
"permission": "showings:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete showings.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/showings/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "May change state through DELETE /api/showings/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/showings/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "offers.list",
"title": "List offers",
"description": "List offers.",
"method": "GET",
"path": "/api/offers",
"permission": "offers:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"search": {
"type": "string"
},
"property_id": {
"type": "string"
},
"listing_id": {
"type": "string"
},
"status": {
"type": "string"
},
"contact_id": {
"type": "string"
},
"page": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List offers.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"search": "example",
"property_id": "00000000-0000-4000-8000-000000000000",
"listing_id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/offers",
"body": null
},
"effects": "Reads state through GET /api/offers 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/offers",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "offers.create",
"title": "Create offers",
"description": "Create offers.",
"method": "POST",
"path": "/api/offers",
"permission": "offers:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"property_id": {
"type": "string"
},
"listing_id": {
"type": "string"
},
"contact_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"company_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"amount_cents": {
"type": "number"
},
"currency": {
"type": "string"
},
"status": {
"type": "string"
},
"expiry_at": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"contingencies": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create offers.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"property_id": "00000000-0000-4000-8000-000000000000",
"listing_id": "00000000-0000-4000-8000-000000000000",
"contact_id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/offers",
"body": {
"property_id": "00000000-0000-4000-8000-000000000000",
"listing_id": "00000000-0000-4000-8000-000000000000",
"contact_id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/offers. 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/offers",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "offers.get",
"title": "Get offers",
"description": "Get one offers record.",
"method": "GET",
"path": "/api/offers/{id}",
"permission": "offers:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get offers.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/offers/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "Reads state through GET /api/offers/{id} 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/offers/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "offers.update",
"title": "Update offers",
"description": "Update one offers record.",
"method": "PUT",
"path": "/api/offers/{id}",
"permission": "offers:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"property_id": {
"type": "string"
},
"listing_id": {
"type": "string"
},
"contact_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"company_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"amount_cents": {
"type": "number"
},
"currency": {
"type": "string"
},
"status": {
"type": "string"
},
"expiry_at": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"contingencies": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update offers.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/offers/00000000-0000-4000-8000-000000000000",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through PUT /api/offers/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/offers/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "offers.delete",
"title": "Delete offers",
"description": "Delete one offers record.",
"method": "DELETE",
"path": "/api/offers/{id}",
"permission": "offers:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete offers.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/offers/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "May change state through DELETE /api/offers/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/offers/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "transactions.list",
"title": "List transactions",
"description": "List transactions.",
"method": "GET",
"path": "/api/transactions",
"permission": "transactions:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"search": {
"type": "string"
},
"status": {
"type": "string"
},
"property_id": {
"type": "string"
},
"listing_id": {
"type": "string"
},
"offer_id": {
"type": "string"
},
"page": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List transactions.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"search": "example",
"status": "example",
"property_id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/transactions",
"body": null
},
"effects": "Reads state through GET /api/transactions 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/transactions",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "transactions.create",
"title": "Create transactions",
"description": "Create transactions.",
"method": "POST",
"path": "/api/transactions",
"permission": "transactions:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"property_id": {
"type": "string"
},
"listing_id": {
"type": "string"
},
"offer_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"status": {
"type": "string"
},
"escrow_status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"closing_date": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"assigned_coordinator_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create transactions.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"property_id": "00000000-0000-4000-8000-000000000000",
"listing_id": "00000000-0000-4000-8000-000000000000",
"offer_id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/transactions",
"body": {
"property_id": "00000000-0000-4000-8000-000000000000",
"listing_id": "00000000-0000-4000-8000-000000000000",
"offer_id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/transactions. 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/transactions",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "transactions.get",
"title": "Get transactions",
"description": "Get one transactions record.",
"method": "GET",
"path": "/api/transactions/{id}",
"permission": "transactions:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get transactions.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/transactions/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "Reads state through GET /api/transactions/{id} 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/transactions/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "transactions.update",
"title": "Update transactions",
"description": "Update one transactions record.",
"method": "PUT",
"path": "/api/transactions/{id}",
"permission": "transactions:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"property_id": {
"type": "string"
},
"listing_id": {
"type": "string"
},
"offer_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"title": {
"type": "string"
},
"status": {
"type": "string"
},
"escrow_status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"closing_date": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"assigned_coordinator_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update transactions.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/transactions/00000000-0000-4000-8000-000000000000",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through PUT /api/transactions/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/transactions/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "transactions.delete",
"title": "Delete transactions",
"description": "Delete one transactions record.",
"method": "DELETE",
"path": "/api/transactions/{id}",
"permission": "transactions:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete transactions.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/transactions/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "May change state through DELETE /api/transactions/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/transactions/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "transactions.milestones.create",
"title": "Create transaction milestone",
"description": "Create a CRM transaction milestone.",
"method": "POST",
"path": "/api/transactions/{id}/milestones",
"permission": "transactions:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"title": {
"type": "string"
},
"status": {
"type": "string"
},
"due_at": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"sort_order": {
"type": "number"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create transaction milestone.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/transactions/00000000-0000-4000-8000-000000000000/milestones",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/transactions/{id}/milestones. 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/transactions/*/milestones",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "transactions.milestones.update",
"title": "Update transaction milestone",
"description": "Update a CRM transaction milestone.",
"method": "PUT",
"path": "/api/transactions/{transactionId}/milestones/{milestoneId}",
"permission": "transactions:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"transactionId": {
"type": "string",
"minLength": 1
},
"milestoneId": {
"type": "string",
"minLength": 1
},
"title": {
"type": "string"
},
"status": {
"type": "string"
},
"due_at": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"sort_order": {
"type": "number"
}
},
"required": [
"transactionId",
"milestoneId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update transaction milestone.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"transactionId": "example",
"milestoneId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/transactions/example/milestones/example",
"body": {
"transactionId": "example",
"milestoneId": "example"
}
},
"effects": "May change state through PUT /api/transactions/{transactionId}/milestones/{milestoneId}. 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/transactions/*/milestones/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "transactions.checklist.create",
"title": "Create transaction checklist item",
"description": "Create a CRM transaction checklist item.",
"method": "POST",
"path": "/api/transactions/{id}/checklist",
"permission": "transactions:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"title": {
"type": "string"
},
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"required": {
"type": "boolean"
},
"status": {
"type": "string"
},
"notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create transaction checklist item.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/transactions/00000000-0000-4000-8000-000000000000/checklist",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/transactions/{id}/checklist. 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/transactions/*/checklist",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "transactions.checklist.update",
"title": "Update transaction checklist item",
"description": "Update a CRM transaction checklist item.",
"method": "PUT",
"path": "/api/transactions/{transactionId}/checklist/{itemId}",
"permission": "transactions:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"transactionId": {
"type": "string",
"minLength": 1
},
"itemId": {
"type": "string",
"minLength": 1
},
"title": {
"type": "string"
},
"category": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"required": {
"type": "boolean"
},
"status": {
"type": "string"
},
"notes": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"due_at": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"transactionId",
"itemId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update transaction checklist item.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"transactionId": "example",
"itemId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/transactions/example/checklist/example",
"body": {
"transactionId": "example",
"itemId": "example"
}
},
"effects": "May change state through PUT /api/transactions/{transactionId}/checklist/{itemId}. 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/transactions/*/checklist/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "transactions.documents.create",
"title": "Create transaction document",
"description": "Create a CRM transaction document.",
"method": "POST",
"path": "/api/transactions/{id}/documents",
"permission": "documents:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"title": {
"type": "string"
},
"url": {
"type": "string"
},
"document_type": {
"type": "string"
},
"status": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create transaction document.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/transactions/00000000-0000-4000-8000-000000000000/documents",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/transactions/{id}/documents. 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/transactions/*/documents",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "transactions.documents.get",
"title": "Get transaction document",
"description": "Get a CRM transaction document.",
"method": "GET",
"path": "/api/transactions/{transactionId}/documents/{documentId}",
"permission": "documents:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"transactionId": {
"type": "string",
"minLength": 1
},
"documentId": {
"type": "string",
"minLength": 1
}
},
"required": [
"transactionId",
"documentId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get transaction document.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"transactionId": "example",
"documentId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/transactions/example/documents/example",
"body": null
},
"effects": "Reads state through GET /api/transactions/{transactionId}/documents/{documentId} 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/transactions/*/documents/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "transactions.documents.delete",
"title": "Delete transaction document",
"description": "Delete a CRM transaction document.",
"method": "DELETE",
"path": "/api/transactions/{transactionId}/documents/{documentId}",
"permission": "documents:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"transactionId": {
"type": "string",
"minLength": 1
},
"documentId": {
"type": "string",
"minLength": 1
}
},
"required": [
"transactionId",
"documentId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete transaction document.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"transactionId": "example",
"documentId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/transactions/example/documents/example",
"body": null
},
"effects": "May change state through DELETE /api/transactions/{transactionId}/documents/{documentId}. 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/transactions/*/documents/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "commissions.list",
"title": "List commissions",
"description": "List commissions.",
"method": "GET",
"path": "/api/commissions",
"permission": "commissions:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"transaction_id": {
"type": "string"
},
"status": {
"type": "string"
},
"page": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List commissions.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"transaction_id": "00000000-0000-4000-8000-000000000000",
"status": "example",
"page": 1
},
"cli_example": [
"topolo actions --service topolo-crm --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/commissions",
"body": null
},
"effects": "Reads state through GET /api/commissions 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/commissions",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "commissions.create",
"title": "Create commissions",
"description": "Create commissions.",
"method": "POST",
"path": "/api/commissions",
"permission": "commissions:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"transaction_id": {
"type": "string"
},
"recipient_type": {
"type": "string"
},
"recipient_id": {
"type": "string"
},
"recipient_name": {
"type": "string"
},
"status": {
"type": "string"
},
"split_bps": {
"type": "number"
},
"amount_cents": {
"type": "number"
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create commissions.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"transaction_id": "00000000-0000-4000-8000-000000000000",
"recipient_type": "example",
"recipient_id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/commissions",
"body": {
"transaction_id": "00000000-0000-4000-8000-000000000000",
"recipient_type": "example",
"recipient_id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/commissions. 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/commissions",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "commissions.update",
"title": "Update commissions",
"description": "Update one commissions record.",
"method": "PUT",
"path": "/api/commissions/{id}",
"permission": "commissions:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"transaction_id": {
"type": "string"
},
"recipient_type": {
"type": "string"
},
"recipient_id": {
"type": "string"
},
"recipient_name": {
"type": "string"
},
"status": {
"type": "string"
},
"split_bps": {
"type": "number"
},
"amount_cents": {
"type": "number"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update commissions.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/commissions/00000000-0000-4000-8000-000000000000",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through PUT /api/commissions/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/commissions/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "commissions.delete",
"title": "Delete commissions",
"description": "Delete one commissions record.",
"method": "DELETE",
"path": "/api/commissions/{id}",
"permission": "commissions:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete commissions.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/commissions/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "May change state through DELETE /api/commissions/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/commissions/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "notes.list",
"title": "List contact notes",
"description": "List CRM contact notes.",
"method": "GET",
"path": "/api/contacts/{id}/notes",
"permission": "notes:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"page": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List contact notes.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/contacts/00000000-0000-4000-8000-000000000000/notes",
"body": null
},
"effects": "Reads state through GET /api/contacts/{id}/notes 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/contacts/*/notes",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "notes.create",
"title": "Create contact note",
"description": "Create a CRM contact note.",
"method": "POST",
"path": "/api/contacts/{id}/notes",
"permission": "notes:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string"
},
"text": {
"type": "string"
},
"category": {
"type": "string"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create contact note.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/contacts/00000000-0000-4000-8000-000000000000/notes",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/contacts/{id}/notes. 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/contacts/*/notes",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "notes.get",
"title": "Get contact note",
"description": "Get a CRM contact note.",
"method": "GET",
"path": "/api/contacts/{contactId}/notes/{noteId}",
"permission": "notes:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"contactId": {
"type": "string",
"minLength": 1
},
"noteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"contactId",
"noteId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get contact note.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"contactId": "example",
"noteId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/contacts/example/notes/example",
"body": null
},
"effects": "Reads state through GET /api/contacts/{contactId}/notes/{noteId} 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/contacts/*/notes/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "notes.update",
"title": "Update contact note",
"description": "Update a CRM contact note.",
"method": "PUT",
"path": "/api/contacts/{contactId}/notes/{noteId}",
"permission": "notes:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"contactId": {
"type": "string",
"minLength": 1
},
"noteId": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string"
},
"text": {
"type": "string"
},
"category": {
"type": "string"
}
},
"required": [
"contactId",
"noteId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update contact note.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"contactId": "example",
"noteId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/contacts/example/notes/example",
"body": {
"contactId": "example",
"noteId": "example"
}
},
"effects": "May change state through PUT /api/contacts/{contactId}/notes/{noteId}. 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/contacts/*/notes/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "notes.delete",
"title": "Delete contact note",
"description": "Delete a CRM contact note.",
"method": "DELETE",
"path": "/api/contacts/{contactId}/notes/{noteId}",
"permission": "notes:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"contactId": {
"type": "string",
"minLength": 1
},
"noteId": {
"type": "string",
"minLength": 1
}
},
"required": [
"contactId",
"noteId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete contact note.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"contactId": "example",
"noteId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/contacts/example/notes/example",
"body": null
},
"effects": "May change state through DELETE /api/contacts/{contactId}/notes/{noteId}. 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/contacts/*/notes/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "attachments.create",
"title": "Create contact attachment",
"description": "Create a CRM contact attachment.",
"method": "POST",
"path": "/api/contacts/{id}/attachments",
"permission": "attachments:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"contentBase64": {
"type": "string"
},
"contentType": {
"type": "string"
},
"fileName": {
"type": "string"
},
"media_role": {
"type": "string"
},
"set_primary": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "string"
}
]
}
},
"required": [
"id",
"contentBase64",
"contentType",
"fileName"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create contact attachment.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"agentContract": {
"upload": {
"profile": "inline-base64",
"contentField": "contentBase64",
"contentTypeField": "contentType",
"fileNameField": "fileName",
"maxBytes": 10485760,
"acceptedContentTypes": [
"*/*"
]
}
},
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000",
"contentBase64": "example",
"contentType": "example",
"fileName": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/contacts/00000000-0000-4000-8000-000000000000/attachments",
"body": {
"id": "00000000-0000-4000-8000-000000000000",
"contentBase64": "example",
"contentType": "example",
"fileName": "example"
}
},
"effects": "May change state through POST /api/contacts/{id}/attachments. 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/contacts/*/attachments",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "attachments.list",
"title": "List contact attachments",
"description": "List CRM contact attachments.",
"method": "GET",
"path": "/api/contacts/{id}/attachments",
"permission": "attachments:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List contact attachments.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/contacts/00000000-0000-4000-8000-000000000000/attachments",
"body": null
},
"effects": "Reads state through GET /api/contacts/{id}/attachments 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/contacts/*/attachments",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "attachments.get",
"title": "Get attachment",
"description": "Get a CRM attachment.",
"method": "GET",
"path": "/api/attachments/{id}",
"permission": "attachments:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get attachment.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/attachments/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "Reads state through GET /api/attachments/{id} 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/attachments/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "attachments.delete",
"title": "Delete attachment",
"description": "Delete a CRM attachment.",
"method": "DELETE",
"path": "/api/attachments/{id}",
"permission": "attachments:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete attachment.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/attachments/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "May change state through DELETE /api/attachments/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/attachments/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "dashboard.real_estate.get",
"title": "Get real estate dashboard",
"description": "Get CRM real estate dashboard.",
"method": "GET",
"path": "/api/dashboard/real-estate",
"permission": "reports:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"scope": {
"type": "string"
},
"window_days": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get real estate dashboard.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"scope": "example",
"window_days": 1
},
"cli_example": [
"topolo actions --service topolo-crm --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/dashboard/real-estate",
"body": null
},
"effects": "Reads state through GET /api/dashboard/real-estate 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/dashboard/real-estate",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "dashboard.core.get",
"title": "Get core dashboard",
"description": "Get CRM core dashboard.",
"method": "GET",
"path": "/api/dashboard/core",
"permission": "reports:read",
"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 core dashboard.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-crm --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/dashboard/core",
"body": null
},
"effects": "Reads state through GET /api/dashboard/core 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/dashboard/core",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "saved_views.list",
"title": "List saved views",
"description": "List saved views.",
"method": "GET",
"path": "/api/saved-views",
"permission": "settings:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"module_key": {
"type": "string"
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List saved views.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"module_key": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/saved-views",
"body": null
},
"effects": "Reads state through GET /api/saved-views 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/saved-views",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "saved_views.create",
"title": "Create saved views",
"description": "Create saved views.",
"method": "POST",
"path": "/api/saved-views",
"permission": "settings:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": {
"type": "string"
},
"module_key": {
"type": "string"
},
"required": {
"type": "boolean"
},
"config": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create saved views.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"name": "example",
"module_key": "example",
"required": true
},
"cli_example": [
"topolo actions --service topolo-crm --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/saved-views",
"body": {
"name": "example",
"module_key": "example",
"required": true
}
},
"effects": "May change state through POST /api/saved-views. 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/saved-views",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "saved_views.update",
"title": "Update saved views",
"description": "Update one saved views record.",
"method": "PUT",
"path": "/api/saved-views/{id}",
"permission": "settings:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string"
},
"module_key": {
"type": "string"
},
"required": {
"type": "boolean"
},
"config": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update saved views.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/saved-views/00000000-0000-4000-8000-000000000000",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through PUT /api/saved-views/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "PUT /api/saved-views/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "saved_views.delete",
"title": "Delete saved views",
"description": "Delete one saved views record.",
"method": "DELETE",
"path": "/api/saved-views/{id}",
"permission": "settings:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete saved views.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/saved-views/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "May change state through DELETE /api/saved-views/{id}. Inspect the plan and honor the published confirmation policy.",
"verification": [
"Check the structured action result.",
"Read the affected resource back through the corresponding get or list action."
],
"recovery": [
"Do not retry an ambiguous mutation until a read confirms whether it applied.",
"Use a published inverse, update, archive, or delete action only after inspecting its contract."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "DELETE /api/saved-views/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "settings.org.get",
"title": "Get organization settings",
"description": "Get CRM organization settings.",
"method": "GET",
"path": "/api/settings/org",
"permission": "settings:read",
"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 organization settings.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-crm --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/settings/org",
"body": null
},
"effects": "Reads state through GET /api/settings/org 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/settings/org",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "settings.org.update",
"title": "Update organization settings",
"description": "Update CRM organization settings.",
"method": "PUT",
"path": "/api/settings/org",
"permission": "settings:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"module_settings": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"role_defaults": {
"type": "array",
"items": {
"type": "object",
"properties": {
"role_key": {
"type": "string"
},
"landing_path": {
"type": "string"
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Update organization settings.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"module_settings": {},
"role_defaults": [
{
"role_key": "example",
"landing_path": "example"
}
]
},
"cli_example": [
"topolo actions --service topolo-crm --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/settings/org",
"body": {
"module_settings": {},
"role_defaults": [
{
"role_key": "example",
"landing_path": "example"
}
]
}
},
"effects": "May change state through PUT /api/settings/org. 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/settings/org",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "search.run",
"title": "Search CRM",
"description": "Run CRM search.",
"method": "GET",
"path": "/api/search",
"permission": "search:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"q": {
"type": "string"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Search CRM.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"q": "example",
"limit": 1
},
"cli_example": [
"topolo actions --service topolo-crm --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/search",
"body": null
},
"effects": "Reads state through GET /api/search 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/search",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "import_export.preview",
"title": "Preview import",
"description": "Preview a CRM import.",
"method": "POST",
"path": "/api/import-export/preview",
"permission": "contacts:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"csvData": {
"type": "string"
},
"delimiter": {
"type": "string"
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Preview import.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"csvData": "example",
"delimiter": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/import-export/preview",
"body": {
"csvData": "example",
"delimiter": "example"
}
},
"effects": "May change state through POST /api/import-export/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/import-export/preview",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "import_export.execute",
"title": "Execute import",
"description": "Execute a CRM import.",
"method": "POST",
"path": "/api/import-export/execute",
"permission": "contacts:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"csvData": {
"type": "string"
},
"columnMapping": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"delimiter": {
"type": "string"
},
"createCompanies": {
"type": "boolean"
},
"fileName": {
"type": "string"
},
"storeSourceRows": {
"type": "boolean"
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Execute import.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"csvData": "example",
"columnMapping": {},
"delimiter": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/import-export/execute",
"body": {
"csvData": "example",
"columnMapping": {},
"delimiter": "example"
}
},
"effects": "May change state through POST /api/import-export/execute. 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/import-export/execute",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "import_export.template.get",
"title": "Get import template",
"description": "Get a CRM import template.",
"method": "GET",
"path": "/api/import-export/template",
"permission": "contacts:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"module_key": {
"type": "string"
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get import template.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"module_key": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/import-export/template",
"body": null
},
"effects": "Reads state through GET /api/import-export/template 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/import-export/template",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "import_export.bulk",
"title": "Run bulk import",
"description": "Run a CRM bulk import.",
"method": "POST",
"path": "/api/import-export/bulk",
"permission": "contacts:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"contacts": {
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"companies": {
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"notes": {
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Run bulk import.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"contacts": [
{}
],
"companies": [
{}
],
"notes": [
{}
]
},
"cli_example": [
"topolo actions --service topolo-crm --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/import-export/bulk",
"body": {
"contacts": [
{}
],
"companies": [
{}
],
"notes": [
{}
]
}
},
"effects": "May change state through POST /api/import-export/bulk. 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/import-export/bulk",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "import_export.export",
"title": "Export CRM data",
"description": "Export CRM data.",
"method": "GET",
"path": "/api/import-export/export",
"permission": "contacts:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"includeDeleted": {
"type": "boolean"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Export CRM data.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"includeDeleted": true,
"limit": 1
},
"cli_example": [
"topolo actions --service topolo-crm --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/import-export/export",
"body": null
},
"effects": "Reads state through GET /api/import-export/export without a declared mutation.",
"verification": [
"Check the structured action result and pagination or resource identifiers before using it downstream."
],
"recovery": [
"Correct identity, resource context, permission, or input validation failures, then retry the read."
],
"docs_url": null,
"resource": null,
"next_action_ids": [],
"rollback_action_id": null
},
"implementation": {
"status": "implemented",
"route_key": "GET /api/import-export/export",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_sync.listing.publish",
"title": "Publish listing",
"description": "Publish a CRM listing.",
"method": "POST",
"path": "/api/listings/{id}/publish",
"permission": "portal_sync:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"portal_connection_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"force_refresh": {
"type": "boolean"
},
"dry_run": {
"type": "boolean"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Publish listing.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/listings/00000000-0000-4000-8000-000000000000/publish",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/listings/{id}/publish. 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/listings/*/publish",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_sync.listing.unpublish",
"title": "Unpublish listing",
"description": "Unpublish a CRM listing.",
"method": "POST",
"path": "/api/listings/{id}/unpublish",
"permission": "portal_sync:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"portal_connection_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"force_refresh": {
"type": "boolean"
},
"dry_run": {
"type": "boolean"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Unpublish listing.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/listings/00000000-0000-4000-8000-000000000000/unpublish",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/listings/{id}/unpublish. 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/listings/*/unpublish",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_sync.listing.refresh",
"title": "Refresh listing sync",
"description": "Refresh CRM listing sync.",
"method": "POST",
"path": "/api/listings/{id}/refresh",
"permission": "portal_sync:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"portal_connection_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"force_refresh": {
"type": "boolean"
},
"dry_run": {
"type": "boolean"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Refresh listing sync.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/listings/00000000-0000-4000-8000-000000000000/refresh",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/listings/{id}/refresh. 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/listings/*/refresh",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_sync.listing.retry",
"title": "Retry listing sync",
"description": "Retry CRM listing sync.",
"method": "POST",
"path": "/api/listings/{id}/retry-sync",
"permission": "portal_sync:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"portal_connection_ids": {
"type": "array",
"items": {
"type": "string"
}
},
"force_refresh": {
"type": "boolean"
},
"dry_run": {
"type": "boolean"
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Retry listing sync.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/listings/00000000-0000-4000-8000-000000000000/retry-sync",
"body": {
"id": "00000000-0000-4000-8000-000000000000"
}
},
"effects": "May change state through POST /api/listings/{id}/retry-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/listings/*/retry-sync",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_sync.jobs.list",
"title": "List listing sync jobs",
"description": "List CRM listing sync jobs.",
"method": "GET",
"path": "/api/listings/{id}/sync-jobs",
"permission": "portal_sync:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List listing sync jobs.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/listings/00000000-0000-4000-8000-000000000000/sync-jobs",
"body": null
},
"effects": "Reads state through GET /api/listings/{id}/sync-jobs 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/listings/*/sync-jobs",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_sync.publications.get",
"title": "Get portal publication",
"description": "Get a CRM portal publication.",
"method": "GET",
"path": "/api/publications/{id}",
"permission": "portal_sync:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get portal publication.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/publications/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "Reads state through GET /api/publications/{id} 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/publications/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "portal_sync.publication_jobs.list",
"title": "List publication sync jobs",
"description": "List CRM publication sync jobs.",
"method": "GET",
"path": "/api/publications/{id}/sync-jobs",
"permission": "portal_sync:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List publication sync jobs.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/publications/00000000-0000-4000-8000-000000000000/sync-jobs",
"body": null
},
"effects": "Reads state through GET /api/publications/{id}/sync-jobs 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/publications/*/sync-jobs",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "real_estate_media.properties.list",
"title": "List property media",
"description": "List CRM property media.",
"method": "GET",
"path": "/api/properties/{id}/media",
"permission": "properties:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List property media.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/properties/00000000-0000-4000-8000-000000000000/media",
"body": null
},
"effects": "Reads state through GET /api/properties/{id}/media 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/properties/*/media",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "real_estate_media.properties.create",
"title": "Create property media",
"description": "Create CRM property media.",
"method": "POST",
"path": "/api/properties/{id}/media",
"permission": "properties:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"contentBase64": {
"type": "string"
},
"contentType": {
"type": "string"
},
"fileName": {
"type": "string"
},
"media_role": {
"type": "string"
},
"set_primary": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "string"
}
]
}
},
"required": [
"id",
"contentBase64",
"contentType",
"fileName"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create property media.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"agentContract": {
"upload": {
"profile": "inline-base64",
"contentField": "contentBase64",
"contentTypeField": "contentType",
"fileNameField": "fileName",
"maxBytes": 26214400,
"acceptedContentTypes": [
"image/*",
"video/*"
]
}
},
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000",
"contentBase64": "example",
"contentType": "example",
"fileName": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/properties/00000000-0000-4000-8000-000000000000/media",
"body": {
"id": "00000000-0000-4000-8000-000000000000",
"contentBase64": "example",
"contentType": "example",
"fileName": "example"
}
},
"effects": "May change state through POST /api/properties/{id}/media. 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/properties/*/media",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "real_estate_media.properties.set_primary",
"title": "Set primary property media",
"description": "Set primary CRM property media.",
"method": "POST",
"path": "/api/properties/{propertyId}/media/{mediaId}/primary",
"permission": "properties:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"propertyId": {
"type": "string",
"minLength": 1
},
"mediaId": {
"type": "string",
"minLength": 1
}
},
"required": [
"propertyId",
"mediaId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Set primary property media.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"propertyId": "example",
"mediaId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/properties/example/media/example/primary",
"body": {
"propertyId": "example",
"mediaId": "example"
}
},
"effects": "May change state through POST /api/properties/{propertyId}/media/{mediaId}/primary. 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/properties/*/media/*/primary",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "real_estate_media.properties.delete",
"title": "Delete property media",
"description": "Delete CRM property media.",
"method": "DELETE",
"path": "/api/properties/{propertyId}/media/{mediaId}",
"permission": "properties:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"propertyId": {
"type": "string",
"minLength": 1
},
"mediaId": {
"type": "string",
"minLength": 1
}
},
"required": [
"propertyId",
"mediaId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete property media.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"propertyId": "example",
"mediaId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/properties/example/media/example",
"body": null
},
"effects": "May change state through DELETE /api/properties/{propertyId}/media/{mediaId}. 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/properties/*/media/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "real_estate_media.listings.list",
"title": "List listing media",
"description": "List CRM listing media.",
"method": "GET",
"path": "/api/listings/{id}/media",
"permission": "listings:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by List listing media.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/listings/00000000-0000-4000-8000-000000000000/media",
"body": null
},
"effects": "Reads state through GET /api/listings/{id}/media 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/listings/*/media",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "real_estate_media.listings.create",
"title": "Create listing media",
"description": "Create CRM listing media.",
"method": "POST",
"path": "/api/listings/{id}/media",
"permission": "listings:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
},
"contentBase64": {
"type": "string"
},
"contentType": {
"type": "string"
},
"fileName": {
"type": "string"
},
"media_role": {
"type": "string"
},
"set_primary": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "string"
}
]
}
},
"required": [
"id",
"contentBase64",
"contentType",
"fileName"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Create listing media.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"agentContract": {
"upload": {
"profile": "inline-base64",
"contentField": "contentBase64",
"contentTypeField": "contentType",
"fileNameField": "fileName",
"maxBytes": 26214400,
"acceptedContentTypes": [
"image/*",
"video/*"
]
}
},
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000",
"contentBase64": "example",
"contentType": "example",
"fileName": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/listings/00000000-0000-4000-8000-000000000000/media",
"body": {
"id": "00000000-0000-4000-8000-000000000000",
"contentBase64": "example",
"contentType": "example",
"fileName": "example"
}
},
"effects": "May change state through POST /api/listings/{id}/media. 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/listings/*/media",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "real_estate_media.listings.set_primary",
"title": "Set primary listing media",
"description": "Set primary CRM listing media.",
"method": "POST",
"path": "/api/listings/{listingId}/media/{mediaId}/primary",
"permission": "listings:write",
"requiresConfirmation": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"listingId": {
"type": "string",
"minLength": 1
},
"mediaId": {
"type": "string",
"minLength": 1
}
},
"required": [
"listingId",
"mediaId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Set primary listing media.",
"additionalProperties": true
},
"readOnly": false,
"destructive": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"listingId": "example",
"mediaId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/listings/example/media/example/primary",
"body": {
"listingId": "example",
"mediaId": "example"
}
},
"effects": "May change state through POST /api/listings/{listingId}/media/{mediaId}/primary. 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/listings/*/media/*/primary",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "real_estate_media.listings.delete",
"title": "Delete listing media",
"description": "Delete CRM listing media.",
"method": "DELETE",
"path": "/api/listings/{listingId}/media/{mediaId}",
"permission": "listings:write",
"requiresConfirmation": true,
"destructive": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"listingId": {
"type": "string",
"minLength": 1
},
"mediaId": {
"type": "string",
"minLength": 1
}
},
"required": [
"listingId",
"mediaId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Delete listing media.",
"additionalProperties": true
},
"readOnly": false,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"listingId": "example",
"mediaId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/listings/example/media/example",
"body": null
},
"effects": "May change state through DELETE /api/listings/{listingId}/media/{mediaId}. 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/listings/*/media/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "real_estate_media.get",
"title": "Get real estate media",
"description": "Get CRM real estate media.",
"method": "GET",
"path": "/api/real-estate-media/{id}",
"permission": "attachments:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1
}
},
"required": [
"id"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Get real estate media.",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/real-estate-media/00000000-0000-4000-8000-000000000000",
"body": null
},
"effects": "Reads state through GET /api/real-estate-media/{id} 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/real-estate-media/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "organizations.data.export",
"title": "Export CRM organization data",
"description": "Export CRM-owned organization data across all workspaces and storage concerns with credentials redacted and binary objects represented by metadata.",
"method": "GET",
"path": "/api/organizations/{organizationId}/data",
"permission": "privacy:read",
"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",
"authorizationMode": "static",
"documentation": {
"example_input": {
"organizationId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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 CRM organization data",
"description": "Erase CRM-owned organization data after active business work is closed and exact ERASE confirmation is supplied.",
"method": "DELETE",
"path": "/api/organizations/{organizationId}/data",
"permission": "privacy:write",
"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",
"authorizationMode": "static",
"documentation": {
"example_input": {
"organizationId": "example",
"confirmation": "ERASE"
},
"cli_example": [
"topolo actions --service topolo-crm --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."
}
},
{
"name": "widget.get",
"title": "Get CRM widget",
"description": "Get CRM workspace summary widgets.",
"method": "GET",
"path": "/api/widget",
"permission": "contacts:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {},
"cli_example": [
"topolo actions --service topolo-crm --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": "workspaces.archive",
"title": "Archive CRM workspace",
"description": "Confirm a CRM workspace holds no records, then ask the platform to archive it. The workspace record itself belongs to Auth.",
"target": "api",
"outputSchema": {
"type": "object",
"description": "Response returned by Archive CRM workspace.",
"additionalProperties": true
},
"method": "DELETE",
"path": "/api/crm/workspaces/{workspaceId}",
"permission": "workspace:delete",
"authorizationMode": "static",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"workspaceId": {
"type": "string",
"minLength": 1
}
},
"required": [
"workspaceId"
],
"additionalProperties": false
},
"readOnly": false,
"destructive": true,
"requiresConfirmation": true,
"agentAccess": "confirm",
"documentation": {
"example_input": {
"workspaceId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/crm/workspaces/example",
"body": null
},
"effects": "May change state through DELETE /api/crm/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/crm/workspaces/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "tickets.list",
"title": "List tickets",
"description": "List CRM tickets for the selected workspace.",
"method": "GET",
"path": "/api/tickets",
"permission": "contacts:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"status": {
"type": "string"
},
"assignee_id": {
"type": "string"
},
"contact_id": {
"type": "string"
},
"company_id": {
"type": "string"
},
"source": {
"type": "string"
},
"external_thread_id": {
"type": "string"
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 200
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"status": "example",
"assignee_id": "00000000-0000-4000-8000-000000000000",
"contact_id": "00000000-0000-4000-8000-000000000000"
},
"cli_example": [
"topolo actions --service topolo-crm --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/tickets",
"body": null
},
"effects": "Reads state through GET /api/tickets 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/tickets",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "tickets.get",
"title": "Get ticket",
"description": "Get a CRM ticket and its messages.",
"method": "GET",
"path": "/api/tickets/{ticketId}",
"permission": "contacts:read",
"readOnly": true,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"ticketId": {
"type": "string",
"minLength": 1
}
},
"required": [
"ticketId"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": false,
"agentAccess": "auto",
"authorizationMode": "static",
"documentation": {
"example_input": {
"ticketId": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/tickets/example",
"body": null
},
"effects": "Reads state through GET /api/tickets/{ticketId} 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/tickets/*",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "tickets.create",
"title": "Create ticket",
"description": "Create a CRM ticket with an optional initial message.",
"method": "POST",
"path": "/api/tickets",
"permission": "contacts:write",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"subject": {
"type": "string",
"minLength": 1
},
"status": {
"type": "string"
},
"priority": {
"type": "string"
},
"contact_id": {
"type": "string"
},
"company_id": {
"type": "string"
},
"assignee_id": {
"type": "string"
},
"source": {
"type": "string"
},
"external_thread_id": {
"type": "string"
},
"message": {
"type": "object",
"properties": {
"body": {
"type": "string",
"minLength": 1
},
"direction": {
"type": "string"
},
"sender": {
"type": "string"
},
"recipients": {
"type": "string"
},
"message_id": {
"type": "string"
},
"in_reply_to": {
"type": "string"
}
},
"required": [
"body"
],
"additionalProperties": false
}
},
"required": [
"subject"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"subject": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/tickets",
"body": {
"subject": "example"
}
},
"effects": "May change state through POST /api/tickets. 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/tickets",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "tickets.messages.create",
"title": "Add ticket message",
"description": "Add a message to a CRM ticket.",
"method": "POST",
"path": "/api/tickets/{ticketId}/messages",
"permission": "contacts:write",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"ticketId": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string",
"minLength": 1
},
"direction": {
"type": "string"
},
"sender": {
"type": "string"
},
"recipients": {
"type": "string"
},
"message_id": {
"type": "string"
},
"in_reply_to": {
"type": "string"
}
},
"required": [
"ticketId",
"body"
],
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"ticketId": "example",
"body": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/tickets/example/messages",
"body": {
"ticketId": "example",
"body": "example"
}
},
"effects": "May change state through POST /api/tickets/{ticketId}/messages. 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/tickets/*/messages",
"evidence": "Matched to a served route extracted from canonical staging source."
}
},
{
"name": "tickets.email.ingest",
"title": "Ingest ticket email",
"description": "Ingest an authenticated email event into CRM tickets.",
"method": "POST",
"path": "/api/tickets/ingest-email",
"permission": "contacts:write",
"readOnly": false,
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"from": {
"type": "string"
},
"to": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
]
},
"subject": {
"type": "string"
},
"body": {
"type": "string"
},
"messageId": {
"type": "string"
},
"inReplyTo": {
"type": "string"
}
},
"additionalProperties": false
},
"target": "api",
"outputSchema": {
"type": "object",
"additionalProperties": true
},
"destructive": false,
"requiresConfirmation": true,
"agentAccess": "confirm",
"authorizationMode": "static",
"documentation": {
"example_input": {
"from": "example",
"to": "example",
"subject": "example"
},
"cli_example": [
"topolo actions --service topolo-crm --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/tickets/ingest-email",
"body": {
"from": "example",
"to": "example",
"subject": "example"
}
},
"effects": "May change state through POST /api/tickets/ingest-email. 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/tickets/ingest-email",
"evidence": "Matched to a served route extracted from canonical staging source."
}
}
],
"action_coverage": {
"status": "ok",
"served_routes": 150,
"matched_actions": 134,
"declared_unserved_actions": [],
"coverage_excluded_actions": [],
"uncatalogued_routes": [
{
"key": "* /api/*",
"method": "*",
"path": "/api/{segment1}",
"source": "apps/api/index.ts",
"target": "api"
},
{
"key": "* /docs/*",
"method": "*",
"path": "/docs/{segment1}",
"source": "apps/api/index.ts",
"target": "api"
}
],
"ignored_routes": 14,
"configured_exclusions": 9,
"configuration_findings": [],
"notes": [
"1 manually-declared route(s)"
]
},
"runtime_contract_audit": {
"status": "verified",
"actions": 134,
"contracts": 134,
"contract_module": "topolo.action-contracts.mjs",
"validator_sources": [
"apps/api/index.ts"
],
"authorization_sources": [
"apps/api/index.ts"
],
"findings": []
}
}
],
"mobile_contracts": [
{
"source_path": "apps/TopoloCRM/topolo.mobile-experience.json",
"contract": {
"version": "2026-06-29",
"status": "approved",
"mode": "native_capability",
"appId": "app_topolo_crm",
"localizationNamespace": "crm",
"permissions": [
"crm.contacts.read",
"crm.contacts.write",
"crm.companies.read",
"crm.companies.write",
"crm.activities.read"
],
"offlinePolicy": "read_through_cache",
"fallbackPath": "/contacts",
"auth": {
"audience": "topolo-crm",
"scopes": [
"crm.contacts:read",
"crm.contacts:write",
"crm.companies:read",
"crm.companies:write",
"crm.activities:read"
]
},
"routes": [
{
"path": "/contacts",
"apiPath": "/api/contacts",
"title": "Contacts",
"titleKey": "crm.mobile.routes.contacts.title",
"template": "record.list",
"dataSource": "crm.contacts.list",
"detailRoute": "/contacts/:id",
"actions": [
{
"id": "crm.contacts.create",
"title": "Create contact",
"titleKey": "crm.mobile.actions.createContact.title",
"type": "record.create",
"permission": "crm.contacts.write",
"method": "POST",
"path": "/api/contacts",
"fields": [
{
"key": "first",
"label": "First name",
"labelKey": "crm.contactForm.labels.firstName",
"type": "text"
},
{
"key": "middle_name",
"label": "Middle name",
"labelKey": "crm.contactForm.labels.middleName",
"type": "text"
},
{
"key": "last",
"label": "Last name",
"labelKey": "crm.contactForm.labels.lastName",
"type": "text"
},
{
"key": "email",
"label": "Email",
"labelKey": "crm.contactView.labels.email",
"type": "email"
},
{
"key": "phone",
"label": "Phone",
"labelKey": "crm.contactForm.labels.phone",
"type": "tel"
},
{
"key": "mobile_phone",
"label": "Mobile phone",
"labelKey": "crm.contactForm.labels.mobilePhone",
"type": "tel"
},
{
"key": "company",
"label": "Company",
"labelKey": "crm.contactForm.labels.company",
"type": "text"
},
{
"key": "job_title",
"label": "Job title",
"labelKey": "crm.contactForm.labels.jobTitle",
"type": "text"
},
{
"key": "employment_role",
"label": "Employment role",
"labelKey": "crm.contactForm.labels.employmentRole",
"type": "text"
},
{
"key": "seniority",
"label": "Seniority",
"labelKey": "crm.contactForm.labels.seniority",
"type": "text"
},
{
"key": "department",
"label": "Department",
"labelKey": "crm.contactForm.labels.department",
"type": "text"
},
{
"key": "lead_status",
"label": "Lead status",
"labelKey": "crm.contactForm.labels.leadStatus",
"type": "text"
},
{
"key": "lifecycle_stage",
"label": "Lifecycle stage",
"labelKey": "crm.contactForm.labels.lifecycleStage",
"type": "text"
},
{
"key": "lead_score",
"label": "Lead score",
"labelKey": "crm.contactForm.labels.leadScore",
"type": "number",
"min": 0,
"max": 100
},
{
"key": "contact_accuracy_grade",
"label": "Contact accuracy grade",
"labelKey": "crm.contactForm.labels.contactAccuracyGrade",
"type": "text"
},
{
"key": "education_level",
"label": "Education level",
"labelKey": "crm.contactForm.labels.educationLevel",
"type": "text"
},
{
"key": "city",
"label": "City",
"labelKey": "crm.contactForm.labels.city",
"type": "text"
},
{
"key": "state",
"label": "State/Region",
"labelKey": "crm.contactForm.labels.stateRegion",
"type": "text"
},
{
"key": "country",
"label": "Country",
"labelKey": "crm.contactForm.labels.country",
"type": "text"
},
{
"key": "postal_code",
"label": "Postal code",
"labelKey": "crm.contactForm.labels.postalCode",
"type": "text"
},
{
"key": "address",
"label": "Address",
"labelKey": "crm.contactForm.labels.address",
"type": "textarea"
},
{
"key": "linkedin_url",
"label": "LinkedIn URL",
"labelKey": "crm.contactForm.labels.linkedinUrl",
"type": "url"
},
{
"key": "website_url",
"label": "Website URL",
"labelKey": "crm.contactForm.labels.websiteUrl",
"type": "url"
},
{
"key": "tags",
"label": "Tags",
"labelKey": "crm.contactForm.labels.tags",
"type": "text",
"placeholderKey": "crm.contactForm.placeholders.tags",
"placeholder": "Comma-separated tags"
},
{
"key": "external_id",
"label": "External ID",
"labelKey": "crm.contactForm.labels.externalId",
"type": "text",
"placeholderKey": "crm.contactForm.placeholders.externalId",
"placeholder": "External system ID"
}
]
},
{
"id": "crm.contacts.update",
"title": "Update contact",
"titleKey": "crm.mobile.actions.updateContact.title",
"type": "record.update",
"permission": "crm.contacts.write",
"method": "PUT",
"path": "/api/contacts/:id",
"fields": [
{
"key": "first",
"label": "First name",
"labelKey": "crm.contactForm.labels.firstName",
"type": "text"
},
{
"key": "middle_name",
"label": "Middle name",
"labelKey": "crm.contactForm.labels.middleName",
"type": "text"
},
{
"key": "last",
"label": "Last name",
"labelKey": "crm.contactForm.labels.lastName",
"type": "text"
},
{
"key": "email",
"label": "Email",
"labelKey": "crm.contactView.labels.email",
"type": "email"
},
{
"key": "phone",
"label": "Phone",
"labelKey": "crm.contactForm.labels.phone",
"type": "tel"
},
{
"key": "mobile_phone",
"label": "Mobile phone",
"labelKey": "crm.contactForm.labels.mobilePhone",
"type": "tel"
},
{
"key": "company",
"label": "Company",
"labelKey": "crm.contactForm.labels.company",
"type": "text"
},
{
"key": "job_title",
"label": "Job title",
"labelKey": "crm.contactForm.labels.jobTitle",
"type": "text"
},
{
"key": "employment_role",
"label": "Employment role",
"labelKey": "crm.contactForm.labels.employmentRole",
"type": "text"
},
{
"key": "seniority",
"label": "Seniority",
"labelKey": "crm.contactForm.labels.seniority",
"type": "text"
},
{
"key": "department",
"label": "Department",
"labelKey": "crm.contactForm.labels.department",
"type": "text"
},
{
"key": "lead_status",
"label": "Lead status",
"labelKey": "crm.contactForm.labels.leadStatus",
"type": "text"
},
{
"key": "lifecycle_stage",
"label": "Lifecycle stage",
"labelKey": "crm.contactForm.labels.lifecycleStage",
"type": "text"
},
{
"key": "lead_score",
"label": "Lead score",
"labelKey": "crm.contactForm.labels.leadScore",
"type": "number",
"min": 0,
"max": 100
},
{
"key": "contact_accuracy_grade",
"label": "Contact accuracy grade",
"labelKey": "crm.contactForm.labels.contactAccuracyGrade",
"type": "text"
},
{
"key": "education_level",
"label": "Education level",
"labelKey": "crm.contactForm.labels.educationLevel",
"type": "text"
},
{
"key": "city",
"label": "City",
"labelKey": "crm.contactForm.labels.city",
"type": "text"
},
{
"key": "state",
"label": "State/Region",
"labelKey": "crm.contactForm.labels.stateRegion",
"type": "text"
},
{
"key": "country",
"label": "Country",
"labelKey": "crm.contactForm.labels.country",
"type": "text"
},
{
"key": "postal_code",
"label": "Postal code",
"labelKey": "crm.contactForm.labels.postalCode",
"type": "text"
},
{
"key": "address",
"label": "Address",
"labelKey": "crm.contactForm.labels.address",
"type": "textarea"
},
{
"key": "linkedin_url",
"label": "LinkedIn URL",
"labelKey": "crm.contactForm.labels.linkedinUrl",
"type": "url"
},
{
"key": "website_url",
"label": "Website URL",
"labelKey": "crm.contactForm.labels.websiteUrl",
"type": "url"
},
{
"key": "tags",
"label": "Tags",
"labelKey": "crm.contactForm.labels.tags",
"type": "text",
"placeholderKey": "crm.contactForm.placeholders.tags",
"placeholder": "Comma-separated tags"
},
{
"key": "external_id",
"label": "External ID",
"labelKey": "crm.contactForm.labels.externalId",
"type": "text",
"placeholderKey": "crm.contactForm.placeholders.externalId",
"placeholder": "External system ID"
}
]
},
{
"id": "crm.contacts.delete",
"title": "Delete contact",
"titleKey": "crm.mobile.actions.deleteContact.title",
"type": "record.delete",
"permission": "crm.contacts.write",
"method": "DELETE",
"path": "/api/contacts/:id"
}
]
},
{
"path": "/contacts/:id",
"apiPath": "/api/contacts/:id",
"title": "Contact",
"titleKey": "crm.mobile.routes.contactDetail.title",
"template": "record.detail",
"dataSource": "crm.contacts.detail"
},
{
"path": "/companies",
"apiPath": "/api/companies",
"title": "Companies",
"titleKey": "crm.mobile.routes.companies.title",
"template": "record.list",
"dataSource": "crm.companies.list",
"detailRoute": "/companies/:id",
"actions": [
{
"id": "crm.companies.create",
"title": "Create company",
"type": "record.create",
"permission": "crm.companies.write",
"method": "POST",
"path": "/api/companies",
"fields": [
{
"key": "name",
"label": "Name",
"labelKey": "crm.companyView.labels.name",
"type": "text",
"required": true
},
{
"key": "external_id",
"label": "External ID",
"labelKey": "crm.companyForm.labels.externalId",
"type": "text"
},
{
"key": "website",
"label": "Website",
"labelKey": "crm.companyForm.labels.website",
"type": "url"
},
{
"key": "domain",
"label": "Domain",
"labelKey": "crm.companyForm.labels.domain",
"type": "text"
},
{
"key": "phone",
"label": "Phone",
"labelKey": "crm.companyForm.labels.phone",
"type": "tel"
},
{
"key": "fax",
"label": "Fax",
"labelKey": "crm.companyForm.labels.fax",
"type": "tel"
},
{
"key": "email",
"label": "Email",
"labelKey": "crm.companyForm.labels.email",
"type": "email"
},
{
"key": "industry",
"label": "Industry",
"labelKey": "crm.companyForm.labels.industry",
"type": "text"
},
{
"key": "primary_sub_industry",
"label": "Primary sub-industry",
"labelKey": "crm.companyForm.labels.primarySubIndustry",
"type": "text"
},
{
"key": "size",
"label": "Company size",
"labelKey": "crm.companyForm.labels.companySize",
"type": "select",
"options": [
{
"value": "startup",
"label": "Startup (1-10 employees)"
},
{
"value": "small",
"label": "Small (11-50 employees)"
},
{
"value": "medium",
"label": "Medium (51-200 employees)"
},
{
"value": "large",
"label": "Large (201-1000 employees)"
},
{
"value": "enterprise",
"label": "Enterprise (1000+ employees)"
}
]
},
{
"key": "founded_year",
"label": "Founded year",
"labelKey": "crm.companyForm.labels.foundedYear",
"type": "number",
"min": 1800,
"max": 3000
},
{
"key": "ticker",
"label": "Ticker",
"labelKey": "crm.companyForm.labels.ticker",
"type": "text"
},
{
"key": "employee_count",
"label": "Employee count",
"labelKey": "crm.companyForm.labels.employeeCount",
"type": "number",
"min": 0
},
{
"key": "employee_range",
"label": "Employee range",
"labelKey": "crm.companyForm.labels.employeeRange",
"type": "text"
},
{
"key": "revenue_range",
"label": "Revenue range",
"labelKey": "crm.companyForm.labels.revenueRange",
"type": "text"
},
{
"key": "description",
"label": "Description",
"labelKey": "crm.companyForm.labels.description",
"type": "textarea"
},
{
"key": "linkedin_url",
"label": "LinkedIn URL",
"labelKey": "crm.companyForm.labels.linkedInUrl",
"type": "url"
},
{
"key": "external_profile_url",
"label": "External profile URL",
"labelKey": "crm.companyForm.labels.externalProfileUrl",
"type": "url"
},
{
"key": "address",
"label": "Address",
"labelKey": "crm.companyForm.labels.address",
"type": "textarea"
},
{
"key": "city",
"label": "City",
"labelKey": "crm.companyForm.labels.city",
"type": "text"
},
{
"key": "state",
"label": "State / Region",
"labelKey": "crm.companyForm.labels.stateRegion",
"type": "text"
},
{
"key": "postal_code",
"label": "Postal code",
"labelKey": "crm.companyForm.labels.postalCode",
"type": "text"
},
{
"key": "country",
"label": "Country",
"labelKey": "crm.companyForm.labels.country",
"type": "text"
},
{
"key": "logo_url",
"label": "Logo URL",
"labelKey": "crm.companyForm.labels.logoUrl",
"type": "url"
}
],
"titleKey": "crm.mobile.actions.createCompany.title"
},
{
"id": "crm.companies.update",
"title": "Update company",
"type": "record.update",
"permission": "crm.companies.write",
"method": "PUT",
"path": "/api/companies/:id",
"fields": [
{
"key": "name",
"label": "Name",
"labelKey": "crm.companyView.labels.name",
"type": "text"
},
{
"key": "external_id",
"label": "External ID",
"labelKey": "crm.companyForm.labels.externalId",
"type": "text"
},
{
"key": "website",
"label": "Website",
"labelKey": "crm.companyForm.labels.website",
"type": "url"
},
{
"key": "domain",
"label": "Domain",
"labelKey": "crm.companyForm.labels.domain",
"type": "text"
},
{
"key": "phone",
"label": "Phone",
"labelKey": "crm.companyForm.labels.phone",
"type": "tel"
},
{
"key": "fax",
"label": "Fax",
"labelKey": "crm.companyForm.labels.fax",
"type": "tel"
},
{
"key": "email",
"label": "Email",
"labelKey": "crm.companyForm.labels.email",
"type": "email"
},
{
"key": "industry",
"label": "Industry",
"labelKey": "crm.companyForm.labels.industry",
"type": "text"
},
{
"key": "primary_sub_industry",
"label": "Primary sub-industry",
"labelKey": "crm.companyForm.labels.primarySubIndustry",
"type": "text"
},
{
"key": "size",
"label": "Company size",
"labelKey": "crm.companyForm.labels.companySize",
"type": "select",
"options": [
{
"value": "startup",
"label": "Startup (1-10 employees)"
},
{
"value": "small",
"label": "Small (11-50 employees)"
},
{
"value": "medium",
"label": "Medium (51-200 employees)"
},
{
"value": "large",
"label": "Large (201-1000 employees)"
},
{
"value": "enterprise",
"label": "Enterprise (1000+ employees)"
}
]
},
{
"key": "founded_year",
"label": "Founded year",
"labelKey": "crm.companyForm.labels.foundedYear",
"type": "number",
"min": 1800,
"max": 3000
},
{
"key": "ticker",
"label": "Ticker",
"labelKey": "crm.companyForm.labels.ticker",
"type": "text"
},
{
"key": "employee_count",
"label": "Employee count",
"labelKey": "crm.companyForm.labels.employeeCount",
"type": "number",
"min": 0
},
{
"key": "employee_range",
"label": "Employee range",
"labelKey": "crm.companyForm.labels.employeeRange",
"type": "text"
},
{
"key": "revenue_range",
"label": "Revenue range",
"labelKey": "crm.companyForm.labels.revenueRange",
"type": "text"
},
{
"key": "description",
"label": "Description",
"labelKey": "crm.companyForm.labels.description",
"type": "textarea"
},
{
"key": "linkedin_url",
"label": "LinkedIn URL",
"labelKey": "crm.companyForm.labels.linkedInUrl",
"type": "url"
},
{
"key": "external_profile_url",
"label": "External profile URL",
"labelKey": "crm.companyForm.labels.externalProfileUrl",
"type": "url"
},
{
"key": "address",
"label": "Address",
"labelKey": "crm.companyForm.labels.address",
"type": "textarea"
},
{
"key": "city",
"label": "City",
"labelKey": "crm.companyForm.labels.city",
"type": "text"
},
{
"key": "state",
"label": "State / Region",
"labelKey": "crm.companyForm.labels.stateRegion",
"type": "text"
},
{
"key": "postal_code",
"label": "Postal code",
"labelKey": "crm.companyForm.labels.postalCode",
"type": "text"
},
{
"key": "country",
"label": "Country",
"labelKey": "crm.companyForm.labels.country",
"type": "text"
},
{
"key": "logo_url",
"label": "Logo URL",
"labelKey": "crm.companyForm.labels.logoUrl",
"type": "url"
}
],
"titleKey": "crm.mobile.actions.updateCompany.title"
},
{
"id": "crm.companies.delete",
"title": "Delete company",
"type": "record.delete",
"permission": "crm.companies.write",
"method": "DELETE",
"path": "/api/companies/:id",
"titleKey": "crm.mobile.actions.deleteCompany.title"
}
]
},
{
"path": "/companies/:id",
"apiPath": "/api/companies/:id",
"title": "Company",
"titleKey": "crm.mobile.routes.companyDetail.title",
"template": "record.detail",
"dataSource": "crm.companies.detail"
},
{
"path": "/contacts/:id/activity",
"apiPath": "/api/pipeline/:id/history",
"title": "Activity",
"titleKey": "crm.mobile.routes.activity.title",
"template": "activity.timeline",
"dataSource": "crm.activities.timeline"
}
]
}
}
],
"package_manifests": [],
"deployment_configs": [],
"source_signals": {
"api_routes": [
{
"method": "OPTIONS",
"path": "*",
"source_path": "apps/TopoloCRM/apps/api/index.ts"
},
{
"method": "GET",
"path": "/warmup",
"source_path": "apps/TopoloCRM/apps/api/index.ts"
},
{
"method": "GET",
"path": "/health",
"source_path": "apps/TopoloCRM/apps/api/index.ts"
},
{
"method": "GET",
"path": "/api/health",
"source_path": "apps/TopoloCRM/apps/api/index.ts"
},
{
"method": "GET",
"path": "/api/widget",
"source_path": "apps/TopoloCRM/apps/api/index.ts"
},
{
"method": "GET",
"path": "/api",
"source_path": "apps/TopoloCRM/apps/api/index.ts"
},
{
"method": "ALL",
"path": "*",
"source_path": "apps/TopoloCRM/apps/api/index.ts"
},
{
"method": "LITERAL",
"path": "/health",
"source_path": "apps/TopoloCRM/apps/api/index.ts"
}
],
"ui_routes": [
{
"path": "/tasks/${task.id}",
"source_path": "apps/TopoloCRM/apps/api/lib/crm-notifications.ts"
},
{
"path": "/transactions/${milestone.transaction_id}",
"source_path": "apps/TopoloCRM/apps/api/lib/crm-notifications.ts"
},
{
"path": "/offers/${offerId}",
"source_path": "apps/TopoloCRM/apps/api/routes/offers.ts"
},
{
"path": "/offers/${id}",
"source_path": "apps/TopoloCRM/apps/api/routes/offers.ts"
},
{
"path": "/portal-leads/${leadEventId}",
"source_path": "apps/TopoloCRM/apps/api/routes/portal-leads.ts"
},
{
"path": "/listings/${listingId}",
"source_path": "apps/TopoloCRM/apps/api/routes/portal-sync.ts"
},
{
"path": "/showings/${showingId}",
"source_path": "apps/TopoloCRM/apps/api/routes/showings.ts"
},
{
"path": "/tasks/${taskId}",
"source_path": "apps/TopoloCRM/apps/api/routes/tasks.ts"
},
{
"path": "/tasks/${id}",
"source_path": "apps/TopoloCRM/apps/api/routes/tasks.ts"
},
{
"path": "/inbox",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/contacts",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/contacts/:contactId",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/companies",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/companies/:companyId",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/deals",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/deals/:dealId",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/import",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/pipeline",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/pipeline/:pipelineId",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/tasks",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/dashboard",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/properties",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/properties/:propertyId",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/listings",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/listings/:listingId",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/showings",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/offers",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/transactions",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/transactions/:transactionId",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/commissions",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/portal-connections",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/portal-leads",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/settings",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/settings/:section",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/getting-started",
"source_path": "apps/TopoloCRM/apps/web/src/App.tsx"
},
{
"path": "/${path}",
"source_path": "apps/TopoloCRM/apps/web/src/utils/api/real-estate-api.ts"
}
],
"test_cases": [],
"database_tables": []
},
"documentation": {
"declared_paths": [
"internal/apps/crm",
"applications/crm"
],
"present_paths": [
"internal/apps/crm",
"applications/crm"
],
"missing_paths": [],
"human_reference": "/systems/topolo-crm",
"machine_reference": "/machine/systems/topolo-crm.json",
"action_examples": 134,
"action_schemas": 134
},
"source_findings": [
{
"type": "uncatalogued_routes",
"source_path": "apps/TopoloCRM/topolo.app.json",
"detail": [
{
"key": "* /api/*",
"method": "*",
"path": "/api/{segment1}",
"source": "apps/api/index.ts",
"target": "api"
},
{
"key": "* /docs/*",
"method": "*",
"path": "/docs/{segment1}",
"source": "apps/api/index.ts",
"target": "api"
}
]
}
]
}