{
  "openapi": "3.0.3",
  "info": {
    "title": "DripPulse API (v1) — Agent Starter Spec",
    "version": "1.1.0",
    "description": "OpenAPI starter spec for external agent systems operating DripPulse. Covers core /api/v1 surfaces for templates, agent deployment/execution, workflows, projects, webhooks, API keys, and CRM layer (pipelines, opportunities, accounts, contacts, leads, activities, export/import)."
  },
  "servers": [
    {
      "url": "https://drippulse.io/api/v1"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    },
    "schemas": {
      "ErrorResponse": {
        "type": "object",
        "properties": {
          "error": { "type": "string" },
          "errors": { "type": "array", "items": { "type": "string" } }
        },
        "additionalProperties": true
      },
      "CrmPipelineStage": {
        "type": "object",
        "properties": {
          "id": { "type": "string", "format": "uuid" },
          "pipeline_id": { "type": "string", "format": "uuid" },
          "name": { "type": "string" },
          "position": { "type": "integer" },
          "stage_type": { "type": "string", "enum": ["open", "won", "lost"] },
          "color": { "type": ["string", "null"] }
        },
        "required": ["id", "name", "position", "stage_type"]
      },
      "CrmPipeline": {
        "type": "object",
        "properties": {
          "id": { "type": "string", "format": "uuid" },
          "organization_id": { "type": "integer" },
          "user_id": { "type": ["integer", "null"] },
          "name": { "type": "string" },
          "is_default": { "type": "boolean" },
          "org_default": { "type": "boolean" },
          "stages": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/CrmPipelineStage" }
          }
        },
        "required": ["id", "name", "is_default", "org_default", "stages"]
      },
      "CrmOpportunity": {
        "type": "object",
        "properties": {
          "id": { "type": "string", "format": "uuid" },
          "public_id": { "type": "string" },
          "name": { "type": "string" },
          "account_id": { "type": ["string", "null"], "format": "uuid" },
          "account_public_id": { "type": ["string", "null"] },
          "primary_contact_id": { "type": ["string", "null"], "format": "uuid" },
          "primary_contact_public_id": { "type": ["string", "null"] },
          "pipeline_id": { "type": "string", "format": "uuid" },
          "pipeline_name": { "type": ["string", "null"] },
          "pipeline_stage_id": { "type": "string", "format": "uuid" },
          "pipeline_stage_type": { "type": ["string", "null"], "enum": ["open", "won", "lost", null] },
          "stage": { "type": "string" },
          "amount": { "type": ["string", "null"] },
          "currency": { "type": ["string", "null"] },
          "close_date": { "type": ["string", "null"] },
          "owner_user_id": { "type": ["integer", "null"] },
          "status": { "type": ["string", "null"] },
          "stage_position": { "type": ["integer", "null"] },
          "metadata": { "type": ["object", "null"], "additionalProperties": true },
          "custom_fields": { "type": ["object", "null"], "additionalProperties": true },
          "external_system": { "type": ["string", "null"] },
          "external_id": { "type": ["string", "null"] },
          "created_at": { "type": ["string", "null"], "format": "date-time" },
          "updated_at": { "type": ["string", "null"], "format": "date-time" },
          "deleted_at": { "type": ["string", "null"], "format": "date-time" }
        },
        "required": ["public_id", "name", "pipeline_id", "pipeline_stage_id", "stage"]
      },
      "CreateOpportunityRequest": {
        "type": "object",
        "properties": {
          "opportunity": {
            "type": "object",
            "properties": {
              "account_id": { "type": "string" },
              "primary_contact_id": { "type": "string" },
              "name": { "type": "string" },
              "stage": { "type": "string" },
              "pipeline_id": { "type": "string", "format": "uuid" },
              "pipeline_stage_id": { "type": "string", "format": "uuid" },
              "stage_position": { "type": "integer" },
              "amount": { "type": "string" },
              "currency": { "type": "string" },
              "close_date": { "type": "string" },
              "owner_user_id": { "type": "integer" },
              "status": { "type": "string" },
              "external_system": { "type": "string" },
              "external_id": { "type": "string" },
              "metadata": { "type": "object", "additionalProperties": true },
              "custom_fields": { "type": "object", "additionalProperties": true }
            },
            "required": ["name"]
          }
        },
        "required": ["opportunity"]
      },
      "UpdateOpportunityRequest": {
        "allOf": [
          { "$ref": "#/components/schemas/CreateOpportunityRequest" }
        ]
      },
      "ReorderOpportunitiesRequest": {
        "type": "object",
        "properties": {
          "pipeline_stage_id": { "type": "string", "format": "uuid" },
          "ordered_ids": { "type": "array", "items": { "type": "string" } }
        },
        "required": ["pipeline_stage_id", "ordered_ids"]
      },
      "CrmAccount": {
        "type": "object",
        "properties": {
          "id": { "type": "string", "format": "uuid" },
          "public_id": { "type": "string" },
          "name": { "type": "string" },
          "domain": { "type": ["string", "null"] }
        },
        "required": ["public_id", "name"]
      },
      "CrmContact": {
        "type": "object",
        "properties": {
          "id": { "type": "string", "format": "uuid" },
          "public_id": { "type": "string" },
          "first_name": { "type": ["string", "null"] },
          "last_name": { "type": ["string", "null"] },
          "full_name": { "type": ["string", "null"] },
          "email": { "type": ["string", "null"] }
        },
        "required": ["public_id"]
      },
      "CrmLead": {
        "type": "object",
        "properties": {
          "id": { "type": "string", "format": "uuid" },
          "public_id": { "type": "string" },
          "email": { "type": ["string", "null"] },
          "company_name": { "type": ["string", "null"] },
          "status": { "type": ["string", "null"] }
        },
        "required": ["public_id"]
      },
      "CrmActivity": {
        "type": "object",
        "properties": {
          "id": { "type": "string", "format": "uuid" },
          "public_id": { "type": "string" },
          "record_type": { "type": "string" },
          "record_public_id": { "type": "string" },
          "activity_type": { "type": "string" },
          "subject": { "type": ["string", "null"] },
          "body": { "type": ["string", "null"] }
        },
        "required": ["public_id", "record_type", "record_public_id", "activity_type"]
      },
      "CreateAccountRequest": {
        "type": "object",
        "properties": {
          "account": {
            "type": "object",
            "properties": {
              "name": { "type": "string" },
              "domain": { "type": "string" },
              "industry": { "type": "string" },
              "size_band": { "type": "string" }
            },
            "required": ["name"]
          }
        },
        "required": ["account"]
      },
      "CreateContactRequest": {
        "type": "object",
        "properties": {
          "contact": {
            "type": "object",
            "properties": {
              "account_id": { "type": "string" },
              "first_name": { "type": "string" },
              "last_name": { "type": "string" },
              "email": { "type": "string" },
              "phone": { "type": "string" },
              "title": { "type": "string" }
            }
          }
        },
        "required": ["contact"]
      },
      "CreateLeadRequest": {
        "type": "object",
        "properties": {
          "lead": {
            "type": "object",
            "properties": {
              "first_name": { "type": "string" },
              "last_name": { "type": "string" },
              "email": { "type": "string" },
              "company_name": { "type": "string" },
              "phone": { "type": "string" },
              "source": { "type": "string" },
              "status": { "type": "string" }
            }
          }
        },
        "required": ["lead"]
      },
      "CreateActivityRequest": {
        "type": "object",
        "properties": {
          "activity": {
            "type": "object",
            "properties": {
              "record_type": { "type": "string" },
              "record_public_id": { "type": "string" },
              "activity_type": { "type": "string" },
              "subject": { "type": "string" },
              "body": { "type": "string" },
              "due_at": { "type": "string", "format": "date-time" }
            },
            "required": ["record_type", "record_public_id", "activity_type"]
          }
        },
        "required": ["activity"]
      },
      "Workflow": {
        "type": "object",
        "properties": {
          "id": { "type": "integer" },
          "name": { "type": "string" },
          "status": { "type": ["string", "null"] },
          "created_at": { "type": ["string", "null"], "format": "date-time" },
          "updated_at": { "type": ["string", "null"], "format": "date-time" }
        },
        "required": ["id", "name"]
      },
      "CreateWorkflowRequest": {
        "type": "object",
        "properties": {
          "workflow": {
            "type": "object",
            "properties": {
              "name": { "type": "string" },
              "definition": { "type": "object", "additionalProperties": true }
            },
            "required": ["name"]
          }
        },
        "required": ["workflow"]
      }
      ,
      "AgentTemplate": {
        "type": "object",
        "properties": {
          "id": { "type": "integer" },
          "name": { "type": "string" },
          "description": { "type": ["string", "null"] },
          "category": { "type": ["string", "null"] },
          "difficulty": { "type": ["string", "null"] },
          "prompt": { "type": ["string", "null"] },
          "config_fields": { "type": ["array", "null"], "items": { "type": "object" } },
          "integrations_required": { "type": ["array", "null"], "items": { "type": "string" } },
          "integrations_optional": { "type": ["array", "null"], "items": { "type": "string" } },
          "times_deployed": { "type": ["integer", "null"] },
          "created_at": { "type": ["string", "null"], "format": "date-time" },
          "updated_at": { "type": ["string", "null"], "format": "date-time" }
        },
        "required": ["id", "name"]
      },
      "Agent": {
        "type": "object",
        "properties": {
          "id": { "type": "integer" },
          "name": { "type": "string" },
          "status": { "type": ["string", "null"] },
          "type": { "type": ["string", "null"], "enum": ["template", "workflow", "code", null] },
          "template_id": { "type": ["integer", "null"] },
          "workflow_id": { "type": ["integer", "null"] },
          "openclaw_session_id": { "type": ["string", "null"] },
          "configuration": { "type": ["object", "null"], "additionalProperties": true },
          "created_at": { "type": ["string", "null"], "format": "date-time" },
          "updated_at": { "type": ["string", "null"], "format": "date-time" }
        },
        "required": ["id", "name"]
      },
      "SpawnAgentRequest": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "type": { "type": "string", "enum": ["template", "workflow", "code"] },
          "template_id": { "type": "integer" },
          "workflow_id": { "type": "integer" },
          "code_id": { "type": "integer" },
          "configuration": { "type": "object", "additionalProperties": true }
        },
        "required": ["name", "type"]
      },
      "ExecuteAgentRequest": {
        "type": "object",
        "properties": {
          "input": { "type": "object", "additionalProperties": true },
          "idempotency_key": { "type": "string" }
        },
        "required": ["input"]
      },
      "Webhook": {
        "type": "object",
        "properties": {
          "id": { "type": "integer" },
          "url": { "type": "string" },
          "event_type": { "type": "string" },
          "secret": { "type": ["string", "null"] },
          "active": { "type": ["boolean", "null"] },
          "created_at": { "type": ["string", "null"], "format": "date-time" },
          "updated_at": { "type": ["string", "null"], "format": "date-time" }
        },
        "required": ["id", "url", "event_type"]
      },
      "CreateWebhookRequest": {
        "type": "object",
        "properties": {
          "url": { "type": "string" },
          "event_type": { "type": "string" },
          "active": { "type": "boolean" }
        },
        "required": ["url", "event_type"]
      },
      "Project": {
        "type": "object",
        "properties": {
          "id": { "type": "integer" },
          "name": { "type": "string" },
          "description": { "type": ["string", "null"] },
          "status": { "type": ["string", "null"] },
          "created_at": { "type": ["string", "null"], "format": "date-time" },
          "updated_at": { "type": ["string", "null"], "format": "date-time" }
        },
        "required": ["id", "name"]
      },
      "CreateProjectRequest": {
        "type": "object",
        "properties": {
          "project": {
            "type": "object",
            "properties": {
              "name": { "type": "string" },
              "description": { "type": "string" },
              "status": { "type": "string" }
            },
            "required": ["name"]
          }
        },
        "required": ["project"]
      },
      "ApiKey": {
        "type": "object",
        "properties": {
          "id": { "type": "integer" },
          "name": { "type": ["string", "null"] },
          "key_prefix": { "type": ["string", "null"] },
          "last_four": { "type": ["string", "null"] },
          "expires_at": { "type": ["string", "null"], "format": "date-time" },
          "created_at": { "type": ["string", "null"], "format": "date-time" }
        },
        "required": ["id"]
      },
      "CreateApiKeyRequest": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "expires_in": { "type": "integer", "description": "Days until expiration" }
        },
        "additionalProperties": true
      }
    }
  },
  "paths": {
    "/agent_templates": {
      "get": {
        "operationId": "listAgentTemplates",
        "summary": "List out-of-the-box agent templates",
        "parameters": [
          { "name": "category", "in": "query", "required": false, "schema": { "type": "string" } }
        ],
        "responses": {
          "200": {
            "description": "Template list",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "templates": { "type": "array", "items": { "$ref": "#/components/schemas/AgentTemplate" } },
                    "total_count": { "type": "integer" },
                    "categories": { "type": "array", "items": { "type": "string" } }
                  },
                  "required": ["templates"]
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "createAgentTemplate",
        "summary": "Create a custom agent template",
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true } } }
        },
        "responses": {
          "201": { "description": "Created" },
          "400": { "description": "Bad request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } }
        }
      }
    },
    "/agent_templates/{id}": {
      "get": {
        "operationId": "getAgentTemplate",
        "summary": "Get an agent template",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "responses": { "200": { "description": "Template" }, "404": { "description": "Not found" } }
      },
      "patch": {
        "operationId": "updateAgentTemplate",
        "summary": "Update an agent template",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true } } } },
        "responses": { "200": { "description": "Updated" }, "400": { "description": "Bad request" } }
      },
      "delete": {
        "operationId": "deleteAgentTemplate",
        "summary": "Delete an agent template",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "responses": { "200": { "description": "Deleted" } }
      }
    },
    "/agent_templates/{id}/execution_policy": {
      "patch": {
        "operationId": "updateAgentTemplateExecutionPolicy",
        "summary": "Update template execution policy (admin-only)",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "execution_policy": { "type": "object", "additionalProperties": true } }, "required": ["execution_policy"] } } } },
        "responses": { "200": { "description": "Updated" }, "403": { "description": "Forbidden" } }
      }
    },
    "/agents": {
      "get": {
        "operationId": "listAgents",
        "summary": "List agents in the organization",
        "responses": { "200": { "description": "Agents" } }
      }
    },
    "/agents/spawn": {
      "post": {
        "operationId": "spawnAgent",
        "summary": "Deploy an agent from template or workflow",
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SpawnAgentRequest" } } } },
        "responses": {
          "201": { "description": "Created" },
          "202": { "description": "Accepted (agent already exists by name)" },
          "400": { "description": "Bad request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } },
          "403": { "description": "Limit/forbidden", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } },
          "404": { "description": "Template/workflow not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } }
        }
      }
    },
    "/agents/{id}": {
      "get": { "operationId": "getAgent", "summary": "Get agent", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }], "responses": { "200": { "description": "Agent" }, "404": { "description": "Not found" } } },
      "patch": { "operationId": "updateAgent", "summary": "Update agent (status/config)", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true } } } }, "responses": { "200": { "description": "Updated" } } },
      "delete": { "operationId": "deleteAgent", "summary": "Destroy agent", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }], "responses": { "204": { "description": "Deleted" } } }
    },
    "/agents/{id}/execute": {
      "post": {
        "operationId": "executeAgent",
        "summary": "Execute an agent (policy-driven)",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExecuteAgentRequest" } } } },
        "responses": { "200": { "description": "Execution result" }, "422": { "description": "Validation error" } }
      }
    },
    "/agents/{id}/inference": {
      "post": {
        "operationId": "agentInference",
        "summary": "Run structured JSON inference for template agent",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExecuteAgentRequest" } } } },
        "responses": { "200": { "description": "Inference result" }, "422": { "description": "Validation error" } }
      }
    },
    "/agents/{id}/status": {
      "get": { "operationId": "agentStatus", "summary": "Agent status snapshot", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }], "responses": { "200": { "description": "Status" } } }
    },
    "/agents/{id}/executions": {
      "get": { "operationId": "agentExecutions", "summary": "Agent execution history", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }], "responses": { "200": { "description": "Executions" } } }
    },
    "/projects": {
      "get": { "operationId": "listProjects", "summary": "List projects", "responses": { "200": { "description": "Projects" } } },
      "post": { "operationId": "createProject", "summary": "Create project", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateProjectRequest" } } } }, "responses": { "201": { "description": "Created" }, "422": { "description": "Validation error" } } }
    },
    "/projects/{id}": {
      "get": { "operationId": "getProject", "summary": "Get project", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }], "responses": { "200": { "description": "Project" } } },
      "patch": { "operationId": "updateProject", "summary": "Update project", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateProjectRequest" } } } }, "responses": { "200": { "description": "Updated" }, "422": { "description": "Validation error" } } },
      "delete": { "operationId": "deleteProject", "summary": "Delete project", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }], "responses": { "204": { "description": "Deleted" } } }
    },
    "/webhooks": {
      "get": { "operationId": "listWebhooks", "summary": "List configured webhooks", "responses": { "200": { "description": "Webhooks" } } },
      "post": { "operationId": "createWebhook", "summary": "Create webhook subscription", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateWebhookRequest" } } } }, "responses": { "201": { "description": "Created" }, "400": { "description": "Bad request" } } }
    },
    "/webhooks/catalog": {
      "get": { "operationId": "webhookCatalog", "summary": "List event types and signature contract", "responses": { "200": { "description": "Catalog" } } }
    },
    "/webhooks/{id}": {
      "get": { "operationId": "getWebhook", "summary": "Get webhook", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }], "responses": { "200": { "description": "Webhook" }, "404": { "description": "Not found" } } },
      "patch": { "operationId": "updateWebhook", "summary": "Update webhook", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true } } } }, "responses": { "200": { "description": "Updated" }, "400": { "description": "Bad request" } } },
      "delete": { "operationId": "deleteWebhook", "summary": "Delete webhook", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }], "responses": { "200": { "description": "Deleted" } } }
    },
    "/webhooks/{id}/test": {
      "post": { "operationId": "testWebhook", "summary": "Send a test delivery", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }], "responses": { "200": { "description": "Delivered" }, "422": { "description": "Delivery failed" } } }
    },
    "/webhooks/{id}/deliveries": {
      "get": { "operationId": "webhookDeliveries", "summary": "List delivery history", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }, { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer" } }], "responses": { "200": { "description": "Deliveries" } } }
    },
    "/api_keys": {
      "get": { "operationId": "listApiKeys", "summary": "List API keys (secrets redacted)", "responses": { "200": { "description": "Keys" } } },
      "post": { "operationId": "createApiKey", "summary": "Create API key (full key returned once)", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateApiKeyRequest" } } } }, "responses": { "201": { "description": "Created" }, "422": { "description": "Validation error" } } }
    },
    "/api_keys/usage": {
      "get": { "operationId": "apiKeyUsage", "summary": "API key usage stats", "responses": { "200": { "description": "Usage" } } }
    },
    "/api_keys/{id}": {
      "get": { "operationId": "getApiKey", "summary": "Show API key metadata", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }], "responses": { "200": { "description": "Key" } } }
    },
    "/api_keys/{id}/revoke": {
      "delete": { "operationId": "revokeApiKey", "summary": "Revoke API key", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }], "responses": { "200": { "description": "Revoked" } } }
    },
    "/crm/opportunity_pipelines": {
      "get": {
        "operationId": "crmListOpportunityPipelines",
        "summary": "List visible opportunity pipelines + stages",
        "responses": {
          "200": {
            "description": "Pipelines + default pipeline id",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "pipelines": { "type": "array", "items": { "$ref": "#/components/schemas/CrmPipeline" } },
                    "default_pipeline_id": { "type": ["string", "null"], "format": "uuid" }
                  },
                  "required": ["pipelines"]
                }
              }
            }
          },
          "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } }
        }
      },
      "post": {
        "operationId": "crmCreateOpportunityPipeline",
        "summary": "Clone org default pipeline for current user",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "pipeline": { "type": "object", "properties": { "name": { "type": "string" } } }
                },
                "required": ["pipeline"]
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Pipeline created",
            "content": {
              "application/json": {
                "schema": { "type": "object", "properties": { "pipeline": { "$ref": "#/components/schemas/CrmPipeline" } }, "required": ["pipeline"] }
              }
            }
          },
          "403": { "description": "Forbidden", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } },
          "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } }
        }
      }
    },
    "/crm/opportunity_pipelines/{id}": {
      "patch": {
        "operationId": "crmUpdateOpportunityPipeline",
        "summary": "Update a user-owned pipeline (name and stages)",
        "parameters": [
          { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "pipeline": { "type": "object", "additionalProperties": true }
                },
                "required": ["pipeline"]
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Pipeline updated" },
          "403": { "description": "Forbidden", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } },
          "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } }
        }
      },
      "delete": {
        "operationId": "crmDeleteOpportunityPipeline",
        "summary": "Delete a user-owned pipeline (must be empty)",
        "parameters": [
          { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }
        ],
        "responses": {
          "204": { "description": "Deleted" },
          "403": { "description": "Forbidden", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } },
          "422": { "description": "Cannot delete", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } }
        }
      }
    },
    "/crm/opportunity_pipelines/{id}/set_default": {
      "post": {
        "operationId": "crmSetDefaultOpportunityPipeline",
        "summary": "Set the current user's default pipeline",
        "parameters": [
          { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }
        ],
        "responses": {
          "204": { "description": "Set" },
          "403": { "description": "Forbidden", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } }
        }
      }
    },
    "/crm/opportunities": {
      "get": {
        "operationId": "crmListOpportunities",
        "summary": "List opportunities (optionally by pipeline and query)",
        "parameters": [
          { "name": "pipeline_id", "in": "query", "required": false, "schema": { "type": "string", "format": "uuid" } },
          { "name": "q", "in": "query", "required": false, "schema": { "type": "string" } }
        ],
        "responses": {
          "200": {
            "description": "Opportunities",
            "content": {
              "application/json": {
                "schema": { "type": "object", "properties": { "opportunities": { "type": "array", "items": { "$ref": "#/components/schemas/CrmOpportunity" } } }, "required": ["opportunities"] }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "crmCreateOpportunity",
        "summary": "Create opportunity",
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateOpportunityRequest" } } }
        },
        "responses": {
          "201": { "description": "Created", "content": { "application/json": { "schema": { "type": "object", "properties": { "opportunity": { "$ref": "#/components/schemas/CrmOpportunity" } }, "required": ["opportunity"] } } } },
          "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } }
        }
      }
    },
    "/crm/opportunities/{id}": {
      "patch": {
        "operationId": "crmUpdateOpportunity",
        "summary": "Update opportunity (by public_id or UUID)",
        "parameters": [
          { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
        ],
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateOpportunityRequest" } } }
        },
        "responses": {
          "200": { "description": "Updated", "content": { "application/json": { "schema": { "type": "object", "properties": { "opportunity": { "$ref": "#/components/schemas/CrmOpportunity" } }, "required": ["opportunity"] } } } },
          "404": { "description": "Not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } },
          "422": { "description": "Validation error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } }
        }
      },
      "delete": {
        "operationId": "crmDeleteOpportunity",
        "summary": "Soft-delete opportunity",
        "parameters": [
          { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
        ],
        "responses": {
          "204": { "description": "Deleted" }
        }
      }
    },
    "/crm/opportunities/reorder": {
      "post": {
        "operationId": "crmReorderOpportunities",
        "summary": "Reorder opportunities within a stage",
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReorderOpportunitiesRequest" } } }
        },
        "responses": {
          "204": { "description": "Reordered" },
          "400": { "description": "Bad request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } },
          "422": { "description": "Invalid stage/order", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ErrorResponse" } } } }
        }
      }
    },
    "/crm/accounts": {
      "get": {
        "operationId": "crmListAccounts",
        "summary": "List accounts",
        "responses": { "200": { "description": "Accounts" } }
      },
      "post": {
        "operationId": "crmCreateAccount",
        "summary": "Create account",
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateAccountRequest" } } } },
        "responses": { "201": { "description": "Created" }, "422": { "description": "Validation error" } }
      }
    },
    "/crm/accounts/{id}": {
      "patch": {
        "operationId": "crmUpdateAccount",
        "summary": "Update account",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }],
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateAccountRequest" } } } },
        "responses": { "200": { "description": "Updated" } }
      },
      "delete": {
        "operationId": "crmDeleteAccount",
        "summary": "Soft-delete account",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }],
        "responses": { "204": { "description": "Deleted" } }
      }
    },
    "/crm/contacts": {
      "get": { "operationId": "crmListContacts", "summary": "List contacts", "responses": { "200": { "description": "Contacts" } } },
      "post": {
        "operationId": "crmCreateContact",
        "summary": "Create contact",
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateContactRequest" } } } },
        "responses": { "201": { "description": "Created" }, "422": { "description": "Validation error" } }
      }
    },
    "/crm/contacts/{id}": {
      "patch": { "operationId": "crmUpdateContact", "summary": "Update contact", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateContactRequest" } } } }, "responses": { "200": { "description": "Updated" } } },
      "delete": { "operationId": "crmDeleteContact", "summary": "Soft-delete contact", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "204": { "description": "Deleted" } } }
    },
    "/crm/leads": {
      "get": { "operationId": "crmListLeads", "summary": "List leads", "responses": { "200": { "description": "Leads" } } },
      "post": { "operationId": "crmCreateLead", "summary": "Create lead", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateLeadRequest" } } } }, "responses": { "201": { "description": "Created" }, "422": { "description": "Validation error" } } }
    },
    "/crm/leads/{id}": {
      "patch": { "operationId": "crmUpdateLead", "summary": "Update lead", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateLeadRequest" } } } }, "responses": { "200": { "description": "Updated" } } },
      "delete": { "operationId": "crmDeleteLead", "summary": "Soft-delete lead", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "204": { "description": "Deleted" } } }
    },
    "/crm/activities": {
      "get": { "operationId": "crmListActivities", "summary": "List activities", "responses": { "200": { "description": "Activities" } } },
      "post": { "operationId": "crmCreateActivity", "summary": "Create activity", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateActivityRequest" } } } }, "responses": { "201": { "description": "Created" }, "422": { "description": "Validation error" } } }
    },
    "/crm/activities/{id}": {
      "patch": { "operationId": "crmUpdateActivity", "summary": "Update activity", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateActivityRequest" } } } }, "responses": { "200": { "description": "Updated" } } },
      "delete": { "operationId": "crmDeleteActivity", "summary": "Soft-delete activity", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "204": { "description": "Deleted" } } }
    },
    "/crm/export": {
      "get": {
        "operationId": "crmExportBundle",
        "summary": "Export full CRM bundle",
        "responses": { "200": { "description": "Bundle JSON" } }
      }
    },
    "/crm/import": {
      "post": {
        "operationId": "crmImportBundle",
        "summary": "Import (upsert) CRM bundle",
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true } } } },
        "responses": { "200": { "description": "Import results" }, "422": { "description": "Validation error" } }
      }
    },
    "/crm/change_events": {
      "get": {
        "operationId": "crmListChangeEvents",
        "summary": "List CRM change events",
        "responses": { "200": { "description": "Events" } }
      }
    },
    "/workflows": {
      "get": {
        "operationId": "listWorkflows",
        "summary": "List workflows",
        "responses": {
          "200": {
            "description": "Workflows",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "workflows": { "type": "array", "items": { "$ref": "#/components/schemas/Workflow" } }
                  },
                  "required": ["workflows"]
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "createWorkflow",
        "summary": "Create workflow",
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateWorkflowRequest" } } } },
        "responses": { "201": { "description": "Created" }, "422": { "description": "Validation error" } }
      }
    },
    "/workflows/{id}": {
      "get": {
        "operationId": "getWorkflow",
        "summary": "Get workflow",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "responses": { "200": { "description": "Workflow" }, "404": { "description": "Not found" } }
      },
      "patch": {
        "operationId": "updateWorkflow",
        "summary": "Update workflow",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateWorkflowRequest" } } } },
        "responses": { "200": { "description": "Updated" }, "422": { "description": "Validation error" } }
      },
      "delete": {
        "operationId": "deleteWorkflow",
        "summary": "Delete workflow",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "responses": { "204": { "description": "Deleted" } }
      }
    },
    "/workflows/{id}/test": {
      "post": {
        "operationId": "testWorkflow",
        "summary": "Test workflow with sample input",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "requestBody": { "required": false, "content": { "application/json": { "schema": { "type": "object", "additionalProperties": true } } } },
        "responses": { "200": { "description": "Test outcome" }, "422": { "description": "Validation error" } }
      }
    },
    "/workflows/step_types": {
      "get": {
        "operationId": "workflowStepTypes",
        "summary": "List available workflow step types",
        "responses": { "200": { "description": "Step types" } }
      }
    }
  }
}

