{"openapi":"3.0.0","paths":{"/v1/me":{"get":{"description":"Devuelve los permisos efectivos otorgados por el Personal Access Token autenticado.","operationId":"MeController_getMe","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponseDto"}}}},"401":{"description":"Token inválido, revocado o expirado"}},"security":[{"PAT":[]}],"summary":"Obtener permisos efectivos del token","tags":["me"]}},"/v1/me/projects":{"get":{"operationId":"MeController_listProjects","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"PAT":[]}],"summary":"Listar projects de la company autenticada. Útil para que el CLI elija project context.","tags":["me"]}},"/v1/me/token":{"delete":{"description":"Marca el PAT con el que se autenticó esta request como revocado. Próximas requests con el mismo token devolverán 401.","operationId":"MeController_revokeCurrentToken","parameters":[],"responses":{"204":{"description":""},"401":{"description":"Token inválido, revocado o expirado"}},"security":[{"PAT":[]}],"summary":"Revocar el token actualmente autenticado (logout server-side)","tags":["me"]}},"/v1/app/auth/login":{"post":{"operationId":"AppAuthController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppLoginDto"}}}},"responses":{"200":{"description":""}},"summary":"Login de operador (email/password) → JWT","tags":["app"]}},"/v1/app/auth/refresh":{"post":{"operationId":"AppAuthController_refresh","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppRefreshDto"}}}},"responses":{"200":{"description":""}},"summary":"Renovar el access token con el refresh token","tags":["app"]}},"/v1/app/auth/logout":{"post":{"operationId":"AppAuthController_logout","parameters":[],"responses":{"204":{"description":""}},"summary":"Cerrar la sesión actual","tags":["app"]}},"/v1/app/users/me":{"get":{"operationId":"AppUsersController_me","parameters":[],"responses":{"200":{"description":""}},"summary":"Perfil del operador autenticado","tags":["app"]}},"/v1/app/chat-users/with-messages":{"get":{"operationId":"AppChatUsersController_withMessages","parameters":[],"responses":{"200":{"description":""}},"summary":"Conversaciones con su último mensaje","tags":["app"]}},"/v1/app/chat-users/{id}/mark-read":{"post":{"operationId":"AppChatUsersController_markRead","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppMarkReadDto"}}}},"responses":{"204":{"description":""}},"summary":"Marcar la conversación como leída","tags":["app"]}},"/v1/app/messages/chat-user/{chatUserId}":{"get":{"operationId":"AppMessagesController_byChatUser","parameters":[{"name":"chatUserId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Mensajes de una conversación","tags":["app"]}},"/v1/app/messages":{"post":{"operationId":"AppMessagesController_send","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppSendMessageDto"}}}},"responses":{"201":{"description":""}},"summary":"Enviar un mensaje de agente","tags":["app"]}},"/v1/app/appointments":{"get":{"operationId":"AppAgendaController_list","parameters":[],"responses":{"200":{"description":""}},"summary":"Citas del operador en un rango de fechas","tags":["app"]},"post":{"operationId":"AppAgendaController_create","parameters":[{"name":"idempotency-key","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppAppointmentCreateDto"}}}},"responses":{"201":{"description":""}},"summary":"Crear una cita","tags":["app"]}},"/v1/app/appointments/{id}":{"get":{"operationId":"AppAgendaController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Detalle de una cita","tags":["app"]},"put":{"operationId":"AppAgendaController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"idempotency-key","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppAppointmentUpdateDto"}}}},"responses":{"200":{"description":""}},"summary":"Editar una cita","tags":["app"]}},"/v1/app/appointments/{id}/move":{"patch":{"operationId":"AppAgendaController_move","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"idempotency-key","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppAppointmentMoveDto"}}}},"responses":{"200":{"description":""}},"summary":"Reprogramar una cita","tags":["app"]}},"/v1/app/appointments/{id}/status":{"patch":{"operationId":"AppAgendaController_status","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"idempotency-key","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppAppointmentStatusDto"}}}},"responses":{"200":{"description":""}},"summary":"Cambiar el estado de una cita","tags":["app"]}},"/v1/app/appointments/{id}/cancel":{"post":{"operationId":"AppAgendaController_cancel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"idempotency-key","required":true,"in":"header","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppAppointmentCancelDto"}}}},"responses":{"201":{"description":""}},"summary":"Cancelar una cita","tags":["app"]}},"/v1/app/professionals/visible":{"get":{"operationId":"AppProfessionalsController_visible","parameters":[],"responses":{"200":{"description":""}},"summary":"Profesionales que el operador puede ver","tags":["app"]}},"/v1/app/config/appointments":{"get":{"operationId":"AppCatalogController_appointmentsConfig","parameters":[],"responses":{"200":{"description":""}},"summary":"Configuración de la agenda","tags":["app"]}},"/v1/app/branches":{"get":{"operationId":"AppCatalogController_branches","parameters":[],"responses":{"200":{"description":""}},"summary":"Sucursales","tags":["app"]}},"/v1/app/services":{"get":{"operationId":"AppCatalogController_services","parameters":[],"responses":{"200":{"description":""}},"summary":"Servicios","tags":["app"]}},"/v1/app/copilot/query-stream":{"post":{"operationId":"AppCopilotController_queryStream","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppCopilotQueryDto"}}}},"responses":{"201":{"description":""}},"summary":"Consultar al copilot (stream NDJSON)","tags":["app"]}},"/v1/messages/text":{"post":{"operationId":"PublicMessagesController_sendText","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendTextDto"}}}},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleSendResponse"}}}}},"security":[{"PAT":[]}],"summary":"Send a free-form text message","tags":["messages"]}},"/v1/messages/template":{"post":{"operationId":"PublicMessagesController_sendTemplate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendTemplateDto"}}}},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleSendResponse"}}}}},"security":[{"PAT":[]}],"summary":"Send an approved WhatsApp template","tags":["messages"]}},"/v1/messages/image":{"post":{"operationId":"PublicMessagesController_sendImage","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendImageDto"}}}},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleSendResponse"}}}}},"security":[{"PAT":[]}],"summary":"Send an image (by URL or previously uploaded media_id)","tags":["messages"]}},"/v1/messages/video":{"post":{"operationId":"PublicMessagesController_sendVideo","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendVideoDto"}}}},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleSendResponse"}}}}},"security":[{"PAT":[]}],"summary":"Send a video","tags":["messages"]}},"/v1/messages/audio":{"post":{"operationId":"PublicMessagesController_sendAudio","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendAudioDto"}}}},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleSendResponse"}}}}},"security":[{"PAT":[]}],"summary":"Send audio (voice/PTT supported)","tags":["messages"]}},"/v1/messages/document":{"post":{"operationId":"PublicMessagesController_sendDocument","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendDocumentDto"}}}},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleSendResponse"}}}}},"security":[{"PAT":[]}],"summary":"Send a document (PDF, DOCX, etc.)","tags":["messages"]}},"/v1/messages/sticker":{"post":{"operationId":"PublicMessagesController_sendSticker","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendStickerDto"}}}},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleSendResponse"}}}}},"security":[{"PAT":[]}],"summary":"Send a sticker","tags":["messages"]}},"/v1/messages/location":{"post":{"operationId":"PublicMessagesController_sendLocation","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendLocationDto"}}}},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleSendResponse"}}}}},"security":[{"PAT":[]}],"summary":"Send a geo location pin","tags":["messages"]}},"/v1/messages/contacts":{"post":{"operationId":"PublicMessagesController_sendContacts","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendContactsDto"}}}},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleSendResponse"}}}}},"security":[{"PAT":[]}],"summary":"Send one or more contact cards (vCard-style)","tags":["messages"]}},"/v1/messages/reaction":{"post":{"operationId":"PublicMessagesController_sendReaction","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendReactionDto"}}}},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleSendResponse"}}}}},"security":[{"PAT":[]}],"summary":"React with an emoji to a previous message","tags":["messages"]}},"/v1/messages/mark-read":{"post":{"operationId":"PublicMessagesController_markRead","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkReadDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkReadResponse"}}}}},"security":[{"PAT":[]}],"summary":"Mark a received message as read (optionally show typing)","tags":["messages"]}},"/v1/messages/interactive/buttons":{"post":{"operationId":"PublicMessagesController_sendInteractiveButtons","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendInteractiveButtonsDto"}}}},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleSendResponse"}}}}},"security":[{"PAT":[]}],"summary":"Send an interactive button message (max 3 buttons)","tags":["messages"]}},"/v1/messages/interactive/list":{"post":{"operationId":"PublicMessagesController_sendInteractiveList","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendInteractiveListDto"}}}},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleSendResponse"}}}}},"security":[{"PAT":[]}],"summary":"Send an interactive list message","tags":["messages"]}},"/v1/messages/interactive/cta-url":{"post":{"operationId":"PublicMessagesController_sendInteractiveCtaUrl","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendInteractiveCtaUrlDto"}}}},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleSendResponse"}}}}},"security":[{"PAT":[]}],"summary":"Send a CTA URL message with a tappable link","tags":["messages"]}},"/v1/messages/interactive/catalog":{"post":{"operationId":"PublicMessagesController_sendInteractiveCatalog","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendInteractiveCatalogDto"}}}},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleSendResponse"}}}}},"security":[{"PAT":[]}],"summary":"Send a catalog interactive message","tags":["messages"]}},"/v1/messages/raw":{"post":{"operationId":"PublicMessagesController_sendRaw","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendRawDto"}}}},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SingleSendResponse"}}}}},"security":[{"PAT":[]}],"summary":"Escape hatch: forward a raw Meta Graph API body to /{phone_number_id}/messages","tags":["messages"]}},"/v1/messages/bulk":{"post":{"operationId":"PublicMessagesController_sendBulk","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendBulkDto"}}}},"responses":{"202":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkDispatchResponse"}}}}},"security":[{"PAT":[]}],"summary":"Schedule a bulk template broadcast to many recipients","tags":["messages"]}},"/v1/messages/bulk/{broadcastId}":{"get":{"operationId":"PublicMessagesController_getBulkStatus","parameters":[{"name":"broadcastId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkStatusResponse"}}}}},"security":[{"PAT":[]}],"summary":"Status of a previously scheduled bulk broadcast","tags":["messages"]}},"/v1/media/upload":{"post":{"operationId":"PublicMediaController_uploadMedia","parameters":[],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/UploadMediaDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaUploadResponse"}}}}},"security":[{"PAT":[]}],"summary":"Upload a media file to WhatsApp. Returns a media_id usable in send-{image,video,audio,document,sticker} endpoints.","tags":["media"]}},"/v1/media/{mediaId}":{"get":{"operationId":"PublicMediaController_getMedia","parameters":[{"name":"mediaId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phone_number_id","required":true,"in":"query","schema":{"example":"100000000000001","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MediaMetadataResponse"}}}}},"security":[{"PAT":[]}],"summary":"Get WhatsApp media metadata","tags":["media"]},"delete":{"operationId":"PublicMediaController_deleteMedia","parameters":[{"name":"mediaId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phone_number_id","required":true,"in":"query","schema":{"example":"100000000000001","type":"string"}}],"responses":{"204":{"description":""}},"security":[{"PAT":[]}],"summary":"Delete a previously uploaded WhatsApp media","tags":["media"]}},"/v1/media/{mediaId}/download":{"get":{"operationId":"PublicMediaController_downloadMedia","parameters":[{"name":"mediaId","required":true,"in":"path","schema":{"type":"string"}},{"name":"phone_number_id","required":true,"in":"query","schema":{"example":"100000000000001","type":"string"}}],"responses":{"200":{"description":""}},"security":[{"PAT":[]}],"summary":"Download the binary contents of a WhatsApp media","tags":["media"]}},"/v1/templates":{"get":{"operationId":"PublicTemplatesController_list","parameters":[{"name":"page","required":false,"in":"query","schema":{"default":0,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"maximum":100,"default":50,"type":"number"}},{"name":"status","required":false,"in":"query","schema":{"default":"APPROVED","type":"string","enum":["PENDING","IN_REVIEW","REJECTED","APPROVED","PAUSED","DISABLED","IN_APPEAL"]}},{"name":"channel_id","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedTemplatesResponse"}}}}},"security":[{"PAT":[]}],"summary":"Listar templates aprobados de la company","tags":["templates"]},"post":{"operationId":"PublicTemplatesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTemplateDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTemplateDto"}}}}},"security":[{"PAT":[]}],"summary":"Crear un template de WhatsApp y enviarlo a Meta para aprobación","tags":["templates"]}},"/v1/templates/{id}":{"patch":{"operationId":"PublicTemplatesController_update","parameters":[{"name":"id","required":true,"in":"path","description":"ObjectId del template","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTemplateDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicTemplateDto"}}}}},"security":[{"PAT":[]}],"summary":"Editar un template existente","tags":["templates"]}},"/v1/webhooks":{"post":{"description":"Devuelve el secret raw UNA SOLA VEZ. Guárdalo de inmediato — no se puede recuperar.","operationId":"PublicWebhooksController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreatedResponseDto"}}}}},"security":[{"PAT":[]}],"summary":"Crear una subscripción de webhook saliente","tags":["webhooks"]},"get":{"operationId":"PublicWebhooksController_list","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookListResponseDto"}}}}},"security":[{"PAT":[]}],"summary":"Listar subscripciones de webhooks de la company","tags":["webhooks"]}},"/v1/webhooks/{id}":{"get":{"operationId":"PublicWebhooksController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponseDto"}}}}},"security":[{"PAT":[]}],"summary":"Obtener una subscripción","tags":["webhooks"]},"patch":{"operationId":"PublicWebhooksController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponseDto"}}}}},"security":[{"PAT":[]}],"summary":"Actualizar una subscripción","tags":["webhooks"]},"delete":{"operationId":"PublicWebhooksController_delete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"PAT":[]}],"summary":"Eliminar una subscripción","tags":["webhooks"]}},"/v1/webhooks/{id}/rotate-secret":{"post":{"operationId":"PublicWebhooksController_rotateSecret","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreatedResponseDto"}}}}},"security":[{"PAT":[]}],"summary":"Rotar el secret. El secret anterior queda inválido inmediatamente.","tags":["webhooks"]}},"/v1/webhooks/{id}/test":{"post":{"operationId":"PublicWebhooksController_test","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestWebhookDto"}}}},"responses":{"202":{"description":""}},"security":[{"PAT":[]}],"summary":"Disparar un evento sintético hacia la URL configurada (para pruebas).","tags":["webhooks"]}},"/v1/webhooks/{id}/deliveries":{"get":{"operationId":"PublicWebhooksController_listDeliveries","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"maximum":200,"default":50,"type":"number"}},{"name":"cursor","required":false,"in":"query","description":"Cursor de paginación (delivery id).","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryListResponseDto"}}}}},"security":[{"PAT":[]}],"summary":"Historial de deliveries de la subscripción.","tags":["webhooks"]}},"/v1/channels":{"get":{"operationId":"PublicChannelsController_list","parameters":[{"name":"type","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"PAT":[]}],"summary":"Listar canales activos de la company.","tags":["channels"]}},"/v1/channels/{id}":{"get":{"operationId":"PublicChannelsController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"PAT":[]}],"summary":"Obtener un canal por id.","tags":["channels"]}},"/v1/channels/whatsapp/connect":{"post":{"operationId":"PublicChannelsController_initiateWhatsappConnect","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WhatsappConnectRequestDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"PAT":[]}],"summary":"Inicia un flow de conexión de WhatsApp Business desde el CLI. Devuelve una URL del portal donde el usuario completa el embedded signup.","tags":["channels"]}},"/v1/channels/whatsapp/connect/{sessionId}":{"get":{"operationId":"PublicChannelsController_pollWhatsappConnect","parameters":[{"name":"sessionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"PAT":[]}],"summary":"Polling: estado de la sesión de conexión. Cuando status=completed devuelve el canal creado.","tags":["channels"]}},"/v1/channels/whatsapp/connect/{sessionId}/qr-stream":{"get":{"operationId":"PublicChannelsController_streamWhatsappQrConnect","parameters":[{"name":"sessionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"PAT":[]}],"summary":"Stream SSE de eventos de pairing por QR (events: qr | connecting | connected | failed | disconnected). Sólo para sesiones iniciadas con mode=qr.","tags":["channels"]}},"/v1/whatsapp/numbers":{"get":{"operationId":"PublicWhatsappNumbersController_list","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"PAT":[]}],"summary":"Lista los números de WhatsApp Business conectados a la company.","tags":["whatsapp"]}},"/v1/knowledge/tree":{"get":{"operationId":"PublicKnowledgeController_getTree","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeTreeResponseDto"}}}}},"security":[{"PAT":[]}],"summary":"Obtener el árbol completo de carpetas y documentos de la base de conocimientos.","tags":["knowledge"]}},"/v1/knowledge/folders":{"post":{"operationId":"PublicKnowledgeController_createFolder","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFolderDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeNodeDto"}}}}},"security":[{"PAT":[]}],"summary":"Crear una carpeta en la base de conocimientos.","tags":["knowledge"]}},"/v1/knowledge/documents":{"post":{"operationId":"PublicKnowledgeController_createDocument","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDocumentDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KnowledgeNodeDto"}}}}},"security":[{"PAT":[]}],"summary":"Crear un documento desde markdown. El contenido se convierte a BlockNote y se reindexa para búsquedas.","tags":["knowledge"]}},"/v1/knowledge/nodes/{id}":{"delete":{"operationId":"PublicKnowledgeController_deleteNode","parameters":[{"name":"id","required":true,"in":"path","description":"ObjectId del nodo a eliminar.","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"PAT":[]}],"summary":"Eliminar un nodo (carpeta o documento). Si es carpeta, elimina sus descendientes.","tags":["knowledge"]}},"/v1/knowledge/search":{"post":{"operationId":"PublicKnowledgeController_search","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchKnowledgeDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchKnowledgeResponseDto"}}}}},"security":[{"PAT":[]}],"summary":"Buscar en la base de conocimientos por full-text, vector o híbrido.","tags":["knowledge"]}},"/v1/knowledge/assignments":{"post":{"operationId":"PublicKnowledgeController_assign","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignKnowledgeDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignKnowledgeResponseDto"}}}}},"security":[{"PAT":[]}],"summary":"Asignar nodos de la base de conocimientos a todos los workers de un asistente.","tags":["knowledge"]}},"/v1/assistants":{"get":{"operationId":"PublicAssistantsController_list","parameters":[{"name":"q","required":false,"in":"query","description":"Filtro por nombre (búsqueda parcial, case-insensitive).","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"minimum":1,"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":100,"default":25,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedAssistantsResponse"}}}}},"security":[{"PAT":[]}],"summary":"Listar y buscar asistentes activos de la company.","tags":["assistants"]}},"/v1/scheduling/branches":{"get":{"operationId":"PublicBranchesController_list","parameters":[{"name":"search","required":false,"in":"query","description":"Búsqueda libre por nombre","schema":{"type":"string"}},{"name":"skip","required":false,"in":"query","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":200,"default":50,"type":"number"}}],"responses":{"200":{"description":"Listado paginado de sucursales"}},"security":[{"PAT":[]}],"summary":"Listar sucursales activas del tenant","tags":["scheduling-branches"]}},"/v1/scheduling/branches/{id}":{"get":{"operationId":"PublicBranchesController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Detalle de la sucursal"}},"security":[{"PAT":[]}],"summary":"Obtener detalle de una sucursal","tags":["scheduling-branches"]}},"/v1/scheduling/services":{"get":{"operationId":"PublicServicesController_list","parameters":[{"name":"branchId","required":false,"in":"query","description":"Filtrar por sucursal","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","description":"Estado del servicio (active/inactive)","schema":{"type":"string"}},{"name":"skip","required":false,"in":"query","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":200,"default":50,"type":"number"}}],"responses":{"200":{"description":"Listado de servicios"}},"security":[{"PAT":[]}],"summary":"Listar servicios disponibles del tenant","tags":["scheduling-services"]}},"/v1/scheduling/services/{id}":{"get":{"operationId":"PublicServicesController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Detalle del servicio"}},"security":[{"PAT":[]}],"summary":"Obtener detalle de un servicio","tags":["scheduling-services"]}},"/v1/scheduling/professionals":{"get":{"operationId":"PublicProfessionalsController_list","parameters":[{"name":"branchId","required":false,"in":"query","description":"Filtrar por sucursal","schema":{"type":"string"}},{"name":"serviceId","required":false,"in":"query","description":"Filtrar por servicio prestado","schema":{"type":"string"}},{"name":"search","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","description":"Estado (active/inactive/on_leave)","schema":{"type":"string"}},{"name":"skip","required":false,"in":"query","schema":{"minimum":0,"default":0,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":200,"default":50,"type":"number"}}],"responses":{"200":{"description":"Listado de profesionales"}},"security":[{"PAT":[]}],"summary":"Listar profesionales del tenant","tags":["scheduling-professionals"]}},"/v1/scheduling/professionals/{id}":{"get":{"operationId":"PublicProfessionalsController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Detalle del profesional"}},"security":[{"PAT":[]}],"summary":"Obtener detalle de un profesional","tags":["scheduling-professionals"]}},"/v1/scheduling/availability":{"get":{"description":"Retorna los slots libres para un servicio en una fecha puntual.","operationId":"PublicAvailabilityController_byDate","parameters":[{"name":"serviceId","required":true,"in":"query","description":"Servicio (requerido)","schema":{"type":"string"}},{"name":"date","required":true,"in":"query","description":"Fecha en formato YYYY-MM-DD","schema":{"example":"2026-05-02","type":"string"}},{"name":"branchId","required":false,"in":"query","description":"Sucursal (default: primera del tenant)","schema":{"type":"string"}},{"name":"professionalId","required":false,"in":"query","description":"Profesional específico","schema":{"type":"string"}}],"responses":{"200":{"description":"Disponibilidad por profesional para la fecha"}},"security":[{"PAT":[]}],"summary":"Disponibilidad por fecha específica","tags":["scheduling-availability"]}},"/v1/scheduling/availability/range":{"get":{"description":"Retorna los slots libres día a día entre `from` y `to` (inclusive).","operationId":"PublicAvailabilityController_byRange","parameters":[{"name":"serviceId","required":true,"in":"query","description":"Servicio (requerido)","schema":{"type":"string"}},{"name":"from","required":true,"in":"query","description":"Fecha desde (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"to","required":true,"in":"query","description":"Fecha hasta (YYYY-MM-DD, máximo 14 días desde from)","schema":{"type":"string"}},{"name":"branchId","required":false,"in":"query","schema":{"type":"string"}},{"name":"professionalId","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Disponibilidad agrupada por día"}},"security":[{"PAT":[]}],"summary":"Disponibilidad por rango de fechas (máximo 14 días)","tags":["scheduling-availability"]}},"/v1/scheduling/availability/next":{"get":{"description":"Busca los próximos slots libres a partir de `fromDate` (default: hoy) recorriendo hasta `maxDays` días.","operationId":"PublicAvailabilityController_next","parameters":[{"name":"serviceId","required":true,"in":"query","description":"Servicio (requerido)","schema":{"type":"string"}},{"name":"branchId","required":false,"in":"query","schema":{"type":"string"}},{"name":"professionalId","required":false,"in":"query","schema":{"type":"string"}},{"name":"fromDate","required":false,"in":"query","description":"Fecha desde (YYYY-MM-DD)","schema":{"type":"string"}},{"name":"maxDays","required":false,"in":"query","schema":{"minimum":1,"maximum":60,"default":14,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"minimum":1,"maximum":20,"default":5,"type":"number"}}],"responses":{"200":{"description":"Próximas horas disponibles por profesional"}},"security":[{"PAT":[]}],"summary":"Próximas horas disponibles más cercanas","tags":["scheduling-availability"]}},"/v1/scheduling/appointments/{id}":{"get":{"operationId":"PublicAppointmentsController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Detalle de la cita"}},"security":[{"PAT":[]}],"summary":"Obtener detalle de una cita","tags":["scheduling-appointments"]}},"/v1/scheduling/appointments":{"post":{"description":"Crea una nueva cita en estado pendiente con datos del cliente embebidos.","operationId":"PublicAppointmentsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicAppointmentCreateDto"}}}},"responses":{"201":{"description":"Cita creada"}},"security":[{"PAT":[]}],"summary":"Crear una cita","tags":["scheduling-appointments"]}},"/v1/scheduling/appointments/{id}/confirm":{"post":{"description":"Sólo permite confirmar citas en estado `pending`. Devuelve 409 en caso contrario.","operationId":"PublicAppointmentsController_confirm","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Cita confirmada"}},"security":[{"PAT":[]}],"summary":"Confirmar una cita","tags":["scheduling-appointments"]}},"/v1/scheduling/appointments/{id}/cancel":{"post":{"description":"Marca la cita como cancelada con la razón opcional indicada.","operationId":"PublicAppointmentsController_cancel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CancelAppointmentDto"}}}},"responses":{"200":{"description":"Cita cancelada"}},"security":[{"PAT":[]}],"summary":"Suspender (cancelar) una cita","tags":["scheduling-appointments"]}},"/v1/tenants":{"post":{"operationId":"PublicTenantsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantCreateDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"PAT":[]}],"summary":"Crear un tenant (cliente final del developer).","tags":["tenants"]},"get":{"operationId":"PublicTenantsController_list","parameters":[{"name":"search","required":true,"in":"query","schema":{"type":"string"}},{"name":"cursor","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"PAT":[]}],"summary":"Listar tenants.","tags":["tenants"]}},"/v1/tenants/{id}":{"get":{"operationId":"PublicTenantsController_getById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"PAT":[]}],"summary":"Obtener tenant por id.","tags":["tenants"]},"patch":{"operationId":"PublicTenantsController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantUpdateDto"}}}},"responses":{"200":{"description":""}},"security":[{"PAT":[]}],"summary":"Editar tenant.","tags":["tenants"]},"delete":{"operationId":"PublicTenantsController_remove","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"PAT":[]}],"summary":"Soft-delete del tenant.","tags":["tenants"]}},"/v1/tenants/{id}/whatsapp-configs":{"get":{"operationId":"PublicTenantsController_listWhatsappConfigs","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"PAT":[]}],"summary":"Listar canales WhatsApp asociados al tenant.","tags":["tenants"]}},"/v1/tenants/{id}/setup-links":{"post":{"operationId":"PublicTenantsController_createSetupLink","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupLinkCreateDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"security":[{"PAT":[]}],"summary":"Generar un setup link para el tenant.","tags":["tenants"]},"get":{"operationId":"PublicTenantsController_listSetupLinks","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"PAT":[]}],"summary":"Listar setup links del tenant.","tags":["tenants"]}},"/v1/tenants/{id}/setup-links/{linkId}":{"patch":{"operationId":"PublicTenantsController_updateSetupLink","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"linkId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupLinkUpdateDto"}}}},"responses":{"200":{"description":""}},"security":[{"PAT":[]}],"summary":"Editar config de setup link (no rota el token).","tags":["tenants"]},"delete":{"operationId":"PublicTenantsController_revokeSetupLink","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"linkId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"PAT":[]}],"summary":"Revocar setup link. Token deja de ser válido.","tags":["tenants"]}},"/v1/setup/links/{token}":{"get":{"operationId":"PublicSetupController_getLink","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"type":"object"}}}}},"summary":"Config pública del setup link. Sin auth: el token del link autoriza.","tags":["setup"]}},"/v1/setup/links/{token}/start":{"post":{"operationId":"PublicSetupController_start","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartSetupLinkRequestDto"}}}},"responses":{"201":{"description":""}},"summary":"Inicia el flujo de conexión (Embedded Signup, Coexistence o QR). Sin persistencia intermedia: el state HMAC firmado correlaciona el callback.","tags":["setup"]}},"/v1/setup/links/{token}/complete":{"post":{"operationId":"PublicSetupController_complete","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteSetupLinkRequestDto"}}}},"responses":{"200":{"description":""}},"summary":"Cierra el flujo Embedded Signup iniciado vía Facebook JS SDK. Recibe code + waba_id + phone_number_id, verifica state HMAC y crea el Channel.","tags":["setup"]}},"/v1/setup/links/{token}/qr-stream":{"get":{"operationId":"PublicSetupController_qrStream","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}},{"name":"pending_id","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"SSE proxy del pairing QR. Reusa wa_qr_sessions de api-client.","tags":["setup"]}},"/v1/setup/links/{token}/attach-channel":{"post":{"operationId":"PublicSetupController_attachChannel","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachChannelRequestDto"}}}},"responses":{"200":{"description":""}},"summary":"Tras QR connect: aplica dev_tenant_id al Channel ya creado por api-client.","tags":["setup"]}},"/v1/auth/cli/select-project":{"post":{"operationId":"CliSessionController_selectProject","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SelectProjectRequestDto"}}}},"responses":{"200":{"description":""}},"security":[{"PAT":[]}],"summary":"Cambia el project activo de la session CLI y emite un JWT nuevo. Sólo aceptable con un JWT del CLI (no con PAT).","tags":["cli-session"]}},"/v1/auth/cli/me":{"get":{"operationId":"CliSessionController_me","parameters":[],"responses":{"200":{"description":""}},"security":[{"PAT":[]}],"summary":"Datos de la session CLI actual (user, company, current project). Útil para `keebai whoami`.","tags":["cli-session"]}}},"info":{"title":"Keebai Public API","description":"Superficie pública REST autenticada con Personal Access Tokens (PAT).","version":"1.0.0","contact":{}},"tags":[],"servers":[{"url":"https://api.keebai.com","description":"Production"}],"components":{"securitySchemes":{"PAT":{"scheme":"bearer","bearerFormat":"kbai_pk_<hex>","type":"http","description":"Personal Access Token con prefijo `kbai_pk_`. Generar desde el portal con permiso `developer.manage_tokens`."}},"schemas":{"MeResponseDto":{"type":"object","properties":{"permissions":{"description":"Permisos efectivos del token: intersección entre los scopes del token y los permisos actuales del usuario.","example":["conversations.read","contacts.read"],"type":"array","items":{"type":"string"}}},"required":["permissions"]},"AppLoginDto":{"type":"object","properties":{}},"AppRefreshDto":{"type":"object","properties":{}},"AppMarkReadDto":{"type":"object","properties":{}},"AppSendMessageDto":{"type":"object","properties":{}},"AppAppointmentCreateDto":{"type":"object","properties":{}},"AppAppointmentUpdateDto":{"type":"object","properties":{}},"AppAppointmentMoveDto":{"type":"object","properties":{}},"AppAppointmentStatusDto":{"type":"object","properties":{}},"AppAppointmentCancelDto":{"type":"object","properties":{}},"AppCopilotQueryDto":{"type":"object","properties":{}},"SendTextDto":{"type":"object","properties":{"to":{"type":"string","example":"+5491155555555"},"phone_number_id":{"type":"string","example":"100000000000001","description":"WhatsApp Business phone_number_id (numeric identifier issued by Meta for the sending number)."},"text":{"type":"string","example":"Hola, ¿cómo estás?"},"preview_url":{"type":"boolean","description":"Render link previews for URLs in the text body."},"meta_data":{"type":"object"}},"required":["to","phone_number_id","text"]},"SingleSendResponse":{"type":"object","properties":{"message_id":{"type":"string","description":"Meta message_id (wamid.*) of the sent WhatsApp message."},"status":{"type":"string","example":"sent"},"sent_at":{"type":"string","description":"ISO-8601 timestamp of the dispatch."}},"required":["message_id","status","sent_at"]},"SendTemplateDto":{"type":"object","properties":{"to":{"type":"string","example":"+5491155555555"},"phone_number_id":{"type":"string","example":"100000000000001","description":"WhatsApp Business phone_number_id (numeric identifier issued by Meta for the sending number)."},"template_name":{"type":"string","example":"welcome_v2"},"language":{"type":"string","example":"es"},"variables":{"type":"object","example":{"nombre":"Lucio","monto":"1500"},"description":"Named template variables (Meta parameter_name)."},"meta_data":{"type":"object","description":"Free-form metadata persisted with the message. Returned on webhooks for correlation."}},"required":["to","phone_number_id","template_name","language"]},"SendImageDto":{"type":"object","properties":{"to":{"type":"string","example":"+5491155555555"},"phone_number_id":{"type":"string","example":"100000000000001","description":"WhatsApp Business phone_number_id (numeric identifier issued by Meta for the sending number)."},"link":{"type":"string","description":"Public HTTPS URL to the image."},"media_id":{"type":"string","description":"Previously-uploaded media id (POST /v1/media/upload)."},"caption":{"type":"string","maxLength":1024},"meta_data":{"type":"object","description":"Free-form metadata persisted with the message. Returned on webhooks for correlation."}},"required":["to","phone_number_id"]},"SendVideoDto":{"type":"object","properties":{"to":{"type":"string","example":"+5491155555555"},"phone_number_id":{"type":"string","example":"100000000000001","description":"WhatsApp Business phone_number_id (numeric identifier issued by Meta for the sending number)."},"link":{"type":"string"},"media_id":{"type":"string"},"caption":{"type":"string","maxLength":1024},"meta_data":{"type":"object","description":"Free-form metadata persisted with the message. Returned on webhooks for correlation."}},"required":["to","phone_number_id"]},"SendAudioDto":{"type":"object","properties":{"to":{"type":"string","example":"+5491155555555"},"phone_number_id":{"type":"string","example":"100000000000001","description":"WhatsApp Business phone_number_id (numeric identifier issued by Meta for the sending number)."},"link":{"type":"string"},"media_id":{"type":"string"},"voice":{"type":"boolean","description":"Send as voice (PTT) audio message."},"meta_data":{"type":"object","description":"Free-form metadata persisted with the message. Returned on webhooks for correlation."}},"required":["to","phone_number_id"]},"SendDocumentDto":{"type":"object","properties":{"to":{"type":"string","example":"+5491155555555"},"phone_number_id":{"type":"string","example":"100000000000001","description":"WhatsApp Business phone_number_id (numeric identifier issued by Meta for the sending number)."},"link":{"type":"string"},"media_id":{"type":"string"},"filename":{"type":"string","maxLength":240},"caption":{"type":"string","maxLength":1024},"meta_data":{"type":"object","description":"Free-form metadata persisted with the message. Returned on webhooks for correlation."}},"required":["to","phone_number_id"]},"SendStickerDto":{"type":"object","properties":{"to":{"type":"string","example":"+5491155555555"},"phone_number_id":{"type":"string","example":"100000000000001","description":"WhatsApp Business phone_number_id (numeric identifier issued by Meta for the sending number)."},"link":{"type":"string"},"media_id":{"type":"string"},"meta_data":{"type":"object","description":"Free-form metadata persisted with the message. Returned on webhooks for correlation."}},"required":["to","phone_number_id"]},"SendLocationDto":{"type":"object","properties":{"to":{"type":"string","example":"+5491155555555"},"phone_number_id":{"type":"string","example":"100000000000001","description":"WhatsApp Business phone_number_id (numeric identifier issued by Meta for the sending number)."},"latitude":{"type":"number","example":-33.4489},"longitude":{"type":"number","example":-70.6693},"name":{"type":"string","maxLength":1000},"address":{"type":"string","maxLength":1000},"meta_data":{"type":"object","description":"Free-form metadata persisted with the message. Returned on webhooks for correlation."}},"required":["to","phone_number_id","latitude","longitude"]},"ContactNameDto":{"type":"object","properties":{"formatted_name":{"type":"string"},"first_name":{"type":"string"},"last_name":{"type":"string"}},"required":["formatted_name"]},"ContactPhoneDto":{"type":"object","properties":{"phone":{"type":"string"},"type":{"type":"string"},"wa_id":{"type":"string"}},"required":["phone"]},"ContactCardDto":{"type":"object","properties":{"name":{"$ref":"#/components/schemas/ContactNameDto"},"phones":{"type":"array","items":{"$ref":"#/components/schemas/ContactPhoneDto"}},"org":{"type":"object"},"emails":{"type":"array","items":{"type":"string"}},"urls":{"type":"array","items":{"type":"string"}},"birthday":{"type":"string"}},"required":["name"]},"SendContactsDto":{"type":"object","properties":{"to":{"type":"string","example":"+5491155555555"},"phone_number_id":{"type":"string","example":"100000000000001","description":"WhatsApp Business phone_number_id (numeric identifier issued by Meta for the sending number)."},"contacts":{"type":"array","items":{"$ref":"#/components/schemas/ContactCardDto"}},"meta_data":{"type":"object","description":"Free-form metadata persisted with the message. Returned on webhooks for correlation."}},"required":["to","phone_number_id","contacts"]},"SendReactionDto":{"type":"object","properties":{"to":{"type":"string","example":"+5491155555555"},"phone_number_id":{"type":"string","example":"100000000000001","description":"WhatsApp Business phone_number_id (numeric identifier issued by Meta for the sending number)."},"message_id":{"type":"string","description":"Meta message_id (wamid.*) of the message to react to."},"emoji":{"type":"string","description":"Emoji to send as reaction. Empty string clears a previous reaction.","example":"👍"},"meta_data":{"type":"object","description":"Free-form metadata persisted with the message. Returned on webhooks for correlation."}},"required":["to","phone_number_id","message_id","emoji"]},"MarkReadDto":{"type":"object","properties":{"phone_number_id":{"type":"string","example":"100000000000001","description":"WhatsApp Business phone_number_id (numeric identifier issued by Meta for the sending number)."},"message_id":{"type":"string","description":"Meta message_id (wamid.*) to mark as read."},"typing_indicator":{"type":"string","enum":["text","off"]}},"required":["phone_number_id","message_id"]},"MarkReadResponse":{"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]},"InteractiveButtonDto":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"}},"required":["id","title"]},"SendInteractiveButtonsDto":{"type":"object","properties":{"to":{"type":"string","example":"+5491155555555"},"phone_number_id":{"type":"string","example":"100000000000001","description":"WhatsApp Business phone_number_id (numeric identifier issued by Meta for the sending number)."},"body_text":{"type":"string","maxLength":1024},"buttons":{"maxItems":3,"minItems":1,"type":"array","items":{"$ref":"#/components/schemas/InteractiveButtonDto"}},"header":{"type":"object","example":{"type":"text","text":"Header"}},"footer_text":{"type":"string","maxLength":60},"meta_data":{"type":"object","description":"Free-form metadata persisted with the message. Returned on webhooks for correlation."}},"required":["to","phone_number_id","body_text","buttons"]},"InteractiveListRowDto":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string","maxLength":24},"description":{"type":"string","maxLength":72}},"required":["id","title"]},"InteractiveListSectionDto":{"type":"object","properties":{"title":{"type":"string","maxLength":24},"rows":{"type":"array","items":{"$ref":"#/components/schemas/InteractiveListRowDto"}}},"required":["rows"]},"SendInteractiveListDto":{"type":"object","properties":{"to":{"type":"string","example":"+5491155555555"},"phone_number_id":{"type":"string","example":"100000000000001","description":"WhatsApp Business phone_number_id (numeric identifier issued by Meta for the sending number)."},"body_text":{"type":"string","maxLength":1024},"button_text":{"type":"string","maxLength":20},"sections":{"type":"array","items":{"$ref":"#/components/schemas/InteractiveListSectionDto"}},"header":{"type":"object"},"footer_text":{"type":"string","maxLength":60},"meta_data":{"type":"object","description":"Free-form metadata persisted with the message. Returned on webhooks for correlation."}},"required":["to","phone_number_id","body_text","button_text","sections"]},"SendInteractiveCtaUrlDto":{"type":"object","properties":{"to":{"type":"string","example":"+5491155555555"},"phone_number_id":{"type":"string","example":"100000000000001","description":"WhatsApp Business phone_number_id (numeric identifier issued by Meta for the sending number)."},"body_text":{"type":"string","maxLength":1024},"display_text":{"type":"string","maxLength":20},"url":{"type":"string"},"header":{"type":"object"},"footer_text":{"type":"string","maxLength":60},"meta_data":{"type":"object","description":"Free-form metadata persisted with the message. Returned on webhooks for correlation."}},"required":["to","phone_number_id","body_text","display_text","url"]},"SendInteractiveCatalogDto":{"type":"object","properties":{"to":{"type":"string","example":"+5491155555555"},"phone_number_id":{"type":"string","example":"100000000000001","description":"WhatsApp Business phone_number_id (numeric identifier issued by Meta for the sending number)."},"body_text":{"type":"string","maxLength":1024},"thumbnail_product_retailer_id":{"type":"string"},"footer_text":{"type":"string","maxLength":60},"meta_data":{"type":"object","description":"Free-form metadata persisted with the message. Returned on webhooks for correlation."}},"required":["to","phone_number_id","body_text"]},"SendRawDto":{"type":"object","properties":{"phone_number_id":{"type":"string","example":"100000000000001","description":"WhatsApp Business phone_number_id (numeric identifier issued by Meta for the sending number)."},"body":{"type":"object","description":"Raw Meta Graph API messages body. Sent as-is to /{phone_number_id}/messages. Use only when no high-level endpoint fits."},"meta_data":{"type":"object","description":"Free-form metadata persisted with the message. Returned on webhooks for correlation."}},"required":["phone_number_id","body"]},"BulkRecipientDto":{"type":"object","properties":{"to":{"type":"string","example":"+5491155555555"},"variables":{"type":"object","example":{"nombre":"Lucio"}},"meta_data":{"type":"object"}},"required":["to"]},"SendBulkDto":{"type":"object","properties":{"phone_number_id":{"type":"string","example":"100000000000001","description":"WhatsApp Business phone_number_id (numeric identifier issued by Meta for the sending number)."},"template_name":{"type":"string","example":"welcome_v2"},"language":{"type":"string","example":"es"},"campaign_name":{"type":"string","example":"Onboarding marzo 2026"},"recipients":{"type":"array","items":{"$ref":"#/components/schemas/BulkRecipientDto"}}},"required":["phone_number_id","template_name","language","recipients"]},"BulkDispatchResponse":{"type":"object","properties":{"broadcast_id":{"type":"string"},"status":{"type":"string","example":"scheduled"},"total_recipients":{"type":"number"},"scheduled_at":{"type":"string","nullable":true}},"required":["broadcast_id","status","total_recipients"]},"BulkStatusResponse":{"type":"object","properties":{"broadcast_id":{"type":"string"},"status":{"type":"string"},"total_recipients":{"type":"number"},"sent":{"type":"number"},"failed":{"type":"number"},"pending":{"type":"number"},"started_at":{"type":"string","nullable":true},"completed_at":{"type":"string","nullable":true}},"required":["broadcast_id","status","total_recipients","sent","failed","pending"]},"UploadMediaDto":{"type":"object","properties":{"phone_number_id":{"type":"string","example":"100000000000001"},"type":{"type":"string","example":"image/png"},"filename":{"type":"string"}},"required":["phone_number_id","type"]},"MediaUploadResponse":{"type":"object","properties":{"media_id":{"type":"string"},"mime_type":{"type":"string"},"size":{"type":"number"}},"required":["media_id","mime_type","size"]},"MediaMetadataResponse":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string"},"mime_type":{"type":"string"},"file_size":{"type":"number"},"sha256":{"type":"string"},"messaging_product":{"type":"string"}},"required":["id","url","mime_type","file_size"]},"PublicTemplateDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"language":{"type":"string"},"status":{"type":"string"},"category":{"type":"string"},"parameter_format":{"type":"string"},"variables":{"type":"array","items":{"type":"string"}}},"required":["id","name","language","status","category","variables"]},"PaginatedTemplatesResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PublicTemplateDto"}},"page":{"type":"number"},"limit":{"type":"number"},"total":{"type":"number"}},"required":["items","page","limit","total"]},"TemplateButtonDto":{"type":"object","properties":{"type":{"type":"string","enum":["QUICK_REPLY","URL","PHONE_NUMBER","FLOW","VOICE_CALL","COPY_CODE","OTP"]},"text":{"type":"string","maxLength":25},"url":{"type":"string"},"phone_number":{"type":"string"},"example":{"type":"array","items":{"type":"string"}},"flow_id":{"type":"string"},"flow_action":{"type":"string","enum":["navigate","data_exchange"]},"coupon_code":{"type":"string"},"otp_type":{"type":"string","enum":["COPY_CODE","ONE_TAP","ZERO_TAP"]},"autofill_text":{"type":"string"},"package_name":{"type":"string"},"signature_hash":{"type":"string"}},"required":["type","text"]},"NamedParamDto":{"type":"object","properties":{"param_name":{"type":"string","example":"nombre"},"example":{"type":"string","example":"Lucio"}},"required":["param_name","example"]},"TemplateExampleDto":{"type":"object","properties":{"header_text":{"type":"array","items":{"type":"string"}},"header_text_named_params":{"type":"array","items":{"$ref":"#/components/schemas/NamedParamDto"}},"header_handle":{"type":"array","items":{"type":"string"}},"body_text":{"type":"array","items":{"type":"string"}},"body_text_named_params":{"type":"array","items":{"$ref":"#/components/schemas/NamedParamDto"}}}},"TemplateComponentDto":{"type":"object","properties":{"type":{"type":"string","enum":["HEADER","BODY","FOOTER","BUTTONS"]},"format":{"type":"string","enum":["TEXT","IMAGE","VIDEO","DOCUMENT"]},"text":{"type":"string","maxLength":1024},"buttons":{"type":"array","items":{"$ref":"#/components/schemas/TemplateButtonDto"}},"example":{"$ref":"#/components/schemas/TemplateExampleDto"},"add_security_recommendation":{"type":"boolean"},"code_expiration_minutes":{"type":"number"}},"required":["type"]},"CreateTemplateDto":{"type":"object","properties":{"channel_id":{"type":"string","description":"ObjectId del canal WhatsApp donde se crea el template."},"name":{"type":"string","maxLength":512,"description":"Nombre del template. Solo minúsculas, números y guiones bajos.","example":"welcome_v2"},"language":{"type":"string","maxLength":10,"example":"es_CL"},"category":{"type":"string","enum":["MARKETING","UTILITY","AUTHENTICATION"]},"parameter_format":{"type":"string","enum":["NAMED","POSITIONAL"]},"components":{"type":"array","items":{"$ref":"#/components/schemas/TemplateComponentDto"}},"metadata":{"type":"object","additionalProperties":true}},"required":["channel_id","name","language","category","components"]},"UpdateTemplateDto":{"type":"object","properties":{"channel_id":{"type":"string","description":"ObjectId del canal WhatsApp dueño del template (requerido por upstream)."},"name":{"type":"string","maxLength":512},"language":{"type":"string","maxLength":10},"category":{"type":"string","enum":["MARKETING","UTILITY","AUTHENTICATION"]},"parameter_format":{"type":"string","enum":["NAMED","POSITIONAL"]},"components":{"type":"array","items":{"$ref":"#/components/schemas/TemplateComponentDto"}},"status":{"type":"string","enum":["PENDING","IN_REVIEW","REJECTED","APPROVED","PAUSED","DISABLED","IN_APPEAL"]},"metadata":{"type":"object","additionalProperties":true}},"required":["channel_id"]},"CreateWebhookDto":{"type":"object","properties":{"name":{"type":"string","example":"Producción - Notificaciones CRM"},"url":{"type":"string","example":"https://hooks.example.com/keebai"},"events":{"type":"array","description":"Eventos a los que se subscribe.","items":{"type":"string","enum":["whatsapp.message.received","whatsapp.message.sent","whatsapp.message.delivered","whatsapp.message.read","whatsapp.message.failed","whatsapp.template.status_updated","whatsapp.channel.connected","whatsapp.channel.disconnected","conversation.created","conversation.escalated_to_human","instagram.message.received"]}},"headers":{"type":"object","description":"Headers extra a enviar en cada delivery.","example":{"X-Tenant-Origin":"crm"}},"is_active":{"type":"boolean","default":true}},"required":["name","url","events"]},"WebhookCreatedResponseDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string","enum":["whatsapp.message.received","whatsapp.message.sent","whatsapp.message.delivered","whatsapp.message.read","whatsapp.message.failed","whatsapp.template.status_updated","whatsapp.channel.connected","whatsapp.channel.disconnected","conversation.created","conversation.escalated_to_human","instagram.message.received"]}},"is_active":{"type":"boolean"},"secret_prefix":{"type":"string","description":"Prefijo del secret para identificación visual."},"headers":{"type":"object"},"failure_count":{"type":"number"},"disabled_reason":{"type":"string","enum":["excessive_failures","manual"],"nullable":true},"last_delivery_at":{"type":"object","nullable":true},"created_at":{"type":"string"},"updated_at":{"type":"string"},"secret":{"type":"string","description":"Secret raw (whsec_...). Se muestra UNA SOLA VEZ. Guárdalo de inmediato — no se puede recuperar."}},"required":["id","name","url","events","is_active","secret_prefix","headers","failure_count","created_at","updated_at","secret"]},"WebhookResponseDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string","enum":["whatsapp.message.received","whatsapp.message.sent","whatsapp.message.delivered","whatsapp.message.read","whatsapp.message.failed","whatsapp.template.status_updated","whatsapp.channel.connected","whatsapp.channel.disconnected","conversation.created","conversation.escalated_to_human","instagram.message.received"]}},"is_active":{"type":"boolean"},"secret_prefix":{"type":"string","description":"Prefijo del secret para identificación visual."},"headers":{"type":"object"},"failure_count":{"type":"number"},"disabled_reason":{"type":"string","enum":["excessive_failures","manual"],"nullable":true},"last_delivery_at":{"type":"object","nullable":true},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","name","url","events","is_active","secret_prefix","headers","failure_count","created_at","updated_at"]},"WebhookListResponseDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookResponseDto"}}},"required":["data"]},"UpdateWebhookDto":{"type":"object","properties":{"name":{"type":"string"},"url":{"type":"string"},"events":{"type":"array","items":{"type":"string","enum":["whatsapp.message.received","whatsapp.message.sent","whatsapp.message.delivered","whatsapp.message.read","whatsapp.message.failed","whatsapp.template.status_updated","whatsapp.channel.connected","whatsapp.channel.disconnected","conversation.created","conversation.escalated_to_human","instagram.message.received"]}},"headers":{"type":"object"},"is_active":{"type":"boolean"}}},"TestWebhookDto":{"type":"object","properties":{"event_type":{"type":"string","enum":["whatsapp.message.received","whatsapp.message.sent","whatsapp.message.delivered","whatsapp.message.read","whatsapp.message.failed","whatsapp.template.status_updated","whatsapp.channel.connected","whatsapp.channel.disconnected","conversation.created","conversation.escalated_to_human","instagram.message.received"]}},"required":["event_type"]},"DeliveryResponseDto":{"type":"object","properties":{"id":{"type":"string"},"subscription_id":{"type":"string"},"event_id":{"type":"string"},"event_type":{"type":"string","enum":["whatsapp.message.received","whatsapp.message.sent","whatsapp.message.delivered","whatsapp.message.read","whatsapp.message.failed","whatsapp.template.status_updated","whatsapp.channel.connected","whatsapp.channel.disconnected","conversation.created","conversation.escalated_to_human","instagram.message.received"]},"status":{"type":"string","enum":["pending","success","failed","dead"]},"status_code":{"type":"object","nullable":true},"attempts":{"type":"number"},"last_error":{"type":"object","nullable":true},"delivered_at":{"type":"object","nullable":true},"duration_ms":{"type":"object","nullable":true},"created_at":{"type":"string"}},"required":["id","subscription_id","event_id","event_type","status","attempts","created_at"]},"DeliveryListResponseDto":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DeliveryResponseDto"}},"next_cursor":{"type":"object","nullable":true}},"required":["data"]},"WhatsappConnectRequestDto":{"type":"object","properties":{"mode":{"type":"string","description":"Modo de conexión: `embedded_signup` (default) abre el flujo de Meta en el portal; `qr` devuelve un stream SSE para escanear desde la terminal con WhatsApp multi-dispositivo.","enum":["embedded_signup","qr"],"default":"embedded_signup"},"pipeline_id":{"type":"string","description":"Si se especifica, el canal recién creado se asocia automáticamente al pipeline. Sólo aplica al modo embedded_signup."},"coexistence_enabled":{"type":"boolean","description":"Activa el modo coexistencia (si el cliente ya tiene la app de WhatsApp Business activa). Sólo aplica al modo embedded_signup."},"name":{"type":"string","description":"Etiqueta visible del canal cuando se conecta por QR. Default: \"WhatsApp QR\"."}}},"KnowledgeTreeNodeDto":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"node_type":{"type":"string","enum":["folder","document"]},"parent_id":{"type":"object","nullable":true},"position":{"type":"number"},"path_cache":{"type":"string"},"created_at":{"type":"string"},"updated_at":{"type":"string"},"children":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeTreeNodeDto"}}},"required":["id","title","node_type","position","path_cache","children"]},"KnowledgeTreeResponseDto":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeTreeNodeDto"}}},"required":["items"]},"CreateFolderDto":{"type":"object","properties":{"title":{"type":"string","description":"Título de la carpeta.","example":"Soporte","maxLength":200},"parent_id":{"type":"string","description":"ObjectId de la carpeta padre. Omitir para crear en la raíz."}},"required":["title"]},"KnowledgeNodeDto":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"node_type":{"type":"string","enum":["folder","document"]},"parent_id":{"type":"object","nullable":true},"position":{"type":"number"},"path_cache":{"type":"string"},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","title","node_type","position","path_cache"]},"CreateDocumentDto":{"type":"object","properties":{"title":{"type":"string","description":"Título del documento.","example":"Política de devolución","maxLength":200},"parent_id":{"type":"string","description":"ObjectId de la carpeta padre. Omitir para crear en la raíz."},"markdown":{"type":"string","description":"Contenido en Markdown. Se convierte a BlockNote JSON al guardar.","example":"# Política\n\nTexto de la política..."}},"required":["title","markdown"]},"SearchKnowledgeDto":{"type":"object","properties":{"query":{"type":"string","description":"Texto de búsqueda.","example":"¿cómo cancelar suscripción?"},"mode":{"type":"string","description":"Modo de búsqueda: full (full-text), vector (semántica) o hybrid (combinación con re-ranking).","enum":["full","hybrid","vector"],"example":"hybrid"},"top_k":{"type":"number","description":"Cantidad máxima de resultados (1-25).","example":5,"default":5},"node_ids":{"description":"Limita la búsqueda a estos node ids (carpetas o documentos).","type":"array","items":{"type":"string"}}},"required":["query","mode"]},"KnowledgeSearchResultItemDto":{"type":"object","properties":{"node_id":{"type":"string"},"title":{"type":"string"},"snippet":{"type":"string"},"score":{"type":"number"},"source":{"type":"string","enum":["full","vector"]}},"required":["node_id","score","source"]},"SearchKnowledgeResponseDto":{"type":"object","properties":{"mode":{"type":"string","enum":["full","hybrid","vector"]},"results":{"type":"array","items":{"$ref":"#/components/schemas/KnowledgeSearchResultItemDto"}}},"required":["mode","results"]},"AssignKnowledgeDto":{"type":"object","properties":{"assistant_id":{"type":"string","description":"ObjectId del asistente destino."},"node_ids":{"description":"ObjectIds de los nodos a asignar a todos los workers del asistente.","type":"array","items":{"type":"string"}}},"required":["assistant_id","node_ids"]},"AssignKnowledgeResponseDto":{"type":"object","properties":{"workers_updated":{"type":"number"}},"required":["workers_updated"]},"PublicAssistantDto":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"avatar_url":{"type":"string"},"model":{"type":"string"},"voice_response_enabled":{"type":"boolean","description":"Indica si la respuesta de voz está habilitada."},"created_at":{"type":"string"}},"required":["id","name","model","voice_response_enabled"]},"PaginatedAssistantsResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PublicAssistantDto"}},"page":{"type":"number"},"limit":{"type":"number"},"total":{"type":"number"}},"required":["items","page","limit","total"]},"PublicCustomerDto":{"type":"object","properties":{"name":{"type":"string"},"last_name":{"type":"string"},"email":{"type":"string"},"phone":{"type":"string"}},"required":["name"]},"PublicAppointmentCreateDto":{"type":"object","properties":{"branch_id":{"type":"string"},"service_id":{"type":"string"},"professional_id":{"type":"string"},"date":{"type":"string","description":"Fecha (YYYY-MM-DD)"},"start_time":{"type":"string","description":"Hora inicio (HH:mm)"},"end_time":{"type":"string","description":"Hora fin (HH:mm). Si se omite, scheduling la calcula desde la duración del servicio."},"customer":{"$ref":"#/components/schemas/PublicCustomerDto"},"notes":{"type":"string"},"price":{"type":"number"},"currency":{"type":"string"}},"required":["branch_id","service_id","date","start_time","customer"]},"CancelAppointmentDto":{"type":"object","properties":{"reason":{"type":"string","description":"Motivo de cancelación"}}},"TenantCreateDto":{"type":"object","properties":{"name":{"type":"string","description":"Nombre legible del tenant (cliente final del developer). Ej: \"ACME Corp\"."},"external_id":{"type":"string","description":"ID externo del tenant en el sistema del developer. Único por company. Si ya existe se devuelve el tenant existente (idempotencia)."},"metadata":{"type":"object","description":"Metadata libre."}},"required":["name"]},"TenantUpdateDto":{"type":"object","properties":{"name":{"type":"string"},"external_id":{"type":"object","description":"Pasar null para limpiar el external_id existente."},"metadata":{"type":"object"}}},"SetupLinkThemeDto":{"type":"object","properties":{"primary":{"type":"string"},"primary_foreground":{"type":"string"},"background":{"type":"string"},"text":{"type":"string"},"muted":{"type":"string"},"muted_text":{"type":"string"},"card":{"type":"string"},"border":{"type":"string"},"destructive":{"type":"string"},"destructive_foreground":{"type":"string"},"secondary":{"type":"string"},"secondary_foreground":{"type":"string"}}},"SetupLinkCreateDto":{"type":"object","properties":{"language":{"type":"object","description":"Código de idioma BCP-47. null/omitido = se usa el idioma del browser del cliente final."},"success_redirect_url":{"type":"object"},"failure_redirect_url":{"type":"object"},"allowed_modes":{"type":"array","description":"Modos de conexión permitidos.","items":{"type":"string","enum":["embedded_signup","coexistence","qr"]}},"provision_phone_number":{"type":"boolean","description":"Si true, intentar provisión automática de número (fuera de scope inicial; reservado).","default":false},"theme":{"$ref":"#/components/schemas/SetupLinkThemeDto"}}},"SetupLinkUpdateDto":{"type":"object","properties":{"language":{"type":"object","description":"Código de idioma BCP-47. null/omitido = se usa el idioma del browser del cliente final."},"success_redirect_url":{"type":"object"},"failure_redirect_url":{"type":"object"},"allowed_modes":{"type":"array","description":"Modos de conexión permitidos.","items":{"type":"string","enum":["embedded_signup","coexistence","qr"]}},"provision_phone_number":{"type":"boolean","description":"Si true, intentar provisión automática de número (fuera de scope inicial; reservado).","default":false},"theme":{"$ref":"#/components/schemas/SetupLinkThemeDto"}}},"StartSetupLinkRequestDto":{"type":"object","properties":{"mode":{"type":"string","enum":["embedded_signup","coexistence","qr"]}},"required":["mode"]},"CompleteSetupLinkRequestDto":{"type":"object","properties":{"state":{"type":"string","description":"state HMAC firmado emitido por /start"},"code":{"type":"string","description":"authorization code retornado por FB.login"},"waba_id":{"type":"string","description":"WhatsApp Business Account ID provisto por el SDK"},"phone_number_id":{"type":"string","description":"Phone Number ID provisto por el SDK"},"mode":{"type":"string","enum":["embedded_signup","coexistence"]}},"required":["state","code","waba_id","phone_number_id","mode"]},"AttachChannelRequestDto":{"type":"object","properties":{"state":{"type":"string","description":"state HMAC firmado emitido por /start"},"channel_id":{"type":"string","description":"channel_id del Channel ya creado vía QR"}},"required":["state","channel_id"]},"SelectProjectRequestDto":{"type":"object","properties":{"project":{"type":"string","description":"Slug o ObjectId del project que se quiere activar para la session CLI."}},"required":["project"]}}}}