{
  "openapi": "3.0.3",
  "info": {
    "title": "AI Seva — WhatsApp Automation Bot API",
    "version": "2.0.0",
    "description": "Complete REST API for **Claude AI Bridge**, **Memory Draft-and-Approval Workflow**, **Personal Profiles & Roles**, **Neo4j AuraDB Graph Memory**, **Bi-Directional Slack ↔ WhatsApp Sync**, **Multi-Session Management**, and **Human Pacing Engine**."
  },
  "servers": [
    {
      "url": "https://35-232-194-90.sslip.io",
      "description": "Current Server"
    },
    {
      "url": "http://35.232.194.90:3000",
      "description": "Production GCP VM"
    },
    {
      "url": "http://localhost:3000",
      "description": "Local Development"
    }
  ],
  "tags": [
    {
      "name": "1. Claude AI Bridge",
      "description": "Read chats, send messages as Claude, and toggle Claude vs. Auto-Bot mode"
    },
    {
      "name": "2. Memory Approval Queue",
      "description": "Human-in-the-loop review queue for new contacts and extracted facts"
    },
    {
      "name": "3. Personal Profiles & Roles",
      "description": "CRUD, Pause/Resume, and Visibility controls for personal contact profiles"
    },
    {
      "name": "4. Neo4j Graph Memory",
      "description": "AuraDB health check, credentials configuration, and graph synchronization"
    },
    {
      "name": "5. Temple Knowledge (Tier 3)",
      "description": "Organizational temple schedules, feast timings, and seva guidelines"
    },
    {
      "name": "6. Slack <-> WhatsApp Bridge",
      "description": "Slash commands (/whatsapp), thread sync webhook, and connection test"
    },
    {
      "name": "7. Sessions & Outbound API",
      "description": "Multi-session management, pairing codes, and paced outbound messaging"
    },
    {
      "name": "8. Human Pacing & Audit Log",
      "description": "Human typing simulation settings and live message audit trail"
    }
  ],
  "paths": {
    "/api/claude/conversations": {
      "get": {
        "tags": [
          "1. Claude AI Bridge"
        ],
        "summary": "List all conversations (Individual & Group Chats)",
        "description": "Returns all active WhatsApp Individual and Group conversations with message counts, last message preview, chatType (`individual` or `group`), and current bot mode (`auto` vs `claude`).",
        "parameters": [
          {
            "name": "type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "individual",
                "group"
              ],
              "default": "all"
            },
            "description": "Filter by chat type (`all`, `individual`, or `group`)"
          }
        ],
        "responses": {
          "200": {
            "description": "List of active individual and group conversations"
          }
        }
      }
    },
    "/api/claude/groups": {
      "get": {
        "tags": [
          "1. Claude AI Bridge"
        ],
        "summary": "List all WhatsApp Groups",
        "description": "Returns all participating WhatsApp groups with `jid` (`@g.us`), `name`, `participantCount`, `messageCount`, and `lastTimestamp`.",
        "responses": {
          "200": {
            "description": "List of participating WhatsApp groups"
          }
        }
      }
    },
    "/api/claude/groups/messages": {
      "get": {
        "tags": [
          "1. Claude AI Bridge"
        ],
        "summary": "Get Group Messages within a Time Period (All Groups or Specific Group)",
        "description": "Fetches all WhatsApp group messages within a defined time period (`startTime`/`endTime` or relative `hours`/`minutes`/`days`). Optionally filter by `groupJid`, `mediaType`, `sender`, or `search`.",
        "parameters": [
          {
            "name": "groupJid",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "120363025891234567@g.us"
            },
            "description": "Optional specific WhatsApp Group JID (`@g.us`). Leave empty to query across all groups."
          },
          {
            "name": "startTime",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "2026-10-19T00:00:00Z"
            },
            "description": "Start of time range (ISO-8601 timestamp or epoch ms). Aliases: `from`, `since`."
          },
          {
            "name": "endTime",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "2026-10-19T23:59:59Z"
            },
            "description": "End of time range (ISO-8601 timestamp or epoch ms). Aliases: `to`, `until`."
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "example": 24
            },
            "description": "Relative lookback window in hours (e.g., `24` for last 24 hours). Also supports `minutes` or `days`."
          },
          {
            "name": "mediaType",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "image",
                "video",
                "document",
                "audio"
              ]
            },
            "description": "Filter only messages containing a specific media attachment type"
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Case-insensitive text/caption/sender search filter"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 200
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Time-filtered list of group messages"
          }
        }
      }
    },
    "/api/claude/groups/{groupJid}/messages": {
      "get": {
        "tags": [
          "1. Claude AI Bridge"
        ],
        "summary": "Get Messages for a Specific Group within a Time Period",
        "description": "Fetches messages for a specific WhatsApp Group (`@g.us`) with optional time-range filtering (`startTime`, `endTime`, `hours`, `minutes`, `days`).",
        "parameters": [
          {
            "name": "groupJid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "example": "120363025891234567@g.us"
            },
            "description": "WhatsApp Group JID (`@g.us`)"
          },
          {
            "name": "startTime",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "2026-10-19T00:00:00Z"
            },
            "description": "Start of time range (ISO-8601 or epoch ms)"
          },
          {
            "name": "endTime",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "2026-10-19T23:59:59Z"
            },
            "description": "End of time range (ISO-8601 or epoch ms)"
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "example": 24
            },
            "description": "Relative lookback window in hours"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 200
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Group messages within the requested time range"
          }
        }
      }
    },
    "/api/claude/messages/{jid}": {
      "get": {
        "tags": [
          "1. Claude AI Bridge"
        ],
        "summary": "Get messages by LID / JID / Group JID / Phone (with Time-Range Filter)",
        "description": "Fetches message history for a specific Individual Contact (`918555837203`, `94876599374078@lid`) or Group (`120363...@g.us`), with optional time-range filtering (`startTime`, `endTime`, `hours`, `days`).",
        "parameters": [
          {
            "name": "jid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "example": "918555837203"
            },
            "description": "Phone number, WhatsApp JID, LID, or Group JID (`@g.us`)"
          },
          {
            "name": "startTime",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "2026-10-19T00:00:00Z"
            },
            "description": "Start time filter (ISO-8601 or epoch ms)"
          },
          {
            "name": "endTime",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "2026-10-19T23:59:59Z"
            },
            "description": "End time filter (ISO-8601 or epoch ms)"
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "example": 24
            },
            "description": "Relative lookback window in hours"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100
            },
            "description": "Maximum number of messages to return"
          }
        ],
        "responses": {
          "200": {
            "description": "Conversation or group message history"
          }
        }
      }
    },
    "/api/claude/messages": {
      "get": {
        "tags": [
          "1. Claude AI Bridge"
        ],
        "summary": "Get All Messages within a Defined Time Range (Individual & Group Chats)",
        "description": "Queries messages across all chats or a specific chat (`?jid=`) within a defined time range (`startTime`, `endTime`, `hours`, `minutes`, `days`). Supports filtering by `type` (`all`, `individual`, `group`), `mediaType`, `sender`, and `search`.",
        "parameters": [
          {
            "name": "jid",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "918555837203"
            },
            "description": "Optional Phone number, JID, LID, or Group JID (`@g.us`). Leave empty to search across all chats."
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "individual",
                "group"
              ],
              "default": "all"
            },
            "description": "Filter by chat type (`all`, `individual`, or `group`)"
          },
          {
            "name": "startTime",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "2026-10-19T00:00:00Z"
            },
            "description": "Start of time range (ISO-8601 or epoch ms). Aliases: `from`, `since`."
          },
          {
            "name": "endTime",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "2026-10-19T23:59:59Z"
            },
            "description": "End of time range (ISO-8601 or epoch ms). Aliases: `to`, `until`."
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "example": 24
            },
            "description": "Relative lookback window in hours (also supports `minutes`, `days`)"
          },
          {
            "name": "mediaType",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "image",
                "video",
                "document",
                "audio"
              ]
            },
            "description": "Filter by attachment media type"
          },
          {
            "name": "search",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Search keyword in message text, media caption, or sender name"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Messages matching the requested time range and filters"
          }
        }
      }
    },
    "/api/claude/send": {
      "post": {
        "tags": [
          "1. Claude AI Bridge"
        ],
        "summary": "Send Text, Photo, Video, or Attachment via Claude (Individual or Group)",
        "description": "Dispatches an outbound WhatsApp text message, Photo (`image`), Video (`video`), Document/Attachment (`document`), or Audio (`audio`) to an Individual Contact or Group JID (`@g.us`) with full delivery and group-receipt tracking.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "to"
                ],
                "properties": {
                  "to": {
                    "type": "string",
                    "example": "918555837203",
                    "description": "Recipient phone number, JID, LID, or Group JID (`120363...@g.us`)"
                  },
                  "message": {
                    "type": "string",
                    "example": "Hare Krishna Bala Prabhu! Please find the temple schedule attached 🙏",
                    "description": "Text message or media caption"
                  },
                  "mediaType": {
                    "type": "string",
                    "enum": [
                      "text",
                      "image",
                      "video",
                      "document",
                      "audio"
                    ],
                    "example": "image",
                    "description": "Optional media type (`image` for Photo, `video` for Video, `document` for PDF/Attachment)"
                  },
                  "mediaUrl": {
                    "type": "string",
                    "example": "https://picsum.photos/800/600.jpg",
                    "description": "Public HTTPS URL of the Photo, Video, or Attachment to send"
                  },
                  "mediaBase64": {
                    "type": "string",
                    "description": "Base64-encoded file payload or `data:<mime>;base64,...` URI (alternative to `mediaUrl`)"
                  },
                  "fileName": {
                    "type": "string",
                    "example": "Sunday-Feast-Schedule.pdf",
                    "description": "Filename for documents/attachments"
                  },
                  "mimeType": {
                    "type": "string",
                    "example": "image/jpeg",
                    "description": "Optional explicit MIME type"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Message or media attachment queued and dispatched with queueId for delivery tracking"
          }
        }
      }
    },
    "/api/claude/send-media": {
      "post": {
        "tags": [
          "1. Claude AI Bridge"
        ],
        "summary": "Send Photo, Video, or File Attachment to Individual or Group Chat",
        "description": "Dedicated endpoint for sending Photos (`image`), Videos (`video`), Documents/Attachments (`document`), and Audio (`audio`) via `mediaUrl` or `mediaBase64` to any Individual or Group chat.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "to",
                  "mediaType"
                ],
                "properties": {
                  "to": {
                    "type": "string",
                    "example": "918555837203",
                    "description": "Recipient phone, JID, or Group JID (`@g.us`)"
                  },
                  "mediaType": {
                    "type": "string",
                    "enum": [
                      "image",
                      "video",
                      "document",
                      "audio"
                    ],
                    "example": "image"
                  },
                  "mediaUrl": {
                    "type": "string",
                    "example": "https://picsum.photos/800/600.jpg"
                  },
                  "mediaBase64": {
                    "type": "string",
                    "description": "Base64 file content (alternative to `mediaUrl`)"
                  },
                  "caption": {
                    "type": "string",
                    "example": "Darshan photo from today 🙏"
                  },
                  "fileName": {
                    "type": "string",
                    "example": "darshan.jpg"
                  },
                  "mimeType": {
                    "type": "string",
                    "example": "image/jpeg"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Media attachment queued and dispatched"
          }
        }
      }
    },
    "/api/claude/delivery": {
      "get": {
        "tags": [
          "1. Claude AI Bridge"
        ],
        "summary": "Get Delivery Details & Group Receipts for Messages",
        "description": "Returns delivery status (`queued`, `sent`, `delivered`, `read`, `failed`), WhatsApp status codes (`1..5`), timestamps (`sentAt`, `deliveredAt`, `readAt`), and per-participant group read/delivery receipts (`groupReceipts`) for any message or previous messages in a group/chat.",
        "parameters": [
          {
            "name": "messageId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "3EB0A1B2C3D4E5F6"
            },
            "description": "Optional specific WhatsApp `messageId` or `queueId` (`msg_...`)"
          },
          {
            "name": "jid",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "example": "918555837203"
            },
            "description": "Optional Chat JID, Phone, or Group JID (`@g.us`) to inspect delivery of previous messages in that chat/group"
          },
          {
            "name": "isGroupOnly",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "default": false
            },
            "description": "Set `true` to only return delivery details for Group messages"
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "example": 24
            },
            "description": "Optional relative time window in hours (also supports `startTime` and `endTime`)"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivery status breakdown and per-message receipt details"
          }
        }
      }
    },
    "/api/claude/messages/{messageId}/delivery": {
      "get": {
        "tags": [
          "1. Claude AI Bridge"
        ],
        "summary": "Get Delivery Details for a Specific Message ID",
        "description": "Fetches real-time delivery status, timestamps, and group participant receipts for a specific `messageId` or `queueId`.",
        "parameters": [
          {
            "name": "messageId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "example": "3EB0A1B2C3D4E5F6"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Delivery receipt details for the specified message"
          }
        }
      }
    },
    "/api/claude/groups/{groupJid}/delivery": {
      "get": {
        "tags": [
          "1. Claude AI Bridge"
        ],
        "summary": "Get Delivery Details for Previous Messages in a Group",
        "description": "Fetches delivery status and per-participant group receipts (`delivered` / `read`) for messages in a specific WhatsApp Group.",
        "parameters": [
          {
            "name": "groupJid",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "example": "120363025891234567@g.us"
            }
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "example": 24
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Group message delivery and participant receipt details"
          }
        }
      }
    },
    "/api/claude/mode": {
      "post": {
        "tags": [
          "1. Claude AI Bridge"
        ],
        "summary": "Toggle Claude / Auto-Bot Mode",
        "description": "Switches a contact or group between autonomous Gemini replies (`auto`) and manual Claude takeover (`claude`).",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "jidOrPhone",
                  "mode"
                ],
                "properties": {
                  "jidOrPhone": {
                    "type": "string",
                    "example": "918555837203"
                  },
                  "mode": {
                    "type": "string",
                    "enum": [
                      "auto",
                      "claude"
                    ],
                    "example": "claude"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Chat mode updated"
          }
        }
      }
    },
    "/api/memory/drafts": {
      "get": {
        "tags": [
          "2. Memory Approval Queue"
        ],
        "summary": "Get Memory Drafts by Status",
        "description": "Lists candidate facts and new contact requests in the Memory Approval Queue.",
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "draft",
                "approved",
                "rejected",
                "all"
              ],
              "default": "draft"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "List of draft memories"
          }
        }
      },
      "post": {
        "tags": [
          "2. Memory Approval Queue"
        ],
        "summary": "Create / Simulate Candidate Draft Memory",
        "description": "Injects a candidate fact or new contact into the Memory Approval Queue with `status: \"draft\"`.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "phone",
                  "fact"
                ],
                "properties": {
                  "phone": {
                    "type": "string",
                    "example": "918555837203"
                  },
                  "contactName": {
                    "type": "string",
                    "example": "Bala Ganesh"
                  },
                  "category": {
                    "type": "string",
                    "example": "Seva Preference"
                  },
                  "fact": {
                    "type": "string",
                    "example": "Available for Saturday morning book distribution (9 AM - 12 PM)"
                  },
                  "sourceMessage": {
                    "type": "string",
                    "example": "Prabhu, I can come Saturday 9 to 12 for book distribution"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Draft memory created"
          }
        }
      }
    },
    "/api/memory/drafts/{draftId}/approve": {
      "post": {
        "tags": [
          "2. Memory Approval Queue"
        ],
        "summary": "Edit & Approve Draft Memory",
        "description": "Approves a pending draft (with optional inline edits), activates the contact profile if new, and syncs to Neo4j.",
        "parameters": [
          {
            "name": "draftId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "example": "draft_1792247719952_0aib"
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "fact": {
                    "type": "string",
                    "example": "Approved devotee for weekend book distribution seva"
                  },
                  "category": {
                    "type": "string",
                    "example": "Approved Contact"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Draft approved and committed to active memory"
          }
        }
      }
    },
    "/api/memory/drafts/{draftId}/reject": {
      "post": {
        "tags": [
          "2. Memory Approval Queue"
        ],
        "summary": "Reject Draft Memory",
        "description": "Dismisses a candidate draft memory so it is not added to active memory.",
        "parameters": [
          {
            "name": "draftId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "example": "draft_1792247719952_0aib"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Draft rejected"
          }
        }
      }
    },
    "/api/memory/profiles": {
      "get": {
        "tags": [
          "3. Personal Profiles & Roles"
        ],
        "summary": "List All Personal Profiles",
        "description": "Returns all saved personal contact profiles (Tier 1 & Tier 2 memory).",
        "responses": {
          "200": {
            "description": "Array of contact profiles"
          }
        }
      },
      "post": {
        "tags": [
          "3. Personal Profiles & Roles"
        ],
        "summary": "Create or Update Personal Profile",
        "description": "Creates a new contact profile or updates an existing profile with role, authority boundaries, tone, personal notes, and visibility.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name",
                  "phone"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Bala Ganesh"
                  },
                  "title": {
                    "type": "string",
                    "example": "Bala Ganesh Prabhu"
                  },
                  "phone": {
                    "type": "string",
                    "example": "918555837203"
                  },
                  "role": {
                    "type": "string",
                    "example": "Department Coordinator"
                  },
                  "department": {
                    "type": "string",
                    "example": "Book Distribution & Youth Outreach"
                  },
                  "authority": {
                    "type": "string",
                    "example": "Can assign seva slots and coordinate book tables"
                  },
                  "offLimits": {
                    "type": "string",
                    "example": "Do not discuss temple financial budgeting"
                  },
                  "greeting": {
                    "type": "string",
                    "example": "Hare Krishna Bala Ganesh Prabhu! 🙏"
                  },
                  "tone": {
                    "type": "string",
                    "example": "Devotional, respectful, and organized"
                  },
                  "visibility": {
                    "type": "string",
                    "enum": [
                      "private",
                      "coordinator",
                      "general"
                    ],
                    "example": "coordinator"
                  },
                  "personalNotes": {
                    "type": "string",
                    "example": "- Prefers weekend book distribution seva"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Saved profile object"
          }
        }
      }
    },
    "/api/memory/profiles/{id}": {
      "put": {
        "tags": [
          "3. Personal Profiles & Roles"
        ],
        "summary": "Update Specific Profile by ID",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "example": "prof_8555837203"
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "example": "Bala Ganesh"
                  },
                  "role": {
                    "type": "string",
                    "example": "Department Coordinator"
                  },
                  "visibility": {
                    "type": "string",
                    "enum": [
                      "private",
                      "coordinator",
                      "general"
                    ],
                    "example": "coordinator"
                  },
                  "personalNotes": {
                    "type": "string",
                    "example": "Updated personal notes"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated profile"
          }
        }
      },
      "delete": {
        "tags": [
          "3. Personal Profiles & Roles"
        ],
        "summary": "Delete Personal Profile",
        "description": "Safely removes a contact profile and its associated personal records.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "example": "prof_123456"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Profile deleted"
          }
        }
      }
    },
    "/api/memory/profiles/{id}/toggle": {
      "post": {
        "tags": [
          "3. Personal Profiles & Roles"
        ],
        "summary": "Pause / Resume Bot Replies for Profile",
        "description": "Toggles profile status between `active` (bot auto-replies) and `paused` (bot stays silent).",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "example": "prof_8555837203"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Updated profile with toggled status"
          }
        }
      }
    },
    "/api/neo4j/health": {
      "get": {
        "tags": [
          "4. Neo4j Graph Memory"
        ],
        "summary": "Neo4j Health & Graph Data",
        "description": "Returns Neo4j AuraDB connection status, node/relationship counts, and full graph nodes/edges for visualization.",
        "responses": {
          "200": {
            "description": "Neo4j health and graph topology"
          }
        }
      }
    },
    "/api/neo4j/config": {
      "post": {
        "tags": [
          "4. Neo4j Graph Memory"
        ],
        "summary": "Configure Neo4j AuraDB Credentials",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "uri",
                  "password"
                ],
                "properties": {
                  "uri": {
                    "type": "string",
                    "example": "neo4j+s://d43fa0fb.databases.neo4j.io"
                  },
                  "username": {
                    "type": "string",
                    "example": "neo4j"
                  },
                  "password": {
                    "type": "string",
                    "example": "your-aura-password"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Neo4j connection status"
          }
        }
      }
    },
    "/api/neo4j/sync-all": {
      "post": {
        "tags": [
          "4. Neo4j Graph Memory"
        ],
        "summary": "Sync All Profiles & Facts to Neo4j",
        "description": "Pushes all local profiles, roles, relationships, and approved facts to Neo4j AuraDB.",
        "responses": {
          "200": {
            "description": "Sync summary"
          }
        }
      }
    },
    "/api/memory/org": {
      "get": {
        "tags": [
          "5. Temple Knowledge (Tier 3)"
        ],
        "summary": "Get Temple Organizational Knowledge",
        "responses": {
          "200": {
            "description": "Organizational knowledge object"
          }
        }
      },
      "post": {
        "tags": [
          "5. Temple Knowledge (Tier 3)"
        ],
        "summary": "Update Temple Organizational Knowledge",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "templeName": {
                    "type": "string",
                    "example": "Hare Krishna Movement / ISKCON Center"
                  },
                  "dailySchedule": {
                    "type": "string",
                    "example": "Mangala Aarti: 4:30 AM, Darshan Aarti: 7:30 AM, Gaura Aarti: 7:00 PM"
                  },
                  "sundayFeast": {
                    "type": "string",
                    "example": "Sunday Love Feast: 5:30 PM Kirtan, 6:00 PM Discourse, 7:30 PM Prasadam"
                  },
                  "sevaGuidelines": {
                    "type": "string",
                    "example": "Volunteers should arrive 15 mins early in modest devotional attire"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated organizational knowledge"
          }
        }
      }
    },
    "/api/slack/test": {
      "get": {
        "tags": [
          "6. Slack <-> WhatsApp Bridge"
        ],
        "summary": "Test Slack Connection",
        "description": "Verifies Slack Bot Token authentication and sends a test verification message to Slack.",
        "responses": {
          "200": {
            "description": "Slack connection test result"
          }
        }
      }
    },
    "/api/slack/commands": {
      "post": {
        "tags": [
          "6. Slack <-> WhatsApp Bridge"
        ],
        "summary": "Execute /whatsapp Slash Command",
        "description": "Simulates or handles Slack `/whatsapp <phone> <message>` command to dispatch a WhatsApp message immediately.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "text"
                ],
                "properties": {
                  "command": {
                    "type": "string",
                    "example": "/whatsapp"
                  },
                  "text": {
                    "type": "string",
                    "example": "8555837203 Hare Krishna Bala Prabhu! 🙏"
                  },
                  "user_name": {
                    "type": "string",
                    "example": "vedavittamadasa"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Slash command response"
          }
        }
      }
    },
    "/api/slack/events": {
      "post": {
        "tags": [
          "6. Slack <-> WhatsApp Bridge"
        ],
        "summary": "Slack Events Webhook (Way 2: Thread Reply -> WhatsApp)",
        "description": "Receives Slack URL verification challenge and `message` events inside threads to forward human replies back to WhatsApp.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "type": {
                    "type": "string",
                    "example": "event_callback"
                  },
                  "event": {
                    "type": "object",
                    "properties": {
                      "type": {
                        "type": "string",
                        "example": "message"
                      },
                      "channel": {
                        "type": "string",
                        "example": "C0C55DVC7QU"
                      },
                      "thread_ts": {
                        "type": "string",
                        "example": "1792246000.000100"
                      },
                      "text": {
                        "type": "string",
                        "example": "Hare Krishna Prabhu, replying from Slack thread!"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Event processed"
          }
        }
      }
    },
    "/api/sessions": {
      "get": {
        "tags": [
          "7. Sessions & Outbound API"
        ],
        "summary": "List All WhatsApp Bot Sessions",
        "responses": {
          "200": {
            "description": "Active and standby WhatsApp sessions"
          }
        }
      },
      "post": {
        "tags": [
          "7. Sessions & Outbound API"
        ],
        "summary": "Create New WhatsApp Session",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "sessionId"
                ],
                "properties": {
                  "sessionId": {
                    "type": "string",
                    "example": "temple_helpdesk"
                  },
                  "ownerName": {
                    "type": "string",
                    "example": "Temple Helpdesk"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Created session info"
          }
        }
      }
    },
    "/api/messages/send": {
      "post": {
        "tags": [
          "7. Sessions & Outbound API"
        ],
        "summary": "Send Paced Outbound WhatsApp Message",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "recipient",
                  "text"
                ],
                "properties": {
                  "recipient": {
                    "type": "string",
                    "example": "918555837203"
                  },
                  "text": {
                    "type": "string",
                    "example": "Hare Krishna! Paced outbound test message."
                  },
                  "priority": {
                    "type": "string",
                    "enum": [
                      "normal",
                      "high"
                    ],
                    "example": "high"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Message queued for paced delivery"
          }
        }
      }
    },
    "/api/messages/queue": {
      "get": {
        "tags": [
          "7. Sessions & Outbound API"
        ],
        "summary": "Get Outbound Pacing Queue & Delivery Stats",
        "responses": {
          "200": {
            "description": "Queue status and recent outbound messages"
          }
        }
      }
    },
    "/api/pacing/config": {
      "get": {
        "tags": [
          "8. Human Pacing & Audit Log"
        ],
        "summary": "Get Human Pacing Delay Settings",
        "responses": {
          "200": {
            "description": "Current reading, thinking, and typing speed settings"
          }
        }
      },
      "post": {
        "tags": [
          "8. Human Pacing & Audit Log"
        ],
        "summary": "Update Human Pacing Delay Settings",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "minReadDelayMs": {
                    "type": "integer",
                    "example": 1500
                  },
                  "minThinkDelayMs": {
                    "type": "integer",
                    "example": 1200
                  },
                  "typingSpeedMsPerChar": {
                    "type": "integer",
                    "example": 35
                  },
                  "pacingEnabled": {
                    "type": "boolean",
                    "example": true
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Updated pacing configuration"
          }
        }
      }
    },
    "/api/memory/audit": {
      "get": {
        "tags": [
          "8. Human Pacing & Audit Log"
        ],
        "summary": "Get Live Message Review & Audit Logs",
        "responses": {
          "200": {
            "description": "Recent audit log entries across Gemini, Claude, Slack, and Approval Queue"
          }
        }
      }
    }
  }
}