{"openapi":"3.1.0","info":{"title":"ConnectyHub WhatsApp API","version":"1.0.0","description":"API publica da ConnectyHub para instancias WhatsApp, envio de mensagens, consultas, webhooks assinados e recursos avancados controlados.\n\n## Cobertura Uazapi\n\nA ConnectyHub usa a documentacao Uazapi 2.1.1 como uma das bases do gateway WhatsApp, mas entrega uma fronteira propria de produto: autenticacao por chave ConnectyHub, isolamento por cliente, auditoria de uso, webhooks por tenant e sanitizacao de dados sensiveis.\n\nCobertura atual: 132 paths Uazapi analisados, 125 paths expostos em /provider/*, 17 paths nativos ConnectyHub e 7 paths bloqueados por seguranca/administracao.\n\nUse as rotas nativas sempre que existirem. Use /provider/* para recursos avancados ainda nao promovidos para contrato ConnectyHub estavel. Rotas de admintoken, webhook global e controle de processo do provedor nao sao expostas a clientes."},"servers":[{"url":"https://www.connectyhub.com.br/api/v1","description":"Producao ConnectyHub"}],"tags":[{"name":"Nativo ConnectyHub","description":"Rotas principais da ConnectyHub para clientes da API."},{"name":"Instancias","description":"Ciclo de vida da instancia WhatsApp: conectar, status, limites, perfil e privacidade."},{"name":"CRM","description":"Campos de lead e dados auxiliares de relacionamento."},{"name":"Avancado","description":"Recursos avancados roteados pela ConnectyHub com controle de instancia."},{"name":"Perfil","description":"Nome e imagem de perfil da conta conectada."},{"name":"Enviar Mensagem","description":"Envio de texto, midia, contatos, localizacao, status e mensagens interativas."},{"name":"Mensagem Async","description":"Envio e acompanhamento de mensagens assicronas."},{"name":"Acoes na mensagem e Buscar","description":"Busca, historico, leitura, reacao, edicao, fixacao e download de mensagens."},{"name":"Grupos e Comunidades","description":"Criacao e administracao de grupos, comunidades e participantes."},{"name":"Newsletters e Canais","description":"Criacao, mensagens, seguidores, configuracoes e busca de canais."},{"name":"Webhooks e SSE","description":"Webhooks por instancia, erros recentes e stream de eventos."},{"name":"Mensagem em massa","description":"Pastas, filas e disparos controlados."},{"name":"Bloqueios","description":"Lista e controle de contatos bloqueados."},{"name":"Etiquetas","description":"Gerenciamento de etiquetas e vinculos com chats."},{"name":"Chats","description":"Operacoes de conversa: detalhes, etiquetas, arquivamento, silenciar, leitura e notas."},{"name":"Contatos","description":"Consulta, criacao e remocao de contatos."},{"name":"Respostas Rapidas","description":"Respostas rapidas salvas na conta."},{"name":"Chamadas","description":"Chamadas de voz e rejeicao de chamadas."},{"name":"Integracao Chatwoot","description":"Configuracao de integracao com Chatwoot para atendimento."},{"name":"Business","description":"Perfil comercial, categorias e catalogo de produtos."}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"ConnectyHub API key","description":"Use Authorization: Bearer ch_live_..."},"apiKeyHeader":{"type":"apiKey","in":"header","name":"x-connectyhub-api-key","description":"Header alternativo para enviar a chave ConnectyHub."}},"schemas":{"ErrorEnvelope":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{}}}},"required":["ok","error"]},"ConnectionDiagnosticEvent":{"type":"object","properties":{"type":{"type":"string","enum":["connect_requested","connect_response","qr_received","qr_updated","pair_code_received","pair_code_updated","status_poll","status_connected","status_disconnected","passkey_blocked","timeout","provider_error","reset_requested"]},"at":{"type":"string","format":"date-time"},"providerStatus":{"type":["integer","null"]},"status":{"type":["string","null"]},"connected":{"type":["boolean","null"]},"loggedIn":{"type":["boolean","null"]},"hasQrCode":{"type":"boolean","description":"Indica que o provedor retornou QR, sem expor o conteudo do QR."},"qrCodeLength":{"type":["integer","null"],"description":"Tamanho do QR retornado, usado para identificar atualizacoes sem armazenar o QR."},"hasPairCode":{"type":"boolean","description":"Indica que o provedor retornou codigo de pareamento, sem expor o codigo."},"pairCodeLength":{"type":["integer","null"],"description":"Tamanho do codigo retornado, sem armazenar o codigo."},"lastDisconnectReason":{"type":["string","null"],"description":"Ultimo motivo informado pelo provedor. Passkey pairing not supported indica que a conta exigiu WebAuthn/chave de acesso e que o segundo QR nao e retornado pela API.","example":"Passkey pairing not supported"},"message":{"type":["string","null"]}}},"ConnectionAttemptDiagnostic":{"type":"object","properties":{"id":{"type":"string"},"mode":{"type":"string","enum":["qr","phone"]},"phonePreview":{"type":["string","null"],"description":"Telefone mascarado quando a tentativa usa codigo de pareamento."},"startedAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"finishedAt":{"type":["string","null"],"format":"date-time"},"finalStatus":{"type":"string","enum":["pending","success","passkey_blocked","qr_timeout","disconnected","provider_error","reset","unknown"]},"finalReason":{"type":["string","null"]},"lastDisconnectReason":{"type":["string","null"],"description":"Ultimo motivo informado pelo provedor. Em passkey_blocked, indica a barreira de chave de acesso exigida pelo WhatsApp."},"qrReceivedCount":{"type":"integer"},"pairCodeReceivedCount":{"type":"integer"},"statusPollCount":{"type":"integer"},"scanDetected":{"type":["boolean","null"],"description":"Sinal inferido quando o provedor confirma conexao ou retorna bloqueio por passkey."},"events":{"type":"array","items":{"$ref":"#/components/schemas/ConnectionDiagnosticEvent"}}}},"ConnectionDiagnostics":{"type":"object","description":"Historico resumido e sanitizado das ultimas tentativas de conexao por QR ou codigo de pareamento. Use latestAttempt.finalStatus=passkey_blocked para detectar contas que exigiram chave de acesso/passkey apos a leitura do QR inicial.","properties":{"activeAttemptId":{"type":["string","null"]},"latestAttempt":{"$ref":"#/components/schemas/ConnectionAttemptDiagnostic","type":["object","null"]},"attempts":{"type":"array","items":{"$ref":"#/components/schemas/ConnectionAttemptDiagnostic"}}}},"ConnectyHubInstance":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"provider":{"type":"string","example":"connectyhub"},"phoneNumber":{"type":["string","null"]},"displayName":{"type":["string","null"]},"profileImageUrl":{"type":["string","null"]},"status":{"type":"string","enum":["draft","qr_pending","connected","disconnected","blocked","error","archived"]},"webhookConfigured":{"type":"boolean"},"qrCode":{"type":["string","null"],"description":"Data URL do QR Code atualizado quando disponivel no status do provedor."},"pairCode":{"type":["string","null"],"description":"Codigo de pareamento atualizado quando disponivel no status do provedor."},"lastDisconnectReason":{"type":["string","null"],"description":"Ultimo motivo de desconexao reportado pelo provedor, quando disponivel."},"connectionDiagnostics":{"$ref":"#/components/schemas/ConnectionDiagnostics"}}},"Instance":{"type":"object","description":"Representa uma instancia do WhatsApp","properties":{"id":{"type":"string","format":"uuid","description":"ID unico gerado automaticamente"},"status":{"type":"string","description":"Status atual da conexao","enum":["disconnected","connecting","connected","hibernated"]},"paircode":{"type":"string","description":"Codigo de pareamento"},"qrcode":{"type":"string","description":"QR Code em base64 para autenticacao"},"name":{"type":"string","description":"Nome da instancia"},"profileName":{"type":"string","description":"Nome do perfil WhatsApp"},"profilePicUrl":{"type":"string","format":"uri","description":"URL da foto do perfil"},"isBusiness":{"type":"boolean","description":"Indica se e uma conta business"},"plataform":{"type":"string","description":"Plataforma de origem (iOS/Android/Web)"},"systemName":{"type":"string","description":"Nome do sistema operacional"},"owner":{"type":"string","description":"Proprietario da instancia"},"current_presence":{"type":"string","description":"Status atual de presenca da instancia (campo nao persistido)","enum":["available","unavailable"],"example":"available"},"lastDisconnect":{"type":"string","format":"date-time","description":"Data/hora da ultima desconexao"},"lastDisconnectReason":{"type":"string","description":"Motivo da ultima desconexao"},"openai_apikey":{"type":"string","description":"Chave da API OpenAI"},"chatbot_enabled":{"type":"boolean","description":"Habilitar chatbot automatico"},"chatbot_ignoreGroups":{"type":"boolean","description":"Ignorar mensagens de grupos"},"chatbot_stopConversation":{"type":"string","description":"Palavra-chave para parar conversa"},"chatbot_stopMinutes":{"type":"integer","description":"Por quanto tempo ficara pausado o chatbot ao usar stop conversation"},"chatbot_stopWhenYouSendMsg":{"type":"integer","description":"Por quanto tempo ficara pausada a conversa quando voce enviar mensagem manualmente"},"fieldsMap":{"type":"object","description":"Mapa de campos customizados da instancia (quando presente)","additionalProperties":true},"currentTime":{"type":"string","description":"Horario atual retornado pelo backend"},"created":{"type":"string","format":"date-time","description":"Data de criacao da instancia"},"updated":{"type":"string","format":"date-time","description":"Data da ultima atualizacao"}},"example":{"id":"i91011ijkl","status":"connected","paircode":"1234-5678","qrcode":"data:image/png;base64,iVBORw0KGg...","name":"Instancia Principal","profileName":"Loja ABC","profilePicUrl":"https://example.com/profile.jpg","isBusiness":true,"plataform":"Android","systemName":"ConnectyHub","owner":"user@example.com","lastDisconnect":"2025-01-24T14:00:00Z","lastDisconnectReason":"Network error","openai_apikey":"sk-...xyz","chatbot_enabled":true,"chatbot_ignoreGroups":true,"chatbot_stopConversation":"parar","chatbot_stopMinutes":60,"created":"2025-01-24T14:00:00Z","updated":"2025-01-24T14:30:00Z","currentPresence":"available"}},"Webhook":{"type":"object","description":"Configuracao completa de webhook com filtros e opcoes avancadas","properties":{"id":{"type":"string","format":"uuid","description":"ID unico gerado automaticamente"},"enabled":{"type":"boolean","description":"Webhook ativo/inativo","default":false},"url":{"type":"string","format":"uri","description":"URL de destino dos eventos"},"events":{"type":"array","items":{"type":"string","enum":["connection","history","messages","messages_update","newsletter_messages","call","contacts","presence","groups","labels","chats","chat_labels","blocks","sender"]},"description":"Tipos de eventos monitorados"},"addUrlTypesMessages":{"type":"boolean","description":"Incluir na URLs o tipo de mensagem","default":false},"addUrlEvents":{"type":"boolean","description":"Incluir na URL o nome do evento","default":false},"excludeMessages":{"type":"array","items":{"type":"string","enum":["wasSentByApi","wasNotSentByApi","fromMeYes","fromMeNo","isGroupYes","isGroupNo"]},"description":"Filtros para excluir tipos de mensagens"}},"required":["url","events"],"example":{"id":"wh_9a8b7c6d5e","enabled":true,"url":"https://webhook.cool/example","events":["messages","newsletter_messages","connection"],"addUrlTypesMessages":false,"addUrlEvents":false,"excludeMessages":[]}},"Chat":{"type":"object","description":"Representa uma conversa/chamado no sistema","properties":{"id":{"type":"string","description":"ID unico da conversa (r + 7 bytes aleatorios em hex)"},"wa_fastid":{"type":"string","description":"Identificador rapido do WhatsApp"},"wa_chatid":{"type":"string","description":"ID completo do chat no WhatsApp"},"wa_chatlid":{"type":"string","description":"LID do chat no WhatsApp (quando disponivel)"},"wa_archived":{"type":"boolean","description":"Indica se o chat esta arquivado","default":false},"wa_contactName":{"type":"string","description":"Nome salvo nos contatos pelo dono da conta/instancia.\nSo existe quando o numero estiver salvo na agenda/contatos.\n","default":""},"wa_name":{"type":"string","description":"Nome definido pelo usuario no perfil do WhatsApp (\"push name\").\nVem do perfil do contato e pode nao estar disponivel dependendo do contexto ou da origem dos dados.\n","default":""},"name":{"type":"string","description":"Nome resolvido pelo sistema como fallback.\nNormalmente consolida o melhor valor disponivel entre dados internos, nome vindo do WhatsApp e nome salvo nos contatos.\nPor isso, costuma ter maior chance de vir preenchido.\n","default":""},"image":{"type":"string","description":"URL da imagem do chat","default":""},"imagePreview":{"type":"string","description":"URL da miniatura da imagem","default":""},"wa_ephemeralExpiration":{"type":"integer","format":"int64","description":"Tempo de expiracao de mensagens efemeras","default":0},"wa_isBlocked":{"type":"boolean","description":"Indica se o contato esta bloqueado","default":false},"wa_isGroup":{"type":"boolean","description":"Indica se e um grupo","default":false},"wa_isGroup_admin":{"type":"boolean","description":"Indica se o usuario e admin do grupo","default":false},"wa_isGroup_announce":{"type":"boolean","description":"Indica se e um grupo somente anuncios","default":false},"wa_isGroup_community":{"type":"boolean","description":"Indica se e uma comunidade","default":false},"wa_isGroup_member":{"type":"boolean","description":"Indica se e membro do grupo","default":false},"wa_isPinned":{"type":"boolean","description":"Indica se o chat esta fixado","default":false},"wa_label":{"type":"array","description":"Labels do chat","items":{"type":"string"}},"wa_notes":{"type":"string","description":"Anotacoes internas do chat sincronizadas via app state","default":""},"wa_lastMessageTextVote":{"type":"string","description":"Texto/voto da ultima mensagem","default":""},"wa_lastMessageType":{"type":"string","description":"Tipo da ultima mensagem","default":""},"wa_lastMsgTimestamp":{"type":"integer","format":"int64","description":"Timestamp da ultima mensagem","default":0},"wa_lastMessageSender":{"type":"string","description":"Remetente da ultima mensagem","default":""},"wa_muteEndTime":{"type":"integer","format":"int64","description":"Timestamp do fim do silenciamento","default":0},"owner":{"type":"string","description":"Dono da instancia","default":""},"wa_unreadCount":{"type":"integer","format":"int64","description":"Contador de mensagens nao lidas","default":0},"phone":{"type":"string","description":"Numero de telefone","default":""},"common_groups":{"type":"string","description":"Grupos em comum separados por virgula, formato: (nome_grupo)id_grupo","default":"","example":"Grupo Familia(120363123456789012@g.us),Trabalho(987654321098765432@g.us)"},"lead_name":{"type":"string","description":"Nome do lead","default":""},"lead_fullName":{"type":"string","description":"Nome completo do lead","default":""},"lead_email":{"type":"string","description":"Email do lead","default":""},"lead_personalid":{"type":"string","description":"Documento de identificacao","default":""},"lead_status":{"type":"string","description":"Status do lead","default":""},"lead_tags":{"type":"array","description":"Tags do lead","items":{"type":"string"}},"lead_notes":{"type":"string","description":"Anotacoes sobre o lead","default":""},"lead_isTicketOpen":{"type":"boolean","description":"Indica se tem ticket aberto","default":false},"lead_assignedAttendant_id":{"type":"string","description":"ID do atendente responsavel","default":""},"lead_kanbanOrder":{"type":"integer","format":"int64","description":"Ordem no kanban","default":0},"lead_field01":{"type":"string","default":""},"lead_field02":{"type":"string","default":""},"lead_field03":{"type":"string","default":""},"lead_field04":{"type":"string","default":""},"lead_field05":{"type":"string","default":""},"lead_field06":{"type":"string","default":""},"lead_field07":{"type":"string","default":""},"lead_field08":{"type":"string","default":""},"lead_field09":{"type":"string","default":""},"lead_field10":{"type":"string","default":""},"lead_field11":{"type":"string","default":""},"lead_field12":{"type":"string","default":""},"lead_field13":{"type":"string","default":""},"lead_field14":{"type":"string","default":""},"lead_field15":{"type":"string","default":""},"lead_field16":{"type":"string","default":""},"lead_field17":{"type":"string","default":""},"lead_field18":{"type":"string","default":""},"lead_field19":{"type":"string","default":""},"lead_field20":{"type":"string","default":""},"chatbot_agentResetMemoryAt":{"type":"integer","format":"int64","description":"Timestamp do ultimo reset de memoria","default":0},"chatbot_lastTrigger_id":{"type":"string","description":"ID do ultimo gatilho executado","default":""},"chatbot_lastTriggerAt":{"type":"integer","format":"int64","description":"Timestamp do ultimo gatilho","default":0},"chatbot_disableUntil":{"type":"integer","format":"int64","description":"Timestamp ate quando chatbot esta desativado","default":0}}},"Message":{"type":"object","description":"Representa uma mensagem trocada no sistema","properties":{"id":{"type":"string","format":"uuid","description":"ID unico interno da mensagem (formato r + 7 caracteres hex aleatorios)"},"messageid":{"type":"string","description":"ID original da mensagem no provedor"},"chatid":{"type":"string","description":"ID da conversa relacionada"},"sender":{"type":"string","description":"ID do remetente da mensagem"},"senderName":{"type":"string","description":"Nome exibido do remetente"},"isGroup":{"type":"boolean","description":"Indica se e uma mensagem de grupo","default":false},"fromMe":{"type":"boolean","description":"Indica se a mensagem foi enviada pelo usuario","default":false},"messageType":{"type":"string","description":"Tipo de conteudo da mensagem"},"source":{"type":"string","description":"Plataforma de origem da mensagem"},"messageTimestamp":{"type":"integer","description":"Timestamp original da mensagem em milissegundos","default":0},"status":{"type":"string","description":"Status do ciclo de vida da mensagem.\nExemplos comuns: `Queued`, `Canceled`, `Failed`, `Sent`, `Delivered`, `Read`.\n"},"text":{"type":"string","description":"Texto original da mensagem","default":""},"quoted":{"type":"string","description":"ID da mensagem citada/respondida","default":""},"edited":{"type":"string","description":"Historico de edicoes da mensagem","default":""},"reaction":{"type":"string","description":"ID da mensagem reagida","default":""},"vote":{"type":"string","description":"Dados de votacao de enquete e listas","default":""},"convertOptions":{"type":"string","description":"Conversao de opcoes da mensagem, lista, enquete e botoes","default":""},"buttonOrListid":{"type":"string","description":"ID do botao ou item de lista selecionado","default":""},"owner":{"type":"string","description":"Dono da mensagem","default":""},"error":{"type":"string","description":"Mensagem de erro caso o envio tenha falhado","default":""},"content":{"description":"Conteudo bruto da mensagem (JSON serializado ou texto)","oneOf":[{"type":"object","additionalProperties":true},{"type":"string","description":"Texto bruto quando nao for JSON"}]},"wasSentByApi":{"type":"boolean","description":"Indica se a mensagem foi enviada via API"},"sendFunction":{"type":"string","description":"Funcao usada para enviar a mensagem (quando enviada via API)"},"sendPayload":{"description":"Payload enviado (texto/JSON serializado)","oneOf":[{"type":"object","additionalProperties":true},{"type":"string","description":"Texto bruto quando nao for JSON"}]},"fileURL":{"type":"string","description":"URL ou referencia de arquivo da mensagem"},"send_folder_id":{"type":"string","description":"Pasta associada ao envio (quando aplicavel)"},"track_source":{"type":"string","description":"Origem de rastreamento"},"track_id":{"type":"string","description":"ID de rastreamento (pode repetir)"},"ai_metadata":{"type":"object","description":"Metadados do processamento por IA","properties":{"agent_id":{"type":"string","description":"ID do agente de IA responsavel"},"request":{"type":"object","description":"Dados da requisicao a API de IA","properties":{"messages":{"type":"array","description":"Historico de mensagens enviadas para a API"},"tools":{"type":"array","description":"Ferramentas disponiveis para o agente"},"options":{"type":"object","description":"Opcoes de configuracao da API","properties":{"model":{"type":"string"},"temperature":{"type":"number"},"maxTokens":{"type":"integer"},"topP":{"type":"number"},"frequencyPenalty":{"type":"number"},"presencePenalty":{"type":"number"}}}}},"response":{"type":"object","description":"Resposta da API de IA","properties":{"choices":{"type":"array","description":"Resultados retornados pela API"},"toolResults":{"type":"array","description":"Resultados da execucao de ferramentas"},"error":{"type":"string","description":"Mensagem de erro, se houver"}}}}},"sender_pn":{"type":"string","description":"JID PN resolvido do remetente (quando disponivel)"},"sender_lid":{"type":"string","description":"LID original do remetente (quando disponivel)"}}},"Label":{"type":"object","description":"Representa uma etiqueta/categoria no sistema","properties":{"id":{"type":"string","format":"uuid","description":"ID unico da etiqueta"},"name":{"type":"string","description":"Nome da etiqueta"},"color":{"type":"integer","description":"Indice numerico da cor (0-19)","minimum":0,"maximum":19,"example":2},"colorHex":{"type":"string","description":"Cor hexadecimal correspondente ao indice","enum":["#ff9484","#64c4ff","#fed428","#dfaef0","#9ab6c1","#56ccb4","#fe9dfe","#d3a91f","#6f7bcf","#d8e651","#01d0e2","#ffc5c7","#92ceac","#f64847","#00a1f2","#83e421","#ffae04","#b4ebff","#9ba6ff","#9568cf"],"example":"#fed428"},"labelid":{"type":"string","description":"ID da label no WhatsApp (quando sincronizada)"},"owner":{"type":"string","description":"Dono da etiqueta"},"created":{"type":"string","format":"date-time","description":"Data de criacao"},"updated":{"type":"string","format":"date-time","description":"Data da ultima atualizacao"}},"example":{"id":"l121314mnop","name":"Cliente VIP","color":2,"colorHex":"#fed428","created":"2025-01-24T14:35:00.000Z","updated":"2025-01-24T15:00:00.000Z"}},"Attendant":{"type":"object","description":"Modelo de atendente do sistema","properties":{"id":{"type":"string","format":"uuid","description":"ID unico gerado automaticamente"},"name":{"type":"string","description":"Nome do atendente","default":""},"phone":{"type":"string","description":"Numero de telefone","default":""},"email":{"type":"string","format":"email","description":"Endereco de e-mail","default":""},"department":{"type":"string","description":"Departamento de atuacao","default":""},"customField01":{"type":"string","description":"Campo personalizavel 01","default":""},"customField02":{"type":"string","description":"Campo personalizavel 02","default":""},"owner":{"type":"string","description":"Responsavel pelo cadastro","default":""},"created":{"type":"string","format":"date-time","description":"Data de criacao automatica"},"updated":{"type":"string","format":"date-time","description":"Data de atualizacao automatica"}},"example":{"id":"r1234abcd","name":"Joao da Silva","phone":"+5511999999999","email":"joao@empresa.com","department":"Suporte Tecnico","customField01":"Turno: Manha","customField02":"Nivel: 2","owner":"admin","created":"2025-01-24T13:52:19.000Z","updated":"2025-01-24T13:52:19.000Z"}},"MessageQueueFolder":{"type":"object","description":"Pasta para organizacao de campanhas de mensagens em massa","properties":{"id":{"type":"string","description":"Identificador unico"},"info":{"type":"string","description":"Informacoes adicionais sobre a pasta"},"status":{"type":"string","description":"Status atual da pasta","example":"ativo"},"scheduled_for":{"type":"integer","format":"int64","description":"Timestamp Unix para execucao agendada"},"delayMax":{"type":"integer","format":"int64","description":"Atraso maximo entre mensagens em milissegundos"},"delayMin":{"type":"integer","format":"int64","description":"Atraso minimo entre mensagens em milissegundos"},"log_delivered":{"type":"integer","format":"int64","description":"Contagem de mensagens entregues"},"log_failed":{"type":"integer","format":"int64","description":"Contagem de mensagens com falha"},"log_played":{"type":"integer","format":"int64","description":"Contagem de mensagens reproduzidas (para audio/video)"},"log_read":{"type":"integer","format":"int64","description":"Contagem de mensagens lidas"},"log_sucess":{"type":"integer","format":"int64","description":"Contagem de mensagens enviadas com sucesso"},"log_total":{"type":"integer","format":"int64","description":"Contagem total de mensagens"},"owner":{"type":"string","description":"Identificador do proprietario da instancia"},"created":{"type":"string","format":"date-time","description":"Data e hora de criacao"},"updated":{"type":"string","format":"date-time","description":"Data e hora da ultima atualizacao"}}},"QuickReply":{"type":"object","properties":{"id":{"type":"string","format":"uuid","description":"ID unico da resposta rapida"},"onWhatsApp":{"type":"boolean","description":"Indica se a resposta esta sincronizada com o WhatsApp Business","default":false},"docName":{"type":"string","description":"Nome de documento associado (quando aplicavel)","default":""},"file":{"type":"string","description":"Caminho ou conteudo do arquivo associado","default":""},"shortCut":{"type":"string","description":"Atalho para acionar a resposta"},"text":{"type":"string","description":"Conteudo da mensagem pre-definida"},"type":{"type":"string","description":"Tipo da resposta rapida (texto/documento/outros)"},"owner":{"type":"string","description":"Dono da resposta rapida"},"created":{"type":"string","format":"date-time","description":"Data de criacao"},"updated":{"type":"string","format":"date-time","description":"Data da ultima atualizacao"}},"required":["shortCut","text"]},"Group":{"type":"object","description":"Representa um grupo/conversa coletiva","properties":{"JID":{"type":"string","format":"jid","description":"Identificador unico do grupo","example":"jid8@g.us"},"OwnerJID":{"type":"string","format":"jid","description":"JID do proprietario do grupo","example":"1232@s.whatsapp.net"},"OwnerPN":{"type":"string","format":"jid","description":"Numero/LID do proprietario (quando disponivel)"},"Name":{"type":"string","description":"Nome do grupo","example":"Grupo de Suporte"},"NameSetAt":{"type":"string","format":"date-time","description":"Data da ultima alteracao do nome"},"NameSetBy":{"type":"string","format":"jid","description":"JID do usuario que definiu o nome"},"NameSetByPN":{"type":"string","format":"jid","description":"LID/PN de quem definiu o nome"},"Topic":{"type":"string","description":"Descricao do grupo"},"TopicID":{"type":"string","description":"ID interno da descricao"},"TopicSetAt":{"type":"string","format":"date-time","description":"Data da ultima alteracao da descricao"},"TopicSetBy":{"type":"string","format":"jid","description":"JID de quem alterou a descricao"},"TopicSetByPN":{"type":"string","format":"jid","description":"LID/PN de quem alterou a descricao"},"TopicDeleted":{"type":"boolean","description":"Indica se a descricao foi apagada"},"IsLocked":{"type":"boolean","description":"Indica se apenas administradores podem editar informacoes do grupo\n- true = apenas admins podem editar\n- false = todos podem editar\n","example":true},"IsAnnounce":{"type":"boolean","description":"Indica se apenas administradores podem enviar mensagens"},"AnnounceVersionID":{"type":"string","description":"Versao da configuracao de anuncios"},"IsEphemeral":{"type":"boolean","description":"Indica se as mensagens sao temporarias"},"DisappearingTimer":{"type":"integer","description":"Tempo em segundos para desaparecimento de mensagens","minimum":0},"IsIncognito":{"type":"boolean","description":"Indica se o grupo e incognito"},"IsParent":{"type":"boolean","description":"Indica se e um grupo pai (comunidade)"},"IsJoinApprovalRequired":{"type":"boolean","description":"Indica se requer aprovacao para novos membros"},"LinkedParentJID":{"type":"string","format":"jid","description":"JID da comunidade vinculada"},"IsDefaultSubGroup":{"type":"boolean","description":"Indica se e um subgrupo padrao da comunidade"},"DefaultMembershipApprovalMode":{"type":"string","description":"Modo padrao de aprovacao de membros (quando comunidade)"},"GroupCreated":{"type":"string","format":"date-time","description":"Data de criacao do grupo"},"CreatorCountryCode":{"type":"string","description":"Codigo do pais do criador"},"ParticipantVersionID":{"type":"string","description":"Versao da lista de participantes"},"Participants":{"type":"array","items":{"$ref":"#/components/schemas/GroupParticipant"},"description":"Lista de participantes do grupo"},"MemberAddMode":{"type":"string","enum":["admin_add","all_member_add"],"description":"Modo de adicao de novos membros"},"AddressingMode":{"type":"string","enum":["pn","lid"],"description":"Enderecamento preferido do grupo"},"OwnerCanSendMessage":{"type":"boolean","description":"Verifica se e possivel voce enviar mensagens"},"OwnerIsAdmin":{"type":"boolean","description":"Verifica se voce adminstrador do grupo"},"DefaultSubGroupId":{"type":"string","description":"Se o grupo atual for uma comunidade, nesse campo mostrara o ID do subgrupo de avisos"},"invite_link":{"type":"string","description":"Link de convite para entrar no grupo"},"request_participants":{"type":"string","description":"Lista de solicitacoes de entrada, separados por virgula"}}},"GroupParticipant":{"type":"object","description":"Participante de um grupo","properties":{"JID":{"type":"string","format":"jid","description":"Identificador do participante"},"LID":{"type":"string","format":"jid","description":"Identificador local do participante"},"PhoneNumber":{"type":"string","format":"jid","description":"Numero do participante (quando disponivel)"},"IsAdmin":{"type":"boolean","description":"Indica se e administrador"},"IsSuperAdmin":{"type":"boolean","description":"Indica se e super administrador"},"DisplayName":{"type":"string","description":"Nome exibido no grupo (para usuarios anonimos)"},"Error":{"type":"integer","description":"Codigo de erro ao adicionar participante","minimum":0},"AddRequest":{"type":"object","description":"Informacoes da solicitacao de entrada","properties":{"Code":{"type":"string","description":"Codigo da solicitacao"},"Expiration":{"type":"string","format":"date-time","description":"Data de expiracao da solicitacao"}}}}},"WebhookEvent":{"type":"object","required":["event","instance","data"],"properties":{"event":{"type":"string","enum":["message","status","presence","group","connection"],"description":"Tipo do evento recebido"},"instance":{"type":"string","description":"ID da instancia que gerou o evento"},"data":{"type":"object","description":"Payload do evento enviado pelo webhook. O formato varia conforme o tipo do evento\n(messages, messages_update, connection, presence, etc) e segue o que o backend envia\nem `callHook` (map[string]interface{}). Consulte os exemplos de cada evento especifico.\n","additionalProperties":true}}}}},"paths":{"/instances":{"get":{"tags":["Nativo ConnectyHub"],"summary":"Listar instancias","description":"Retorna as instancias WhatsApp vinculadas ao cliente API autenticado. Use o id retornado aqui em todas as chamadas de mensagens, consultas e recursos avancados.","operationId":"connectyhubListInstances","responses":{"200":{"description":"Instancias do cliente API"},"401":{"description":"Chave ausente, invalida ou expirada"}}},"post":{"tags":["Nativo ConnectyHub"],"summary":"Criar instancia","description":"Cria uma nova instancia controlada pela ConnectyHub, vinculada ao cliente API autenticado e pronta para iniciar conexao por QR Code ou codigo de pareamento.","operationId":"connectyhubCreateInstance","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","description":"Nome interno da instancia","example":"Atendimento Loja Centro"},"webhookUrl":{"type":"string","format":"uri","description":"Webhook inicial do cliente","example":"https://cliente.com/webhooks/connectyhub"},"metadata":{"type":"object","description":"Metadados livres do cliente"}}}}}},"responses":{"201":{"description":"Instancia criada"},"401":{"description":"Chave ausente, invalida ou expirada"},"403":{"description":"Cliente pausado ou sem permissao"}}}},"/instances/{instanceId}":{"delete":{"tags":["Nativo ConnectyHub"],"summary":"Excluir instancia","description":"Exclui uma instancia do cliente API autenticado. A ConnectyHub tenta remover a instancia no provedor WhatsApp e arquiva o registro local para bloquear novas conexoes, mensagens e webhooks. Quando o provedor nao confirma a exclusao, a resposta retorna providerDeleted=false e status HTTP 202 para indicar limpeza pendente no provedor.","operationId":"connectyhubDeleteInstance","parameters":[{"name":"instanceId","in":"path","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub","example":"ch-api-atendimento-01"}],"responses":{"200":{"description":"Instancia excluida na ConnectyHub e no provedor"},"202":{"description":"Instancia arquivada na ConnectyHub, mas exclusao no provedor ficou pendente"},"401":{"description":"Chave ausente, invalida ou expirada"},"404":{"description":"Instancia nao encontrada para este cliente"}}}},"/instances/{instanceId}/connect":{"post":{"tags":["Nativo ConnectyHub"],"summary":"Conectar instancia","description":"Inicia ou atualiza o fluxo de conexao da instancia. Sem phone, solicita QR Code. Com phone em formato internacional, solicita codigo de pareamento. Quando o WhatsApp retornar lastDisconnectReason=Passkey pairing not supported, o provedor ainda nao disponibiliza o segundo QR de chave de acesso pela API; o fluxo por phone pode ser testado, mas nao e garantido. A alternativa operacional e concluir a validacao no WhatsApp Web oficial e migrar a sessao autenticada pelo Session Migration Connector.\n\n## Contas com chave de acesso/passkey\n\nAlgumas contas do WhatsApp leem o QR inicial, mas exigem uma verificacao extra por chave de acesso antes de concluir a sessao. Quando isso acontecer, a API retorna sinais de diagnostico para o painel do cliente tratar o caso sem acionar suporte:\n\n- `connectionDiagnostics.latestAttempt.finalStatus = passkey_blocked`\n- `lastDisconnectReason = Passkey pairing not supported`\n\nEsse caso nao indica token invalido, webhook quebrado ou QR renderizado errado. O QR inicial foi lido, mas o WhatsApp exigiu uma etapa de seguranca que ainda nao retorna o segundo QR pela API.\n\nNo painel do seu produto, detecte esse status, pare de insistir no QR atual e mostre uma mensagem amigavel: `Esta conta pediu uma verificacao extra por chave de acesso. Esse tipo de verificacao ainda nao pode ser concluido diretamente pelo QR Code do painel.`\n\nVoce pode oferecer reset e nova tentativa de QR. Se a conta voltar ao mesmo status, use um fluxo de migracao assistida de sessao apos concluir a validacao no WhatsApp Web oficial.","operationId":"connectyhubConnectInstance","parameters":[{"name":"instanceId","in":"path","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub","example":"ch-api-atendimento-01"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"phone":{"type":"string","description":"Numero em formato internacional para gerar codigo de pareamento","example":"5511999999999"},"browser":{"type":"string","enum":["auto","safari","firefox","edge","chrome"],"description":"Perfil de navegador usado no pareamento. Use auto como padrao.","default":"auto","example":"auto"},"systemName":{"type":"string","description":"Nome exibido no WhatsApp em aparelhos conectados. Envie vazio para usar o padrao do provedor.","example":"ViralCheck"},"proxyManagedCountry":{"type":"string","description":"Pais do proxy regional gerenciado. Alias aceito: proxy_managed_country.","example":"br"},"proxyManagedState":{"type":"string","description":"Estado/subdivisao do proxy regional. Alias aceito: proxy_managed_state.","example":"sp"},"proxyManagedCity":{"type":"string","description":"Cidade do proxy regional. Alias aceito: proxy_managed_city.","example":"campinas"}}}}}},"responses":{"200":{"description":"Status de conexao atualizado","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"instanceId":{"type":"string","example":"ch-api-atendimento-01"},"status":{"type":"string","enum":["draft","qr_pending","connected","disconnected","blocked","error"],"example":"qr_pending"},"qrCode":{"type":["string","null"],"description":"Data URL do QR Code quando o fluxo por QR estiver ativo."},"pairCode":{"type":["string","null"],"description":"Codigo de pareamento quando phone for informado."},"lastDisconnectReason":{"type":["string","null"],"description":"Ultimo motivo informado pelo provedor. Passkey pairing not supported indica que a conta exigiu WebAuthn/chave de acesso e que o segundo QR nao e retornado pela API.","example":"Passkey pairing not supported"},"connectionDiagnostics":{"$ref":"#/components/schemas/ConnectionDiagnostics"},"provider":{"type":"object","description":"Resposta sanitizada do provedor WhatsApp."}}}}}},"404":{"description":"Instancia nao encontrada para este cliente"},"429":{"description":"Limite de conexoes simultaneas atingido"},"503":{"description":"Capacidade de conexao temporariamente indisponivel"}}}},"/instances/{instanceId}/reset":{"post":{"tags":["Nativo ConnectyHub"],"summary":"Resetar runtime da instancia","description":"Solicita um reset controlado do runtime da instancia no provedor WhatsApp. Use antes de gerar uma nova tentativa de conexao quando a sessao ficou presa, mas sem apagar o registro da instancia.","operationId":"connectyhubResetInstance","parameters":[{"name":"instanceId","in":"path","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub","example":"ch-api-atendimento-01"}],"responses":{"200":{"description":"Reset aceito pelo provedor"},"404":{"description":"Instancia nao encontrada para este cliente"},"409":{"description":"Sessao atual nao e reconectavel por reset"}}}},"/instances/{instanceId}/status":{"get":{"tags":["Nativo ConnectyHub"],"summary":"Atualizar status da instancia","description":"Consulta o status atual, sincroniza o registro da ConnectyHub e retorna informacoes de conexao, perfil, numero, foto, QR Code ou codigo de pareamento quando o provedor ainda mantiver o fluxo em andamento.\n\n## Contas com chave de acesso/passkey\n\nAlgumas contas do WhatsApp leem o QR inicial, mas exigem uma verificacao extra por chave de acesso antes de concluir a sessao. Quando isso acontecer, a API retorna sinais de diagnostico para o painel do cliente tratar o caso sem acionar suporte:\n\n- `connectionDiagnostics.latestAttempt.finalStatus = passkey_blocked`\n- `lastDisconnectReason = Passkey pairing not supported`\n\nEsse caso nao indica token invalido, webhook quebrado ou QR renderizado errado. O QR inicial foi lido, mas o WhatsApp exigiu uma etapa de seguranca que ainda nao retorna o segundo QR pela API.\n\nNo painel do seu produto, detecte esse status, pare de insistir no QR atual e mostre uma mensagem amigavel: `Esta conta pediu uma verificacao extra por chave de acesso. Esse tipo de verificacao ainda nao pode ser concluido diretamente pelo QR Code do painel.`\n\nVoce pode oferecer reset e nova tentativa de QR. Se a conta voltar ao mesmo status, use um fluxo de migracao assistida de sessao apos concluir a validacao no WhatsApp Web oficial.","operationId":"connectyhubRefreshInstanceStatus","parameters":[{"name":"instanceId","in":"path","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub","example":"ch-api-atendimento-01"}],"responses":{"200":{"description":"Status atualizado","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","example":true},"instance":{"$ref":"#/components/schemas/ConnectyHubInstance"}}}}}},"404":{"description":"Instancia nao encontrada para este cliente"}}}},"/messages/text":{"post":{"tags":["Nativo ConnectyHub"],"summary":"Enviar texto","description":"Envia mensagem de texto por uma instancia controlada pela chave API. Use Idempotency-Key para evitar duplicidade em tentativas repetidas.","operationId":"connectyhubSendText","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Chave opcional para evitar envio duplicado"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","number","text"],"properties":{"instanceId":{"type":"string","example":"ch-api-atendimento-01"},"number":{"type":"string","description":"Numero em formato internacional","example":"5511999999999"},"text":{"type":"string","description":"Texto da mensagem","example":"Ola! Sua conversa foi iniciada pela ConnectyHub API."},"linkPreview":{"type":"boolean","description":"Ativa preview de link quando aplicavel","example":true},"trackId":{"type":"string","description":"ID externo para conciliacao no seu sistema","example":"pedido-123"}}}}}},"responses":{"200":{"description":"Mensagem enviada"},"409":{"description":"Conflito de idempotencia"},"429":{"description":"Limite mensal atingido"}}}},"/messages/media":{"post":{"tags":["Nativo ConnectyHub"],"summary":"Enviar midia","description":"Envia imagem, video, audio, documento, PTT/PTV ou sticker por URL ou base64. O arquivo e processado pela instancia informada.","operationId":"connectyhubSendMedia","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string"},"description":"Chave opcional para evitar envio duplicado"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","number","type","file"],"properties":{"instanceId":{"type":"string","example":"ch-api-atendimento-01"},"number":{"type":"string","example":"5511999999999"},"type":{"type":"string","enum":["image","video","videoplay","document","audio","myaudio","ptt","ptv","sticker"],"example":"image"},"file":{"type":"string","description":"URL publica ou conteudo base64","example":"https://exemplo.com/foto.jpg"},"text":{"type":"string","description":"Legenda opcional"},"docName":{"type":"string","description":"Nome do documento quando type=document"},"trackId":{"type":"string","description":"ID externo para conciliacao"}}}}}},"responses":{"200":{"description":"Midia enviada"},"429":{"description":"Limite mensal atingido"}}}},"/messages":{"get":{"tags":["Nativo ConnectyHub"],"summary":"Buscar mensagens","description":"Consulta mensagens sincronizadas da instancia com paginacao e filtro por chat.","operationId":"connectyhubFindMessages","parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"Quantidade maxima de registros"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer"},"description":"Deslocamento da paginacao"}],"responses":{"200":{"description":"Consulta executada com sucesso"}}},"post":{"tags":["Nativo ConnectyHub"],"summary":"Buscar mensagens com filtros","description":"Consulta historico de mensagens com filtros avancados no corpo da requisicao.","operationId":"connectyhubFindMessagesWithFilters","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":["instanceId"],"properties":{"instanceId":{"type":"string","example":"ch-api-atendimento-01"},"limit":{"type":"integer","example":50},"offset":{"type":"integer","example":0},"chatId":{"type":"string","example":"5511999999999@s.whatsapp.net"}}}}}},"responses":{"200":{"description":"Mensagens encontradas"}}}},"/chats":{"get":{"tags":["Nativo ConnectyHub"],"summary":"Buscar chats","description":"Lista conversas com filtros, ordenacao e paginacao.","operationId":"connectyhubFindChats","parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"Quantidade maxima de registros"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer"},"description":"Deslocamento da paginacao"}],"responses":{"200":{"description":"Consulta executada com sucesso"}}},"post":{"tags":["Nativo ConnectyHub"],"summary":"Buscar chats com filtros","description":"Lista conversas usando filtros avancados no corpo da requisicao.","operationId":"connectyhubFindChatsWithFilters","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":["instanceId"],"properties":{"instanceId":{"type":"string","example":"ch-api-atendimento-01"},"limit":{"type":"integer","example":50},"offset":{"type":"integer","example":0}}}}}},"responses":{"200":{"description":"Chats encontrados"}}}},"/chats/details":{"get":{"tags":["Nativo ConnectyHub"],"summary":"Detalhes do chat","description":"Retorna dados completos do contato, grupo ou chat, incluindo imagem quando disponivel.","operationId":"connectyhubChatDetails","parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub"},{"name":"number","in":"query","required":true,"schema":{"type":"string"},"description":"Numero ou identificador do chat"},{"name":"preview","in":"query","required":false,"schema":{"type":"boolean"},"description":"Inclui dados resumidos para preview"}],"responses":{"200":{"description":"Detalhes do chat"}}}},"/contacts":{"get":{"tags":["Nativo ConnectyHub"],"summary":"Listar contatos","description":"Lista contatos da conta conectada com paginacao e escopo de agenda.","operationId":"connectyhubListContacts","parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"},"description":"Quantidade maxima de contatos"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer"},"description":"Deslocamento da paginacao"},{"name":"contactScope","in":"query","required":false,"schema":{"type":"string","enum":["address_book","outside_address_book","all"]},"description":"Escopo da agenda consultada"}],"responses":{"200":{"description":"Contatos encontrados"}}}},"/webhooks":{"get":{"tags":["Nativo ConnectyHub"],"summary":"Listar webhooks","description":"Lista endpoints de webhook cadastrados para o cliente API.","operationId":"connectyhubListWebhooks","responses":{"200":{"description":"Webhooks do cliente"}}},"post":{"tags":["Nativo ConnectyHub"],"summary":"Criar webhook","description":"Cria um endpoint de webhook assinado. O secret e retornado apenas uma vez.","operationId":"connectyhubCreateWebhook","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","example":"https://cliente.com/webhooks/connectyhub"},"description":{"type":"string","example":"Webhook principal"},"events":{"type":"array","items":{"type":"string","enum":["messages","messages_update","connection","chats","contacts","history","presence","groups","labels","chat_labels","newsletter_messages","call","blocks","sender"]},"example":["messages","connection"]}}}}}},"responses":{"201":{"description":"Webhook criado"}}}},"/webhooks/{webhookId}":{"get":{"tags":["Nativo ConnectyHub"],"summary":"Detalhar webhook","description":"Detalhar webhook cadastrado para o cliente API autenticado.","operationId":"connectyhubGetWebhook","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"ID do webhook"}],"responses":{"200":{"description":"Detalhar webhook"}}},"patch":{"tags":["Nativo ConnectyHub"],"summary":"Atualizar webhook","description":"Atualizar webhook cadastrado para o cliente API autenticado.","operationId":"connectyhubUpdateWebhook","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"ID do webhook"}],"responses":{"200":{"description":"Atualizar webhook"}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"description":{"type":"string"},"events":{"type":"array","items":{"type":"string","enum":["messages","messages_update","connection","chats","contacts","history","presence","groups","labels","chat_labels","newsletter_messages","call","blocks","sender"]}},"status":{"type":"string","enum":["active","paused","archived"]}}}}}}},"delete":{"tags":["Nativo ConnectyHub"],"summary":"Arquivar webhook","description":"Arquivar webhook cadastrado para o cliente API autenticado.","operationId":"connectyhubArchiveWebhook","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"ID do webhook"}],"responses":{"200":{"description":"Arquivar webhook"}}}},"/webhooks/{webhookId}/test":{"post":{"tags":["Nativo ConnectyHub"],"summary":"Testar webhook","description":"Dispara um evento de teste assinado para validar a URL do cliente.","operationId":"connectyhubTestWebhook","parameters":[{"name":"webhookId","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"ID do webhook"}],"responses":{"200":{"description":"Evento de teste entregue"}}}},"/webhooks/deliveries":{"get":{"tags":["Nativo ConnectyHub"],"summary":"Listar entregas de webhook","description":"Audita tentativas de entrega, status HTTP, payload resumido e resposta do endpoint.","operationId":"connectyhubListWebhookDeliveries","responses":{"200":{"description":"Entregas recentes"}}}},"/webhooks/deliveries/{deliveryId}/retry":{"post":{"tags":["Nativo ConnectyHub"],"summary":"Reenviar entrega de webhook","description":"Executa retry manual de uma entrega de webhook do cliente.","operationId":"connectyhubRetryWebhookDelivery","parameters":[{"name":"deliveryId","in":"path","required":true,"schema":{"type":"string","format":"uuid"},"description":"ID da entrega"}],"responses":{"200":{"description":"Retry executado"}}}},"/usage":{"get":{"tags":["Nativo ConnectyHub"],"summary":"Consultar uso e limite","description":"Retorna consumo do periodo, limite mensal, mensagens usadas e eventos recentes.","operationId":"connectyhubGetUsage","responses":{"200":{"description":"Resumo de consumo do cliente API"}}}},"/provider/instance/connect":{"post":{"tags":["Instancias"],"summary":"Conectar instancia ao WhatsApp","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nInicia o processo de conexao de uma instancia ao WhatsApp. Este endpoint:\n1. Requer o instanceId da ConnectyHub\n2. Recebe o numero de telefone associado a conta WhatsApp\n3. Gera um QR code caso nao passe o campo `phone`\n4. Ou Gera codigo de pareamento se passar o o campo `phone`\n5. Atualiza o status da instancia para \"connecting\"\n\nO processo de conexao permanece pendente ate que:\n- O QR code seja escaneado no WhatsApp do celular, ou\n- O codigo de pareamento seja usado no WhatsApp\n- Timeout de 2 minutos para QRCode seja atingido ou 5 minutos para o codigo de pareamento\n\nUse o endpoint /instance/status para monitorar o progresso da conexao.\n\nEstados possiveis da instancia:\n- `disconnected`: Desconectado do WhatsApp\n- `connecting`: Em processo de conexao\n- `connected`: Conectado e autenticado\n- `hibernated`: Sessao pausada, com credenciais preservadas para reconexao\n\nSincronizacao e armazenamento de mensagens:\n- Todas as mensagens recebidas da Meta durante a sincronizacao da conexao (leitura do QR code) sao enviadas no evento `history` do webhook.\n- As mensagens dos ultimos 7 dias sao armazenadas no banco de dados e ficam acessiveis pelos endpoints: `POST /message/find` e `POST /chat/find`.\n- Depois que a instancia conecta, todas as mensagens enviadas ou recebidas sao armazenadas no banco de dados.\n- Mensagens mais antigas do que 7 dias sao excluidas durante a madrugada.\n\nProxy regional:\n- No momento, o proxy regional publico esta disponivel para Brasil (`br`).\n- Use `GET /proxy-managed/cities?country=br` para listar cidades brasileiras.\n- Envie `proxy_managed_city` com o `value` retornado pela cidade.\n- Quando a cidade retornar `state`, envie tambem `proxy_managed_state` com esse valor.\n- O backend valida a combinacao de pais, estado e cidade antes de salvar.\n","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":["instanceId"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"phone":{"type":"string","description":"Numero de telefone no formato internacional (ex: 5511999999999). Se informado, gera codigo de pareamento. Se omitido, gera QR code.","example":"5511999999999","pattern":"^\\d{10,15}$"},"browser":{"type":"string","description":"Browser usado no ciclo de autenticacao/conexao. `auto` preserva um perfil valido ja salvo ou escolhe Safari, Firefox ou Edge para novas conexoes.","enum":["auto","safari","firefox","edge","chrome"],"default":"auto","example":"auto"},"systemName":{"type":"string","description":"Sistema/nome exibido no celular em aparelhos conectados. Ajuda a identificar a instancia no WhatsApp; para maior estabilidade, recomendamos deixar em branco e usar o valor padrao do navegador escolhido.","example":"Minha Empresa"},"proxy_managed_country":{"type":"string","description":"Pais desejado para o proxy regional, em ISO alpha-2 minusculo. No momento, use `br`.","example":"br","pattern":"^[a-z]{2}$"},"proxy_managed_state":{"type":"string","description":"Estado/subdivisao da cidade escolhida. Quando o pais/cidade exigir desambiguacao, use o campo `state` retornado por `GET /proxy-managed/cities?country=br`.","example":"sp"},"proxy_managed_city":{"type":"string","description":"Cidade escolhida para o proxy regional. Use sempre o campo `value` retornado por `GET /proxy-managed/cities`.","example":"campinas"}}}}}}}},"responses":{"200":{"description":"Sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"connected":{"type":"boolean","description":"Estado atual da conexao","example":false},"loggedIn":{"type":"boolean","description":"Estado do login","example":false},"jid":{"type":["object","null"],"description":"ID do WhatsApp (quando logado)","example":null},"instance":{"$ref":"#/components/schemas/Instance","description":"Detalhes completos da instancia"}}}}}},"401":{"description":"Chave invalida ou expirada"},"404":{"description":"Instancia nao encontrada"},"429":{"description":"Limite de conexoes simultaneas atingido"},"500":{"description":"Erro interno"},"503":{"description":"Capacidade de conexao temporariamente indisponivel","headers":{"Retry-After":{"description":"Tempo recomendado, em segundos, para tentar novamente.","schema":{"type":"integer","example":5}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostInstanceConnect"}},"/provider/instance/disconnect":{"post":{"tags":["Instancias"],"summary":"Desconectar instancia","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string. Esta operacao nao exige payload especifico.\n\nDesconecta a conta do WhatsApp atualmente conectada, encerrando a sessao atual.\nEsta operacao:\n\n- Encerra a conexao ativa\n\n- Requer novo QR code para reconectar\n\n\nDiferencas entre desconectar e hibernar:\n\n- Desconectar: Encerra completamente a sessao, exigindo novo login\n\n- Hibernar: Mantem a sessao ativa, apenas pausa a conexao\n\n\nUse este endpoint para:\n\n1. Encerrar completamente uma sessao\n\n2. Forcar uma nova autenticacao\n\n3. Limpar credenciais da sessao atual\n\n4. Reiniciar o processo de conexao\n\n\nEstados possiveis apos desconectar:\n\n- `disconnected`: Desconectado do WhatsApp\n\n- `connecting`: Em processo de reconexao (apos usar /instance/connect)\n","responses":{"200":{"description":"Sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"instance":{"$ref":"#/components/schemas/Instance"},"response":{"type":"string","example":"Disconnected"},"info":{"type":"string","example":"The device has been successfully disconnected from WhatsApp. A new QR code will be required for the next connection."}}}}}},"401":{"description":"Chave invalida ou expirada"},"404":{"description":"Instancia nao encontrada"},"500":{"description":"Erro interno"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":["instanceId"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","additionalProperties":true,"description":"Payload especifico da operacao, quando aplicavel."}}}}}},"operationId":"providerPostInstanceDisconnect"}},"/provider/instance/reset":{"post":{"tags":["Instancias"],"summary":"Reiniciar runtime da instancia","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string. Esta operacao nao exige payload especifico.\n\nSolicita um reset controlado do runtime da instancia atual.\n\nEste endpoint e util quando a sessao ficou presa, o envio nao esta progredindo\nou a instancia precisa forcar uma tentativa de recuperacao sem apagar o registro\nda instancia.\n\nComportamentos possiveis:\n- inicia um novo reset quando a instancia esta apta\n- informa que um reset ja esta em andamento\n- informa que existe cooldown ativo entre resets\n- retorna erro quando a sessao nao pode ser recuperada ou quando a politica de\n  reconexao bloqueia a operacao\n\nA resposta sempre informa:\n- `instanceId`: ID da instancia autenticada\n- `resetting`: se ha reset em andamento no momento\n- `queuedRecoveryAttempted`: se houve tentativa de recuperacao da fila interna\n","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"Reset aceito, ja em andamento ou em cooldown","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Instance reset started"},"resetting":{"type":"boolean","example":true},"instanceId":{"type":"string","example":"r183e2ef9597845"},"queuedRecoveryAttempted":{"type":"boolean","example":true}}},"examples":{"started":{"summary":"Reset iniciado","value":{"response":"Instance reset started","resetting":true,"instanceId":"r183e2ef9597845","queuedRecoveryAttempted":true}},"inProgress":{"summary":"Reset ja em andamento","value":{"response":"Instance reset already in progress","resetting":true,"instanceId":"r183e2ef9597845","queuedRecoveryAttempted":false}},"cooldown":{"summary":"Cooldown ativo","value":{"response":"Instance reset cooldown active (8s remaining)","resetting":false,"instanceId":"r183e2ef9597845","queuedRecoveryAttempted":false}}}}}},"400":{"description":"Payload JSON invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid payload"}}}}}},"401":{"description":"Token invalido, ausente ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"403":{"description":"Reset bloqueado pela politica de reconexao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"resetting":{"type":"boolean","example":false},"instanceId":{"type":"string"},"queuedRecoveryAttempted":{"type":"boolean"}}}}}},"409":{"description":"Sessao atual nao e reconectavel por reset","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"resetting":{"type":"boolean","example":false},"instanceId":{"type":"string"},"queuedRecoveryAttempted":{"type":"boolean"}}}}}},"500":{"description":"Erro interno ao solicitar o reset","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"server not available"},"resetting":{"type":"boolean","example":false},"instanceId":{"type":"string"},"queuedRecoveryAttempted":{"type":"boolean"}}}}}}},"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":["instanceId"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","additionalProperties":true,"description":"Payload especifico da operacao, quando aplicavel."}}}}}},"operationId":"providerPostInstanceReset"}},"/provider/instance/status":{"get":{"tags":["Instancias"],"summary":"Verificar status da instancia","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nRetorna o status atual de uma instancia, incluindo:\n- Estado da conexao (disconnected, connecting, connected, hibernated)\n- QR code atualizado (se em processo de conexao)\n- Codigo de pareamento (se disponivel)\n- Informacoes da ultima desconexao\n- Detalhes completos da instancia\n\nEste endpoint e particularmente util para:\n1. Monitorar o progresso da conexao\n2. Obter QR codes atualizados durante o processo de conexao\n3. Verificar o estado atual da instancia\n4. Identificar problemas de conexao\n\nEstados possiveis:\n- `disconnected`: Desconectado do WhatsApp\n- `connecting`: Em processo de conexao (aguardando QR code ou codigo de pareamento)\n- `connected`: Conectado e autenticado com sucesso\n- `hibernated`: Sessao pausada, com credenciais preservadas para reconexao\n","responses":{"200":{"description":"Sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"instance":{"$ref":"#/components/schemas/Instance"},"status":{"type":"object","properties":{"connected":{"type":"boolean","description":"Indica se esta conectado ao WhatsApp"},"loggedIn":{"type":"boolean","description":"Indica se esta autenticado no WhatsApp"},"jid":{"type":["object","null"],"description":"ID do WhatsApp quando conectado"}}}}},"example":{"instance":{"id":"r183e2ef9597845","name":"minha-instancia","status":"connected","profileName":"Meu WhatsApp","currentTime":"2024-01-25T12:00:00.000Z"},"status":{"connected":true,"loggedIn":true,"jid":{"user":"5511999999999","agent":0,"device":0,"server":"s.whatsapp.net"}}}}}},"401":{"description":"Chave invalida ou expirada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"instance info not found"}}}}}},"404":{"description":"Instancia nao encontrada"},"500":{"description":"Erro interno"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"}],"operationId":"providerGetInstanceStatus"}},"/provider/instance/wa_messages_limits":{"get":{"tags":["Instancias"],"summary":"Consultar limites atuais de novas conversas no WhatsApp","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nConsulta o estado atual de limitacao do WhatsApp para a conta atualmente conectada.\n\nEste endpoint e util para:\n- diagnosticar erros de envio com `provider_code: 463`\n- verificar se o WhatsApp indica que a conta atualmente conectada pode iniciar novas conversas\n- exibir informacoes de suporte antes de campanhas ou envios de alto volume\n\nA resposta consolida duas fontes internas do WhatsApp:\n- `new_chat_message_capping`: limite de mensagens para iniciar novas conversas\n- `reachout_timelock`: restricao temporaria para iniciar novas conversas\n\nObservacoes:\n- este endpoint depende de sessao ativa e conectada\n- se o WhatsApp nao retornar os dados esperados, a resposta pode marcar os blocos como indisponiveis via `available: false` e `lookup_error`\n- `message` descreve o estado atual da conta atualmente conectada\n- `provider_message` detalha o motivo reportado pelo WhatsApp quando houver restricao ativa\n","responses":{"200":{"description":"Diagnostico atual dos limites de novas conversas da conta atualmente conectada","content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string","example":"whatsapp"},"reachable":{"type":"boolean","description":"Indica se ao menos uma das consultas ao WhatsApp retornou dados uteis","example":true},"can_send_new_messages":{"type":["boolean","null"],"description":"Indica se o WhatsApp sinaliza que a conta atualmente conectada pode iniciar novas conversas.\nPode ser `null` quando nao foi possivel concluir o diagnostico.\n","example":false},"error_key":{"type":"string","description":"Chave de erro derivada do diagnostico atual","example":"WHATSAPP_REACHOUT_TIMELOCK"},"message":{"type":"string","description":"Mensagem tecnica principal em ingles","example":"WhatsApp indicates that the currently connected account is under a temporary restriction for starting new conversations. This is not an internal API error."},"message_ptbr":{"type":"string","description":"Mensagem principal traduzida para pt-BR","example":"O WhatsApp indica que a conta atualmente conectada esta sob uma restricao temporaria para iniciar novas conversas. Isso nao e um erro interno da API."},"provider_message":{"type":"string","description":"Motivo detalhado reportado pelo WhatsApp em ingles","example":"WhatsApp reported that the currently connected account is under a temporary restriction for starting new conversations, usually related to sending volume or quality."},"provider_message_ptbr":{"type":"string","description":"Motivo detalhado reportado pelo WhatsApp em pt-BR","example":"O WhatsApp informou que a conta atualmente conectada esta sob uma restricao temporaria para iniciar novas conversas, normalmente relacionada a volume ou qualidade de envios."},"diagnostics_endpoint":{"type":"string","example":"/instance/wa_messages_limits"},"new_chat_message_capping":{"type":"object","properties":{"available":{"type":"boolean","example":true},"status":{"type":"string","example":"CAPPED"},"used_quota":{"type":"integer","example":10},"total_quota":{"type":"integer","example":10},"cycle_start":{"type":"string","format":"date-time"},"cycle_end":{"type":"string","format":"date-time"},"server_sent_at":{"type":"string","format":"date-time"},"ote_status":{"type":"string","example":"EXHAUSTED"},"mv_status":{"type":"string","example":"ACTIVE"},"lookup_error":{"type":"string"}}},"reachout_timelock":{"type":"object","properties":{"available":{"type":"boolean","example":true},"active":{"type":"boolean","example":true},"until":{"type":"string","format":"date-time"},"enforcement_type":{"type":"string","example":"BIZ_QUALITY"},"lookup_error":{"type":"string"}}}}},"examples":{"restricted":{"summary":"Conta conectada com restricao ativa","value":{"provider":"whatsapp","reachable":true,"can_send_new_messages":false,"error_key":"WHATSAPP_REACHOUT_TIMELOCK","message":"WhatsApp indicates that the currently connected account is under a temporary restriction for starting new conversations. This is not an internal API error.","message_ptbr":"O WhatsApp indica que a conta atualmente conectada esta sob uma restricao temporaria para iniciar novas conversas. Isso nao e um erro interno da API.","provider_message":"WhatsApp reported that the currently connected account is under a temporary restriction for starting new conversations, usually related to sending volume or quality.","provider_message_ptbr":"O WhatsApp informou que a conta atualmente conectada esta sob uma restricao temporaria para iniciar novas conversas, normalmente relacionada a volume ou qualidade de envios.","diagnostics_endpoint":"/instance/wa_messages_limits","new_chat_message_capping":{"available":true,"status":"CAPPED","used_quota":10,"total_quota":10,"cycle_end":"2026-04-30T23:59:59Z","ote_status":"EXHAUSTED","mv_status":"ACTIVE"},"reachout_timelock":{"available":true,"active":true,"until":"2026-04-07T12:00:00Z","enforcement_type":"BIZ_QUALITY"}}},"unrestricted":{"summary":"Conta conectada sem restricoes","value":{"provider":"whatsapp","reachable":true,"can_send_new_messages":true,"message":"No WhatsApp restriction for starting new conversations was detected for the currently connected account.","message_ptbr":"Nenhuma restricao de envio de novas conversas foi identificada no WhatsApp para a conta atualmente conectada.","diagnostics_endpoint":"/instance/wa_messages_limits","new_chat_message_capping":{"available":true,"status":"NONE","used_quota":2,"total_quota":10},"reachout_timelock":{"available":true,"active":false}}}}}}},"401":{"description":"Token invalido ou ausente","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid token"}}}}}},"500":{"description":"Erro interno ao consultar os limites","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"No session"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"}],"operationId":"providerGetInstanceWaMessagesLimits"}},"/provider/instance/updateFieldsMap":{"post":{"tags":["CRM"],"summary":"Atualizar campos personalizados de leads","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAtualiza os campos personalizados (custom fields) de uma instancia. \nPermite configurar ate 20 campos personalizados para armazenamento de \ninformacoes adicionais sobre leads.\n\nCada campo pode armazenar ate 255 caracteres e aceita qualquer tipo de dado.\n\nCampos disponiveis:\n- lead_field01 a lead_field20\n\nExemplo de uso:\n1. Armazenar informacoes adicionais sobre leads\n2. Criar campos personalizados para integracao com outros sistemas\n3. Armazenar tags ou categorias personalizadas\n4. Manter historico de interacoes com o lead\n\nExemplo de requisicao:\n```json\n{\n  \"lead_field01\": \"nome\",\n  \"lead_field02\": \"email\",\n  \"lead_field03\": \"telefone\",\n  \"lead_field04\": \"cidade\",\n  \"lead_field05\": \"estado\",\n  \"lead_field06\": \"idade\",\n  \"lead_field07\": \"interesses\",\n  \"lead_field08\": \"origem\",\n  \"lead_field09\": \"status\",\n  \"lead_field10\": \"valor\",\n  \"lead_field11\": \"observacoes\",\n  \"lead_field12\": \"ultima_interacao\",\n  \"lead_field13\": \"proximo_contato\",\n  \"lead_field14\": \"vendedor\",\n  \"lead_field15\": \"produto_interesse\",\n  \"lead_field16\": \"fonte_captacao\",\n  \"lead_field17\": \"score\",\n  \"lead_field18\": \"tags\",\n  \"lead_field19\": \"historico\",\n  \"lead_field20\": \"custom\"\n}\n```\n\nExemplo de resposta:\n```json\n{\n  \"success\": true,\n  \"message\": \"Custom fields updated successfully\",\n  \"instance\": {\n    \"id\": \"r183e2ef9597845\",\n    \"name\": \"minha-instancia\",\n    \"fieldsMap\": {\n      \"lead_field01\": \"nome\",\n      \"lead_field02\": \"email\",\n      \"lead_field03\": \"telefone\",\n      \"lead_field04\": \"cidade\",\n      \"lead_field05\": \"estado\",\n      \"lead_field06\": \"idade\",\n      \"lead_field07\": \"interesses\",\n      \"lead_field08\": \"origem\",\n      \"lead_field09\": \"status\",\n      \"lead_field10\": \"valor\",\n      \"lead_field11\": \"observacoes\",\n      \"lead_field12\": \"ultima_interacao\",\n      \"lead_field13\": \"proximo_contato\",\n      \"lead_field14\": \"vendedor\",\n      \"lead_field15\": \"produto_interesse\",\n      \"lead_field16\": \"fonte_captacao\",\n      \"lead_field17\": \"score\",\n      \"lead_field18\": \"tags\",\n      \"lead_field19\": \"historico\",\n      \"lead_field20\": \"custom\"\n    }\n  }\n}\n```\n\nErros comuns:\n- 400: Campos invalidos ou payload mal formatado\n- 401: Chave invalida ou expirada\n- 404: Instancia nao encontrada\n- 500: Erro ao atualizar campos no banco de dados\n\nRestricoes:\n- Cada campo pode ter no maximo 255 caracteres\n- Campos vazios serao mantidos com seus valores atuais\n- Apenas os campos enviados serao atualizados\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"lead_field01":{"type":"string","description":"Campo personalizado 01","maxLength":255},"lead_field02":{"type":"string","description":"Campo personalizado 02","maxLength":255},"lead_field03":{"type":"string","description":"Campo personalizado 03","maxLength":255},"lead_field04":{"type":"string","description":"Campo personalizado 04","maxLength":255},"lead_field05":{"type":"string","description":"Campo personalizado 05","maxLength":255},"lead_field06":{"type":"string","description":"Campo personalizado 06","maxLength":255},"lead_field07":{"type":"string","description":"Campo personalizado 07","maxLength":255},"lead_field08":{"type":"string","description":"Campo personalizado 08","maxLength":255},"lead_field09":{"type":"string","description":"Campo personalizado 09","maxLength":255},"lead_field10":{"type":"string","description":"Campo personalizado 10","maxLength":255},"lead_field11":{"type":"string","description":"Campo personalizado 11","maxLength":255},"lead_field12":{"type":"string","description":"Campo personalizado 12","maxLength":255},"lead_field13":{"type":"string","description":"Campo personalizado 13","maxLength":255},"lead_field14":{"type":"string","description":"Campo personalizado 14","maxLength":255},"lead_field15":{"type":"string","description":"Campo personalizado 15","maxLength":255},"lead_field16":{"type":"string","description":"Campo personalizado 16","maxLength":255},"lead_field17":{"type":"string","description":"Campo personalizado 17","maxLength":255},"lead_field18":{"type":"string","description":"Campo personalizado 18","maxLength":255},"lead_field19":{"type":"string","description":"Campo personalizado 19","maxLength":255},"lead_field20":{"type":"string","description":"Campo personalizado 20","maxLength":255}}}}}}}},"responses":{"200":{"description":"Sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Instance"}}}},"401":{"description":"Chave invalida ou expirada"},"404":{"description":"Instancia nao encontrada"},"500":{"description":"Erro interno"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostInstanceUpdateFieldsMap"}},"/provider/instance/updateInstanceName":{"post":{"tags":["Instancias"],"summary":"Atualizar nome da instancia","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAtualiza o nome de uma instancia WhatsApp existente.\nO nome nao precisa ser unico.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"name":{"type":"string","description":"Novo nome para a instancia","example":"Minha Nova Instancia 2024!@#"}},"required":["name"]}}}}}},"responses":{"200":{"description":"Sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Instance"}}}},"401":{"description":"Chave invalida ou expirada"},"404":{"description":"Instancia nao encontrada"},"500":{"description":"Erro interno"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostInstanceUpdateInstanceName"}},"/provider/instance/proxy":{"get":{"tags":["Avancado"],"summary":"Obter configuracao de proxy da instancia","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nA ConnectyHub distingue a intencao persistida do cliente (`mode`) do transporte efetivo em runtime (`effective_mode`).\nIsso evita degradar silenciosamente para conexao direta quando a instancia foi configurada para usar proxy.\n\n`mode` sempre sera:\n  - `custom`: o cliente escolheu um proxy proprio;\n  - `internal`: a instancia deve usar o pool interno ou a rota interna; ou\n  - `none`: o cliente confirmou explicitamente que aceita conexao direta.\n\n`effective_mode` mostra o que esta sendo usado no momento:\n  - `custom`\n  - `internal`\n  - `direct`\n\n`effective_detail` qualifica o transporte efetivo:\n  - `managed_pool`: proxy interno gerenciado pela plataforma;\n  - `internal_route`: rota interna dedicada do ambiente, sem uma `proxy_url` propria;\n  - `relay`: tunel relay do cliente;\n  - campo omitido: sem detalhe adicional.\n\nQuando um proxy customizado falha, a plataforma pode seguir uma cadeia de contingencia:\n  1. `proxy_fallback` explicito, se configurado com outra URL;\n  2. proxy interno;\n  3. conexao direta como ultimo recurso, quando a politica permitir.\n\nEm qualquer fallback, a intencao persistida continua sendo `mode=custom`. O cliente deve olhar\n`effective_mode`, `effective_detail` e `fallback.active` para entender o estado runtime.\n\nComo ler cada campo da resposta:\n- `mode`: intencao salva na instancia. E o que o cliente pediu para usar.\n- `effective_mode`: transporte realmente em uso agora. Pode divergir de `mode` durante fallback.\n- `effective_detail`: detalhe extra do transporte efetivo. Use para distinguir pool interno, rota interna ou relay. Quando nao ha detalhe adicional, o campo e omitido.\n- `fallback.active`: `true` quando a instancia esta operando fora da rota principal configurada.\n- `fallback.reason`: motivo interno resumido do fallback atual. Serve para diagnostico e pode mudar conforme a causa.\n- `fallback.since`: timestamp Unix em milissegundos desde quando o fallback atual comecou.\n- `proxy_url`: proxy persistido na instancia, sempre mascarado. Se `mode=custom`, continua mostrando o proxy do cliente mesmo quando a sessao caiu em fallback.\n- `proxy_fallback`: politica persistida de contingencia para `mode=custom`. Pode ser `internal`, `never` ou outra URL de proxy.\n- `managed`: campo legado. Fica `true` quando a infraestrutura interna da plataforma esta envolvida no transporte atual ou pretendido.\n- `last_test_at`: timestamp Unix em milissegundos do ultimo teste ou da ultima falha persistida para esse proxy.\n- `last_test_error`: ultimo erro persistido para diagnostico. String vazia significa ausencia de erro salvo.\n- `validation_error`: atalho booleano para `last_test_error != \"\"`.\n\nLeitura rapida dos cenarios mais comuns:\n- `mode=custom` + `effective_mode=custom`: o proxy do cliente esta sendo usado normalmente.\n- `mode=custom` + `effective_mode=internal`: o proxy do cliente falhou e a sessao esta operando no fallback interno.\n- `mode=custom` + `effective_mode=direct`: o proxy do cliente falhou e a sessao caiu para conexao direta como ultimo recurso.\n- `mode=internal` + `effective_detail=managed_pool`: a instancia esta usando um proxy do pool interno.\n- `mode=internal` + `effective_detail=internal_route`: a instancia esta usando uma rota interna dedicada, sem `proxy_url` propria.\n- `mode=none` + `effective_mode=direct`: conexao direta assumida explicitamente.\n\nCombinacoes que nao devem aparecer numa resposta valida:\n- `mode=none` com `effective_mode=custom` ou `internal`\n- `effective_detail=managed_pool` com `effective_mode=custom`\n- `effective_detail=relay` com `effective_mode=internal` ou `direct`\n","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"Configuracao de proxy recuperada com sucesso","content":{"application/json":{"examples":{"custom_active":{"summary":"Proxy do cliente ativo","value":{"mode":"custom","effective_mode":"custom","fallback":{"active":false,"reason":"","since":0},"proxy_url":"http://***:***@cliente-proxy.example:8080","proxy_fallback":"internal","managed":false,"last_test_at":0,"last_test_error":"","validation_error":false}},"custom_internal_fallback":{"summary":"Proxy do cliente falhou e a sessao subiu no proxy interno","value":{"mode":"custom","effective_mode":"internal","effective_detail":"managed_pool","fallback":{"active":true,"reason":"custom_failed_internal:dial tcp timeout","since":1760000000000},"proxy_url":"http://***:***@cliente-proxy.example:8080","proxy_fallback":"internal","managed":true,"last_test_at":1760000000000,"last_test_error":"dial tcp timeout","validation_error":true}},"custom_direct_fallback":{"summary":"Proxy do cliente falhou e a sessao caiu para direto como ultimo recurso","value":{"mode":"custom","effective_mode":"direct","fallback":{"active":true,"reason":"custom_failed_direct:dial tcp timeout","since":1760000005000},"proxy_url":"http://***:***@cliente-proxy.example:8080","proxy_fallback":"internal","managed":false,"last_test_at":1760000005000,"last_test_error":"dial tcp timeout","validation_error":true}},"internal_dedicated_route":{"summary":"Modo interno usando rota interna dedicada","value":{"mode":"internal","effective_mode":"internal","effective_detail":"internal_route","fallback":{"active":false,"reason":"","since":0},"proxy_url":"","proxy_fallback":"internal","managed":true,"last_test_at":0,"last_test_error":"","validation_error":false}}},"schema":{"type":"object","example":{"mode":"custom","effective_mode":"internal","effective_detail":"managed_pool","fallback":{"active":true,"reason":"custom_failed_internal:dial tcp timeout","since":1760000000000},"proxy_url":"http://***:***@cliente-proxy.example:8080","proxy_fallback":"internal","managed":true,"last_test_at":1760000000000,"last_test_error":"dial tcp timeout","validation_error":true},"properties":{"mode":{"type":"string","enum":["custom","internal","none"],"description":"Intencao persistida do cliente. Representa o modo salvo na instancia, nao necessariamente o transporte em uso agora.","example":"custom"},"effective_mode":{"type":"string","enum":["custom","internal","direct"],"description":"Transporte efetivo em runtime. E o valor principal para entender por onde a sessao esta saindo neste momento.","example":"internal"},"effective_detail":{"type":"string","enum":["managed_pool","internal_route","relay"],"description":"Detalhe opcional do transporte atual.\n`managed_pool` = proxy interno gerenciado.\n`internal_route` = rota interna dedicada do ambiente.\n`relay` = tunel relay do cliente.\nQuando nao ha detalhe adicional, o campo e omitido.\n","example":"managed_pool"},"fallback":{"type":"object","description":"Estado do fallback runtime. So fica ativo quando a instancia precisou sair da rota principal configurada.","properties":{"active":{"type":"boolean","description":"Indica se a instancia esta operando em fallback neste momento.","example":true},"reason":{"type":"string","description":"Motivo interno resumido do fallback atual, util para observabilidade e suporte.","example":"custom_failed_internal:dial tcp timeout"},"since":{"type":"integer","description":"Timestamp Unix em milissegundos desde quando o fallback atual esta ativo.","example":1760000000000}}},"proxy_url":{"type":"string","description":"URL mascarada do proxy persistido. Em fallback de proxy custom, continua mostrando a URL do cliente; nao troca para o proxy efetivo de contingencia.","example":"http://***:***@cliente-proxy.example:8080"},"proxy_fallback":{"type":"string","description":"Politica de contingencia persistida para `mode=custom`.\nValores aceitos:\n  - `internal`\n  - `never`\n  - uma URL de proxy HTTP/HTTPS/SOCKS para contingencia explicita\n","example":"internal"},"managed":{"type":"boolean","description":"Campo legado indicando participacao da infraestrutura interna. Pode ficar `true` tanto em `mode=internal` quanto em fallback interno de `mode=custom`.","example":true},"last_test_at":{"type":"integer","description":"Timestamp Unix em milissegundos do ultimo teste ou da ultima falha persistida.","example":1760000000000},"last_test_error":{"type":"string","description":"Ultimo erro persistido para diagnostico. String vazia significa ausencia de erro salvo.","example":"dial tcp timeout"},"validation_error":{"type":"boolean","description":"Indica se `last_test_error` esta preenchido.","example":true}}}}}},"401":{"description":"Chave invalida ou expirada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Unauthorized"}}}}}},"500":{"description":"Erro interno do servidor ao recuperar a configuracao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem detalhando o erro encontrado"}}}}}}},"parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"}],"operationId":"providerGetInstanceProxy"},"post":{"tags":["Avancado"],"summary":"Configurar ou alterar o proxy","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nDefine explicitamente um dos tres estados aceitos:\n  - `mode=custom`: usa um proxy proprio informado em `proxy_url`;\n  - `mode=internal`: usa a infraestrutura interna; ou\n  - `mode=none`: conexao direta, permitida apenas com `confirm_no_proxy=true`.\n\nImportante: `POST /instance/proxy` confirma que a configuracao foi salva, nao que o proxy ja foi comprovado em uso.\nA validacao operacional principal acontece no proximo ciclo real de conexao da instancia.\n\nEm termos praticos:\n  - `200 OK` aqui = configuracao persistida com sucesso;\n  - falhas reais de conectividade podem aparecer depois; e\n  - para observar o estado real, consulte `GET /instance/proxy` e leia:\n    - `effective_mode`\n    - `effective_detail`\n    - `fallback.active`\n    - `last_test_error`\n    - `validation_error`\n\nQuando `mode=custom`, voce tambem pode definir a contingencia via `proxy_fallback`:\n  - `internal`: tenta a infraestrutura interna e, se ainda assim falhar, pode usar direto como ultimo recurso;\n  - `never`: nao usa contingencia; ou\n  - uma URL de proxy de contingencia controlada pelo proprio cliente.\n\nQuando `mode=internal`, `rotate_now: true` troca imediatamente o proxy interno persistido.\nSe houver mais de uma origem interna disponivel, a plataforma escolhe outra origem sem expor o fornecedor.\nSe houver apenas uma origem, troca apenas o proxy/IP dentro dessa origem.\n\nProtocolos aceitos em URLs de proxy customizado:\n  - `http://usuario:senha@host:porta`\n  - `https://usuario:senha@host:porta`\n  - `socks5://usuario:senha@host:porta`\n  - `socks5h://usuario:senha@host:porta`\n\nO esquema `socks://` generico nao e aceito. Para proxies SOCKS, use `socks5://` ou `socks5h://`.\n","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"mode":{"type":"string","enum":["custom","internal","none"],"description":"Campo canonico para definir a estrategia de proxy."},"proxy_url":{"type":"string","description":"Obrigatorio quando `mode=custom`.\nProtocolos aceitos: `http://`, `https://`, `socks5://` e `socks5h://`.\nO esquema `socks://` generico nao e suportado; use `socks5://` ou `socks5h://`.\n","example":"http://usuario:senha@ip:porta"},"proxy_fallback":{"type":"string","description":"Politica de contingencia para `mode=custom`.\nAceita `internal`, `never` ou uma URL de proxy de contingencia usando `http://`, `https://`, `socks5://` ou `socks5h://`.\n"},"confirm_no_proxy":{"type":"boolean","description":"Obrigatorio quando `mode=none`."},"rotate_now":{"type":"boolean","description":"Quando `true` com `mode=internal`, troca imediatamente o proxy interno persistido sem expor o fornecedor usado.","default":false}}}}}}}},"responses":{"200":{"description":"Proxy configurado com sucesso","content":{"application/json":{"examples":{"custom_internal_fallback_saved":{"summary":"Configuracao salva; o uso real sera confirmado no proximo ciclo de conexao","value":{"details":"Proxy configurado","proxy":{"mode":"custom","effective_mode":"custom","fallback":{"active":false,"reason":"","since":0},"proxy_url":"http://***:***@proxy-do-cliente.example:8080","proxy_fallback":"internal","managed":false,"last_test_at":0,"last_test_error":"","validation_error":false},"restart_requested":true}},"after_connect_failure_example":{"summary":"Exemplo do que o GET pode mostrar depois se o proxy salvo falhar","value":{"details":"Proxy configurado","proxy":{"mode":"custom","effective_mode":"custom","fallback":{"active":false,"reason":"","since":0},"proxy_url":"http://***:***@proxy-do-cliente.example:8080","proxy_fallback":"internal","managed":false,"last_test_at":0,"last_test_error":"","validation_error":false},"restart_requested":true}},"direct_explicit":{"summary":"Direto explicito","value":{"details":"Proxy configurado","proxy":{"mode":"none","effective_mode":"direct","fallback":{"active":false,"reason":"","since":0},"proxy_url":"","proxy_fallback":"internal","managed":false,"last_test_at":0,"last_test_error":"","validation_error":false}}},"internal_rotated":{"summary":"Proxy interno rotacionado","value":{"details":"Proxy configurado","rotated":true,"proxy":{"mode":"internal","effective_mode":"internal","effective_detail":"managed_pool","fallback":{"active":false,"reason":"","since":0},"proxy_url":"managed_pool://hidden","proxy_fallback":"internal","managed":true,"last_test_at":0,"last_test_error":"","validation_error":false}}}},"schema":{"type":"object","example":{"details":"Proxy configurado","proxy":{"mode":"custom","effective_mode":"custom","fallback":{"active":false,"reason":"","since":0},"proxy_url":"http://***:***@proxy-do-cliente.example:8080","proxy_fallback":"internal","managed":false,"last_test_at":0,"last_test_error":"","validation_error":false},"restart_requested":true},"properties":{"details":{"type":"string","example":"Proxy configurado"},"proxy":{"type":"object","properties":{"mode":{"type":"string","enum":["custom","internal","none"],"description":"Intencao persistida do cliente apos a gravacao."},"effective_mode":{"type":"string","enum":["custom","internal","direct"],"description":"Transporte efetivo no momento da resposta."},"effective_detail":{"type":"string","enum":["managed_pool","internal_route","relay"],"description":"Detalhe complementar do transporte efetivo. Quando nao ha detalhe adicional, o campo e omitido."},"fallback":{"type":"object","description":"Estado do fallback runtime.","properties":{"active":{"type":"boolean","description":"Indica se a instancia esta operando em fallback neste momento."},"reason":{"type":"string","description":"Motivo interno resumido do fallback atual."},"since":{"type":"integer","description":"Timestamp Unix em milissegundos desde quando o fallback atual esta ativo."}}},"proxy_url":{"type":"string","description":"URL mascarada do proxy persistido."},"proxy_fallback":{"type":"string","description":"Politica de contingencia persistida para `mode=custom`."},"managed":{"type":"boolean","description":"Campo legado ligado ao uso da infraestrutura interna."},"last_test_at":{"type":"integer","description":"Timestamp do ultimo teste/erro persistido."},"last_test_error":{"type":"string","description":"Ultimo erro persistido para diagnostico."},"validation_error":{"type":"boolean","description":"Indica se `last_test_error` esta preenchido."}}},"restart_requested":{"type":"boolean","description":"Indica se uma reinicializacao da conexao foi solicitada para aplicar o proxy."},"rotated":{"type":"boolean","description":"Presente como `true` quando `rotate_now` troca o proxy interno com sucesso."}}}}}},"400":{"description":"Payload invalido ou falha na validacao do proxy","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"confirm_no_proxy e obrigatorio para desabilitar proxy"}}}}}},"401":{"description":"Chave invalida ou expirada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Unauthorized"}}}}}},"409":{"description":"Nao ha proxy alternativo disponivel para rotacao interna","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"nao foi possivel rotacionar proxy interno: nenhum proxy alternativo disponivel para rotacao"}}}}}},"500":{"description":"Erro interno do servidor ao configurar o proxy","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem detalhando o erro encontrado"}}}}}}},"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostInstanceProxy"}},"/provider/proxy-managed/cities":{"get":{"tags":["Avancado"],"summary":"Proxy Interno - Listar cidades disponiveis","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nRetorna a lista de cidades disponiveis para uso nos campos\n`proxy_managed_country`, `proxy_managed_state` e `proxy_managed_city` do endpoint\n`POST /instance/connect`.\n\nO backend consulta o catalogo disponivel e aplica um cache interno de 24 horas.\nSe o catalogo de cidades nao estiver disponivel, o endpoint retorna erro.\n\n- Autenticacao: requer `token` valido de qualquer instancia (ou credencial interna via instancia).\n- Query `country` (opcional): ISO alpha-2 minusculo. Default `br`.\n- Query `state` (opcional): UF/subdivisao minuscula, como `sp`.\n- Query `search` (opcional): filtro parcial por nome/slug, insensivel a acento/caixa.\n\nComo escolher a cidade:\n1. Use `br` em `proxy_managed_country`.\n2. Chame `GET /proxy-managed/cities?country=br` para obter as cidades brasileiras.\n3. Quando a cidade retornar `state`, envie tambem esse valor em `proxy_managed_state`.\n4. Quando o usuario escolher uma cidade, envie em `/instance/connect`:\n   - `proxy_managed_country`: o pais escolhido, ex. `br`\n   - `proxy_managed_state`: o `state` retornado pela cidade, ex. `sp`, quando disponivel\n   - `proxy_managed_city`: sempre o `cities[].value`\n\nSe `state` nao vier na cidade selecionada, envie apenas `proxy_managed_country` e `proxy_managed_city`.\nO backend valida a combinacao e retorna erro se faltar algum dado necessario.\n\nExemplo de requisicao:\n```\nGET /proxy-managed/cities?country=br&state=sp&search=camp\n```\n","parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"},{"in":"query","name":"country","required":false,"schema":{"type":"string","pattern":"^[a-z]{2}$","default":"br"},"description":"ISO alpha-2 (minusculo). Default `br`."},{"in":"query","name":"state","required":false,"schema":{"type":"string","pattern":"^[a-z0-9-]{1,16}$"},"description":"Filtra por UF/subdivisao quando o catalogo traz `state`. Para Brasil, use valores como `sp`, `rj`, `mg`."},{"in":"query","name":"search","required":false,"schema":{"type":"string"},"description":"Filtro parcial por nome/slug (insensivel a acento/caixa)."}],"responses":{"200":{"description":"Lista de cidades disponiveis","content":{"application/json":{"schema":{"type":"object","properties":{"country":{"type":"string","example":"br"},"state":{"type":"string","description":"Retornado apenas quando a query `state` foi informada.","example":"sp"},"cities":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","description":"Slug aceito em `proxy_managed_city`.","example":"saopaulo"},"label":{"type":"string","description":"Nome apresentavel da cidade.","example":"Sao Paulo"},"state":{"type":"string","description":"Codigo ISO 3166-2 da subdivisao/estado quando disponivel.","example":"sp"},"state_label":{"type":"string","description":"Nome apresentavel do estado/subdivisao quando disponivel.","example":"Sao Paulo"},"raw_city":{"type":"string","description":"Campo tecnico para diagnostico. Nao envie este campo no `/instance/connect`; use `value`.","example":"sao_paulo"}}}}}},"examples":{"brasil_enriquecido":{"summary":"Cidade brasileira enriquecida","value":{"country":"br","state":"sp","cities":[{"value":"campinas","label":"Campinas","state":"sp","state_label":"Sao Paulo","raw_city":"campinas"},{"value":"saopaulo","label":"Sao Paulo","state":"sp","state_label":"Sao Paulo","raw_city":"sao_paulo"}]}},"pais_sem_enriquecimento":{"summary":"Cidade fora do Brasil","value":{"country":"us","cities":[{"value":"losangeles","label":"Los Angeles"}]}}}}}},"400":{"description":"country invalido (nao e ISO alpha-2)"},"401":{"description":"Token invalido/ausente"},"500":{"description":"Erro interno"},"503":{"description":"Provider indisponivel ou catalogo de cidades inacessivel"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"operationId":"providerGetProxyManagedCities"}},"/provider/profile/name":{"post":{"tags":["Perfil"],"summary":"Altera o nome do perfil do WhatsApp","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAltera o nome de exibicao do perfil da conta do WhatsApp atualmente conectada.\n\nO endpoint realiza:\n- Atualiza o nome do perfil usando o WhatsApp AppState\n- Sincroniza a mudanca com o servidor do WhatsApp\n- Retorna confirmacao da alteracao\n\n**Importante**: \n- A conta do WhatsApp deve estar conectada\n- O nome sera visivel para todos os contatos\n- Pode haver um limite de alteracoes por periodo (conforme WhatsApp)\n","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Novo nome do perfil do WhatsApp","example":"Minha Empresa - Atendimento","maxLength":25}}}}}}}},"responses":{"200":{"description":"Nome do perfil alterado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Nome do perfil alterado com sucesso"},"profile":{"type":"object","properties":{"name":{"type":"string","description":"Novo nome do perfil","example":"Minha Empresa - Atendimento"},"updated_at":{"type":"integer","description":"Timestamp da alteracao (Unix timestamp)","example":1704067200}}}}}}}},"400":{"description":"Dados invalidos na requisicao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Nome muito longo ou invalido"}}}}}},"401":{"description":"Sem sessao ativa","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"No session"}}}}}},"403":{"description":"Acao nao permitida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Limite de alteracoes excedido ou conta com restricoes"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Erro ao alterar nome do perfil"}}}}}}},"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostProfileName"}},"/provider/profile/image":{"post":{"tags":["Perfil"],"summary":"Altera a imagem do perfil do WhatsApp","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAltera a imagem de perfil da conta do WhatsApp atualmente conectada.\n\nO endpoint realiza:\n- Atualiza a imagem do perfil usando \n- Processa a imagem (URL, base64 ou comando de remocao)\n- Sincroniza a mudanca com o servidor do WhatsApp\n- Retorna confirmacao da alteracao\n\n**Importante**: \n- A conta do WhatsApp deve estar conectada\n- A imagem sera visivel para todos os contatos\n- A imagem deve estar em formato JPEG e tamanho 640x640 pixels\n","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["image"],"properties":{"image":{"type":"string","description":"Imagem do perfil. Pode ser:\n- URL da imagem (http/https)\n- String base64 da imagem\n- \"remove\" ou \"delete\" para remover a imagem atual\n","example":"https://picsum.photos/640/640.jpg","oneOf":[{"description":"URL da imagem","example":"https://picsum.photos/640/640.jpg"},{"description":"Imagem em base64","example":"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAABAAEDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAv/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAX/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCdABmX/9k="},{"description":"Comando para remover imagem","example":"remove"}]}}}}}}}},"responses":{"200":{"description":"Imagem do perfil alterada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Imagem do perfil alterada com sucesso"},"profile":{"type":"object","properties":{"image_updated":{"type":"boolean","description":"Indica se a imagem foi atualizada","example":true},"image_removed":{"type":"boolean","description":"Indica se a imagem foi removida","example":false},"updated_at":{"type":"integer","description":"Timestamp da alteracao (Unix timestamp)","example":1704067200}}}}}}}},"400":{"description":"Dados invalidos na requisicao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Formato de imagem invalido ou URL inacessivel"}}}}}},"401":{"description":"Sem sessao ativa","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"No session"}}}}}},"403":{"description":"Acao nao permitida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Limite de alteracoes excedido ou conta com restricoes"}}}}}},"413":{"description":"Imagem muito grande","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Imagem muito grande, tamanho maximo permitido excedido"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Erro ao alterar imagem do perfil"}}}}}}},"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostProfileImage"}},"/provider/instance":{"delete":{"tags":["Instancias"],"summary":"Deletar instancia","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string. Esta operacao nao exige payload especifico.\n\nRemove a instancia do sistema.\n","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"responses":{"200":{"description":"Instancia deletada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Instance Deleted"},"info":{"type":"string","example":"O dispositivo foi desconectado com sucesso e a instancia foi removida do banco de dados."}}}}}},"401":{"description":"Falha na autenticacao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Nao autorizado - Token invalido ou ausente"}}}}}},"404":{"description":"Instancia nao encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Instancia nao encontrada"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Falha ao deletar instancia"}}}}}}},"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":["instanceId"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","additionalProperties":true,"description":"Payload especifico da operacao, quando aplicavel."}}}}}},"operationId":"providerDeleteInstance"}},"/provider/instance/privacy":{"get":{"tags":["Instancias"],"summary":"Buscar configuracoes de privacidade","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nBusca as configuracoes de privacidade atuais da conta do WhatsApp atualmente conectada.\n\n**Importante - Diferenca entre Status e Broadcast:**\n\n- **Status**: Refere-se ao recado personalizado que aparece embaixo do nome do usuario (ex: \"Disponivel\", \"Ocupado\", texto personalizado)\n- **Broadcast**: Refere-se ao envio de \"stories/reels\" (fotos/videos temporarios)\n\n**Limitacao**: As configuracoes de privacidade do broadcast (stories/reels) nao estao disponiveis para alteracao via API.\n\nRetorna todas as configuracoes de privacidade como quem pode:\n- Adicionar aos grupos\n- Ver visto por ultimo\n- Ver status (recado embaixo do nome)\n- Ver foto de perfil\n- Receber confirmacao de leitura\n- Ver status online\n- Fazer chamadas\n","responses":{"200":{"description":"Configuracoes de privacidade obtidas com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"groupadd":{"type":"string","enum":["all","contacts","contact_blacklist","none"],"description":"Quem pode adicionar aos grupos. Valores - all, contacts, contact_blacklist, none","example":"contacts"},"last":{"type":"string","enum":["all","contacts","contact_blacklist","none"],"description":"Quem pode ver visto por ultimo. Valores - all, contacts, contact_blacklist, none","example":"contacts"},"status":{"type":"string","enum":["all","contacts","contact_blacklist","none"],"description":"Quem pode ver status (recado embaixo do nome). Valores - all, contacts, contact_blacklist, none","example":"contacts"},"profile":{"type":"string","enum":["all","contacts","contact_blacklist","none"],"description":"Quem pode ver foto de perfil. Valores - all, contacts, contact_blacklist, none","example":"contacts"},"readreceipts":{"type":"string","enum":["all","none"],"description":"Confirmacao de leitura. Valores - all, none","example":"all"},"online":{"type":"string","enum":["all","match_last_seen"],"description":"Quem pode ver status online. Valores - all, match_last_seen","example":"all"},"calladd":{"type":"string","enum":["all","known"],"description":"Quem pode fazer chamadas. Valores - all, known","example":"all"}}},"examples":{"success":{"summary":"Configuracoes de privacidade obtidas","value":{"groupadd":"contacts","last":"contacts","status":"contacts","profile":"contacts","readreceipts":"all","online":"all","calladd":"all"}}}}}},"401":{"description":"Chave de autenticacao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"No session"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"}],"operationId":"providerGetInstancePrivacy"},"post":{"tags":["Instancias"],"summary":"Alterar configuracoes de privacidade","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAltera uma ou multiplas configuracoes de privacidade da conta do WhatsApp atualmente conectada de forma otimizada.\n\n**Importante - Diferenca entre Status e Broadcast:**\n\n- **Status**: Refere-se ao recado personalizado que aparece embaixo do nome do usuario (ex: \"Disponivel\", \"Ocupado\", texto personalizado)\n- **Broadcast**: Refere-se ao envio de \"stories/reels\" (fotos/videos temporarios)\n\n**Limitacao**: As configuracoes de privacidade do broadcast (stories/reels) nao estao disponiveis para alteracao via API.\n\n**Caracteristicas:**\n-  **Eficiencia**: Altera apenas configuracoes que realmente mudaram\n-  **Flexibilidade**: Pode alterar uma ou multiplas configuracoes na mesma requisicao\n-  **Feedback completo**: Retorna todas as configuracoes atualizadas\n\n**Formato de entrada:**\n```json\n{\n  \"groupadd\": \"contacts\",\n  \"last\": \"none\",\n  \"status\": \"contacts\"\n}\n```\n\n**Tipos de privacidade disponiveis:**\n- `groupadd`: Quem pode adicionar aos grupos\n- `last`: Quem pode ver visto por ultimo\n- `status`: Quem pode ver status (recado embaixo do nome)\n- `profile`: Quem pode ver foto de perfil\n- `readreceipts`: Confirmacao de leitura\n- `online`: Quem pode ver status online\n- `calladd`: Quem pode fazer chamadas\n\n**Valores possiveis:**\n- `all`: Todos\n- `contacts`: Apenas contatos\n- `contact_blacklist`: Contatos exceto bloqueados\n- `none`: Ninguem\n- `match_last_seen`: Corresponder ao visto por ultimo (apenas para online)\n- `known`: Numeros conhecidos (apenas para calladd)\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"groupadd":{"type":"string","enum":["all","contacts","contact_blacklist","none"],"description":"Quem pode adicionar aos grupos. Valores - all, contacts, contact_blacklist, none"},"last":{"type":"string","enum":["all","contacts","contact_blacklist","none"],"description":"Quem pode ver visto por ultimo. Valores - all, contacts, contact_blacklist, none"},"status":{"type":"string","enum":["all","contacts","contact_blacklist","none"],"description":"Quem pode ver status (recado embaixo do nome). Valores - all, contacts, contact_blacklist, none"},"profile":{"type":"string","enum":["all","contacts","contact_blacklist","none"],"description":"Quem pode ver foto de perfil. Valores - all, contacts, contact_blacklist, none"},"readreceipts":{"type":"string","enum":["all","none"],"description":"Confirmacao de leitura. Valores - all, none"},"online":{"type":"string","enum":["all","match_last_seen"],"description":"Quem pode ver status online. Valores - all, match_last_seen"},"calladd":{"type":"string","enum":["all","known"],"description":"Quem pode fazer chamadas. Valores - all, known"}},"minProperties":1,"additionalProperties":false}}}}}},"responses":{"200":{"description":"Configuracao de privacidade alterada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"groupadd":{"type":"string","enum":["all","contacts","contact_blacklist","none"],"description":"Quem pode adicionar aos grupos. Valores - all, contacts, contact_blacklist, none"},"last":{"type":"string","enum":["all","contacts","contact_blacklist","none"],"description":"Quem pode ver visto por ultimo. Valores - all, contacts, contact_blacklist, none"},"status":{"type":"string","enum":["all","contacts","contact_blacklist","none"],"description":"Quem pode ver status (recado embaixo do nome). Valores - all, contacts, contact_blacklist, none"},"profile":{"type":"string","enum":["all","contacts","contact_blacklist","none"],"description":"Quem pode ver foto de perfil. Valores - all, contacts, contact_blacklist, none"},"readreceipts":{"type":"string","enum":["all","none"],"description":"Confirmacao de leitura. Valores - all, none"},"online":{"type":"string","enum":["all","match_last_seen"],"description":"Quem pode ver status online. Valores - all, match_last_seen"},"calladd":{"type":"string","enum":["all","known"],"description":"Quem pode fazer chamadas. Valores - all, known"}}},"examples":{"success":{"summary":"Configuracoes atualizadas apos alteracao","value":{"groupadd":"contacts","last":"contacts","status":"contacts","profile":"contacts","readreceipts":"all","online":"all","calladd":"all"}}}}}},"400":{"description":"Dados de entrada invalidos","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}},"examples":{"no_valid_settings":{"summary":"Nenhuma configuracao valida encontrada","value":{"error":"No valid privacy settings found. Use format: {\"groupadd\": \"contacts\", \"last\": \"none\"}"}},"invalid_value_type":{"summary":"Valor deve ser string","value":{"error":"Value for groupadd must be a non-empty string"}},"invalid_privacy_type":{"summary":"Tipo de privacidade invalido","value":{"error":"invalid privacy type: invalidtype. Valid types: groupadd, last, status, profile, readreceipts, online, calladd"}},"invalid_privacy_value":{"summary":"Valor de privacidade invalido","value":{"error":"invalid privacy value: invalidvalue. Valid values: all, contacts, contact_blacklist, none, match_last_seen, known"}}}}}},"401":{"description":"Chave de autenticacao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}},"examples":{"no_session":{"summary":"Sem sessao ativa","value":{"error":"No session"}},"whatsapp_error":{"summary":"Erro do WhatsApp","value":{"error":"Failed to set privacy setting: context deadline exceeded"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostInstancePrivacy"}},"/provider/instance/presence":{"post":{"tags":["Instancias"],"summary":"Atualizar status de presenca da instancia","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAtualiza o status de presenca global da conta do WhatsApp atualmente conectada. Este endpoint permite:\n1. Definir se a conta aparece como disponivel (\"online\") ou indisponivel\n2. Controlar o status de presenca para todos os contatos\n3. Salvar o estado atual da presenca para a conta conectada\n\nTipos de presenca suportados:\n- available: Marca a conta como disponivel/online\n- unavailable: Marca a conta como indisponivel/offline\n\n**Atencao**:\n- O status de presenca pode ser temporariamente alterado para \"available\" (online) em algumas situacoes internas da API, e com isso o visto por ultimo tambem pode ser atualizado.\n- Caso isso for um problema, considere alterar suas configuracoes de privacidade no WhatsApp para nao mostrar o visto por ultimo e/ou quem pode ver seu status \"online\".\n\n** Importante - Limitacao do Presence \"unavailable\"**:\n- **Quando a API e o unico dispositivo ativo**: Confirmacoes de entrega/leitura (ticks cinzas/azuis) nao sao enviadas nem recebidas\n- **Impacto**: Eventos `message_update` com status de entrega podem nao ser recebidos\n- **Solucao**: Se precisar das confirmacoes, mantenha WhatsApp Web ou aplicativo movel ativo ou use presence \"available\" \n\nExemplo de requisicao:\n```json\n{\n  \"presence\": \"available\"\n}\n```\n\nExemplo de resposta:\n```json\n{\n  \"response\": \"Presence updated successfully\"\n}\n```\n\nErros comuns:\n- 401: Chave invalida ou expirada\n- 400: Valor de presenca invalido\n- 500: Erro ao atualizar presenca\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"presence":{"type":"string","description":"Status de presenca da conta atualmente conectada","enum":["available","unavailable"],"example":"available"}},"required":["presence"]}}}}}},"responses":{"200":{"description":"Presenca atualizada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","description":"Mensagem de confirmacao","example":"Presence updated successfully"}}}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Descricao do erro","examples":["Invalid payload","Invalid presence value, use available or unavailable"]}}}}}},"401":{"description":"Chave invalida ou expirada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Descricao do erro de autenticacao","example":"client not found"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Descricao do erro interno","example":"No session"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostInstancePresence"}},"/provider/send/text":{"post":{"tags":["Enviar Mensagem"],"summary":"Enviar mensagem de texto","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nEnvia uma mensagem de texto para um contato, grupo ou canal/newsletter.\n\n## Recursos Especificos\n\n- **Preview de links** com suporte a personalizacao automatica ou customizada\n- **Formatacao basica** do texto\n- **Substituicao automatica de placeholders** dinamicos\n\n## Envio para Newsletter\n\nPara enviar texto para um canal, use o mesmo campo `number`, mas informe o JID completo do canal:\n- Exemplo: `120363123456789012@newsletter`\n\n```json\n{\n  \"number\": \"120363123456789012@newsletter\",\n  \"text\": \"Post publicado no canal\"\n}\n```\n\n## Campos Comuns\n\nEste endpoint suporta todos os **campos opcionais comuns** documentados na tag **\"Enviar Mensagem\"**, incluindo:\n`delay`, `readchat`, `readmessages`, `replyid`, `mentions`, `forward`, `track_source`, `track_id`, placeholders e envio para grupos.\n\n## Preview de Links\n\n### Preview Automatico\n```json\n{\n  \"number\": \"5511999999999\",\n  \"text\": \"Confira: https://exemplo.com\",\n  \"linkPreview\": true\n}\n```\n\n### Preview Personalizado\n```json\n{\n  \"number\": \"5511999999999\",\n  \"text\": \"Confira nosso site! https://exemplo.com\",\n  \"linkPreview\": true,\n  \"linkPreviewTitle\": \"Titulo Personalizado\",\n  \"linkPreviewDescription\": \"Uma descricao personalizada do link\",\n  \"linkPreviewImage\": \"https://exemplo.com/imagem.jpg\",\n  \"linkPreviewLarge\": true\n}\n```\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"ID do chat para o qual a mensagem sera enviada. Pode ser um numero de telefone em formato internacional, um ID de grupo (`@g.us`), um ID de usuario (com `@s.whatsapp.net` ou `@lid`) ou um ID de canal/newsletter (`@newsletter`).","example":"5511999999999"},"text":{"type":"string","description":"Texto da mensagem (aceita placeholders)","example":"Ola {{name}}! Como posso ajudar?"},"linkPreview":{"type":"boolean","description":"Ativa/desativa preview de links. Se true, procura automaticamente um link no texto para gerar preview.\n\nComportamento:\n- Se apenas linkPreview=true: gera preview automatico do primeiro link encontrado no texto\n- Se fornecidos campos personalizados (title, description, image): usa os valores fornecidos\n- Se campos personalizados parciais: combina com dados automaticos do link como fallback\n","example":true},"linkPreviewTitle":{"type":"string","description":"Define um titulo personalizado para o preview do link","example":"Titulo Personalizado"},"linkPreviewDescription":{"type":"string","description":"Define uma descricao personalizada para o preview do link","example":"Descricao personalizada do link"},"linkPreviewImage":{"type":"string","description":"URL ou Base64 da imagem para usar no preview do link","example":"https://exemplo.com/imagem.jpg"},"linkPreviewLarge":{"type":"boolean","description":"Se true, gera um preview grande com upload da imagem. Se false, gera um preview pequeno sem upload","example":true},"replyid":{"type":"string","description":"ID da mensagem para responder","example":"3EB0538DA65A59F6D8A251"},"mentions":{"type":"string","description":"Numeros para mencionar (separados por virgula)","example":"5511999999999,5511888888888"},"readchat":{"type":"boolean","description":"Marca conversa como lida apos envio","example":true},"readmessages":{"type":"boolean","description":"Marca ultimas mensagens recebidas como lidas","example":true},"delay":{"type":"integer","description":"Atraso em milissegundos antes do envio, durante o atraso apacera 'Digitando...'","example":1000},"forward":{"type":"boolean","description":"Marca a mensagem como encaminhada no WhatsApp","example":true},"track_source":{"type":"string","description":"Origem do rastreamento da mensagem","example":"chatwoot"},"track_id":{"type":"string","description":"ID para rastreamento da mensagem (aceita valores duplicados)","example":"msg_123456789"},"async":{"type":"boolean","description":"Se true, envia a mensagem de forma assincrona via fila interna. Util para alto volume de mensagens.","example":false}},"required":["number","text"]}}}}}},"responses":{"200":{"description":"Mensagem enviada com sucesso","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Message"},{"type":"object","properties":{"response":{"type":"object","properties":{"status":{"type":"string","example":"success"},"message":{"type":"string","example":"Message sent successfully"}}}}}]}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Missing number or text"}}}}}},"401":{"description":"Nao autorizado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid token"}}}}}},"429":{"description":"Limite de requisicoes excedido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Rate limit exceeded"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"WhatsApp server error 463: WhatsApp reported that the currently connected account is under a temporary restriction for starting new conversations, usually related to sending volume or quality."},"error_source":{"type":"string","example":"whatsapp_server"},"provider":{"type":"string","example":"whatsapp"},"provider_code":{"type":"integer","example":463},"error_key":{"type":"string","example":"WHATSAPP_REACHOUT_TIMELOCK"},"message":{"type":"string","example":"The WhatsApp server rejected this message. This was not an internal API error."},"message_ptbr":{"type":"string","example":"O servidor do WhatsApp recusou esta mensagem. Isso nao foi um erro interno da API."},"provider_message":{"type":"string","example":"WhatsApp reported that the currently connected account is under a temporary restriction for starting new conversations, usually related to sending volume or quality."},"provider_message_ptbr":{"type":"string","example":"O WhatsApp informou que a conta atualmente conectada esta sob uma restricao temporaria para iniciar novas conversas, normalmente relacionada a volume ou qualidade de envios."},"diagnostics_endpoint":{"type":"string","example":"/instance/wa_messages_limits"},"details":{"type":"object","properties":{"new_chat_message_capping":{"type":"object","additionalProperties":true},"reachout_timelock":{"type":"object","additionalProperties":true}}}}},"examples":{"generic":{"summary":"Erro interno generico","value":{"error":"Failed to send message"}},"whatsapp_463":{"summary":"Erro do WhatsApp ao iniciar novas conversas","value":{"error":"WhatsApp server error 463: WhatsApp reported that the currently connected account is under a temporary restriction for starting new conversations, usually related to sending volume or quality.","error_source":"whatsapp_server","provider":"whatsapp","provider_code":463,"error_key":"WHATSAPP_REACHOUT_TIMELOCK","message":"The WhatsApp server rejected this message. This was not an internal API error.","message_ptbr":"O servidor do WhatsApp recusou esta mensagem. Isso nao foi um erro interno da API.","provider_message":"WhatsApp reported that the currently connected account is under a temporary restriction for starting new conversations, usually related to sending volume or quality.","provider_message_ptbr":"O WhatsApp informou que a conta atualmente conectada esta sob uma restricao temporaria para iniciar novas conversas, normalmente relacionada a volume ou qualidade de envios.","diagnostics_endpoint":"/instance/wa_messages_limits","details":{"new_chat_message_capping":{"available":true,"status":"CAPPED","used_quota":10,"total_quota":10},"reachout_timelock":{"available":true,"active":true,"until":"2026-04-07T12:00:00Z","enforcement_type":"BIZ_QUALITY"}}}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostSendText"}},"/provider/send/media":{"post":{"tags":["Enviar Mensagem"],"summary":"Enviar midia (imagem, video, audio ou documento)","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nEnvia diferentes tipos de midia para um contato, grupo ou canal/newsletter. Suporta URLs ou arquivos base64.\n\n## Tipos de Midia Suportados\n- **`image`**: Imagens (JPG preferencialmente)\n- **`video`**: Videos (apenas MP4)\n- **`videoplay`**: Video com comportamento visual de autoplay/loop no WhatsApp\n- **`document`**: Documentos (PDF, DOCX, XLSX, etc)\n- **`audio`**: Audio comum (MP3 ou OGG)\n- **`myaudio`**: Mensagem de voz (alternativa ao PTT)\n- **`ptt`**: Mensagem de voz (Push-to-Talk)\n- **`ptv`**: Mensagem de video (Push-to-Video)\n- **`sticker`**: Figurinha/Sticker\n\n## Recursos Especificos\n- **Upload por URL ou base64**\n- **Caption/legenda** opcional com suporte a placeholders\n- **Nome personalizado** para documentos (`docName`)\n- **Geracao automatica de thumbnails**\n- **Compressao otimizada** conforme o tipo\n- **`viewOnce`** recomendado para midia compativel\n\n## Envio para Newsletter\n\nPara enviar midia para um canal, use o mesmo campo `number`, mas informe o JID completo do canal:\n- Exemplo: `120363123456789012@newsletter`\n\n```json\n{\n  \"number\": \"120363123456789012@newsletter\",\n  \"type\": \"image\",\n  \"file\": \"https://exemplo.com/foto.jpg\",\n  \"text\": \"Imagem publicada no canal\"\n}\n```\n\n## Campos Comuns\n\nEste endpoint suporta todos os **campos opcionais comuns** documentados na tag **\"Enviar Mensagem\"**, incluindo:\n`delay`, `readchat`, `readmessages`, `replyid`, `mentions`, `forward`, `track_source`, `track_id`, placeholders e envio para grupos.\n\n## Exemplos Basicos\n\n## Visualizacao Unica (`viewOnce`)\n\nO campo `viewOnce` e recomendado quando quiser midia de visualizacao unica e hoje produz efeito para os tipos:\n`image`, `video`, `videoplay`, `ptv`, `audio`, `myaudio` e `ptt`.\n\nPara `document`, `sticker` e demais endpoints de envio, o campo e ignorado silenciosamente.\n\n### Imagem Simples\n```json\n{\n  \"number\": \"5511999999999\",\n  \"type\": \"image\",\n  \"file\": \"https://exemplo.com/foto.jpg\"\n}\n```\n\n### Documento com Nome\n```json\n{\n  \"number\": \"5511999999999\",\n  \"type\": \"document\",\n  \"file\": \"https://exemplo.com/contrato.pdf\",\n  \"docName\": \"Contrato.pdf\",\n  \"text\": \"Segue o documento solicitado\"\n}\n```\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"ID do chat para o qual a mensagem sera enviada. Pode ser um numero de telefone em formato internacional, um ID de grupo (`@g.us`), um ID de usuario (com `@s.whatsapp.net` ou `@lid`) ou um ID de canal/newsletter (`@newsletter`).","example":"5511999999999"},"type":{"type":"string","description":"Tipo de midia (image, video, videoplay, document, audio, myaudio, ptt, ptv, sticker)","enum":["image","video","videoplay","document","audio","myaudio","ptt","ptv","sticker"],"example":"image"},"file":{"type":"string","description":"URL ou base64 do arquivo","example":"https://exemplo.com/imagem.jpg"},"text":{"type":"string","description":"Texto descritivo (caption) - aceita placeholders","example":"Veja esta foto!"},"docName":{"type":"string","description":"Nome do arquivo (apenas para documents)","example":"relatorio.pdf"},"thumbnail":{"type":"string","description":"URL ou base64 de thumbnail personalizado para videos e documentos","example":"https://exemplo.com/thumb.jpg"},"mimetype":{"type":"string","description":"MIME type do arquivo (opcional, detectado automaticamente)","example":"application/pdf"},"replyid":{"type":"string","description":"ID da mensagem para responder","example":"3EB0538DA65A59F6D8A251"},"mentions":{"type":"string","description":"Numeros para mencionar (separados por virgula)","example":"5511999999999,5511888888888"},"readchat":{"type":"boolean","description":"Marca conversa como lida apos envio","example":true},"readmessages":{"type":"boolean","description":"Marca ultimas mensagens recebidas como lidas","example":true},"delay":{"type":"integer","description":"Atraso em milissegundos antes do envio, durante o atraso apacera 'Digitando...' ou 'Gravando audio...'","example":1000},"forward":{"type":"boolean","description":"Marca a mensagem como encaminhada no WhatsApp","example":true},"track_source":{"type":"string","description":"Origem do rastreamento da mensagem","example":"chatwoot"},"track_id":{"type":"string","description":"ID para rastreamento da mensagem (aceita valores duplicados)","example":"msg_123456789"},"async":{"type":"boolean","description":"Se true, envia a mensagem de forma assincrona via fila interna","example":false},"viewOnce":{"type":"boolean","description":"Recomendado para midia com visualizacao unica em tipos compativeis (`image`, `video`, `videoplay`, `ptv`, `audio`, `myaudio`, `ptt`). Em tipos nao compativeis, o campo e ignorado silenciosamente.","example":false}},"required":["number","type","file"]}}}}}},"responses":{"200":{"description":"Midia enviada com sucesso","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Message"},{"type":"object","properties":{"response":{"type":"object","properties":{"status":{"type":"string","example":"success"},"message":{"type":"string","example":"Media sent successfully"},"fileUrl":{"type":"string","example":"https://mmg.whatsapp.net/..."}}}}}]}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid media type or file format"}}}}}},"401":{"description":"Nao autorizado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid token"}}}}}},"413":{"description":"Arquivo muito grande","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"File size exceeds limit"}}}}}},"415":{"description":"Formato de midia nao suportado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Unsupported media format"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to upload media"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostSendMedia"}},"/provider/send/contact":{"post":{"tags":["Enviar Mensagem"],"summary":"Enviar cartao de contato (vCard)","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nEnvia um cartao de contato (vCard) para um contato ou grupo.\n\n## Recursos Especificos\n\n- **vCard completo** com nome, telefones, organizacao, email e URL\n- **Multiplos numeros de telefone** (separados por virgula)\n- **Cartao clicavel** no WhatsApp para salvar na agenda\n- **Informacoes profissionais** (organizacao/empresa)\n\n## Campos Comuns\n\nEste endpoint suporta todos os **campos opcionais comuns** documentados na tag **\"Enviar Mensagem\"**, incluindo:\n`delay`, `readchat`, `readmessages`, `replyid`, `mentions`, `forward`, `track_source`, `track_id`, placeholders e envio para grupos.\n\n## Exemplo Basico\n```json\n{\n  \"number\": \"5511999999999\",\n  \"fullName\": \"Joao Silva\",\n  \"phoneNumber\": \"5511999999999,5511888888888\",\n  \"organization\": \"Empresa XYZ\",\n  \"email\": \"joao.silva@empresa.com\",\n  \"url\": \"https://empresa.com/joao\"\n}\n```\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"ID do chat para o qual a mensagem sera enviada. Pode ser um numero de telefone em formato internacional, um ID de grupo (`@g.us`), um ID de usuario (com `@s.whatsapp.net` ou `@lid`).","example":"5511999999999"},"fullName":{"type":"string","description":"Nome completo do contato","example":"Joao Silva"},"phoneNumber":{"type":"string","description":"Numeros de telefone (separados por virgula)","example":"5511999999999,5511888888888"},"organization":{"type":"string","description":"Nome da organizacao/empresa","example":"Empresa XYZ"},"email":{"type":"string","description":"Endereco de email","example":"joao@empresa.com"},"url":{"type":"string","description":"URL pessoal ou da empresa","example":"https://empresa.com/joao"},"replyid":{"type":"string","description":"ID da mensagem para responder","example":"3EB0538DA65A59F6D8A251"},"mentions":{"type":"string","description":"Numeros para mencionar (separados por virgula)","example":"5511999999999,5511888888888"},"readchat":{"type":"boolean","description":"Marca conversa como lida apos envio","example":true},"readmessages":{"type":"boolean","description":"Marca ultimas mensagens recebidas como lidas","example":true},"delay":{"type":"integer","description":"Atraso em milissegundos antes do envio, durante o atraso apacera 'Digitando...'","example":1000},"forward":{"type":"boolean","description":"Marca a mensagem como encaminhada no WhatsApp","example":true},"track_source":{"type":"string","description":"Origem do rastreamento da mensagem","example":"chatwoot"},"track_id":{"type":"string","description":"ID para rastreamento da mensagem (aceita valores duplicados)","example":"msg_123456789"},"async":{"type":"boolean","description":"Se true, envia a mensagem de forma assincrona via fila interna","example":false}},"required":["number","fullName","phoneNumber"]}}}}}},"responses":{"200":{"description":"Cartao de contato enviado com sucesso","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Message"},{"type":"object","properties":{"response":{"type":"object","properties":{"status":{"type":"string","example":"success"},"message":{"type":"string","example":"Contact card sent successfully"}}}}}]}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Missing required fields"}}}}}},"401":{"description":"Nao autorizado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid token"}}}}}},"429":{"description":"Limite de requisicoes excedido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Rate limit exceeded"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to send contact card"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostSendContact"}},"/provider/send/location":{"post":{"tags":["Enviar Mensagem"],"summary":"Enviar localizacao geografica","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nEnvia uma localizacao geografica para um contato ou grupo.\n\n## Recursos Especificos\n\n- **Coordenadas precisas** (latitude e longitude obrigatorias)\n- **Nome do local** para identificacao\n- **Endereco completo** para exibicao detalhada\n- **Mapa interativo** no WhatsApp para navegacao\n- **Pin personalizado** com nome do local\n\n## Campos Comuns\n\nEste endpoint suporta todos os **campos opcionais comuns** documentados na tag **\"Enviar Mensagem\"**, incluindo:\n`delay`, `readchat`, `readmessages`, `replyid`, `mentions`, `forward`, `track_source`, `track_id`, placeholders e envio para grupos.\n\n## Exemplo Basico\n```json\n{\n  \"number\": \"5511999999999\",\n  \"name\": \"Maracana\",\n  \"address\": \"Av. Pres. Castelo Branco - Maracana, Rio de Janeiro - RJ\",\n  \"latitude\": -22.912982815767986,\n  \"longitude\": -43.23028153499254\n}\n```\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"ID do chat para o qual a mensagem sera enviada. Pode ser um numero de telefone em formato internacional, um ID de grupo (`@g.us`), um ID de usuario (com `@s.whatsapp.net` ou `@lid`).","example":"5511999999999"},"name":{"type":"string","description":"Nome do local","example":"MASP"},"address":{"type":"string","description":"Endereco do local","example":"Av. Paulista, 1578 - Bela Vista, Sao Paulo - SP"},"latitude":{"type":"number","description":"Latitude (-90 a 90)","example":-23.5616},"longitude":{"type":"number","description":"Longitude (-180 a 180)","example":-46.6562},"replyid":{"type":"string","description":"ID da mensagem para responder","example":"3EB0538DA65A59F6D8A251"},"mentions":{"type":"string","description":"Numeros para mencionar (separados por virgula)","example":"5511999999999,5511888888888"},"readchat":{"type":"boolean","description":"Marca conversa como lida apos envio","example":true},"readmessages":{"type":"boolean","description":"Marca ultimas mensagens recebidas como lidas","example":true},"delay":{"type":"integer","description":"Atraso em milissegundos antes do envio, durante o atraso apacera 'Digitando...'","example":1000},"forward":{"type":"boolean","description":"Marca a mensagem como encaminhada no WhatsApp","example":true},"track_source":{"type":"string","description":"Origem do rastreamento da mensagem","example":"chatwoot"},"track_id":{"type":"string","description":"ID para rastreamento da mensagem (aceita valores duplicados)","example":"msg_123456789"},"async":{"type":"boolean","description":"Se true, envia a mensagem de forma assincrona via fila interna","example":false}},"required":["number","latitude","longitude"]}}}}}},"responses":{"200":{"description":"Localizacao enviada com sucesso","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Message"},{"type":"object","properties":{"response":{"type":"object","properties":{"status":{"type":"string","example":"success"},"message":{"type":"string","example":"Location sent successfully"}}}}}]}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid coordinates or missing number"}}}}}},"401":{"description":"Nao autorizado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid token"}}}}}},"429":{"description":"Limite de requisicoes excedido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Rate limit exceeded"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to send location"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostSendLocation"}},"/provider/message/presence":{"post":{"tags":["Enviar Mensagem"],"summary":"Enviar atualizacao de presenca","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nEnvia uma atualizacao de presenca para um contato ou grupo de forma **assincrona**.\n\n##  Comportamento Assincrono:\n- **Execucao independente**: A presenca e gerenciada em background, nao bloqueia o retorno da API\n- **Limite maximo**: 5 minutos de duracao (300 segundos)\n- **Tick de atualizacao**: Reenvia a presenca a cada 10 segundos\n- **Cancelamento automatico**: Presenca e cancelada automaticamente ao enviar uma mensagem para o mesmo chat\n\n##  Tipos de presenca suportados:\n- **composing**: Indica que voce esta digitando uma mensagem\n- **recording**: Indica que voce esta gravando um audio\n- **paused**: Remove/cancela a indicacao de presenca atual\n\n##  Controle de duracao:\n- **Sem delay**: Usa limite padrao de 5 minutos\n- **Com delay**: Usa o valor especificado (maximo 5 minutos)\n- **Cancelamento**: Envio de mensagem cancela presenca automaticamente\n\n##  Exemplos de uso:\n\n### Digitar por 30 segundos:\n```json\n{\n  \"number\": \"5511999999999\",\n  \"presence\": \"composing\",\n  \"delay\": 30000\n}\n```\n\n### Gravar audio por 1 minuto:\n```json\n{\n  \"number\": \"5511999999999\",\n  \"presence\": \"recording\",\n  \"delay\": 60000\n}\n```\n\n### Cancelar presenca atual:\n```json\n{\n  \"number\": \"5511999999999\",\n  \"presence\": \"paused\"\n}\n```\n\n### Usar limite maximo (5 minutos):\n```json\n{\n  \"number\": \"5511999999999\",\n  \"presence\": \"composing\"\n}\n```\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"Numero do destinatario no formato internacional (ex: 5511999999999)","example":"5511999999999"},"presence":{"type":"string","description":"Tipo de presenca a ser enviada","enum":["composing","recording","paused"],"example":"composing"},"delay":{"type":"integer","description":"Duracao em milissegundos que a presenca ficara ativa (maximo 5 minutos = 300000ms).\nSe nao informado ou valor maior que 5 minutos, usa o limite padrao de 5 minutos.\nA presenca e reenviada a cada 10 segundos durante este periodo.\n","maximum":300000,"example":30000}},"required":["number","presence"]}}}}}},"responses":{"200":{"description":"Presenca atualizada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","description":"Mensagem de confirmacao","example":"Chat presence sent successfully"}}}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Descricao do erro","example":"Numero invalido ou tipo de presenca invalido"}}}}}},"401":{"description":"Chave invalida ou expirada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Descricao do erro de autenticacao","example":"Chave invalida ou expirada"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Descricao do erro interno","example":"Erro ao enviar presenca"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostMessagePresence"}},"/provider/send/status":{"post":{"tags":["Enviar Mensagem"],"summary":"Enviar status (stories)","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nEnvia um status do WhatsApp com suporte para texto, imagem, video e audio.\n\nEste endpoint possui 3 modos de uso:\n\n- envio normal: omita `recipients` e `max_recipients`\n- envio explicito: informe `recipients` para enviar apenas para numeros especificos; o backend aproveita os validos e descarta os invalidos com motivo no `debug`\n- envio parcial: informe `max_recipients` para limitar a audiencia ou aplicar um cap de seguranca sobre `recipients`\n\n## Observacao importante sobre `recipients`\nQuando `recipients` e informado, o backend:\n\n- aceita numeros em formato WhatsApp, JIDs `@s.whatsapp.net` e JIDs `@lid`\n- quando recebe `@lid`, primeiro tenta resolver esse identificador para o PN (`@s.whatsapp.net`) usando o cache local de LID do WhatsApp\n- se o `@lid` nao puder ser resolvido para PN, esse item e descartado com motivo `lid_unresolved`\n- valida se o destinatario existe no WhatsApp usando o mesmo fluxo de verificacao do envio normal, com batch para evitar uma chamada remota por recipient\n- cruza os destinatarios verificados com a audiencia atual permitida pela privacidade do status, aceitando equivalencia PN/LID quando o cache local conhece esse vinculo\n- recipients descartados aparecem em `debug.discarded_recipients`, com motivos como `invalid_format`, `lid_unresolved`, `not_on_whatsapp`, `outside_status_audience` e `duplicate`\n- a requisicao so retorna `400` quando nenhum recipient valido sobra para envio\n\n## Observacao importante sobre `max_recipients`\nO campo `max_recipients` foi adicionado como mitigacao operacional.\nJa observamos casos em que o WhatsApp bloqueia imediatamente o envio de status quando a audiencia e muito grande\n(por exemplo, agendas com milhares de contatos, como ~3.000).\nA causa exata ainda nao esta totalmente clara, entao a recomendacao e comecar com limites menores e aumentar gradualmente.\n\n## Tipos suportados\n- `text`: texto com cor de fundo e fonte\n- `image`: imagem com legenda opcional\n- `video`: video com legenda opcional\n- `audio`: audio normal\n- `myaudio`: audio enviado como voz\n- `ptt`: audio enviado como voz\n\n## Cores de fundo\nInforme um valor de `1` a `19`. O backend converte esse indice para a cor ARGB usada pelo WhatsApp.\n\n- `1`: amarelo esverdeado suave\n- `2`: amarelo palido\n- `3`: amarelo alaranjado vibrante\n- `4`: verde vibrante\n- `5`: verde musgo\n- `6`: verde claro\n- `7`: azul piscina\n- `8`: azul intenso\n- `9`: azul claro acinzentado\n- `10`: lilas claro\n- `11`: lilas quente\n- `12`: roxo azulado\n- `13`: magenta profundo\n- `14`: rosa suave\n- `15`: salmao rosado\n- `16`: marrom claro\n- `17`: cinza claro azulado\n- `18`: cinza medio\n- `19`: cinza profundo padrao\n\nExemplo rapido:\n- `7`: azul piscina\n- `13`: magenta profundo\n- `19`: cinza profundo (padrao)\n\n## Fontes validas para `type=text`\nValores aceitos atualmente: `0`, `1`, `2`, `6`, `7`, `8`, `9`, `10`.\n\n## Limites\n- `text`: maximo de 656 caracteres\n- `max_recipients`: nao pode ser negativo\n- `recipients`: aceita numeros, JIDs `@s.whatsapp.net` e JIDs `@lid`\n- `@lid` so entra no envio quando puder ser resolvido localmente para um PN valido; caso contrario, e descartado\n- para tipos de midia, `file` e obrigatorio\n\nExemplo de envio explicito:\n```json\n{\n  \"type\": \"text\",\n  \"text\": \"Novidades chegando!\",\n  \"recipients\": [\n    \"5511999999999\",\n    \"5511888888888@s.whatsapp.net\"\n  ]\n}\n```\n\nExemplo de envio parcial:\n```json\n{\n  \"type\": \"text\",\n  \"text\": \"Novidades chegando!\",\n  \"background_color\": 7,\n  \"font\": 1,\n  \"max_recipients\": 100\n}\n```\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"type":{"type":"string","enum":["text","image","video","audio","myaudio","ptt"],"description":"Tipo do status.","example":"text"},"text":{"type":"string","description":"Texto principal ou legenda.","example":"Novidades chegando!"},"background_color":{"type":"integer","minimum":1,"maximum":19,"description":"Indice da cor de fundo para status em texto.","example":7},"font":{"type":"integer","enum":[0,1,2,6,7,8,9,10],"description":"Fonte aceita para `type=text`.","example":1},"file":{"type":"string","description":"URL ou base64 do arquivo de midia.","example":"https://example.com/video.mp4"},"thumbnail":{"type":"string","description":"Campo aceito no payload; o backend gera thumbnail automaticamente quando necessario.","example":"https://example.com/thumb.jpg"},"mimetype":{"type":"string","description":"MIME type do arquivo, quando necessario.","example":"video/mp4"},"recipients":{"type":"array","description":"Lista explicita de destinatarios. Aceita numeros em formato WhatsApp, JIDs `@s.whatsapp.net` e JIDs `@lid`. O backend valida item a item, descarta os invalidos com motivo no `debug` e envia para o subconjunto valido restante. Entradas `@lid` dependem de resolucao local para PN.","items":{"type":"string"},"example":["5511999999999","5511888888888@s.whatsapp.net"]},"max_recipients":{"type":"integer","minimum":0,"description":"Limita o envio a um subconjunto deterministico da audiencia. Quando `recipients` for informado, funciona como cap de seguranca sobre a lista explicita ja validada.","example":100}},"required":["type"]}}}}}},"responses":{"200":{"description":"Status enviado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"Id":{"type":"string","description":"ID da mensagem quando ha envio real.","example":"ABCD1234"},"content":{"type":"object","description":"Conteudo processado da mensagem quando ha envio real."},"messageTimestamp":{"type":"integer","description":"Timestamp em milissegundos quando ha envio real.","example":1672531200000},"status":{"type":"string","description":"Status do envio quando ha envio real.","example":"Pending"},"debug":{"type":"object","description":"Metricas agregadas da audiencia e da selecao aplicada.","properties":{"status_privacy_type":{"type":"string","example":"contacts"},"audience_recipient_count":{"type":"integer","example":245},"total_contacts_in_store":{"type":"integer","example":300},"contacts_with_full_name":{"type":"integer","example":245},"contacts_with_push_name_only":{"type":"integer","example":32},"contacts_with_business_name_only":{"type":"integer","example":23},"used_default_privacy_fallback":{"type":"boolean","example":false},"privacy_lookup_error":{"type":"string","example":"privacy unavailable"},"explicit_recipients":{"type":"boolean","example":true},"requested_recipient_count":{"type":"integer","example":25},"resolved_recipient_count":{"type":"integer","example":20},"discarded_recipient_count":{"type":"integer","example":5},"discarded_recipients":{"type":"array","items":{"type":"object","properties":{"input":{"type":"string","example":"144637553594388@lid"},"reason":{"type":"string","example":"lid_unresolved"}}}},"max_recipients":{"type":"integer","example":100},"selected_recipient_count":{"type":"integer","example":100},"partial_send":{"type":"boolean","example":true}}}}}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid font"},"debug":{"type":"object","description":"Presente especialmente quando `recipients` foi informado, para indicar quais itens foram descartados antes de concluir que nenhum recipient valido sobrou."}}}}}},"401":{"description":"Nao autorizado"},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"failed to determine status audience: privacy unavailable"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostSendStatus"}},"/provider/send/menu":{"post":{"tags":["Enviar Mensagem"],"summary":"Enviar menu interativo (botoes, carrosel, lista ou enquete)","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nEste endpoint oferece uma interface unificada para envio de quatro tipos principais de mensagens interativas:\n- Botoes: Para acoes rapidas e diretas\n- Carrosel de Botoes: Para uma lista horizontal de botoes com imagens\n- Listas: Para menus organizados em secoes\n- Enquetes: Para coleta de opinioes e votacoes\n\n**Suporte a campos de rastreamento**: Este endpoint tambem suporta `track_source` e `track_id` documentados na tag **\"Enviar Mensagem\"**.\n\n## Estrutura Base do Payload\n\nTodas as requisicoes seguem esta estrutura base:\n\n```json\n{\n  \"number\": \"5511999999999\",\n  \"type\": \"button|list|poll|carousel\",\n  \"text\": \"Texto principal da mensagem\",\n  \"choices\": [\"opcoes baseadas no tipo escolhido\"],\n  \"footerText\": \"Texto do rodape (opcional para botoes e listas)\",\n  \"listButton\": \"Texto do botao (para listas)\",\n  \"selectableCount\": \"Numero de opcoes selecionaveis (apenas para enquetes)\"\n}\n```\n\n## Tipos de Mensagens Interativas\n\n### 1. Botoes (type: \"button\")\n\nCria botoes interativos com diferentes funcionalidades de acao.\n\n#### Campos Especificos\n- `footerText`: Texto opcional exibido abaixo da mensagem principal\n- `choices`: Array de opcoes que serao convertidas em botoes\n\n#### Formatos de Botoes\nCada botao pode ser configurado usando `|` (pipe) ou `\\n` (quebra de linha) como separadores:\n\n- **Botao de Resposta**: \n  - `\"texto|id\"` ou \n  - `\"texto\\nid\"` ou \n  - `\"texto\"` (ID sera igual ao texto)\n\n- **Botao de Copia**: \n  - `\"texto|copy:codigo\"` ou \n  - `\"texto\\ncopy:codigo\"`\n\n- **Botao de Chamada**: \n  - `\"texto|call:+5511999999999\"` ou \n  - `\"texto\\ncall:+5511999999999\"`\n\n- **Botao de URL**: \n  - `\"texto|https://exemplo.com\"` ou \n  - `\"texto|url:https://exemplo.com\"`\n\n#### Botoes com Imagem\nPara adicionar uma imagem aos botoes, use o campo `imageButton` no payload:\n\n#### Exemplo com Imagem\n```json\n{\n  \"number\": \"5511999999999\",\n  \"type\": \"button\",\n  \"text\": \"Escolha um produto:\",\n  \"imageButton\": \"https://exemplo.com/produto1.jpg\",\n  \"choices\": [\n    \"Produto A|prod_a\",\n    \"Mais Info|https://exemplo.com/produto-a\",\n    \"Produto B|prod_b\",\n    \"Ligar|call:+5511999999999\"\n  ],\n  \"footerText\": \"Produtos em destaque\"\n}\n```\n\n> **Suporte**: O campo `imageButton` aceita URLs ou imagens em base64.\n\n#### Exemplo Completo\n```json\n{\n  \"number\": \"5511999999999\",\n  \"type\": \"button\",\n  \"text\": \"Como podemos ajudar?\",\n  \"choices\": [\n    \"Suporte Tecnico|suporte\",\n    \"Fazer Pedido|pedido\",\n    \"Nosso Site|https://exemplo.com\",\n    \"Falar Conosco|call:+5511999999999\"\n  ],\n  \"footerText\": \"Escolha uma das opcoes abaixo\"\n}\n```\n\n#### Limitacoes e Compatibilidade\n> **Importante**: Ao combinar botoes de resposta com outros tipos (call, url, copy) na mesma mensagem, sera exibido o aviso: \"Nao e possivel exibir esta mensagem no WhatsApp Web. Abra o WhatsApp no seu celular para visualiza-la.\"\n\n### 2. Listas (type: \"list\")\n\nCria menus organizados em secoes com itens selecionaveis.\n\n#### Campos Especificos\n- `listButton`: Texto do botao que abre a lista\n- `footerText`: Texto opcional do rodape\n- `choices`: Array com secoes e itens da lista\n\n#### Formato das Choices\n- `\"[Titulo da Secao]\"`: Inicia uma nova secao\n- `\"texto|id|descricao\"`: Item da lista com:\n  - texto: Label do item\n  - id: Identificador unico, opcional\n  - descricao: Texto descritivo adicional e opcional\n\n#### Exemplo Completo\n```json\n{\n  \"number\": \"5511999999999\",\n  \"type\": \"list\",\n  \"text\": \"Catalogo de Produtos\",\n  \"choices\": [\n    \"[Eletronicos]\",\n    \"Smartphones|phones|Ultimos lancamentos\",\n    \"Notebooks|notes|Modelos 2024\",\n    \"[Acessorios]\",\n    \"Fones|fones|Bluetooth e com fio\",\n    \"Capas|cases|Protecao para seu device\"\n  ],\n  \"listButton\": \"Ver Catalogo\",\n  \"footerText\": \"Precos sujeitos a alteracao\"\n}\n```\n\n### 3. Enquetes (type: \"poll\")\n\nCria enquetes interativas para votacao.\n\n#### Campos Especificos\n- `selectableCount`: Numero de opcoes que podem ser selecionadas (padrao: 1)\n- `choices`: Array simples com as opcoes de voto\n\n#### Exemplo Completo\n```json\n{\n  \"number\": \"5511999999999\",\n  \"type\": \"poll\",\n  \"text\": \"Qual horario prefere para atendimento?\",\n  \"choices\": [\n    \"Manha (8h-12h)\",\n    \"Tarde (13h-17h)\",\n    \"Noite (18h-22h)\"\n  ],\n  \"selectableCount\": 1\n}\n```\n\n### 4. Carousel (type: \"carousel\")\n\nCria um carrossel de cartoes com imagens e botoes interativos.\n\n#### Campos Especificos\n- `choices`: Array com elementos do carrossel na seguinte ordem:\n  - `[Texto do cartao]`: Texto do cartao entre colchetes\n  - `{URL ou base64 da imagem}`: Imagem entre chaves\n  - Botoes do cartao (um por linha):\n    - `\"texto|copy:codigo\"` para botao de copiar\n    - `\"texto|https://url\"` para botao de link\n    - `\"texto|call:+numero\"` para botao de ligacao\n\n#### Exemplo Completo\n```json\n{\n  \"number\": \"5511999999999\",\n  \"type\": \"carousel\",\n  \"text\": \"Conheca nossos produtos\",\n  \"choices\": [\n    \"[Smartphone XYZ\\nO mais avancado smartphone da linha]\",\n    \"{https://exemplo.com/produto1.jpg}\",\n    \"Copiar Codigo|copy:PROD123\",\n    \"Ver no Site|https://exemplo.com/xyz\",\n    \"Fale Conosco|call:+5511999999999\",\n    \"[Notebook ABC\\nO notebook ideal para profissionais]\",\n    \"{https://exemplo.com/produto2.jpg}\",\n    \"Copiar Codigo|copy:NOTE456\",\n    \"Comprar Online|https://exemplo.com/abc\",\n    \"Suporte|call:+5511988888888\"\n  ]\n}\n```\n\n> **Nota**: Criamos outro endpoint para carrossel: `/send/carousel`, funciona da mesma forma, mas com outro formato de payload. Veja o que e mais facil para voce.\n\n## Termos de uso\n\nOs recursos de botoes interativos e listas podem ser descontinuados a qualquer momento sem aviso previo. Nao nos responsabilizamos por quaisquer alteracoes ou indisponibilidade destes recursos.\n\n### Alternativas e Compatibilidade\n\nConsiderando a natureza dinamica destes recursos, nosso endpoint foi projetado para facilitar a migracao entre diferentes tipos de mensagens (botoes, listas e enquetes). \n\nRecomendamos criar seus fluxos de forma flexivel, preparados para alternar entre os diferentes tipos.\n\nEm caso de descontinuidade de algum recurso, voce podera facilmente migrar para outro tipo de mensagem apenas alterando o campo \"type\" no payload, mantendo a mesma estrutura de choices.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"ID do chat para o qual a mensagem sera enviada. Pode ser um numero de telefone em formato internacional, um ID de grupo (`@g.us`), um ID de usuario (com `@s.whatsapp.net` ou `@lid`).","example":"5511999999999"},"type":{"type":"string","description":"Tipo do menu (button, list, poll, carousel)","enum":["button","list","poll","carousel"],"example":"list"},"text":{"type":"string","description":"Texto principal (aceita placeholders)","example":"Escolha uma opcao:"},"footerText":{"type":"string","description":"Texto do rodape (opcional)","example":"Menu de servicos"},"listButton":{"type":"string","description":"Texto do botao principal","example":"Ver opcoes"},"selectableCount":{"type":"integer","description":"Numero maximo de opcoes selecionaveis (para enquetes)","example":1},"choices":{"type":"array","description":"Lista de opcoes. Use [Titulo] para secoes em listas","items":{"type":"string"},"example":["[Eletronicos]","Smartphones|phones|Ultimos lancamentos","Notebooks|notes|Modelos 2024","[Acessorios]","Fones|fones|Bluetooth e com fio","Capas|cases|Protecao para seu device"]},"imageButton":{"type":"string","description":"URL da imagem para botoes (recomendado para type: button)","example":"https://exemplo.com/imagem-botao.jpg"},"replyid":{"type":"string","description":"ID da mensagem para responder","example":"3EB0538DA65A59F6D8A251"},"mentions":{"type":"string","description":"Numeros para mencionar (separados por virgula)","example":"5511999999999,5511888888888"},"readchat":{"type":"boolean","description":"Marca conversa como lida apos envio","example":true},"readmessages":{"type":"boolean","description":"Marca ultimas mensagens recebidas como lidas","example":true},"delay":{"type":"integer","description":"Atraso em milissegundos antes do envio, durante o atraso apacera 'Digitando...'","example":1000},"track_source":{"type":"string","description":"Origem do rastreamento da mensagem","example":"chatwoot"},"track_id":{"type":"string","description":"ID para rastreamento da mensagem (aceita valores duplicados)","example":"msg_123456789"},"async":{"type":"boolean","description":"Se true, envia a mensagem de forma assincrona via fila interna","example":false}},"required":["number","type","text","choices"]}}}}}},"responses":{"200":{"description":"Menu enviado com sucesso","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Message"},{"type":"object","properties":{"response":{"type":"object","properties":{"status":{"type":"string","example":"success"},"message":{"type":"string","example":"Menu sent successfully"}}}}}]}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Missing required fields or invalid menu type"}}}}}},"401":{"description":"Nao autorizado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid token"}}}}}},"429":{"description":"Limite de requisicoes excedido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Rate limit exceeded"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to send menu"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostSendMenu"}},"/provider/send/carousel":{"post":{"tags":["Enviar Mensagem"],"summary":"Enviar carrossel de midia com botoes","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nEste endpoint permite enviar um carrossel com imagens e botoes interativos.\nFunciona de maneira igual ao endpoint `/send/menu` com type: carousel, porem usando outro formato de payload.\n\n## Campos Comuns\n\nEste endpoint suporta todos os **campos opcionais comuns** documentados na tag **\"Enviar Mensagem\"**, incluindo:\n`delay`, `readchat`, `readmessages`, `replyid`, `mentions`, `forward`, `track_source`, `track_id`, placeholders e envio para grupos.\n\n## Estrutura do Payload\n\n```json\n{\n  \"number\": \"5511999999999\",\n  \"text\": \"Texto principal\",\n  \"carousel\": [\n    {\n      \"text\": \"Texto do cartao\",\n      \"image\": \"URL da imagem\",\n      \"buttons\": [\n        {\n          \"id\": \"resposta1\",\n          \"text\": \"Texto do botao\",\n          \"type\": \"REPLY\"\n        }\n      ]\n    }\n  ],\n  \"delay\": 1000,\n  \"readchat\": true\n}\n```\n\n## Tipos de Botoes\n\n- `REPLY`: Botao de resposta rapida\n  - Quando clicado, envia o valor do id como resposta ao chat\n  - O id sera o texto enviado como resposta\n\n- `URL`: Botao com link\n  - Quando clicado, abre a URL especificada\n  - O id deve conter a URL completa (ex: https://exemplo.com)\n\n- `COPY`: Botao para copiar texto\n  - Quando clicado, copia o texto para a area de transferencia\n  - O id sera o texto que sera copiado\n\n- `CALL`: Botao para realizar chamada\n  - Quando clicado, inicia uma chamada telefonica\n  - O id deve conter o numero de telefone\n\n## Exemplo de Botoes\n```json\n{\n  \"buttons\": [\n    {\n      \"id\": \"Sim, quero comprar!\",\n      \"text\": \"Confirmar Compra\",\n      \"type\": \"REPLY\"\n    },\n    {\n      \"id\": \"https://exemplo.com/produto\",\n      \"text\": \"Ver Produto\",\n      \"type\": \"URL\"\n    },\n    {\n      \"id\": \"CUPOM20\",\n      \"text\": \"Copiar Cupom\",\n      \"type\": \"COPY\"\n    },\n    {\n      \"id\": \"5511999999999\",\n      \"text\": \"Falar com Vendedor\",\n      \"type\": \"CALL\"\n    }\n  ]\n}\n```\n\n## Exemplo Completo de Carrossel\n```json\n{\n  \"number\": \"5511999999999\",\n  \"text\": \"Nossos Produtos em Destaque\",\n  \"carousel\": [\n    {\n      \"text\": \"Smartphone XYZ\\nO mais avancado smartphone da linha\",\n      \"image\": \"https://exemplo.com/produto1.jpg\",\n      \"buttons\": [\n        {\n          \"id\": \"SIM_COMPRAR_XYZ\",\n          \"text\": \"Comprar Agora\",\n          \"type\": \"REPLY\"\n        },\n        {\n          \"id\": \"https://exemplo.com/xyz\",\n          \"text\": \"Ver Detalhes\",\n          \"type\": \"URL\"\n        }\n      ]\n    },\n    {\n      \"text\": \"Cupom de Desconto\\nGanhe 20% OFF em qualquer produto\",\n      \"image\": \"https://exemplo.com/cupom.jpg\",\n      \"buttons\": [\n        {\n          \"id\": \"DESCONTO20\",\n          \"text\": \"Copiar Cupom\",\n          \"type\": \"COPY\"\n        },\n        {\n          \"id\": \"5511999999999\",\n          \"text\": \"Falar com Vendedor\",\n          \"type\": \"CALL\"\n        }\n      ]\n    }\n  ],\n  \"delay\": 0,\n  \"readchat\": true\n}\n```\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"ID do chat para o qual a mensagem sera enviada. Pode ser um numero de telefone em formato internacional, um ID de grupo (`@g.us`), um ID de usuario (com `@s.whatsapp.net` ou `@lid`).","example":"5511999999999"},"text":{"type":"string","description":"Texto principal da mensagem","example":"Nossos Produtos em Destaque"},"carousel":{"type":"array","description":"Array de cartoes do carrossel","items":{"type":"object","properties":{"text":{"type":"string","description":"Texto do cartao","example":"Smartphone XYZ\nO mais avancado smartphone da linha"},"image":{"type":"string","description":"URL da imagem (opcional)","example":"https://exemplo.com/produto1.jpg"},"video":{"type":"string","description":"URL do video (alternativa a imagem)","example":"https://exemplo.com/produto1.mp4"},"document":{"type":"string","description":"URL do documento (alternativa a imagem)","example":"https://exemplo.com/catalogo.pdf"},"filename":{"type":"string","description":"Nome do arquivo para documentos","example":"Catalogo.pdf"},"buttons":{"type":"array","description":"Array de botoes do cartao","items":{"type":"object","properties":{"id":{"type":"string","description":"ID do botao","example":"buy_xyz"},"text":{"type":"string","description":"Texto exibido no botao","example":"Comprar Agora"},"type":{"type":"string","description":"Tipo do botao:\n* REPLY - O id sera enviado como resposta ao chat\n* URL - O id deve ser a URL completa que sera aberta\n* COPY - O id sera o texto copiado para area de transferencia\n* CALL - O id deve ser o numero de telefone para a chamada\n","enum":["REPLY","URL","CALL","COPY"],"example":"REPLY"}}}}},"required":["text","buttons"]}},"delay":{"type":"integer","description":"Atraso em milissegundos antes do envio","example":1000},"readchat":{"type":"boolean","description":"Marca conversa como lida apos envio","example":true},"readmessages":{"type":"boolean","description":"Marca ultimas mensagens recebidas como lidas","example":true},"replyid":{"type":"string","description":"ID da mensagem para responder","example":"3EB0538DA65A59F6D8A251"},"mentions":{"type":"string","description":"Numeros para mencionar (separados por virgula)","example":"5511999999999,5511888888888"},"forward":{"type":"boolean","description":"Marca a mensagem como encaminhada no WhatsApp","example":false},"async":{"type":"boolean","description":"Se true, envia a mensagem de forma assincrona via fila interna","example":false},"track_source":{"type":"string","description":"Origem do rastreamento da mensagem","example":"chatwoot"},"track_id":{"type":"string","description":"ID para rastreamento da mensagem (aceita valores duplicados)","example":"msg_123456789"}},"required":["number","text","carousel"]}}}}}},"responses":{"200":{"description":"Carrossel enviado com sucesso","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Message"},{"type":"object","properties":{"response":{"type":"object","properties":{"status":{"type":"string","example":"success"},"message":{"type":"string","example":"Carousel sent successfully"}}}}}]}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Missing required fields or invalid card format"}}}}}},"401":{"description":"Nao autorizado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid token"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to send carousel"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostSendCarousel"}},"/provider/send/location-button":{"post":{"tags":["Enviar Mensagem"],"summary":"Solicitar localizacao do usuario","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nEste endpoint envia uma mensagem com um botao que solicita a localizacao do usuario.\nQuando o usuario clica no botao, o WhatsApp abre a interface para compartilhar a localizacao atual.\n\n## Campos Comuns\n\nEste endpoint suporta todos os **campos opcionais comuns** documentados na tag **\"Enviar Mensagem\"**, incluindo:\n`delay`, `readchat`, `readmessages`, `replyid`, `mentions`, `forward`, `track_source`, `track_id`, placeholders e envio para grupos.\n\n## Estrutura do Payload\n\n```json\n{\n  \"number\": \"5511999999999\",\n  \"text\": \"Por favor, compartilhe sua localizacao\",\n  \"delay\": 0,\n  \"readchat\": true\n}\n```\n\n## Exemplo de Uso\n\n```json\n{\n  \"number\": \"5511999999999\",\n  \"text\": \"Para continuar o atendimento, clique no botao abaixo e compartilhe sua localizacao\"\n}\n```\n\n> **Nota**: O botao de localizacao e adicionado automaticamente a mensagem\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"ID do chat para o qual a mensagem sera enviada. Pode ser um numero de telefone em formato internacional, um ID de grupo (`@g.us`), um ID de usuario (com `@s.whatsapp.net` ou `@lid`).","example":"5511999999999"},"text":{"type":"string","description":"Texto da mensagem que sera exibida","example":"Por favor, compartilhe sua localizacao"},"delay":{"type":"integer","description":"Atraso em milissegundos antes do envio","example":0},"readchat":{"type":"boolean","description":"Se deve marcar a conversa como lida apos envio","example":true},"readmessages":{"type":"boolean","description":"Marca ultimas mensagens recebidas como lidas","example":true},"replyid":{"type":"string","description":"ID da mensagem para responder","example":"3EB0538DA65A59F6D8A251"},"mentions":{"type":"string","description":"Numeros para mencionar (separados por virgula)","example":"5511999999999,5511888888888"},"async":{"type":"boolean","description":"Se true, envia a mensagem de forma assincrona via fila interna","example":false},"track_source":{"type":"string","description":"Origem do rastreamento da mensagem","example":"chatwoot"},"track_id":{"type":"string","description":"ID para rastreamento da mensagem (aceita valores duplicados)","example":"msg_123456789"}},"required":["number","text"]}}}}}},"responses":{"200":{"description":"Localizacao enviada com sucesso","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Message"},{"type":"object","properties":{"response":{"type":"object","properties":{"status":{"type":"string","example":"success"},"message":{"type":"string","example":"Location sent successfully"}}}}}]}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Missing required fields or invalid coordinates"}}}}}},"401":{"description":"Nao autorizado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid token"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to send location"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostSendLocationButton"}},"/provider/send/request-payment":{"post":{"tags":["Enviar Mensagem"],"summary":"Solicitar pagamento","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nEnvia uma solicitacao de pagamento com o botao nativo **\"Revisar e pagar\"** do WhatsApp.\nO fluxo suporta PIX (estatico, dinamico ou desabilitado), boleto, link de pagamento e cartao,\ncombinando tudo em uma unica mensagem interativa.\n\n## Como funciona\n- Define o valor em `amount` (BRL por padrao) e opcionalmente personaliza titulo, texto e nota adicional.\n- Por padrao exige `pixKey`.\n- O arquivo apontado por `fileUrl` e anexado como documento (boleto ou fatura em PDF, por exemplo).\n- `paymentLink` habilita o botao externo.\n\n\n\n## Campos comuns\nEste endpoint tambem suporta os campos padrao: `delay`, `readchat`, `readmessages`, `replyid`,\n`mentions`, `track_source`, `track_id` e `async`.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"ID do chat para o qual a mensagem sera enviada. Pode ser um numero de telefone em formato internacional, um ID de grupo (`@g.us`), um ID de usuario (com `@s.whatsapp.net` ou `@lid`).","example":"5511999999999"},"title":{"type":"string","description":"Titulo que aparece no cabecalho do fluxo","example":"Detalhes do pedido"},"text":{"type":"string","description":"Mensagem exibida no corpo do fluxo","example":"Pedido #123 pronto para pagamento"},"footer":{"type":"string","description":"Texto do rodape da mensagem","example":"Loja Exemplo"},"itemName":{"type":"string","description":"Nome do item principal listado no fluxo","example":"Assinatura Plano Ouro"},"invoiceNumber":{"type":"string","description":"Identificador ou numero da fatura","example":"PED-123"},"amount":{"type":"number","format":"float","description":"Valor da cobranca (em BRL por padrao)","example":199.9},"pixKey":{"type":"string","description":"Chave PIX estatico (CPF/CNPJ/telefone/email/EVP)","example":"123e4567-e89b-12d3-a456-426614174000"},"pixType":{"type":"string","description":"Tipo da chave PIX (`CPF`, `CNPJ`, `PHONE`, `EMAIL`, `EVP`). Padrao `EVP`","example":"EVP"},"pixName":{"type":"string","description":"Nome do recebedor exibido no fluxo (padrao usa o nome do perfil da instancia)","example":"Loja Exemplo"},"paymentLink":{"type":"string","description":"URL externa para checkout (somente dominios homologados; veja lista acima)","example":"https://pagamentos.exemplo.com/checkout/abc"},"fileUrl":{"type":"string","description":"URL ou caminho (base64) do documento a ser anexado (ex.: boleto PDF)","example":"https://cdn.exemplo.com/boleto-123.pdf"},"fileName":{"type":"string","description":"Nome do arquivo exibido no WhatsApp ao anexar `fileUrl`","example":"boleto-123.pdf"},"boletoCode":{"type":"string","description":"Linha digitavel do boleto (habilita o metodo boleto automaticamente)","example":"34191.79001 01043.510047 91020.150008 5 91070026000"},"replyid":{"type":"string","description":"ID da mensagem que sera respondida"},"mentions":{"type":"string","description":"Numeros mencionados separados por virgula"},"delay":{"type":"integer","description":"Atraso em milissegundos antes do envio (exibe \"digitando...\" no WhatsApp)"},"readchat":{"type":"boolean","description":"Marca o chat como lido apos enviar a mensagem"},"readmessages":{"type":"boolean","description":"Marca mensagens recentes como lidas apos o envio"},"async":{"type":"boolean","description":"Enfileira o envio para processamento assincrono"},"track_source":{"type":"string","description":"Origem de rastreamento (ex.: chatwoot, crm-interno)"},"track_id":{"type":"string","description":"Identificador de rastreamento (aceita valores duplicados)"}},"required":["number","amount"]}}}}}},"responses":{"200":{"description":"Solicitacao de pagamento enviada com sucesso","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Message"},{"type":"object","properties":{"response":{"type":"object","properties":{"status":{"type":"string","example":"success"},"message":{"type":"string","example":"Payment request sent successfully"}}}}}]}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Missing pixKey or pixCode"}}}}}},"401":{"description":"Nao autorizado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid token"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to send payment request"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostSendRequestPayment"}},"/provider/send/pix-button":{"post":{"tags":["Enviar Mensagem"],"summary":"Enviar botao PIX","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nEnvia um botao nativo do WhatsApp que abre para pagamento PIX com a chave informada.\nO usuario visualiza o detalhe do recebedor, nome e chave.\n\n## Regras principais\n- `pixType` aceita: `CPF`, `CNPJ`, `PHONE`, `EMAIL`, `EVP` (case insensitive)\n- `pixName` padrao: `\"Pix\"` quando nao informado - nome de quem recebe o pagamento\n\n\n## Campos comuns\nEste endpoint herda os campos opcionais padronizados da tag **\"Enviar Mensagem\"**:\n`delay`, `readchat`, `readmessages`, `replyid`, `mentions`, `track_source`, `track_id` e `async`.\n\n## Exemplo de payload\n```json\n{\n  \"number\": \"5511999999999\",\n  \"pixType\": \"EVP\",\n  \"pixKey\": \"123e4567-e89b-12d3-a456-426614174000\",\n  \"pixName\": \"Loja Exemplo\"\n}\n```\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"ID do chat para o qual a mensagem sera enviada. Pode ser um numero de telefone em formato internacional, um ID de grupo (`@g.us`), um ID de usuario (com `@s.whatsapp.net` ou `@lid`).","example":"5511999999999"},"pixType":{"type":"string","description":"Tipo da chave PIX. Valores aceitos: CPF, CNPJ, PHONE, EMAIL ou EVP","example":"EVP"},"pixKey":{"type":"string","description":"Valor da chave PIX (CPF/CNPJ/telefone/email/EVP)","example":"123e4567-e89b-12d3-a456-426614174000"},"pixName":{"type":"string","description":"Nome exibido como recebedor do PIX (padrao \"Pix\" se vazio)","example":"Loja Exemplo"},"async":{"type":"boolean","description":"Enfileira o envio para processamento assincrono"},"delay":{"type":"integer","description":"Atraso em milissegundos antes do envio (exibe \"digitando...\" no WhatsApp)"},"readchat":{"type":"boolean","description":"Marca o chat como lido apos enviar a mensagem"},"readmessages":{"type":"boolean","description":"Marca mensagens recentes como lidas apos o envio"},"replyid":{"type":"string","description":"ID da mensagem que sera respondida"},"mentions":{"type":"string","description":"Lista de numeros mencionados separados por virgula"},"track_source":{"type":"string","description":"Origem de rastreamento (ex.: chatwoot, crm-interno)"},"track_id":{"type":"string","description":"Identificador de rastreamento (aceita valores duplicados)"}},"required":["number","pixType","pixKey"],"example":{"number":"5511999999999","pixType":"EVP","pixKey":"123e4567-e89b-12d3-a456-426614174000","pixName":"Loja Exemplo"}}}}}}},"responses":{"200":{"description":"Botao PIX enviado com sucesso","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Message"},{"type":"object","properties":{"response":{"type":"object","properties":{"status":{"type":"string","example":"success"},"message":{"type":"string","example":"PIX button sent successfully"}}}}}]}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid keyType. Allowed: CPF, CNPJ, PHONE, EMAIL, EVP"}}}}}},"401":{"description":"Nao autorizado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid token"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to send PIX button"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostSendPixButton"}},"/provider/message/async":{"get":{"tags":["Mensagem Async"],"summary":"Consultar fila async de envio direto","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nRetorna um resumo simples da fila de envio `async=true` da instancia atual autenticada.\n\nEste endpoint cobre apenas a fila interna de envio direto assincrono. Ele **nao** representa:\n- campanhas de envio em massa do sender (`/sender/*`)\n\nA resposta padrao foi pensada para clientes:\n- `status`: visao resumida da fila (`idle`, `queued`, `processing`, `waiting_connection`, `resetting`)\n- `pending`: quantidade total estimada de mensagens pendentes\n- `processingNow`: indica se o worker esta ocupando um job neste momento\n- `acceptingNewMessages`: indica se a fila aceita novos envios async\n- `sessionReady`: indica se a sessao WhatsApp esta pronta para envio\n- `resetting`: indica se a fila esta pausada por reset/clear\n","responses":{"200":{"description":"Resumo da fila async","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Async queue status"},"instanceId":{"type":"string","description":"ID da instancia"},"queue":{"type":"object","properties":{"status":{"type":"string","description":"Estado resumido da fila","example":"waiting_connection"},"pending":{"type":"integer","format":"int64","description":"Quantidade total estimada de mensagens pendentes","example":3},"processingNow":{"type":"boolean","description":"Indica se ha um job ativo no worker agora","example":true},"acceptingNewMessages":{"type":"boolean","description":"Indica se a fila aceita novos envios async","example":true},"sessionReady":{"type":"boolean","description":"Indica se a sessao WhatsApp esta pronta para envio","example":false},"resetting":{"type":"boolean","description":"Indica se a fila async esta pausada por reset/clear","example":false}}}}}}}},"401":{"description":"Token invalido ou ausente"},"500":{"description":"Erro interno ao consultar a fila async","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"instanceId":{"type":"string"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"}],"operationId":"providerGetMessageAsync"},"delete":{"tags":["Mensagem Async"],"summary":"Limpar fila async de envio direto","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string. Esta operacao nao exige payload especifico.\n\nCancela toda a fila de envio `async=true` da instancia e marca as mensagens pendentes como `Canceled`.\n\nEste endpoint atua apenas na fila interna de envio direto assincrono. Ele **nao** afeta:\n- campanhas do sender (`/sender/*`)\n- mensagens ja enviadas com sucesso\n- mensagens em massa agendadas\n\nO fluxo executado e:\n1. pausa o worker interno da fila async\n2. drena jobs pendentes em memoria e overflow\n3. marca backlog persistido em `Queued` como `Canceled`\n4. libera a fila para novos envios async\n\nUse este endpoint quando houver backlog preso, fila acumulada ou quando voce quiser abortar todos os envios assincronos ainda nao concluidos.\n","responses":{"200":{"description":"Fila async limpa com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Async queue cleared"},"instanceId":{"type":"string","description":"ID da instancia"},"stats":{"type":"object","properties":{"trackedJobsCleared":{"type":"integer","description":"Quantidade de IDs rastreados removidos da fila em memoria","example":3},"bufferedJobsMarkedCanceled":{"type":"integer","description":"Jobs em memoria marcados como `Canceled`","example":2},"drainedChannelJobs":{"type":"integer","description":"Jobs removidos do canal principal da fila","example":1},"clearedOverflowJobs":{"type":"integer","description":"Jobs removidos do backlog de overflow","example":1},"persistedQueuedCanceled":{"type":"integer","format":"int64","description":"Mensagens persistidas em `Queued` que foram atualizadas para `Canceled`","example":5}}}}}}}},"401":{"description":"Token invalido ou ausente"},"409":{"description":"A fila nao pode ser limpa porque a instancia esta em reset ou havia envio em progresso que nao drenou a tempo","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"async queue did not drain before reset"},"instanceId":{"type":"string"},"stats":{"type":"object","additionalProperties":true}}}}}},"500":{"description":"Erro interno ao limpar a fila async","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"instanceId":{"type":"string"},"stats":{"type":"object","additionalProperties":true}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":["instanceId"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","additionalProperties":true,"description":"Payload especifico da operacao, quando aplicavel."}}}}}},"operationId":"providerDeleteMessageAsync"}},"/provider/instance/updateDelaySettings":{"post":{"tags":["Mensagem Async"],"summary":"Configurar delay entre mensagens async","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nConfigura o intervalo de tempo entre mensagens diretas enviadas com `async=true`.\n\n### Detalhes\n- Configuracao aplicada apenas a fila interna de mensagens async\n- Afeta mensagens enviadas pelos endpoints de envio com `async=true`\n- Nao afeta campanhas do sender (`/sender/*`)\n- Delay minimo (msg_delay_min): 0 ou mais segundos (0 = sem delay)\n- Delay maximo (msg_delay_max): se menor que min, sera ajustado para o mesmo valor de min\n- Sistema ajusta automaticamente valores negativos para 0\n\n### Exemplo\n```json\n{\n  \"msg_delay_min\": 0,\n  \"msg_delay_max\": 2\n}\n```\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"msg_delay_min":{"type":"integer","format":"int64","minimum":0,"description":"Delay minimo em segundos (0 = sem delay)","example":0},"msg_delay_max":{"type":"integer","format":"int64","minimum":0,"description":"Delay maximo em segundos","example":2}},"required":["msg_delay_min","msg_delay_max"]}}}}}},"responses":{"200":{"description":"Sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"instance":{"$ref":"#/components/schemas/Instance"}}}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid request payload"}}}}}},"401":{"description":"Chave invalida ou expirada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to update delay settings"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostInstanceUpdateDelaySettings"}},"/provider/message/download":{"post":{"tags":["Acoes na mensagem e Buscar"],"summary":"Baixar arquivo de uma mensagem","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nBaixa o arquivo associado a uma mensagem de midia (imagem, video, audio, documento ou sticker).\n\n## Parametros\n\n- **id** (string, obrigatorio): ID da mensagem\n- **return_base64** (boolean, default: false): Retorna arquivo em base64\n- **generate_mp3** (boolean, default: true): Para audios, define formato de retorno\n  - `true`: Retorna MP3\n  - `false`: Retorna OGG\n- **return_link** (boolean, default: true): Retorna URL publica do arquivo\n- **transcribe** (boolean, default: false): Transcreve audios para texto\n- **openai_apikey** (string, opcional): Chave OpenAI para transcricao\n  - Se nao informada, usa a chave salva na instancia\n  - Se informada, atualiza e salva na instancia para proximas chamadas\n- **download_quoted** (boolean, default: false): Baixa midia da mensagem citada\n  - Util para baixar conteudo original de status do WhatsApp\n  - Quando uma mensagem e resposta a um status, permite baixar a midia do status original\n  - **Contextualizacao**: Ao baixar a midia citada, voce identifica o contexto da conversa\n    - Exemplo: Se alguem responde a uma promocao, baixando a midia voce sabera que a pergunta e sobre aquela promocao especifica\n\n## Exemplos\n\n### Baixar audio como MP3:\n```json\n{\n  \"id\": \"7EB0F01D7244B421048F0706368376E0\",\n  \"generate_mp3\": true\n}\n```\n\n### Transcrever audio:\n```json\n{\n  \"id\": \"7EB0F01D7244B421048F0706368376E0\",\n  \"transcribe\": true\n}\n```\n\n### Apenas base64 (sem salvar):\n```json\n{\n  \"id\": \"7EB0F01D7244B421048F0706368376E0\",\n  \"return_base64\": true,\n  \"return_link\": false\n}\n```\n\n### Baixar midia de status (mensagem citada):\n```json\n{\n  \"id\": \"7EB0F01D7244B421048F0706368376E0\",\n  \"download_quoted\": true\n}\n```\n*Util quando o cliente responde a uma promocao/status - voce baixa a midia original para entender sobre qual produto/oferta ele esta perguntando.*\n\n## Resposta\n\n```json\n{\n  \"fileURL\": \"https://api.exemplo.com/files/arquivo.mp3\",\n  \"mimetype\": \"audio/mpeg\",\n  \"base64Data\": \"UklGRkj...\",\n  \"transcription\": \"Texto transcrito\"\n}\n```\n\n**Nota**: \n- Por padrao, se nao definido o contrario:\n  1. audios sao retornados como MP3. \n  2. E todos os pedidos de download sao retornados com URL publica.\n- Transcricao requer chave OpenAI valida. A chave pode ser configurada uma vez na instancia e sera reutilizada automaticamente.\n- Retencao de midia: mantemos as midias no nosso storage por 2 dias. Apos 2 dias, elas sao removidas na limpeza automatica e o link retornado deixa de ficar disponivel. Para voltar a disponibilizar a midia, e necessario refazer o download pelo endpoint. Se o cliente solicitar novamente, a midia sera baixada do CDN da Meta, o que pode aumentar o tempo de resposta. Enquanto estiver no nosso storage, a resposta tende a ser mais rapida.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","description":"ID da mensagem contendo o arquivo","example":"7EB0F01D7244B421048F0706368376E0"},"return_base64":{"type":"boolean","description":"Se verdadeiro, retorna o conteudo em base64","default":false},"generate_mp3":{"type":"boolean","description":"Para audios, define formato de retorno (true=MP3, false=OGG)","default":true},"return_link":{"type":"boolean","description":"Salva e retorna URL publica do arquivo","default":true},"transcribe":{"type":"boolean","description":"Se verdadeiro, transcreve audios para texto","default":false},"openai_apikey":{"type":"string","description":"Chave da API OpenAI para transcricao (opcional)","example":"sk-..."},"download_quoted":{"type":"boolean","description":"Se verdadeiro, baixa midia da mensagem citada ao inves da mensagem principal","default":false}},"required":["id"]}}}}}},"responses":{"200":{"description":"Successful file download","content":{"application/json":{"schema":{"type":"object","properties":{"fileURL":{"type":"string","description":"URL publica para acessar o arquivo (se return_link=true)","example":"https://api.exemplo.com/files/arquivo.mp3"},"mimetype":{"type":"string","description":"Tipo MIME do arquivo","example":"audio/mpeg"},"base64Data":{"type":"string","description":"Conteudo do arquivo em base64 (se return_base64=true)","example":"UklGRkj..."},"transcription":{"type":"string","description":"Texto transcrito do audio (se transcribe=true)","example":"Texto transcrito"}},"required":["mimetype"]}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Unsupported media type or no media found in message"}}}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid token"}}}}}},"404":{"description":"Not Found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","examples":["Message not found","No quoted message found in this message"]}}}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to download media"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostMessageDownload"}},"/provider/message/find":{"post":{"tags":["Acoes na mensagem e Buscar"],"summary":"Buscar mensagens em um chat","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nBusca mensagens com multiplos filtros disponiveis. Este endpoint permite:\n\n1. **Busca por ID especifico**: Use `id` para encontrar uma mensagem exata\n2. **Filtrar por chat**: Use `chatid` para mensagens de uma conversa especifica\n3. **Filtrar por rastreamento**: Use `track_source` e `track_id` para mensagens com dados de tracking\n4. **Limitar resultados**: Use `limit` para controlar quantas mensagens retornar\n5. **Ordenacao**: Resultados ordenados por data (mais recentes primeiro)\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","description":"ID especifico da mensagem para busca exata","example":"user123:r3EB0538"},"chatid":{"type":"string","description":"ID do chat no formato internacional","example":"5511999999999@s.whatsapp.net"},"track_source":{"type":"string","description":"Origem do rastreamento para filtrar mensagens","example":"chatwoot"},"track_id":{"type":"string","description":"ID de rastreamento para filtrar mensagens","example":"msg_123456789"},"limit":{"type":"integer","description":"Numero maximo de mensagens a retornar (padrao 100)","minimum":1,"default":100,"example":20},"offset":{"type":"integer","description":"Deslocamento para paginacao (0 retorna as mensagens mais recentes)","default":0}}}}}}}},"responses":{"200":{"description":"Lista de mensagens encontradas com metadados de paginacao","content":{"application/json":{"schema":{"type":"object","properties":{"returnedMessages":{"type":"integer","description":"Quantidade de mensagens retornadas nesta pagina"},"messages":{"type":"array","items":{"$ref":"#/components/schemas/Message"}},"limit":{"type":"integer","description":"Limite aplicado na busca"},"offset":{"type":"integer","description":"Offset usado para recuperar os resultados"},"nextOffset":{"type":"integer","description":"Offset sugerido para a proxima pagina"},"hasMore":{"type":"boolean","description":"Indica se existem mais mensagens apos esta pagina"}}}}}},"400":{"description":"Parametros invalidos"},"401":{"description":"Chave invalida ou expirada"},"404":{"description":"Chat nao encontrado"},"500":{"description":"Erro interno do servidor"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostMessageFind"}},"/provider/message/history-sync":{"post":{"tags":["Acoes na mensagem e Buscar"],"summary":"Solicitar historico sob demanda de um chat","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nSolicita ao WhatsApp um sync sob demanda de mensagens antigas de um chat\nou tenta recuperar uma mensagem exata ja conhecida localmente.\n\nModos suportados:\n- `history` (padrao): busca historico para tras a partir de uma mensagem ancora\n- `exact`: tenta recarregar a mensagem exata informada em `messageid`\n\nRegras:\n- envie `number`\n- `mode` e opcional; quando omitido, assume `history`\n- em `mode=history`, `count` e opcional e limitado a 100\n- em `mode=history`, `messageid` e opcional; quando informado, a API usa essa mensagem como referencia para buscar mensagens mais antigas do chat\n- em `mode=exact`, `messageid` e obrigatorio e `count` nao e necessario\n\nObservacao:\n- **Importante:** a recuperacao pode so acontecer depois de abrir o WhatsApp no celular ou deixa-lo ativo em segundo plano\n- em `mode=history`, `messageid` define a mensagem de referencia para carregar historico anterior\n- em `mode=history`, esse campo nao serve para buscar essa mensagem especifica\n- em `mode=history`, o historico e buscado para tras a partir da mensagem de referencia informada\n- se voce quiser recuperar apenas uma mensagem especifica `X` via historico, informe como `messageid` a mensagem logo depois de `X` e use `count=1`\n- se `messageid` nao for informado em `mode=history`, a API usa a mensagem mais antiga conhecida localmente desse chat como referencia para buscar historico anterior\n- em `mode=exact`, a API tenta um rerequest da mensagem exata informada em `messageid`\n- **`mode=exact` esta em teste** e funciona melhor quando a mensagem ja existe no historico local da instancia\n- as mensagens retornam depois via webhook/SSE em eventos do tipo `history` e tambem ficam disponiveis em `/message/find`\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["number"],"properties":{"mode":{"type":"string","enum":["history","exact"],"default":"history","description":"Define o comportamento da operacao.\n- `history`: busca mensagens mais antigas a partir de uma ancora\n- `exact`: tenta recuperar a mensagem exata informada em `messageid`\n","example":"history"},"messageid":{"type":"string","description":"Em `mode=history`, ID da mensagem de referencia usada para buscar mensagens mais antigas do chat.\nEm `mode=exact`, ID exato da mensagem que deve ser recarregada.\n","example":"3EB01234567890ABCDEF"},"number":{"type":"string","description":"JID completo do chat. Mantido obrigatorio em todos os modos para simplificar o contrato publico e restringir a busca ao chat esperado.","example":"5511999999999@s.whatsapp.net"},"count":{"type":"integer","minimum":1,"maximum":100,"description":"Quantidade desejada de mensagens no sync em `mode=history`. Em `mode=exact`, este campo e ignorado.","example":20}}}}}}}},"responses":{"200":{"description":"Solicitacao enviada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"mode":{"type":"string","example":"history"},"message":{"type":"string","example":"History sync request sent. Messages will be received as history sync events."},"details":{"type":"object","additionalProperties":true,"description":"Metadados adicionais da operacao"}}},"examples":{"async_padrão":{"summary":"Solicitacao de historico enviada","value":{"success":true,"mode":"history","message":"History sync request sent. Messages will be received as history sync events."}},"exact_padrão":{"summary":"Solicitacao de mensagem exata enviada","value":{"success":true,"mode":"exact","message":"Exact message reload request sent. The message will be received if available."}}}}}},"400":{"description":"Payload invalido, modo invalido ou ancora insuficiente","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"number is required"}}}}}},"404":{"description":"Mensagem exata nao encontrada no historico local","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"messageid not found in local history for chat; use mode=history to fetch older messages first"}}}}}},"500":{"description":"Erro interno ao solicitar o history sync ou o rerequest exato","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to request history: connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostMessageHistorySync"}},"/provider/message/markread":{"post":{"tags":["Acoes na mensagem e Buscar"],"summary":"Marcar mensagens como lidas","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nMarca uma ou mais mensagens como lidas. Este endpoint permite:\n1. Marcar multiplas mensagens como lidas de uma vez\n2. Atualizar o status de leitura no WhatsApp\n3. Sincronizar o status de leitura entre dispositivos\n\nExemplo de requisicao basica:\n```json\n{\n  \"id\": [\n    \"62AD1AD844E518180227BF68DA7ED710\",\n    \"ECB9DE48EB41F77BFA8491BFA8D6EF9B\"  \n  ]\n}\n```\n\nExemplo de resposta:\n```json\n{\n  \"success\": true,\n  \"message\": \"Messages marked as read\",\n  \"markedMessages\": [\n    {\n      \"id\": \"62AD1AD844E518180227BF68DA7ED710\",\n      \"timestamp\": 1672531200000\n    },\n    {\n      \"id\": \"ECB9DE48EB41F77BFA8491BFA8D6EF9B\",\n      \"timestamp\": 1672531300000\n    }\n  ]\n}\n```\n\nParametros disponiveis:\n- id: Lista de IDs das mensagens a serem marcadas como lidas\n\nErros comuns:\n- 401: Chave invalida ou expirada\n- 400: Lista de IDs vazia ou invalida\n- 404: Uma ou mais mensagens nao encontradas\n- 500: Erro ao marcar mensagens como lidas\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"array","description":"Lista de IDs das mensagens a serem marcadas como lidas","items":{"type":"string"},"example":["62AD1AD844E518180227BF68DA7ED710","ECB9DE48EB41F77BFA8491BFA8D6EF9B"]}},"required":["id"]}}}}}},"responses":{"200":{"description":"Messages successfully marked as read","content":{"application/json":{"schema":{"type":"object","properties":{"results":{"type":"array","items":{"type":"object","properties":{"message_id":{"type":"string","description":"ID of the message that was processed"},"status":{"type":"string","enum":["success","error"],"description":"Status of the mark as read operation"},"error":{"type":"string","description":"Error message if status is error"}}},"example":[{"message_id":"62AD1AD844E518180227BF68DA7ED710","status":"success"},{"message_id":"ECB9DE48EB41F77BFA8491BFA8D6EF9B","status":"error","error":"Message not found"}]}}}}}},"400":{"description":"Invalid request payload or missing required fields","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Missing Id in Payload"}}}}}},"401":{"description":"Unauthorized - invalid or missing token"},"500":{"description":"Server error while processing the request"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostMessageMarkread"}},"/provider/message/react":{"post":{"tags":["Acoes na mensagem e Buscar"],"summary":"Enviar reacao a uma mensagem","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nEnvia uma reacao (emoji) a uma mensagem especifica. Este endpoint permite:\n\n1. Adicionar ou remover reacoes em mensagens\n\n2. Usar qualquer emoji Unicode valido\n\n3. Reagir a mensagens em chats individuais ou grupos\n\n4. Remover reacoes existentes\n\n5. Verificar o status da reacao enviada\n\n\nTipos de reacoes suportados:\n\n- Qualquer emoji Unicode valido (, , , etc)\n\n- String vazia para remover reacao\n\n\nExemplo de requisicao basica:\n\n```json\n\n{\n  \"number\": \"5511999999999@s.whatsapp.net\",\n  \"text\": \"\",\n  \"id\": \"3EB0538DA65A59F6D8A251\"\n}\n\n```\n\n\nExemplo de requisicao para remover reacao:\n\n```json\n\n{\n  \"number\": \"5511999999999@s.whatsapp.net\",\n  \"text\": \"\",\n  \"id\": \"3EB0538DA65A59F6D8A251\"\n}\n\n```\n\n\nExemplo de resposta:\n\n```json\n\n{\n  \"success\": true,\n  \"message\": \"Reaction sent\",\n  \"reaction\": {\n    \"id\": \"3EB0538DA65A59F6D8A251\",\n    \"emoji\": \"\",\n    \"timestamp\": 1672531200000,\n    \"status\": \"sent\"\n  }\n}\n\n```\n\n\nExemplo de resposta ao remover reacao:\n\n```json\n\n{\n  \"success\": true,\n  \"message\": \"Reaction removed\",\n  \"reaction\": {\n    \"id\": \"3EB0538DA65A59F6D8A251\",\n    \"emoji\": null,\n    \"timestamp\": 1672531200000,\n    \"status\": \"removed\"\n  }\n}\n\n```\n\n\nParametros disponiveis:\n\n- number: Numero do chat no formato internacional (ex:\n5511999999999@s.whatsapp.net)\n\n- text: Emoji Unicode da reacao (ou string vazia para remover reacao)\n\n- id: ID da mensagem que recebera a reacao\n\n\nErros comuns:\n\n- 401: Chave invalida ou expirada\n\n- 400: Numero invalido ou emoji nao suportado\n\n- 404: Mensagem nao encontrada\n\n- 500: Erro ao enviar reacao\n\n\nLimitacoes:\n\n- So e possivel reagir a mensagens enviadas por outros usuarios\n\n- Nao e possivel reagir a mensagens antigas (mais de 7 dias)\n\n- O mesmo usuario so pode ter uma reacao ativa por mensagem\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"Numero do chat no formato internacional","example":"5511999999999@s.whatsapp.net"},"text":{"type":"string","description":"Emoji Unicode da reacao (ou string vazia para remover reacao)","example":""},"id":{"type":"string","description":"ID da mensagem que recebera a reacao","example":"3EB0538DA65A59F6D8A251"}},"required":["number","text","id"]}}}}}},"responses":{"200":{"description":"Reacao enviada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"ID unico da mensagem de reacao","example":"owner:generated_message_id"},"messageid":{"type":"string","description":"ID gerado para a mensagem de reacao","example":"generated_message_id"},"content":{"type":"object","description":"Detalhes da reacao"},"messageTimestamp":{"type":"number","description":"Timestamp da mensagem em milissegundos","example":1672531200000},"messageType":{"type":"string","description":"Tipo da mensagem","example":"reaction"},"status":{"type":"string","description":"Status atual da mensagem","example":"Pending"},"owner":{"type":"string","description":"Proprietario da instancia","example":"instance_owner"}}}}}},"400":{"description":"Erro nos dados da requisicao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Missing Id in Payload"}}}}}},"401":{"description":"Nao autorizado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"No session"}}}}}},"404":{"description":"Mensagem nao encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Message not found"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Error sending message"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostMessageReact"}},"/provider/message/delete":{"post":{"tags":["Acoes na mensagem e Buscar"],"summary":"Apagar Mensagem Para Todos","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nApaga uma mensagem para todos os participantes da conversa.\n\n### Funcionalidades:\n- Apaga mensagens em conversas individuais ou grupos\n- Funciona com mensagens enviadas pelo usuario ou recebidas\n- Atualiza o status no banco de dados\n- Envia webhook de atualizacao\n\n**Notas Tecnicas**:\n1. O ID da mensagem pode ser fornecido em dois formatos:\n   - ID completo (contem \":\"): usado diretamente\n   - ID curto: concatenado com o owner para busca\n2. Gera evento webhook do tipo \"messages_update\"\n3. Atualiza o status da mensagem para \"Deleted\"\n4. Para newsletters/canais, use `POST /newsletter/messages/delete`\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","description":"ID da mensagem a ser apagada"}},"required":["id"]}}}}}},"responses":{"200":{"description":"Mensagem apagada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"timestamp":{"type":"string","format":"date-time"},"id":{"type":"string"}}}}}},"400":{"description":"Payload invalido ou ID de chat/sender invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid payload"}}}}}},"401":{"description":"Token nao fornecido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Unauthorized"}}}}}},"404":{"description":"Mensagem nao encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"message not found"}}}}}},"500":{"description":"Erro interno do servidor ou sessao nao iniciada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"No session"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostMessageDelete"}},"/provider/message/edit":{"post":{"tags":["Acoes na mensagem e Buscar"],"summary":"Edita uma mensagem enviada","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nEdita o conteudo de uma mensagem ja enviada usando a funcionalidade nativa do WhatsApp.\n\nO endpoint realiza:\n- Busca a mensagem original no banco de dados usando o ID fornecido\n- Edita o conteudo da mensagem para o novo texto no WhatsApp\n- Gera um novo ID para a mensagem editada\n- Retorna objeto de mensagem completo seguindo o padrao da API\n- Dispara eventos SSE/Webhook automaticamente\n\n**Importante**: \n- So e possivel editar mensagens enviadas pela propria instancia\n- A mensagem deve existir no banco de dados\n- O ID pode ser fornecido no formato completo (owner:messageid) ou apenas messageid\n- A mensagem deve estar dentro do prazo permitido pelo WhatsApp para edicao\n- Para newsletters/canais, use `POST /newsletter/messages/edit`\n","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["id","text"],"properties":{"id":{"type":"string","description":"ID unico da mensagem que sera editada (formato owner:messageid ou apenas messageid)","example":"3A12345678901234567890123456789012"},"text":{"type":"string","description":"Novo conteudo de texto da mensagem","example":"Texto editado da mensagem"}}}}}}}},"responses":{"200":{"description":"Mensagem editada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"ID unico da mensagem no formato owner:messageid","example":"5511999999999:3A12345678901234567890123456789012"},"messageid":{"type":"string","description":"ID da mensagem no WhatsApp","example":"3A12345678901234567890123456789012"},"content":{"type":"string","description":"Conteudo da mensagem editada","example":"Texto editado da mensagem"},"messageTimestamp":{"type":"integer","description":"Timestamp da mensagem (Unix timestamp em milissegundos)","example":1704067200000},"messageType":{"type":"string","description":"Tipo da mensagem","example":"text"},"status":{"type":"string","description":"Status da mensagem","example":"Pending"},"owner":{"type":"string","description":"Proprietario da instancia","example":"5511999999999"}}}}}},"400":{"description":"Dados invalidos na requisicao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid payload"}}}}}},"401":{"description":"Sem sessao ativa","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"No session"}}}}}},"404":{"description":"Mensagem nao encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Message not found"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Error fetching message from database"}}}}}}},"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostMessageEdit"}},"/provider/message/pin":{"post":{"tags":["Acoes na mensagem e Buscar"],"summary":"Fixa ou desafixa uma mensagem","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nFixa ou desafixa uma mensagem especifica usando a funcionalidade nativa do WhatsApp.\n\nO endpoint realiza:\n- Busca a mensagem original no banco de dados usando o ID fornecido\n- Envia a acao de fixar ou desafixar a mensagem no WhatsApp\n- Funciona em conversas individuais e grupos\n- Gera um novo ID para o evento de pin/unpin\n- Retorna objeto de mensagem completo seguindo o padrao da API\n- Dispara eventos SSE/Webhook automaticamente\n\n**Importante**:\n- O ID pode ser fornecido no formato completo (`owner:messageid`) ou apenas `messageid`\n- Em conversas `1:1`, a acao e suportada normalmente\n- Em grupos, a permissao depende da configuracao do WhatsApp do grupo (`apenas admins` ou `qualquer membro`)\n- O backend nao valida localmente se a instancia e admin do grupo; a decisao final e do WhatsApp\n- Newsletters/canais nao sao suportados neste endpoint\n- Se `pin` nao for enviado, o valor padrao e `true`\n- Ao fixar mensagem, `duration` aceita dias (`1`, `7` ou `30`)\n- Se `duration` nao for enviado ou vier com qualquer outro valor, o backend usa `30` dias\n- Ao desafixar (`pin: false`), `duration` e ignorado\n","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"ID unico da mensagem alvo (formato `owner:messageid` ou apenas `messageid`)","example":"3A12345678901234567890123456789012"},"pin":{"type":"boolean","default":true,"description":"Define se a mensagem deve ser fixada (`true`) ou desafixada (`false`)","example":true},"duration":{"type":"integer","default":30,"description":"Duracao do pin em dias. Valores aceitos: `1`, `7` ou `30`. Qualquer outro valor cai para `30`.","example":7}}}}}}}},"responses":{"200":{"description":"Acao de fixar/desafixar mensagem enviada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"ID unico da mensagem gerada para o evento de pin/unpin","example":"5511999999999:3A12345678901234567890123456789012"},"messageid":{"type":"string","description":"ID da mensagem do evento no WhatsApp","example":"3A12345678901234567890123456789012"},"chatid":{"type":"string","description":"Chat onde a acao ocorreu","example":"120363123456789012@g.us"},"sender":{"type":"string","description":"JID do remetente da acao","example":"5511999999999@s.whatsapp.net"},"senderName":{"type":"string","description":"Nome do perfil da instancia","example":"Minha Instancia"},"isGroup":{"type":"boolean","description":"Indica se o chat e um grupo","example":true},"fromMe":{"type":"boolean","description":"Indica se a acao foi enviada pela propria instancia","example":true},"content":{"type":"object","description":"Payload interno de `PinInChatMessage`"},"messageType":{"type":"string","description":"Tipo da mensagem retornada","example":"PinInChatMessage"},"source":{"type":"string","description":"Origem estimada da mensagem","example":"web"},"messageTimestamp":{"type":"integer","description":"Timestamp da mensagem em milissegundos","example":1704067200000},"status":{"type":"string","description":"Status atual da acao","example":"Pending"},"text":{"type":"string","description":"Texto amigavel derivado da acao","example":"Mensagem fixada"},"quoted":{"type":"string","description":"ID da mensagem citada, quando aplicavel","example":""},"edited":{"type":"string","description":"ID da mensagem editada, quando aplicavel","example":""},"reaction":{"type":"string","description":"Emoji de reacao, quando aplicavel","example":""},"convertOptions":{"type":"string","description":"Opcoes convertidas para mensagens interativas, quando aplicavel","example":""},"owner":{"type":"string","description":"Proprietario da instancia","example":"5511999999999"},"targetMessageID":{"type":"string","description":"ID da mensagem alvo que foi fixada ou desafixada","example":"3EB0538DA65A59F6D8A251"},"pinned":{"type":"boolean","description":"Estado final solicitado para a mensagem alvo","example":true}}}}}},"400":{"description":"Dados invalidos na requisicao ou operacao nao suportada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"message pinning is not supported for newsletters"}}}}}},"401":{"description":"Sem sessao ativa ou token invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"No session"}}}}}},"404":{"description":"Mensagem nao encontrada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Message not found"}}}}}},"500":{"description":"Erro interno do servidor ou erro retornado pelo WhatsApp","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"error pinning message: ..."}}}}}}},"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostMessagePin"}},"/provider/group/create":{"post":{"tags":["Grupos e Comunidades"],"summary":"Criar um novo grupo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nCria um novo grupo no WhatsApp com participantes iniciais.\n\n### Detalhes\n- Requer autenticacao via instanceId da ConnectyHub\n- Os numeros devem ser fornecidos sem formatacao (apenas digitos)\n\n### Limitacoes\n- Minimo de 1 participante alem do criador\n  \n### Comportamento\n- Retorna informacoes detalhadas do grupo criado\n- Inclui lista de participantes adicionados com sucesso/falha\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"name":{"type":"string","description":"Nome do grupo","minLength":1,"maxLength":100,"example":"ConnectyHub grupo"},"participants":{"type":"array","description":"Lista de numeros de telefone dos participantes iniciais","items":{"type":"string","description":"Numero de telefone sem formatacao"},"minItems":1,"maxItems":50,"example":["5521987905995","5511912345678"]}},"required":["name","participants"]}}}}}},"responses":{"200":{"description":"Grupo criado com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}}},"400":{"description":"Erro de payload invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Could not parse phone"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to create group"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostGroupCreate"}},"/provider/group/info":{"post":{"tags":["Grupos e Comunidades"],"summary":"Obter informacoes detalhadas de um grupo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nRecupera informacoes completas de um grupo do WhatsApp, incluindo:\n- Detalhes do grupo\n- Participantes\n- Configuracoes\n- Link de convite (opcional)\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"groupjid":{"type":"string","description":"Identificador unico do grupo (JID)","example":"120363153742561022@g.us"},"getInviteLink":{"type":"boolean","description":"Recuperar link de convite do grupo","default":false,"example":true},"getRequestsParticipants":{"type":"boolean","description":"Recuperar lista de solicitacoes pendentes de participacao","default":false,"example":false},"force":{"type":"boolean","description":"Forcar atualizacao, ignorando cache","default":false,"example":false}},"required":["groupjid"]}}}}}},"responses":{"200":{"description":"Informacoes do grupo obtidas com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"},"example":{"JID":"120363153742561022@g.us","Name":"ConnectyHub Community","Participants":[{"JID":"5521987654321@s.whatsapp.net","IsAdmin":true}],"IsLocked":false,"IsAnnounce":false}}}},"400":{"description":"Codigo de convite invalido ou mal formatado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid invite code"}}}}}},"404":{"description":"Grupo nao encontrado ou link de convite expirado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Group invite link is invalid or has expired"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to retrieve group information"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostGroupInfo"}},"/provider/group/inviteInfo":{"post":{"tags":["Grupos e Comunidades"],"summary":"Obter informacoes de um grupo pelo codigo de convite","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nRetorna informacoes detalhadas de um grupo usando um codigo de convite ou URL completo do WhatsApp.\n\nEsta rota permite:\n- Recuperar informacoes basicas sobre um grupo antes de entrar\n- Validar um link de convite\n- Obter detalhes como nome do grupo, numero de participantes e restricoes de entrada\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"invitecode":{"type":"string","description":"Codigo de convite ou URL completo do grupo.\nPode ser um codigo curto ou a URL completa do WhatsApp.\n","examples":["IYnl5Zg9bUcJD32rJrDzO7","https://chat.whatsapp.com/IYnl5Zg9bUcJD32rJrDzO7"]}},"required":["invitecode"]}}}}}},"responses":{"200":{"description":"Informacoes do grupo obtidas com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"},"example":{"JID":"120363153742561022@g.us","Name":"ConnectyHub Community","Participants":[{"JID":"5521987654321@s.whatsapp.net","IsAdmin":true}],"IsLocked":false,"IsAnnounce":false}}}},"400":{"description":"Codigo de convite invalido ou mal formatado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid invite code"}}}}}},"404":{"description":"Grupo nao encontrado ou link de convite expirado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Group invite link is invalid or has expired"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to retrieve group information"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostGroupInviteInfo"}},"/provider/group/join":{"post":{"tags":["Grupos e Comunidades"],"summary":"Entrar em um grupo usando codigo de convite","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nPermite entrar em um grupo do WhatsApp usando um codigo de convite ou URL completo. \n\nCaracteristicas:\n- Suporta codigo de convite ou URL completo\n- Valida o codigo antes de tentar entrar no grupo\n- Retorna informacoes basicas do grupo apos entrada bem-sucedida\n- Trata possiveis erros como convite invalido ou expirado\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["invitecode"],"properties":{"invitecode":{"type":"string","description":"Codigo de convite ou URL completo do grupo. \nFormatos aceitos:\n- Codigo completo: \"IYnl5Zg9bUcJD32rJrDzO7\"\n- URL completa: \"https://chat.whatsapp.com/IYnl5Zg9bUcJD32rJrDzO7\"\n","example":"https://chat.whatsapp.com/IYnl5Zg9bUcJD32rJrDzO7","minLength":10,"maxLength":50}}}}}}}},"responses":{"200":{"description":"Entrada no grupo realizada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Group join successful"},"group":{"$ref":"#/components/schemas/Group"},"needs_refresh":{"type":"boolean","description":"Indica se o grupo precisa ser atualizado no cache local","example":false}}}}}},"400":{"description":"Codigo de convite invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid invite code"}}}}}},"403":{"description":"Usuario ja esta no grupo ou nao tem permissao para entrar","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Unable to join group"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Error processing group invite"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostGroupJoin"}},"/provider/group/leave":{"post":{"tags":["Grupos e Comunidades"],"summary":"Sair de um grupo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nRemove o usuario atual de um grupo especifico do WhatsApp.\n\nRequisitos:\n- O usuario deve estar conectado a uma instancia valida\n- O usuario deve ser um membro do grupo\n\nComportamentos:\n- Se o usuario for o ultimo administrador, o grupo sera dissolvido\n- Se o usuario for um membro comum, sera removido do grupo\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"groupjid":{"type":"string","description":"Identificador unico do grupo (JID)\n- Formato: numero@g.us\n- Exemplo valido: 120363324255083289@g.us\n","example":"120363324255083289@g.us","pattern":"^\\d+@g\\.us$"}},"required":["groupjid"]}}}}}},"responses":{"200":{"description":"Saida do grupo realizada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Group leave successful"}}}}}},"400":{"description":"Erro de payload invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid payload"}}}}}},"500":{"description":"Erro interno do servidor ou falha na conexao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"error leaving group"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostGroupLeave"}},"/provider/group/list":{"get":{"tags":["Grupos e Comunidades"],"summary":"Listar todos os grupos","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nRetorna uma lista com todos os grupos disponiveis para a conta do WhatsApp atualmente conectada.\n\nRecursos adicionais:\n- Suporta atualizacao forcada do cache de grupos\n- Recupera informacoes detalhadas de grupos conectados\n","parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"},{"name":"force","in":"query","schema":{"type":"boolean","default":false},"description":"Se definido como `true`, forca a atualizacao do cache de grupos.\nUtil para garantir que as informacoes mais recentes sejam recuperadas.\n\nComportamentos:\n- `false` (padrao): Usa informacoes em cache\n- `true`: Busca dados atualizados diretamente do WhatsApp\n"},{"name":"noparticipants","in":"query","schema":{"type":"boolean","default":false},"description":"Se definido como `true`, retorna a lista de grupos sem incluir os participantes.\nUtil para otimizar a resposta quando nao ha necessidade dos dados dos participantes.\n\nComportamentos:\n- `false` (padrao): Retorna grupos com lista completa de participantes\n- `true`: Retorna grupos sem incluir os participantes\n"}],"responses":{"200":{"description":"Lista de grupos recuperada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/components/schemas/Group"},"description":"Lista detalhada de grupos"}}}}}},"500":{"description":"Erro interno do servidor ao recuperar grupos","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem detalhando o erro encontrado"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"operationId":"providerGetGroupList"},"post":{"tags":["Grupos e Comunidades"],"summary":"Listar todos os grupos com filtros e paginacao","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nRetorna uma lista com todos os grupos disponiveis para a conta do WhatsApp atualmente conectada, com opcoes de filtros e paginacao via corpo (POST).\nA rota GET continua para quem prefere a listagem direta sem paginacao.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"limit":{"type":"integer","description":"Quantidade maxima de resultados por pagina (padrao 50, maximo 1000)","default":50},"offset":{"type":"integer","description":"Deslocamento base zero","default":0},"search":{"type":"string","description":"Texto para filtrar grupos por nome/JID"},"force":{"type":"boolean","default":false,"description":"Se definido como `true`, forca a atualizacao do cache de grupos.\nUtil para garantir que as informacoes mais recentes sejam recuperadas.\n"},"noParticipants":{"type":"boolean","default":false,"description":"Se definido como `true`, retorna a lista de grupos sem incluir os participantes.\nUtil para otimizar a resposta quando nao ha necessidade dos dados dos participantes.\n"}}}}}}}},"responses":{"200":{"description":"Lista de grupos recuperada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"groups":{"type":"array","items":{"$ref":"#/components/schemas/Group"},"description":"Lista detalhada de grupos"},"pagination":{"type":"object","properties":{"totalRecords":{"type":"integer","description":"Total de grupos encontrados"},"limit":{"type":"integer","description":"Limite aplicado na pagina atual"},"offset":{"type":"integer","description":"Offset efetivamente usado na pagina atual"}}}}}}}},"500":{"description":"Erro interno do servidor ao recuperar grupos","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem detalhando o erro encontrado"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostGroupList"}},"/provider/group/resetInviteCode":{"post":{"tags":["Grupos e Comunidades"],"summary":"Resetar codigo de convite do grupo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nGera um novo codigo de convite para o grupo, invalidando o codigo de convite anterior. \nSomente administradores do grupo podem realizar esta acao.\n\nPrincipais caracteristicas:\n- Invalida o link de convite antigo\n- Cria um novo link unico\n- Retorna as informacoes atualizadas do grupo\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"groupjid":{"type":"string","description":"Identificador unico do grupo (JID)","example":"120363308883996631@g.us"}},"required":["groupjid"]}}}}}},"responses":{"200":{"description":"Codigo de convite resetado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"InviteLink":{"type":"string","description":"Novo link de convite gerado","example":"https://chat.whatsapp.com/AbCdEfGhIjKlMnOpQrStUv"},"group":{"$ref":"#/components/schemas/Group"},"needs_refresh":{"type":"boolean","description":"Indica se o grupo precisa ser atualizado no cache local","example":false}}}}}},"400":{"description":"Erro de validacao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Could not parse Group JID"}}}}}},"403":{"description":"Usuario sem permissao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"User is not an admin of this group"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to reset group invite link"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostGroupResetInviteCode"}},"/provider/group/updateAnnounce":{"post":{"tags":["Grupos e Comunidades"],"summary":"Configurar permissoes de envio de mensagens no grupo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nDefine as permissoes de envio de mensagens no grupo, permitindo restringir o envio apenas para administradores.\n\nQuando ativado (announce=true):\n- Apenas administradores podem enviar mensagens\n- Outros participantes podem apenas ler\n- Util para anuncios importantes ou controle de spam\n\nQuando desativado (announce=false):\n- Todos os participantes podem enviar mensagens\n- Configuracao padrao para grupos normais\n\nRequer que o usuario seja administrador do grupo para fazer alteracoes.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"groupjid":{"type":"string","description":"Identificador unico do grupo no formato xxxx@g.us","example":"120363339858396166@g.us"},"announce":{"type":"boolean","description":"Controla quem pode enviar mensagens no grupo","example":true}},"required":["groupjid","announce"]}}}}}},"responses":{"200":{"description":"Configuracao atualizada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Group announce enabled successfully"},"group":{"$ref":"#/components/schemas/Group"},"needs_refresh":{"type":"boolean","description":"Indica se o grupo precisa ser atualizado no cache local","example":false}}}}}},"401":{"description":"Token de autenticacao ausente ou invalido"},"403":{"description":"Usuario nao e administrador do grupo"},"404":{"description":"Grupo nao encontrado"},"500":{"description":"Erro interno do servidor ou falha na API do WhatsApp"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostGroupUpdateAnnounce"}},"/provider/group/updateJoinApproval":{"post":{"tags":["Grupos e Comunidades"],"summary":"Configurar aprovacao para entrada no grupo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nDefine se novos participantes precisam ser aprovados antes de entrar no grupo.\nNo objeto retornado em `group` e tambem em `/group/info`, esse estado aparece no campo `IsJoinApprovalRequired`.\n\nQuando ativado (`IsJoinApprovalRequired=true`):\n- Novas entradas passam por aprovacao de administrador\n- Solicitacoes pendentes podem ser listadas em `/group/info`\n\nQuando desativado (`IsJoinApprovalRequired=false`):\n- Entradas por link/convite nao exigem aprovacao adicional\n\nRequer que o usuario seja administrador do grupo.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"groupjid":{"type":"string","description":"Identificador unico do grupo no formato xxxx@g.us","example":"120363339858396166@g.us"},"IsJoinApprovalRequired":{"type":"boolean","description":"Define se a entrada no grupo exige aprovacao; reflete no campo `IsJoinApprovalRequired`","example":true}},"required":["groupjid","IsJoinApprovalRequired"]}}}}}},"responses":{"200":{"description":"Configuracao atualizada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Group join approval enabled successfully"},"group":{"$ref":"#/components/schemas/Group"},"needs_refresh":{"type":"boolean","description":"Indica se o grupo precisa ser atualizado no cache local","example":false}}},"examples":{"success":{"summary":"Aprovacao de entrada ativada","value":{"response":"Group join approval enabled successfully","group":{"JID":"120363339858396166@g.us","IsJoinApprovalRequired":true},"needs_refresh":false}}}}}},"400":{"description":"Payload invalido ou campo IsJoinApprovalRequired ausente/invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"IsJoinApprovalRequired is required"}}}}}},"401":{"description":"Token de autenticacao ausente ou invalido"},"403":{"description":"Usuario nao e administrador do grupo"},"404":{"description":"Grupo nao encontrado"},"500":{"description":"Erro interno do servidor ou falha na API do WhatsApp"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostGroupUpdateJoinApproval"}},"/provider/group/updateMemberAddMode":{"post":{"tags":["Grupos e Comunidades"],"summary":"Configurar quem pode adicionar novos membros ao grupo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nDefine quem tem permissao para adicionar novos participantes diretamente ao grupo.\nNo objeto retornado em `group` e tambem em `/group/info`, esse estado aparece no campo `MemberAddMode`.\n\nValores aceitos em `MemberAddMode`:\n- `admin_add`: apenas administradores podem adicionar membros\n- `all_member_add`: qualquer participante pode adicionar membros\n\nRequer que o usuario seja administrador do grupo.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"groupjid":{"type":"string","description":"Identificador unico do grupo no formato xxxx@g.us","example":"120363339858396166@g.us"},"MemberAddMode":{"type":"string","enum":["admin_add","all_member_add"],"description":"Define quem pode adicionar novos membros ao grupo; reflete no campo `MemberAddMode`","example":"admin_add"}},"required":["groupjid","MemberAddMode"]}}}}}},"responses":{"200":{"description":"Configuracao atualizada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Group member add mode set to admin_add successfully"},"group":{"$ref":"#/components/schemas/Group"},"needs_refresh":{"type":"boolean","description":"Indica se o grupo precisa ser atualizado no cache local","example":false}}},"examples":{"success":{"summary":"Apenas admins podem adicionar membros","value":{"response":"Group member add mode set to admin_add successfully","group":{"JID":"120363339858396166@g.us","MemberAddMode":"admin_add"},"needs_refresh":false}}}}}},"400":{"description":"Valor invalido para MemberAddMode"},"403":{"description":"Usuario nao e administrador do grupo"},"404":{"description":"Grupo nao encontrado"},"500":{"description":"Erro interno do servidor ou falha na API do WhatsApp"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostGroupUpdateMemberAddMode"}},"/provider/group/updateDescription":{"post":{"tags":["Grupos e Comunidades"],"summary":"Atualizar descricao do grupo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAltera a descricao (topico) do grupo WhatsApp especificado.\nRequer que o usuario seja administrador do grupo.\nA descricao aparece na tela de informacoes do grupo e pode ser visualizada por todos os participantes.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["groupjid","description"],"properties":{"groupjid":{"type":"string","description":"JID (ID) do grupo no formato xxxxx@g.us","example":"120363339858396166@g.us","pattern":"^[0-9]+@g\\.us$"},"description":{"type":"string","description":"Nova descricao/topico do grupo","example":"Grupo oficial de suporte","maxLength":512}}}}}}}},"responses":{"200":{"description":"Descricao atualizada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Group description updated successfully"},"group":{"$ref":"#/components/schemas/Group"},"needs_refresh":{"type":"boolean","description":"Indica se o grupo precisa ser atualizado no cache local","example":false}}}}}},"401":{"description":"Token invalido ou ausente"},"403":{"description":"Usuario nao e administrador do grupo"},"404":{"description":"Grupo nao encontrado"},"413":{"description":"Descricao excede o limite maximo permitido"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostGroupUpdateDescription"}},"/provider/group/ephemeral":{"post":{"summary":"Configurar mensagens temporarias em grupo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nDefine o temporizador de mensagens temporarias (disappearing messages) de um grupo.\n\nValores aceitos para a duracao:\n- `0` ou `off` para desativar\n- `1d`\n- `7d`\n- `90d`\n\nObservacoes:\n- este endpoint e apenas para grupos\n- requer privilegios de administrador do grupo\n- se o identificador informado nao for de grupo, a API retorna erro orientando usar `/chat/ephemeral`\n- apos sucesso, a resposta devolve o chat atualizado e o snapshot mais recente do grupo no cache local\n","tags":["Grupos e Comunidades"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["groupjid","duration"],"properties":{"groupjid":{"type":"string","description":"JID do grupo no formato xxxxx@g.us","example":"120363339858396166@g.us"},"duration":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Duracao desejada para mensagens temporarias","example":"1d"}}}}}}}},"responses":{"200":{"description":"Temporizador atualizado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Ephemeral timer updated successfully"},"chat":{"$ref":"#/components/schemas/Chat"},"ephemeral":{"type":"object","properties":{"enabled":{"type":"boolean","example":true},"seconds":{"type":"integer","format":"int64","example":86400},"label":{"type":"string","example":"1d"}}},"group":{"$ref":"#/components/schemas/Group"},"needs_refresh":{"type":"boolean","description":"Indica se o grupo precisou ser recarregado no cache local","example":false}}},"examples":{"sucesso":{"summary":"Timer atualizado","value":{"response":"Ephemeral timer updated successfully","chat":{"wa_chatid":"120363339858396166@g.us","wa_ephemeralExpiration":86400,"wa_isGroup":true},"ephemeral":{"enabled":true,"seconds":86400,"label":"1d"},"group":{"JID":"120363339858396166@g.us","IsEphemeral":true,"DisappearingTimer":86400},"needs_refresh":false}}}}}},"400":{"description":"Payload invalido, grupo invalido ou duracao nao suportada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid duration. Allowed values: 0, off, 1d, 7d, 90d"}}}}}},"401":{"description":"Token invalido ou ausente"},"403":{"description":"Usuario nao e administrador do grupo","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"user is not an admin of this group"}}}}}},"500":{"description":"Erro interno ao atualizar o temporizador","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Error updating chat ephemeral timer: connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostGroupEphemeral"}},"/provider/group/updateImage":{"post":{"tags":["Grupos e Comunidades"],"summary":"Atualizar imagem do grupo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAltera a imagem do grupo especificado. A imagem pode ser enviada como URL ou como string base64.\n\nRequisitos da imagem:\n- Formato: JPEG\n- Resolucao maxima: 640x640 pixels\n- Imagens maiores ou diferente de JPEG nao sao aceitas pelo WhatsApp\n\nPara remover a imagem atual, envie \"remove\" ou \"delete\" no campo image.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"groupjid":{"type":"string","description":"JID do grupo","example":"120363308883996631@g.us"},"image":{"type":"string","description":"URL da imagem, string base64 ou \"remove\"/\"delete\" para remover.\nA imagem deve estar em formato JPEG e ter resolucao maxima de 640x640.\n","examples":["https://example.com/image.jpg","data:image/jpeg;base64,/9j/4AAQSkZJRg...","remove"]}},"required":["groupjid","image"]}}}}}},"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"responses":{"200":{"description":"Imagem atualizada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Group image updated successfully"},"group":{"$ref":"#/components/schemas/Group"},"needs_refresh":{"type":"boolean","description":"Indica se o grupo precisa ser atualizado no cache local","example":false}}}}}},"400":{"description":"Erro nos parametros da requisicao"},"401":{"description":"Chave invalida ou expirada"},"403":{"description":"Usuario nao e administrador do grupo"},"413":{"description":"Imagem muito grande"},"415":{"description":"Formato de imagem invalido"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"operationId":"providerPostGroupUpdateImage"}},"/provider/group/updateLocked":{"post":{"tags":["Grupos e Comunidades"],"summary":"Configurar permissao de edicao do grupo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nDefine se apenas administradores podem editar as informacoes do grupo. \nQuando bloqueado (locked=true), apenas administradores podem alterar nome, descricao, \nimagem e outras configuracoes do grupo. Quando desbloqueado (locked=false), \nqualquer participante pode editar as informacoes.\n\nImportante:\n- Requer que o usuario seja administrador do grupo\n- Afeta edicoes de nome, descricao, imagem e outras informacoes do grupo\n- Nao controla permissoes de adicao de membros\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"groupjid":{"type":"string","description":"Identificador unico do grupo (JID)","example":"120363308883996631@g.us"},"locked":{"type":"boolean","description":"Define permissoes de edicao:\n- true = apenas admins podem editar infos do grupo\n- false = qualquer participante pode editar infos do grupo\n","example":true}},"required":["groupjid","locked"]}}}}}},"responses":{"200":{"description":"Operacao realizada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Group lock status changed successfully"},"group":{"$ref":"#/components/schemas/Group"},"needs_refresh":{"type":"boolean","description":"Indica se o grupo precisa ser atualizado no cache local","example":false}}}}}},"403":{"description":"Usuario nao e administrador do grupo"},"404":{"description":"Grupo nao encontrado"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostGroupUpdateLocked"}},"/provider/group/updateName":{"post":{"tags":["Grupos e Comunidades"],"summary":"Atualizar nome do grupo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAltera o nome de um grupo do WhatsApp. Apenas administradores do grupo podem realizar esta operacao.\nO nome do grupo deve seguir as diretrizes do WhatsApp e ter entre 1 e 25 caracteres.\n","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["groupjid","name"],"properties":{"groupjid":{"type":"string","description":"Identificador unico do grupo no formato JID","example":"120363339858396166@g.us"},"name":{"type":"string","description":"Novo nome para o grupo","example":"Grupo de Suporte","minLength":1,"maxLength":25}}}}}}}},"responses":{"200":{"description":"Nome do grupo atualizado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Group name updated successfully"},"group":{"$ref":"#/components/schemas/Group"},"needs_refresh":{"type":"boolean","description":"Indica se o grupo precisa ser atualizado no cache local","example":false}}}}}},"400":{"description":"Erro de validacao na requisicao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid payload"}}}}}},"401":{"description":"Token de autenticacao ausente ou invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Unauthorized"}}}}}},"403":{"description":"Usuario nao e administrador do grupo","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"User is not an admin of this group"}}}}}},"404":{"description":"Grupo nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Group not found"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to update group name"}}}}}}},"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostGroupUpdateName"}},"/provider/group/updateParticipants":{"post":{"tags":["Grupos e Comunidades"],"summary":"Gerenciar participantes do grupo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nGerencia participantes do grupo atraves de diferentes acoes:\n- Adicionar ou remover participantes\n- Promover ou rebaixar administradores\n- Aprovar ou rejeitar solicitacoes pendentes\n\nRequer que o usuario seja administrador do grupo para executar as acoes.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"groupjid":{"type":"string","description":"JID (identificador) do grupo","example":"120363308883996631@g.us"},"action":{"type":"string","description":"Acao a ser executada:\n- add: Adicionar participantes ao grupo\n- remove: Remover participantes do grupo\n- promote: Promover participantes a administradores\n- demote: Remover privilegios de administrador\n- approve: Aprovar solicitacoes pendentes de entrada\n- reject: Rejeitar solicitacoes pendentes de entrada\n","enum":["add","remove","promote","demote","approve","reject"],"example":"promote"},"participants":{"type":"array","items":{"type":"string"},"description":"Lista de numeros de telefone ou JIDs dos participantes.\nPara numeros de telefone, use formato internacional sem '+' ou espacos.\n","example":["5521987654321","5511999887766"]}},"required":["groupjid","action","participants"]}}}}}},"responses":{"200":{"description":"Sucesso na operacao","content":{"application/json":{"schema":{"type":"object","properties":{"groupUpdated":{"type":"array","items":{"type":"object","properties":{"JID":{"type":"string","description":"JID do participante"},"Error":{"type":"integer","description":"Codigo de erro (0 para sucesso)"}}},"description":"Status da operacao para cada participante"},"group":{"$ref":"#/components/schemas/Group","description":"Informacoes atualizadas do grupo"},"needs_refresh":{"type":"boolean","description":"Indica se o grupo precisa ser atualizado no cache local","example":false}}}}}},"400":{"description":"Erro nos parametros da requisicao"},"403":{"description":"Usuario nao e administrador do grupo"},"500":{"description":"Erro interno do servidor"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostGroupUpdateParticipants"}},"/provider/community/create":{"post":{"tags":["Grupos e Comunidades"],"summary":"Criar uma comunidade","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nCria uma nova comunidade no WhatsApp. Uma comunidade e uma estrutura que permite agrupar multiplos grupos relacionados sob uma unica administracao. \n\nA comunidade criada inicialmente tera apenas o grupo principal (announcements), e grupos adicionais podem ser vinculados posteriormente usando o endpoint `/community/updategroups`.\n\n**Observacoes importantes:**\n- O numero que cria a comunidade torna-se automaticamente o administrador\n- A comunidade tera um grupo principal de anuncios criado automaticamente\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"name":{"type":"string","description":"Nome da comunidade","example":"Comunidade do Bairro"}},"required":["name"]}}}}}},"responses":{"200":{"description":"Comunidade criada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"group":{"$ref":"#/components/schemas/Group"},"failed":{"type":"array","description":"Lista de JIDs que falharam ao serem adicionados","items":{"type":"string","format":"jid"}}}}}}},"400":{"description":"Erro na requisicao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid payload"}}}}}},"401":{"description":"Token invalido ou nao fornecido"},"403":{"description":"Sem permissao para criar comunidades"},"429":{"description":"Limite de criacao de comunidades atingido"},"500":{"description":"Erro interno do servidor"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostCommunityCreate"}},"/provider/community/editgroups":{"post":{"tags":["Grupos e Comunidades"],"summary":"Gerenciar grupos em uma comunidade","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAdiciona ou remove grupos de uma comunidade do WhatsApp. Apenas administradores da comunidade podem executar estas operacoes.\n\n## Funcionalidades\n- Adicionar multiplos grupos simultaneamente a uma comunidade\n- Remover grupos de uma comunidade existente\n- Suporta operacoes em lote\n\n## Limitacoes\n- Os grupos devem existir previamente\n- A comunidade deve existir e o usuario deve ser administrador\n- Grupos ja vinculados nao podem ser adicionados novamente\n- Grupos nao vinculados nao podem ser removidos\n\n## Acoes Disponiveis\n- `add`: Adiciona os grupos especificados a comunidade\n- `remove`: Remove os grupos especificados da comunidade\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["community","action","groupjids"],"properties":{"community":{"type":"string","description":"JID (identificador unico) da comunidade","example":"120363153742561022@g.us"},"action":{"type":"string","enum":["add","remove"],"description":"Tipo de operacao a ser realizada:\n* add - Adiciona grupos a comunidade\n* remove - Remove grupos da comunidade\n"},"groupjids":{"type":"array","items":{"type":"string","pattern":"^[0-9]+@g.us$"},"minItems":1,"description":"Lista de JIDs dos grupos para adicionar ou remover","example":["120363324255083289@g.us","120363308883996631@g.us"]}}}}}}}},"responses":{"200":{"description":"Operacao realizada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","example":"community updated"},"success":{"type":"array","items":{"type":"string"},"description":"Lista de JIDs dos grupos processados com sucesso"},"failed":{"type":"array","items":{"type":"string"},"description":"Lista de JIDs dos grupos que falharam no processamento"}}}}}},"400":{"description":"Requisicao invalida"},"401":{"description":"Nao autorizado"},"403":{"description":"Usuario nao e administrador da comunidade"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostCommunityEditgroups"}},"/provider/newsletter/create":{"post":{"tags":["Newsletters e Canais"],"summary":"Criar canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nCria um novo canal/newsletter no WhatsApp.\n\nObservacoes:\n- `name` e obrigatorio\n- `picture` e opcional\n- `picture` aceita URL HTTP/HTTPS, base64 puro ou data URI\n- imagens acima de 1 MB sao rejeitadas\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["name"],"properties":{"name":{"type":"string","example":"Canal de Promocoes"},"description":{"type":"string","example":"Ofertas e novidades da loja"},"picture":{"type":"string","description":"URL, base64 puro ou data URI da imagem do canal.","example":"https://example.com/newsletter.png"}}}}}}}},"responses":{"200":{"description":"Canal criado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","description":"Metadata do canal retornada pelo WhatsApp.","additionalProperties":true}}}}}},"400":{"description":"Payload invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"name is required"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao criar o canal","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterCreate"}},"/provider/newsletter/list":{"get":{"tags":["Newsletters e Canais"],"summary":"Listar canais inscritos","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nRetorna os canais/newsletters ja inscritos pela conta do WhatsApp atualmente conectada.\n","responses":{"200":{"description":"Lista de canais recuperada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao listar canais","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"}],"operationId":"providerGetNewsletterList"}},"/provider/newsletter/info":{"post":{"tags":["Newsletters e Canais"],"summary":"Buscar informacoes de um canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nBusca os detalhes de um canal/newsletter pelo `id` numerico ou pelo `jid`.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","description":"ID numerico do canal. Se informado sem dominio, sera convertido para `@newsletter`.","example":"120363123456789012"},"jid":{"type":"string","description":"JID completo do canal.","example":"120363123456789012@newsletter"}}}}}}}},"responses":{"200":{"description":"Informacoes do canal recuperadas com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","additionalProperties":true}}}}}},"400":{"description":"ID/JID invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid newsletter id"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao consultar o canal","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterInfo"}},"/provider/newsletter/link":{"post":{"tags":["Newsletters e Canais"],"summary":"Buscar canal por link-chave de convite","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nBusca as informacoes de um canal a partir da chave de convite.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["key"],"properties":{"key":{"type":"string","description":"Chave do convite do canal.","example":"AbCdEfGhIjKlMn"}}}}}}}},"responses":{"200":{"description":"Informacoes do canal recuperadas com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","additionalProperties":true}}}}}},"400":{"description":"Payload invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"key is required"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao consultar o convite","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterLink"}},"/provider/newsletter/subscribe":{"post":{"tags":["Newsletters e Canais"],"summary":"Assinar live updates temporarios de um canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAssina temporariamente os live updates internos do WhatsApp para um canal.\n\nObservacao:\n- esta rota retorna apenas a duracao da assinatura temporaria\n- isso nao cria um novo evento de webhook\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","example":"120363123456789012"},"jid":{"type":"string","example":"120363123456789012@newsletter"}}}}}}}},"responses":{"200":{"description":"Assinatura criada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","description":"Duracao retornada pelo WhatsApp.","example":"5m0s"}}}}}},"400":{"description":"ID/JID invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid newsletter id"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao assinar updates","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterSubscribe"}},"/provider/newsletter/messages":{"post":{"tags":["Newsletters e Canais"],"summary":"Buscar mensagens de um canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nBusca diretamente no WhatsApp os posts/mensagens de um canal (newsletter).\n\nEsta rota nao depende de mensagens salvas localmente e e util para:\n- carregar o historico recente de posts de um canal\n- paginar mensagens anteriores usando `beforeid`\n- consumir conteudo de newsletters sem persistencia em banco\n\nIdentificacao do canal:\n- envie `id` com o identificador numerico do canal; o backend converte para `@newsletter`\n- ou envie `jid` completo no formato `1234567890@newsletter`\n\nObservacoes:\n- `count` controla quantos posts retornar\n- use preferencialmente `beforeid`\n- `beforeid` pagina para tras a partir de um `serverid`\n- o retorno vem no campo `response`\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","description":"ID numerico do canal. Se informado sem dominio, sera convertido para `@newsletter`.","example":"120363123456789012"},"jid":{"type":"string","description":"JID completo do canal.","example":"120363123456789012@newsletter"},"count":{"type":"integer","minimum":1,"description":"Quantidade de mensagens/posts a buscar.","example":20},"beforeid":{"type":"integer","minimum":1,"description":"Retorna mensagens anteriores ao `serverid` informado.\nUse para paginacao retroativa.\n","example":12345}}}}}}}},"responses":{"200":{"description":"Mensagens do canal recuperadas com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"array","description":"Lista de mensagens/posts do canal retornados diretamente pelo WhatsApp.","items":{"type":"object","properties":{"serverid":{"type":"integer","description":"Identificador sequencial do post no canal.","example":12345},"messageid":{"type":"string","description":"ID logico da mensagem.","example":"3EB0B4302B3A8A52F7A1"},"type":{"type":"string","description":"Tipo da mensagem do canal.","example":"text"},"timestamp":{"type":"string","format":"date-time","description":"Momento em que o post foi publicado."},"viewsCount":{"type":"integer","description":"Quantidade de visualizacoes conhecida no momento da consulta.","example":1200},"reactionCounts":{"type":"object","additionalProperties":{"type":"integer"},"description":"Mapa de emoji para quantidade de reacoes.","example":{"👍":22,"🔥":7}},"message":{"type":"object","description":"Conteudo bruto da mensagem retornado pelo WhatsApp quando disponivel.","additionalProperties":true}}}}}},"examples":{"sucesso":{"value":{"response":[{"messageid":"3EB0B4302B3A8A52F7A1","serverid":12345,"type":"text","timestamp":"2026-03-24T18:20:00Z","viewsCount":1200,"reactionCounts":{"👍":22,"🔥":7},"message":{"conversation":"Post do canal"}}]}}}}}},"400":{"description":"Payload invalido ou ID/JID do canal invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid newsletter id"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao consultar mensagens do canal no WhatsApp","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterMessages"}},"/provider/newsletter/messages/edit":{"post":{"tags":["Newsletters e Canais"],"summary":"Editar mensagem recente de um canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nEdita o conteudo de um post recente de newsletter diretamente no WhatsApp.\n\nEsta rota:\n- nao depende de mensagens salvas localmente\n- busca a mensagem recente do canal via WhatsApp/whatsmeow\n- localiza o post por `messageid` ou `serverid`\n- edita apenas tipos suportados (`text`, `image`, `video`, `document`)\n\nObservacoes:\n- use `jid` ou `id` para identificar o canal\n- envie ao menos um entre `messageid` e `serverid`\n- envie `text` com o novo conteudo/legenda\n- `count` e `maxpages` controlam a janela de busca no canal\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["text"],"properties":{"id":{"type":"string","description":"ID numerico do canal. Se informado sem dominio, sera convertido para `@newsletter`.","example":"120363123456789012"},"jid":{"type":"string","description":"JID completo do canal.","example":"120363123456789012@newsletter"},"messageid":{"type":"string","description":"ID logico da mensagem no canal.","example":"3EB0B4302B3A8A52F7A1"},"serverid":{"type":"integer","minimum":1,"description":"Identificador sequencial do post no canal.","example":12345},"text":{"type":"string","description":"Novo texto ou nova legenda do post.","example":"Post atualizado"},"count":{"type":"integer","minimum":1,"description":"Quantidade de mensagens buscadas por pagina ao localizar o post.","example":100},"maxpages":{"type":"integer","minimum":1,"description":"Quantidade maxima de paginas buscadas ao localizar o post.","example":5}}}}}}}},"responses":{"200":{"description":"Mensagem do canal editada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"jid":{"type":"string","example":"120363123456789012@newsletter"},"targetmessageid":{"type":"string","description":"ID logico do post editado.","example":"3EB0B4302B3A8A52F7A1"},"targetserverid":{"type":"integer","description":"Identificador sequencial do post editado.","example":12345},"messageid":{"type":"string","description":"ID da operacao de edicao enviada ao WhatsApp.","example":"3EB01234567890ABCDEF"},"serverid":{"type":"integer","description":"Server id retornado pela operacao de edicao.","example":12346}}}}}}}},"400":{"description":"Payload invalido, mensagem nao editavel, mensagem alvo nao identificada ou canal invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"text is required"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"404":{"description":"Mensagem do canal nao encontrada na janela recente consultada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"newsletter message not found in recent history"}}}}}},"500":{"description":"Erro interno ao consultar ou editar a mensagem do canal","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterMessagesEdit"}},"/provider/newsletter/messages/delete":{"post":{"tags":["Newsletters e Canais"],"summary":"Deletar mensagem recente de um canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nApaga um post recente de newsletter diretamente no WhatsApp.\n\nEsta rota:\n- nao depende de mensagens salvas localmente\n- revoga o post no canal usando o WhatsApp/whatsmeow\n- aceita localizar o post por `messageid` ou `serverid`\n\nObservacoes:\n- use `jid` ou `id` para identificar o canal\n- envie ao menos um entre `messageid` e `serverid`\n- `count` e `maxpages` controlam a janela de busca no canal\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","description":"ID numerico do canal. Se informado sem dominio, sera convertido para `@newsletter`.","example":"120363123456789012"},"jid":{"type":"string","description":"JID completo do canal.","example":"120363123456789012@newsletter"},"messageid":{"type":"string","description":"ID logico da mensagem no canal.","example":"3EB0B4302B3A8A52F7A1"},"serverid":{"type":"integer","minimum":1,"description":"Identificador sequencial do post no canal.","example":12345},"count":{"type":"integer","minimum":1,"description":"Quantidade de mensagens buscadas por pagina ao localizar o post.","example":100},"maxpages":{"type":"integer","minimum":1,"description":"Quantidade maxima de paginas buscadas ao localizar o post.","example":5}}}}}}}},"responses":{"200":{"description":"Mensagem do canal deletada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"jid":{"type":"string","example":"120363123456789012@newsletter"},"targetmessageid":{"type":"string","description":"ID logico do post deletado.","example":"3EB0B4302B3A8A52F7A1"},"targetserverid":{"type":"integer","description":"Identificador sequencial do post deletado.","example":12345},"messageid":{"type":"string","description":"ID da operacao de delecao enviada ao WhatsApp.","example":"3EB01234567890ABCDEF"},"serverid":{"type":"integer","description":"Server id retornado pela operacao de delecao.","example":12346}}}}}}}},"400":{"description":"Payload invalido ou canal invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"messageid or serverid is required"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"404":{"description":"Mensagem do canal nao encontrada na janela recente consultada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"newsletter message not found in recent history"}}}}}},"500":{"description":"Erro interno ao consultar ou deletar a mensagem do canal","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterMessagesDelete"}},"/provider/newsletter/updates":{"post":{"tags":["Newsletters e Canais"],"summary":"Buscar updates de mensagens de um canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nConsulta diretamente no WhatsApp os updates de posts ja existentes de um canal.\n\nEsta rota e diferente de `/newsletter/messages`:\n- `/newsletter/messages` retorna o conteudo dos posts\n- `/newsletter/updates` retorna mudancas posteriores nos posts, especialmente metricas\n\nEsta rota tambem nao e um evento de webhook:\n- nao existe webhook `newsletter_messages_update`\n- para views e reactions de canais, consulte `/newsletter/updates` sob demanda\n\nCasos de uso:\n- atualizar contadores de `views` de posts ja carregados\n- atualizar `reactionCounts` de posts do canal\n- consultar sob demanda os mesmos tipos de metricas que chegam nos live updates internos do WhatsApp\n\nObservacoes:\n- use preferencialmente `afterid`\n- `afterid` filtra updates depois de um `serverid`\n- `since` filtra pelo momento do update\n- `since` aceita timestamp em segundos ou milissegundos\n- o retorno vem no campo `response`\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","description":"ID numerico do canal. Se informado sem dominio, sera convertido para `@newsletter`.","example":"120363123456789012"},"jid":{"type":"string","description":"JID completo do canal.","example":"120363123456789012@newsletter"},"count":{"type":"integer","minimum":1,"description":"Quantidade maxima de updates retornados.","example":50},"afterid":{"type":"integer","minimum":1,"description":"Retorna apenas updates posteriores ao `serverid` informado.","example":12345},"since":{"type":"integer","description":"Timestamp de corte.\n- Se maior que `1000000000000`, e interpretado como milissegundos.\n- Caso contrario, e interpretado como segundos.\n","example":1710000000}}}}}}}},"responses":{"200":{"description":"Updates de mensagens do canal recuperados com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"array","description":"Lista de updates de mensagens do canal.","items":{"type":"object","properties":{"serverid":{"type":"integer","description":"Identificador do post no canal.","example":12345},"messageid":{"type":"string","description":"ID logico da mensagem.","example":"3EB0B4302B3A8A52F7A1"},"type":{"type":"string","description":"Tipo da mensagem do canal.","example":"text"},"timestamp":{"type":"string","format":"date-time","description":"Momento associado ao update retornado."},"viewsCount":{"type":"integer","description":"Quantidade atualizada de visualizacoes.","example":1540},"reactionCounts":{"type":"object","additionalProperties":{"type":"integer"},"description":"Mapa atualizado de emoji para quantidade de reacoes.","example":{"👍":35,"🔥":11}},"message":{"type":"object","description":"Conteudo bruto da mensagem, quando presente.\nEm muitos live updates esse campo pode vir ausente.\n","additionalProperties":true}}}}}},"examples":{"sucesso":{"value":{"response":[{"messageid":"3EB0B4302B3A8A52F7A1","serverid":12345,"type":"text","timestamp":"2026-03-24T19:00:00Z","viewsCount":1540,"reactionCounts":{"👍":35,"🔥":11}}]}}}}}},"400":{"description":"Payload invalido ou ID/JID do canal invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid newsletter id"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao consultar updates do canal no WhatsApp","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterUpdates"}},"/provider/newsletter/viewed":{"post":{"tags":["Newsletters e Canais"],"summary":"Marcar posts do canal como visualizados","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nMarca um ou mais posts do canal como visualizados usando `serverid`.\n\nObservacoes:\n- envie `serverids` com uma lista de posts\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","example":"120363123456789012"},"jid":{"type":"string","example":"120363123456789012@newsletter"},"serverids":{"type":"array","items":{"type":"integer"},"example":[12345,12346]}}}}}}}},"responses":{"200":{"description":"Posts marcados como visualizados","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"boolean","example":true}}}}}},"400":{"description":"Payload invalido ou faltando `serverids`","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"serverids is required"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao marcar visualizacao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterViewed"}},"/provider/newsletter/reaction":{"post":{"tags":["Newsletters e Canais"],"summary":"Reagir a um post do canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nEnvia, altera ou remove uma reacao de um post do canal.\n\nObservacoes:\n- `serverid` identifica o post alvo\n- `reaction` define o emoji\n- envie `reaction` vazio para remover a reacao\n- `reactionmessageid` e opcional; se omitido, o WhatsApp gera o ID da reacao\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","example":"120363123456789012"},"jid":{"type":"string","example":"120363123456789012@newsletter"},"serverid":{"type":"integer","example":12345},"reaction":{"type":"string","example":""},"reactionmessageid":{"type":"string","example":"3EB0AABBCCDD"}}}}}}}},"responses":{"200":{"description":"Reacao aplicada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"boolean","example":true}}}}}},"400":{"description":"Payload invalido ou faltando `serverid`","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"serverid is required"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao reagir ao post","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterReaction"}},"/provider/newsletter/follow":{"post":{"tags":["Newsletters e Canais"],"summary":"Seguir canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nSegue um canal/newsletter.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","example":"120363123456789012"},"jid":{"type":"string","example":"120363123456789012@newsletter"}}}}}}}},"responses":{"200":{"description":"Canal seguido com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"boolean","example":true}}}}}},"400":{"description":"ID/JID invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid newsletter id"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao seguir canal","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterFollow"}},"/provider/newsletter/unfollow":{"post":{"tags":["Newsletters e Canais"],"summary":"Deixar de seguir canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nDeixa de seguir um canal/newsletter.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","example":"120363123456789012"},"jid":{"type":"string","example":"120363123456789012@newsletter"}}}}}}}},"responses":{"200":{"description":"Canal removido dos seguidos com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"boolean","example":true}}}}}},"400":{"description":"ID/JID invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid newsletter id"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao deixar de seguir canal","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterUnfollow"}},"/provider/newsletter/mute":{"post":{"tags":["Newsletters e Canais"],"summary":"Silenciar canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAtiva o mute de um canal/newsletter.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","example":"120363123456789012"},"jid":{"type":"string","example":"120363123456789012@newsletter"}}}}}}}},"responses":{"200":{"description":"Canal silenciado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"boolean","example":true}}}}}},"400":{"description":"ID/JID invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid newsletter id"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao silenciar canal","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterMute"}},"/provider/newsletter/unmute":{"post":{"tags":["Newsletters e Canais"],"summary":"Remover mute do canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nRemove o mute de um canal/newsletter.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","example":"120363123456789012"},"jid":{"type":"string","example":"120363123456789012@newsletter"}}}}}}}},"responses":{"200":{"description":"Mute removido com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"boolean","example":true}}}}}},"400":{"description":"ID/JID invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid newsletter id"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao remover mute do canal","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterUnmute"}},"/provider/newsletter/delete":{"post":{"tags":["Newsletters e Canais"],"summary":"Deletar canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nRemove/deleta um canal/newsletter.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","example":"120363123456789012"},"jid":{"type":"string","example":"120363123456789012@newsletter"}}}}}}}},"responses":{"200":{"description":"Canal deletado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"boolean","example":true}}}}}},"400":{"description":"ID/JID invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid newsletter id"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao deletar o canal","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterDelete"}},"/provider/newsletter/picture":{"post":{"tags":["Newsletters e Canais"],"summary":"Atualizar foto do canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAtualiza a imagem do canal/newsletter.\n\nObservacoes:\n- `picture` aceita URL HTTP/HTTPS, base64 puro ou data URI\n- imagens acima de 1 MB sao rejeitadas\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["picture"],"properties":{"id":{"type":"string","example":"120363123456789012"},"jid":{"type":"string","example":"120363123456789012@newsletter"},"picture":{"type":"string","example":"https://example.com/newsletter.png"}}}}}}}},"responses":{"200":{"description":"Foto do canal atualizada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"boolean","example":true}}}}}},"400":{"description":"Payload invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"empty image source"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao atualizar a foto do canal","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterPicture"}},"/provider/newsletter/name":{"post":{"tags":["Newsletters e Canais"],"summary":"Atualizar nome do canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAtualiza o nome do canal/newsletter.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["name"],"properties":{"id":{"type":"string","example":"120363123456789012"},"jid":{"type":"string","example":"120363123456789012@newsletter"},"name":{"type":"string","example":"Canal de Promocoes VIP"}}}}}}}},"responses":{"200":{"description":"Nome atualizado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"boolean","example":true}}}}}},"400":{"description":"Payload invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"name is required"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao atualizar o nome do canal","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterName"}},"/provider/newsletter/description":{"post":{"tags":["Newsletters e Canais"],"summary":"Atualizar descricao do canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAtualiza a descricao do canal/newsletter.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","example":"120363123456789012"},"jid":{"type":"string","example":"120363123456789012@newsletter"},"description":{"type":"string","example":"Atualizacoes, ofertas e novidades"}}}}}}}},"responses":{"200":{"description":"Descricao atualizada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"boolean","example":true}}}}}},"400":{"description":"Payload invalido ou ID/JID invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid newsletter id"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao atualizar a descricao do canal","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterDescription"}},"/provider/newsletter/settings":{"post":{"tags":["Newsletters e Canais"],"summary":"Atualizar configuracoes do canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAtualiza configuracoes do canal/newsletter.\n\nAtualmente, esta rota controla `reactionCodes`.\n\nValores aceitos:\n- `all`\n- `basic`\n- `none`\n- `blocklist`\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["reactionCodes"],"properties":{"id":{"type":"string","example":"120363123456789012"},"jid":{"type":"string","example":"120363123456789012@newsletter"},"reactionCodes":{"type":"string","example":"basic"}}}}}}}},"responses":{"200":{"description":"Configuracoes atualizadas com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"boolean","example":true}}}}}},"400":{"description":"Payload invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid reactionCodes"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao atualizar configuracoes do canal","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterSettings"}},"/provider/newsletter/search":{"post":{"tags":["Newsletters e Canais"],"summary":"Pesquisar canais publicos","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nPesquisa canais/newsletters publicos no diretorio do WhatsApp.\n\nObservacoes:\n- use `after` para buscar a proxima pagina\n- `countryCodes` filtra por paises\n- `view` e `searchText` sao opcionais\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"limit":{"type":"integer","example":20},"view":{"type":"string","example":"RECOMMENDED"},"countryCodes":{"type":"array","items":{"type":"string"},"example":["BR"]},"searchText":{"type":"string","example":"promo"},"after":{"type":"string","example":"YXJyYXljb25uZWN0aW9uOjE5"}}}}}}}},"responses":{"200":{"description":"Pesquisa executada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","properties":{"after":{"type":"string","nullable":true,"example":"YXJyYXljb25uZWN0aW9uOjIw"},"data":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}},"400":{"description":"Payload invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid payload"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao pesquisar canais","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterSearch"}},"/provider/newsletter/admin/invite":{"post":{"tags":["Newsletters e Canais"],"summary":"Convidar admin do canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nConvida um telefone para virar administrador do canal.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["phone"],"properties":{"id":{"type":"string","example":"120363123456789012"},"jid":{"type":"string","example":"120363123456789012@newsletter"},"phone":{"type":"string","example":"5511999999999"}}}}}}}},"responses":{"200":{"description":"Convite enviado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"boolean","example":true}}}}}},"400":{"description":"Payload invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"phone is required"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao convidar admin","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterAdminInvite"}},"/provider/newsletter/admin/accept":{"post":{"tags":["Newsletters e Canais"],"summary":"Aceitar convite de admin do canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAceita um convite pendente de administrador do canal.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","example":"120363123456789012"},"jid":{"type":"string","example":"120363123456789012@newsletter"}}}}}}}},"responses":{"200":{"description":"Convite aceito com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"boolean","example":true}}}}}},"400":{"description":"ID/JID invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid newsletter id"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao aceitar convite de admin","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterAdminAccept"}},"/provider/newsletter/admin/remove":{"post":{"tags":["Newsletters e Canais"],"summary":"Remover admin do canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nRemove um administrador do canal usando o telefone dele.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["phone"],"properties":{"id":{"type":"string","example":"120363123456789012"},"jid":{"type":"string","example":"120363123456789012@newsletter"},"phone":{"type":"string","example":"5511999999999"}}}}}}}},"responses":{"200":{"description":"Admin removido com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"boolean","example":true}}}}}},"400":{"description":"Payload invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"phone is required"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao remover admin","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterAdminRemove"}},"/provider/newsletter/admin/revoke":{"post":{"tags":["Newsletters e Canais"],"summary":"Revogar convite de admin do canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nRevoga um convite pendente de administrador do canal usando o telefone do convidado.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["phone"],"properties":{"id":{"type":"string","example":"120363123456789012"},"jid":{"type":"string","example":"120363123456789012@newsletter"},"phone":{"type":"string","example":"5511999999999"}}}}}}}},"responses":{"200":{"description":"Convite revogado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"boolean","example":true}}}}}},"400":{"description":"Payload invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"phone is required"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao revogar convite","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterAdminRevoke"}},"/provider/newsletter/owner/transfer":{"post":{"tags":["Newsletters e Canais"],"summary":"Transferir dono do canal","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nTransfere a propriedade do canal para outro telefone.\n\nObservacoes:\n- `phone` e obrigatorio\n- `quitAdmin=true` remove o dono anterior da posicao de admin apos a transferencia\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["phone"],"properties":{"id":{"type":"string","example":"120363123456789012"},"jid":{"type":"string","example":"120363123456789012@newsletter"},"phone":{"type":"string","example":"5511999999999"},"quitAdmin":{"type":"boolean","example":false}}}}}}}},"responses":{"200":{"description":"Transferencia solicitada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"boolean","example":true}}}}}},"400":{"description":"Payload invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"phone is required"}}}}}},"401":{"description":"Instancia nao autenticada ou cliente nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"client not found"}}}}}},"500":{"description":"Erro interno ao transferir ownership do canal","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostNewsletterOwnerTransfer"}},"/provider/webhook":{"get":{"tags":["Webhooks e SSE"],"summary":"Ver Webhook da Instancia","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nRetorna a configuracao atual do webhook da instancia, incluindo:\n- URL configurada\n- Eventos ativos\n- Filtros aplicados\n- Configuracoes adicionais\n\nExemplo de resposta:\n```json\n[\n  {\n    \"id\": \"123e4567-e89b-12d3-a456-426614174000\",\n    \"enabled\": true,\n    \"url\": \"https://example.com/webhook\",\n    \"events\": [\"messages\", \"messages_update\"],\n    \"excludeMessages\": [\"wasSentByApi\", \"isGroupNo\"],\n    \"addUrlEvents\": true,\n    \"addUrlTypesMessages\": true\n  },\n  {\n    \"id\": \"987fcdeb-51k3-09j8-x543-864297539100\",\n    \"enabled\": true,\n    \"url\": \"https://outro-endpoint.com/webhook\",\n    \"events\": [\"connection\", \"presence\"],\n    \"excludeMessages\": [],\n    \"addUrlEvents\": false,\n    \"addUrlTypesMessages\": false\n  }\n]\n```\n\nA resposta e sempre um array, mesmo quando ha apenas um webhook configurado.\n","responses":{"200":{"description":"Configuracao do webhook retornada com sucesso","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}},"example":[{"id":"123e4567-e89b-12d3-a456-426614174000","enabled":true,"url":"https://example.com/webhook","events":["messages","messages_update"],"excludeMessages":["wasSentByApi","isGroupNo"],"addUrlEvents":true,"addUrlTypesMessages":true},{"id":"987fcdeb-51k3-09j8-x543-864297539100","enabled":true,"url":"https://outro-endpoint.com/webhook","events":["connection","presence"],"excludeMessages":[],"addUrlEvents":false,"addUrlTypesMessages":false}]}}},"401":{"description":"Token invalido ou nao fornecido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"missing token"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to process webhook data"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"}],"operationId":"providerGetWebhook"},"post":{"tags":["Webhooks e SSE"],"summary":"Configurar Webhook da Instancia","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nGerencia a configuracao de webhooks para receber eventos em tempo real da instancia.\nPermite gerenciar multiplos webhooks por instancia atraves do campo ID e action.\n\n###  Modo Simples (Recomendado)\n\n**Uso mais facil - sem complexidade de IDs**:\n- Nao inclua `action` nem `id` no payload\n- Gerencia automaticamente um unico webhook por instancia\n- Cria novo ou atualiza o existente automaticamente\n- **Recomendado**: Sempre use `\"excludeMessages\": [\"wasSentByApi\"]` para evitar loops\n- **Exemplo**: `{\"url\": \"https://meusite.com/webhook\", \"events\": [\"messages\"], \"excludeMessages\": [\"wasSentByApi\"]}`\n\n###  Sites para Testes (ordenados por qualidade)\n\n**Para testar webhooks durante desenvolvimento**:\n1. **https://webhook.cool/** -  Melhor opcao (sem rate limit, interface limpa)\n2. **https://rbaskets.in/** -  Boa alternativa (confiavel, baixo rate limit)\n3. **https://webhook.site/** -  Evitar se possivel (rate limit agressivo)\n\n###  Modo Avancado (Para multiplos webhooks)\n\n**Para usuarios que precisam de multiplos webhooks por instancia**:\n\n **Dica**: Mesmo precisando de multiplos webhooks, considere usar `addUrlEvents` no modo simples.\nUm unico webhook pode receber diferentes tipos de eventos em URLs especificas \n(ex: `/webhook/message`, `/webhook/connection`), eliminando a necessidade de multiplos webhooks.\n\n1. **Criar Novo Webhook**:\n   - Use `action: \"add\"`\n   - Nao inclua `id` no payload\n   - O sistema gera ID automaticamente\n\n2. **Atualizar Webhook Existente**:\n   - Use `action: \"update\"`\n   - Inclua o `id` do webhook no payload\n   - Todos os campos serao atualizados\n\n3. **Remover Webhook**:\n   - Use `action: \"delete\"`\n   - Inclua apenas o `id` do webhook\n   - Outros campos sao ignorados\n\n\n\n### Eventos Disponiveis\n- `connection`: Alteracoes no estado da conexao\n- `history`: Recebimento de historico de mensagens\n- `messages`: Novas mensagens recebidas\n- `messages_update`: Atualizacoes em mensagens existentes\n- `newsletter_messages`: Novos posts/mensagens de canais do WhatsApp\n  Para views e reactions de canais, use a rota `/newsletter/updates`.\n- `call`: Eventos de chamadas VoIP\n- `contacts`: Atualizacoes na agenda de contatos\n- `presence`: Alteracoes no status de presenca\n- `groups`: Modificacoes em grupos\n- `labels`: Gerenciamento de etiquetas\n- `chats`: Eventos de conversas\n- `chat_labels`: Alteracoes em etiquetas de conversas\n- `blocks`: Bloqueios/desbloqueios\n- `sender`: Atualizacoes de campanhas, quando inicia, e quando completa\n\n**Remover mensagens com base nos filtros**:\n- `wasSentByApi`: Mensagens originadas pela API  **IMPORTANTE:** Use sempre este filtro para evitar loops em automacoes\n- `wasNotSentByApi`: Mensagens nao originadas pela API\n- `fromMeYes`: Mensagens enviadas pelo usuario\n- `fromMeNo`: Mensagens recebidas de terceiros\n- `isGroupYes`: Mensagens em grupos\n- `isGroupNo`: Mensagens em conversas individuais\n\n **Prevencao de Loops**: Se voce tem automacoes que enviam mensagens via API, sempre inclua `\"excludeMessages\": [\"wasSentByApi\"]` no seu webhook. Caso prefira receber esses eventos, certifique-se de que sua automacao detecta mensagens enviadas pela propria API para nao criar loops infinitos.\n\n**Acoes Suportadas**:\n- `add`: Registrar novo webhook\n- `delete`: Remover webhook existente\n\n**Parametros de URL**:\n- `addUrlEvents` (boolean): Quando ativo, adiciona o tipo do evento como path parameter na URL.\n  Exemplo: `https://api.example.com/webhook/{evento}`\n- `addUrlTypesMessages` (boolean): Quando ativo, adiciona o tipo da mensagem como path parameter na URL.\n  Exemplo: `https://api.example.com/webhook/{tipo_mensagem}`\n\n**Combinacoes de Parametros**:\n- Ambos ativos: `https://api.example.com/webhook/{evento}/{tipo_mensagem}`\n  Exemplo real: `https://api.example.com/webhook/message/conversation`\n- Apenas eventos: `https://api.example.com/webhook/message`\n- Apenas tipos: `https://api.example.com/webhook/conversation`\n\n**Notas Tecnicas**:\n1. Os parametros sao adicionados na ordem: evento  tipo mensagem\n2. A URL deve ser configurada para aceitar esses parametros dinamicos\n3. Funciona com qualquer combinacao de eventos/mensagens\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","description":"ID unico do webhook (necessario para update/delete)","example":"123e4567-e89b-12d3-a456-426614174000"},"enabled":{"type":"boolean","description":"Habilita/desabilita o webhook","example":true},"url":{"type":"string","description":"URL para receber os eventos","example":"https://example.com/webhook"},"events":{"type":"array","description":"Lista de eventos monitorados","items":{"type":"string","enum":["connection","history","messages","messages_update","newsletter_messages","call","contacts","presence","groups","labels","chats","chat_labels","blocks","sender"]}},"excludeMessages":{"type":"array","description":"Filtros para excluir tipos de mensagens","items":{"type":"string","enum":["wasSentByApi","wasNotSentByApi","fromMeYes","fromMeNo","isGroupYes","isGroupNo"]}},"addUrlEvents":{"type":"boolean","description":"Adiciona o tipo do evento como parametro na URL.\n- `false` (padrao): URL normal\n- `true`: Adiciona evento na URL (ex: `/webhook/message`)\n","default":false},"addUrlTypesMessages":{"type":"boolean","description":"Adiciona o tipo da mensagem como parametro na URL.\n- `false` (padrao): URL normal  \n- `true`: Adiciona tipo da mensagem (ex: `/webhook/conversation`)\n","default":false},"action":{"type":"string","description":"Acao a ser executada:\n- add: criar novo webhook\n- update: atualizar webhook existente (requer id)\n- delete: remover webhook (requer apenas id)\nSe nao informado, opera no modo simples (unico webhook)\n","enum":["add","update","delete"]}},"required":["url"]}}}}}},"responses":{"200":{"description":"Webhook configurado ou atualizado com sucesso","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid action"}}}}}},"401":{"description":"Token invalido ou nao fornecido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"missing token"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Could not save webhook"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostWebhook"}},"/provider/webhook/errors":{"get":{"tags":["Webhooks e SSE"],"summary":"Ver ultimos erros do webhook local","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nRetorna em memoria os ultimos 20 erros de envio dos webhooks locais da instancia autenticada.\n\nCada item inclui data/hora (`created`), URL de destino, evento, tipo do webhook\n(`local`), payload tentado, numero de tentativas, status HTTP final quando existir e a mensagem de erro.\n\nObservacoes:\n- O historico fica apenas em memoria e e perdido quando o processo reinicia.\n- O endpoint usa o mesmo `token` da instancia.\n- Retorna apenas falhas dos webhooks locais da propria instancia.\n- Falhas do webhook global ficam disponiveis separadamente em `/globalwebhook/errors` com `credencial interna`.\n- O header `X-Webhook-Error-Capture-Started-At` informa desde quando a captura atual esta valendo.\n\nExemplo de consulta:\n```bash\ncurl -X GET \"$BASE_URL/webhook/errors\" \\\n  -H \"token: SUA_INSTANCIA_TOKEN\"\n```\n","responses":{"200":{"description":"Historico retornado com sucesso","headers":{"X-Webhook-Error-Capture-Started-At":{"description":"Data/hora em que a captura atual de erros comecou para a instancia","schema":{"type":"string","format":"date-time","example":"2026-03-23T14:50:00Z"}}},"content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"created":{"type":"string","format":"date-time","example":"2026-03-23T15:04:05Z"},"url":{"type":"string","example":"https://example.com/webhook/messages"},"type":{"type":"string","example":"local"},"event":{"type":"string","example":"messages"},"message_type":{"type":"string","example":"text"},"status_code":{"type":"integer","example":502},"attempts":{"type":"integer","example":3},"error":{"type":"string","example":"webhook returned non-success status: 502 Bad Gateway"},"payload":{"type":"object"}}}},"example":[{"created":"2026-03-23T15:04:05Z","url":"https://example.com/webhook/messages","type":"local","event":"messages","message_type":"text","status_code":502,"attempts":3,"error":"webhook returned non-success status: 502 Bad Gateway","payload":{"EventType":"messages","token":"instance-token"}}]}}},"401":{"description":"Token invalido ou nao fornecido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"missing token"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"}],"operationId":"providerGetWebhookErrors"}},"/provider/sse":{"get":{"tags":["Webhooks e SSE"],"summary":"Server-Sent Events (SSE)","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nReceber eventos em tempo real via Server-Sent Events (SSE)\n\n### Funcionalidades Principais:\n- Configuracao de URL para recebimento de eventos\n- Selecao granular de tipos de eventos\n- Filtragem avancada de mensagens\n- Parametros adicionais na URL\n- Gerenciamento multiplo de webhooks\n\n**Eventos Disponiveis**:\n- `connection`: Alteracoes no estado da conexao\n- `history`: Recebimento de historico de mensagens\n- `messages`: Novas mensagens recebidas\n- `messages_update`: Atualizacoes em mensagens existentes\n- `call`: Eventos de chamadas VoIP\n- `contacts`: Atualizacoes na agenda de contatos\n- `presence`: Alteracoes no status de presenca\n- `groups`: Modificacoes em grupos\n- `labels`: Gerenciamento de etiquetas\n- `chats`: Eventos de conversas\n- `chat_labels`: Alteracoes em etiquetas de conversas\n- `blocks`: Bloqueios/desbloqueios\n\n\nEstabelece uma conexao persistente para receber eventos em tempo real. Este\nendpoint:\n\n1. Requer autenticacao via token\n\n2. Mantem uma conexao HTTP aberta com o cliente\n\n3. Envia eventos conforme ocorrem no servidor\n\n4. Suporta diferentes tipos de eventos\n\nExemplo de uso:\n\n```javascript\n\nconst eventSource = new\nEventSource('/sse?token=SEU_TOKEN&events=chats,messages');\n\n\neventSource.onmessage = function(event) {\n  const data = JSON.parse(event.data);\n  console.log('Novo evento:', data);\n};\n\n\neventSource.onerror = function(error) {\n  console.error('Erro na conexao SSE:', error);\n};\n\n```\n\n\nEstrutura de um evento:\n\n```json\n\n{\n  \"type\": \"message\",\n  \"data\": {\n    \"id\": \"3EB0538DA65A59F6D8A251\",\n    \"from\": \"5511999999999@s.whatsapp.net\",\n    \"to\": \"5511888888888@s.whatsapp.net\",\n    \"text\": \"Ola!\",\n    \"timestamp\": 1672531200000\n  }\n}\n\n```","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"},{"name":"events","in":"query","schema":{"type":"string"},"required":true,"description":"Tipos de eventos a serem recebidos. Suporta dois formatos:\n- Separados por virgula: `?events=chats,messages`\n- Parametros repetidos: `?events=chats&events=messages`\n","example":"chats,messages"},{"name":"excludeMessages","in":"query","schema":{"type":"string"},"required":false,"description":"Tipos de mensagens a serem excluidas do evento `messages`. Suporta dois formatos:\n- Separados por virgula: `?excludeMessages=poll,reaction`\n- Parametros repetidos: `?excludeMessages=poll&excludeMessages=reaction`\n","example":"poll,reaction"}],"responses":{"200":{"description":"Sucesso"}},"operationId":"providerGetSse"}},"/provider/sender/simple":{"post":{"tags":["Mensagem em massa"],"summary":"Criar nova campanha (Simples)","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nCria uma nova campanha de envio com configuracoes basicas","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["numbers","type","delayMin","delayMax","scheduled_for"],"properties":{"numbers":{"type":"array","description":"Lista de numeros para envio","items":{"type":"string"},"example":["5511999999999@s.whatsapp.net"]},"type":{"type":"string","description":"Tipo da mensagem","enum":["text","image","video","videoplay","audio","document","contact","location","list","button","poll","carousel"]},"folder":{"type":"string","description":"Nome da campanha de envio","example":"Campanha Janeiro"},"delayMin":{"type":"integer","description":"Delay minimo entre mensagens em segundos","minimum":1,"example":10},"delayMax":{"type":"integer","description":"Delay maximo entre mensagens em segundos","minimum":1,"example":30},"scheduled_for":{"type":"integer","description":"Timestamp em milissegundos ou minutos a partir de agora para agendamento","example":1706198400000},"info":{"type":"string","description":"Informacoes adicionais sobre a campanha"},"delay":{"type":"integer","description":"Delay fixo entre mensagens (opcional)"},"mentions":{"type":"string","description":"Mencoes na mensagem em formato JSON"},"text":{"type":"string","description":"Texto da mensagem"},"linkPreview":{"type":"boolean","description":"Habilitar preview de links em mensagens de texto. O preview sera gerado automaticamente a partir da URL contida no texto."},"linkPreviewTitle":{"type":"string","description":"Titulo personalizado para o preview do link (opcional)"},"linkPreviewDescription":{"type":"string","description":"Descricao personalizada para o preview do link (opcional)"},"linkPreviewImage":{"type":"string","description":"URL ou dados base64 da imagem para o preview do link (opcional)"},"linkPreviewLarge":{"type":"boolean","description":"Se deve usar preview grande ou pequeno (opcional, padrao false)"},"file":{"type":"string","description":"URL da midia ou arquivo (quando type e image, video, audio, document, etc.)"},"docName":{"type":"string","description":"Nome do arquivo (quando type e document)"},"fullName":{"type":"string","description":"Nome completo (quando type e contact)"},"phoneNumber":{"type":"string","description":"Numero do telefone (quando type e contact)"},"organization":{"type":"string","description":"Organizacao (quando type e contact)"},"email":{"type":"string","description":"Email (quando type e contact)"},"url":{"type":"string","description":"URL (quando type e contact)"},"latitude":{"type":"number","description":"Latitude (quando type e location)"},"longitude":{"type":"number","description":"Longitude (quando type e location)"},"name":{"type":"string","description":"Nome do local (quando type e location)"},"address":{"type":"string","description":"Endereco (quando type e location)"},"footerText":{"type":"string","description":"Texto do rodape (quando type e list, button, poll ou carousel)"},"buttonText":{"type":"string","description":"Texto do botao (quando type e list, button, poll ou carousel)"},"listButton":{"type":"string","description":"Texto do botao da lista (quando type e list)"},"selectableCount":{"type":"integer","description":"Quantidade de opcoes selecionaveis (quando type e poll)"},"choices":{"type":"array","items":{"type":"string"},"description":"Lista de opcoes (quando type e list, button, poll ou carousel). Para carousel, use formato especifico com [texto], {imagem} e botoes"},"imageButton":{"type":"string","description":"URL da imagem para o botao (quando type e button)"}}}}}}}},"responses":{"200":{"description":"campanha criada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"folder_id":{"type":"string","description":"ID unico da campanha criada"},"count":{"type":"integer","description":"Quantidade de mensagens agendadas"},"status":{"type":"string","description":"Status da operacao","example":"queued"}}}}}},"400":{"description":"Erro nos parametros da requisicao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"401":{"description":"Erro de autenticacao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"409":{"description":"Conflito - campanha ja existe","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostSenderSimple"}},"/provider/sender/advanced":{"post":{"tags":["Mensagem em massa"],"summary":"Criar envio em massa avancado","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nCria um novo envio em massa com configuracoes avancadas, permitindo definir\nmultiplos destinatarios e mensagens com delays personalizados.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"delayMin":{"type":"integer","description":"Delay minimo entre mensagens (segundos)","minimum":0,"example":3},"delayMax":{"type":"integer","description":"Delay maximo entre mensagens (segundos)","minimum":0,"example":6},"info":{"type":"string","description":"Descricao ou informacao sobre o envio em massa","example":"Campanha de lancamento"},"scheduled_for":{"type":"integer","description":"Timestamp em milissegundos (date unix) ou minutos a partir de agora para agendamento","example":1},"messages":{"type":"array","description":"Lista de mensagens a serem enviadas","items":{"type":"object","required":["number","type"],"properties":{"number":{"type":"string","description":"ID do chat ou numero do destinatario.","example":"5511999999999"},"type":{"type":"string","enum":["text","image","document","audio","ptt","myaudio","sticker","video","videoplay","contact","location","poll","list","button","carousel"],"description":"Tipo da mensagem:\n- text: Mensagem de texto\n- image: Imagem\n- document: Documento/arquivo\n- audio: Audio\n- ptt: Mensagem de voz\n- myaudio: Audio (opcao alternativa)\n- sticker: Figurinha\n- video: Video\n- videoplay: Video com autoplay/loop no WhatsApp\n- contact: Contato\n- location: Localizacao\n- poll: Enquete\n- list: Lista de opcoes\n- button: Botoes interativos\n- carousel: Carrossel de cartoes com imagens e botoes\n"},"text":{"type":"string","description":"Texto da mensagem (quando type e \"text\") ou legenda para midia"},"file":{"type":"string","description":"URL da midia (quando type e image, video, audio, document, etc)"},"docName":{"type":"string","description":"Nome do arquivo (quando type e document)"},"linkPreview":{"type":"boolean","description":"Se deve gerar preview de links (quando type e text). O preview sera gerado automaticamente a partir da URL contida no texto."},"linkPreviewTitle":{"type":"string","description":"Titulo personalizado para o preview do link (opcional)"},"linkPreviewDescription":{"type":"string","description":"Descricao personalizada para o preview do link (opcional)"},"linkPreviewImage":{"type":"string","description":"URL ou dados base64 da imagem para o preview do link (opcional)"},"linkPreviewLarge":{"type":"boolean","description":"Se deve usar preview grande ou pequeno (opcional, padrao false)"},"fullName":{"type":"string","description":"Nome completo (quando type e contact)"},"phoneNumber":{"type":"string","description":"Numero do telefone (quando type e contact)"},"organization":{"type":"string","description":"Organizacao (quando type e contact)"},"email":{"type":"string","description":"Email (quando type e contact)"},"url":{"type":"string","description":"URL (quando type e contact)"},"latitude":{"type":"number","description":"Latitude (quando type e location)"},"longitude":{"type":"number","description":"Longitude (quando type e location)"},"name":{"type":"string","description":"Nome do local (quando type e location)"},"address":{"type":"string","description":"Endereco (quando type e location)"},"footerText":{"type":"string","description":"Texto do rodape (quando type e list, button, poll ou carousel)"},"buttonText":{"type":"string","description":"Texto do botao (quando type e list, button, poll ou carousel)"},"listButton":{"type":"string","description":"Texto do botao da lista (quando type e list)"},"selectableCount":{"type":"integer","description":"Quantidade de opcoes selecionaveis (quando type e poll)"},"choices":{"type":"array","items":{"type":"string"},"description":"Lista de opcoes (quando type e list, button, poll ou carousel). Para carousel, use formato especifico com [texto], {imagem} e botoes"},"imageButton":{"type":"string","description":"URL da imagem para o botao (quando type e button)"}}}}},"required":["messages"],"example":{"delayMin":3,"delayMax":6,"info":"teste avancado","scheduled_for":1,"messages":[{"number":"5511999999999","type":"text","text":"First message"},{"number":"5511999999999","type":"button","text":"Promocao Especial!\nConfira nossas ofertas incriveis","footerText":"Valido ate 31/12/2024","imageButton":"https://exemplo.com/banner-promocao.jpg","choices":["Ver Ofertas|https://loja.exemplo.com/ofertas","Falar com Vendedor|reply:vendedor","Copiar Cupom|copy:PROMO2024"]},{"number":"5511999999999","type":"list","text":"Escolha sua categoria preferida:","listButton":"Ver Categorias","choices":["[Eletronicos]","Smartphones|eletronicos_smartphones","Notebooks|eletronicos_notebooks","[Roupas]","Camisetas|roupas_camisetas","Sapatos|roupas_sapatos"]},{"number":"5511999999999","type":"document","file":"https://example.com/doc.pdf","docName":"Documento.pdf"},{"number":"5511999999999","type":"carousel","text":"Conheca nossos produtos","choices":["[Smartphone XYZ\nO mais avancado smartphone da linha]","{https://exemplo.com/produto1.jpg}","Copiar Codigo|copy:PROD123","Ver no Site|https://exemplo.com/xyz","[Notebook ABC\nO notebook ideal para profissionais]","{https://exemplo.com/produto2.jpg}","Copiar Codigo|copy:NOTE456","Comprar Online|https://exemplo.com/abc"]}]}}}}}}},"responses":{"200":{"description":"Mensagens adicionadas a fila com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"folder_id":{"type":"string","description":"ID da pasta/lote criado"},"count":{"type":"integer","description":"Total de mensagens adicionadas a fila"},"status":{"type":"string","description":"Status da operacao","example":"queued"}}}}}},"400":{"description":"Erro nos parametros da requisicao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Descricao do erro","example":"Formato de numero invalido"}}}}}},"401":{"description":"Nao autorizado - token invalido ou ausente","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de erro","example":"Token invalido ou ausente"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Detalhes do erro interno"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostSenderAdvanced"}},"/provider/sender/edit":{"post":{"tags":["Mensagem em massa"],"summary":"Controlar campanha de envio em massa","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nPermite controlar campanhas de envio de mensagens em massa atraves de diferentes acoes:\n\n## Acoes Disponiveis:\n\n** stop** - Pausar campanha\n- Pausa uma campanha ativa ou agendada\n- Altera o status para \"paused\" \n- Use quando quiser interromper temporariamente o envio\n- Mensagens ja enviadas nao sao afetadas\n\n** continue** - Continuar campanha  \n- Retoma uma campanha pausada\n- Altera o status para \"scheduled\"\n- Use para continuar o envio apos pausar uma campanha\n- Nao funciona em campanhas ja concluidas (\"done\")\n\n** delete** - Deletar campanha\n- Remove completamente a campanha\n- Deleta apenas mensagens NAO ENVIADAS (status \"scheduled\")\n- Mensagens ja enviadas sao preservadas no historico\n- Operacao e executada de forma assincrona\n\n## Status de Campanhas:\n- **scheduled**: Agendada para envio\n- **sending**: Enviando mensagens  \n- **paused**: Pausada pelo usuario\n- **done**: Concluida (nao pode ser alterada)\n- **deleting**: Sendo deletada (operacao em andamento)\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"folder_id":{"type":"string","description":"Identificador unico da campanha de envio","example":"folder_123"},"action":{"type":"string","enum":["stop","continue","delete"],"description":"Acao a ser executada na campanha:\n- **stop**: Pausa a campanha (muda para status \"paused\")\n- **continue**: Retoma campanha pausada (muda para status \"scheduled\") \n- **delete**: Remove campanha e mensagens nao enviadas (assincrono)\n","example":"stop"}},"required":["folder_id","action"]}}}}}},"responses":{"200":{"description":"Acao realizada com sucesso","content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Resposta para acao 'stop'","properties":{"status":{"type":"string","enum":["paused"],"description":"Status da campanha apos pausar","example":"paused"}}},{"type":"object","title":"Resposta para acao 'continue'","properties":{"status":{"type":"string","enum":["scheduled"],"description":"Status da campanha apos retomar","example":"scheduled"},"message":{"type":"string","description":"Mensagem de confirmacao","example":"Folder resumed successfully"}}},{"type":"object","title":"Resposta para acao 'delete'","properties":{"status":{"type":"string","enum":["deleting"],"description":"Status indicando que a delecao foi iniciada","example":"deleting"},"message":{"type":"string","description":"Mensagem informando que a delecao e assincrona","example":"Folder deletion has been initiated"}}}]}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"folder_id is required"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostSenderEdit"}},"/provider/sender/cleardone":{"post":{"tags":["Mensagem em massa"],"summary":"Limpar mensagens enviadas","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nInicia processo de limpeza de mensagens antigas em lote que ja foram enviadas com sucesso. Por padrao, remove mensagens mais antigas que 7 dias.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":["instanceId"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"hours":{"type":"integer","description":"Quantidade de horas para manter mensagens. Mensagens mais antigas que esse valor serao removidas.","example":168,"default":168}}}}}}}},"responses":{"200":{"description":"Limpeza iniciada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","description":"Status da operacao","example":"cleanup started"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostSenderCleardone"}},"/provider/sender/clearall":{"delete":{"tags":["Mensagem em massa"],"summary":"Limpar toda fila de mensagens","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string. Esta operacao nao exige payload especifico.\n\nRemove todas as mensagens da fila de envio em massa, incluindo mensagens pendentes e ja enviadas.\nEsta e uma operacao irreversivel.\n","responses":{"200":{"description":"Fila de mensagens limpa com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","description":"Status da operacao","example":"processed"},"messages_deleted":{"type":"integer","description":"Quantidade de mensagens deletadas","example":150},"folders_deleted":{"type":"integer","description":"Quantidade de pastas deletadas","example":3}}}}}},"401":{"description":"Nao autorizado - token invalido ou ausente","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de erro","example":"Token invalido ou ausente"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Detalhes do erro interno"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":["instanceId"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","additionalProperties":true,"description":"Payload especifico da operacao, quando aplicavel."}}}}}},"operationId":"providerDeleteSenderClearall"}},"/provider/sender/listfolders":{"get":{"tags":["Mensagem em massa"],"summary":"Listar campanhas de envio","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nRetorna as campanhas de envio em massa da instancia atual, ordenadas das mais recentes\npara as mais antigas.\n\nSe a instancia nao possuir owner associado, a API retorna uma lista vazia.\n","parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"},{"in":"query","name":"status","schema":{"type":"string","enum":["Active","Archived"]},"description":"Filtro de status desejado. O backend atual retorna todas as pastas do owner e\npode ignorar esse parametro dependendo da implementacao da fila.\n"}],"responses":{"200":{"description":"Lista de campanhas retornada com sucesso","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MessageQueueFolder"}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to fetch batches: database error"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"operationId":"providerGetSenderListfolders"}},"/provider/sender/listmessages":{"post":{"tags":["Mensagem em massa"],"summary":"Listar mensagens de uma campanha","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nRetorna a lista de mensagens de uma campanha especifica, com opcoes de filtro por status e paginacao","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":["instanceId"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"folder_id":{"type":"string","description":"ID da campanha a ser consultada"},"messageStatus":{"type":"string","enum":["Scheduled","Sent","Failed"],"description":"Status das mensagens para filtrar"},"limit":{"type":"integer","minimum":1,"maximum":1000,"default":1000,"description":"Quantidade maxima de itens por pagina"},"offset":{"type":"integer","minimum":0,"default":0,"description":"Deslocamento base zero para paginacao"}},"required":["folder_id"]}}}}}},"responses":{"200":{"description":"Lista de mensagens retornada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"messages":{"type":"array","items":{"$ref":"#/components/schemas/Message"}},"pagination":{"type":"object","properties":{"totalRecords":{"type":"integer","description":"Total de mensagens encontradas"},"limit":{"type":"integer","description":"Limite aplicado na pagina atual"},"offset":{"type":"integer","description":"Offset efetivamente usado na pagina atual"}}}}}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"folder_id is required"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to fetch messages"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostSenderListmessages"}},"/provider/chat/block":{"post":{"summary":"Bloqueia ou desbloqueia contato do WhatsApp","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nBloqueia ou desbloqueia um contato do WhatsApp. Contatos bloqueados nao podem enviar mensagens \npara a instancia e a instancia nao pode enviar mensagens para eles.\n","tags":["Bloqueios"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"Numero do WhatsApp no formato internacional (ex. 5511999999999)","example":"5511999999999"},"block":{"type":"boolean","description":"True para bloquear, False para desbloquear","example":true}},"required":["number","block"]}}}}}},"responses":{"200":{"description":"Operacao realizada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","description":"Mensagem de confirmacao","example":"Blocked successfully"},"blockList":{"type":"array","description":"Lista atualizada de contatos bloqueados","items":{"type":"string"},"example":["5511999999999@s.whatsapp.net","5511888888888@s.whatsapp.net"]}}}}}},"401":{"description":"Nao autorizado - token invalido"},"404":{"description":"Contato nao encontrado"},"500":{"description":"Erro do servidor ao processar a requisicao"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostChatBlock"}},"/provider/chat/blocklist":{"get":{"summary":"Lista contatos bloqueados","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nRetorna a lista completa de contatos que foram bloqueados pela instancia.\nEsta lista e atualizada em tempo real conforme contatos sao bloqueados/desbloqueados.\n","tags":["Bloqueios"],"responses":{"200":{"description":"Lista de contatos bloqueados recuperada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"blockList":{"type":"array","items":{"type":"string","description":"JIDs dos contatos bloqueados no formato \"numero@s.whatsapp.net\""},"example":["5511999999999@s.whatsapp.net","5511888888888@s.whatsapp.net"]}}}}}},"401":{"description":"Token invalido ou nao fornecido"},"500":{"description":"Erro interno do servidor ou instancia nao conectada"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"}],"operationId":"providerGetChatBlocklist"}},"/provider/chat/labels":{"post":{"summary":"Gerencia labels de um chat","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAtualiza as labels associadas a um chat especifico. Este endpoint oferece tres modos de operacao:\n\n1. **Definir todas as labels** (labelids): Define o conjunto completo de labels para o chat, substituindo labels existentes\n2. **Adicionar uma label** (add_labelid): Adiciona uma unica label ao chat sem afetar as existentes\n3. **Remover uma label** (remove_labelid): Remove uma unica label do chat sem afetar as outras\n\n**Importante**: Use apenas um dos tres parametros por requisicao. Labels inexistentes serao rejeitadas.\n\nAs labels devem ser fornecidas no formato id ou labelid encontradas na funcao get labels.\n","tags":["Etiquetas"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"Numero do chat ou grupo","example":"5511999999999"},"labelids":{"type":"array","items":{"type":"string"},"description":"Lista de IDs das labels a serem aplicadas ao chat (define todas as labels)","example":["10","20"]},"add_labelid":{"type":"string","description":"ID da label a ser adicionada ao chat","example":"10"},"remove_labelid":{"type":"string","description":"ID da label a ser removida do chat","example":"20"}},"required":["number"],"oneOf":[{"required":["labelids"]},{"required":["add_labelid"]},{"required":["remove_labelid"]}]}}}}}},"responses":{"200":{"description":"Labels atualizadas com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","description":"Mensagem de confirmacao"},"editions":{"type":"array","items":{"type":"string"},"description":"Lista de operacoes realizadas (apenas para operacao labelids)"}}},"examples":{"definir_todas_labels":{"summary":"Resposta para definir todas as labels","value":{"response":"Labels updated successfully","editions":["Added label 10 to chat","Added label 20 to chat","Removed label 5 from chat"]}},"adicionar_label":{"summary":"Resposta para adicionar uma label","value":{"response":"Label added to chat"}},"remover_label":{"summary":"Resposta para remover uma label","value":{"response":"Label removed from chat"}}}}}},"400":{"description":"Erro na requisicao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Use only one operation: labelids, add_labelid, or remove_labelid"}}}}}},"404":{"description":"Chat nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Chat not found"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostChatLabels"}},"/provider/chat/delete":{"post":{"summary":"Deleta chat","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nDeleta ou limpa um chat e/ou suas mensagens do WhatsApp e/ou banco de dados.\nVoce pode escolher:\n- Deletar o chat do WhatsApp\n- Limpar a conversa no WhatsApp\n- Deletar o chat do banco de dados\n- Deletar apenas as mensagens do banco de dados\n- Qualquer combinacao das opcoes acima\nObservacao:\n- Se clearChatWhatsApp e deleteChatWhatsApp forem true, o clear tem prioridade.\n","tags":["Chats"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"Numero do chat no formato internacional.\nPara grupos use o ID completo do grupo.\n","example":"5511999999999"},"deleteChatDB":{"type":"boolean","description":"Se true, deleta o chat do banco de dados","default":false,"example":true},"deleteMessagesDB":{"type":"boolean","description":"Se true, deleta todas as mensagens do chat do banco de dados","default":false,"example":true},"deleteChatWhatsApp":{"type":"boolean","description":"Se true, deleta o chat do WhatsApp.\nPara grupos, esta operacao nao e permitida e o chat sera apenas limpo.\n","default":false,"example":true},"clearChatWhatsApp":{"type":"boolean","description":"Se true, limpa a conversa do chat no WhatsApp (sem sair do chat).\nFunciona para grupos e conversas individuais.\n","default":false,"example":true}},"required":["number"]}}}}}},"responses":{"200":{"description":"Operacao realizada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","description":"Mensagem de sucesso","example":"Chat deletion process completed"},"actions":{"type":"array","description":"Lista de acoes realizadas","items":{"type":"string"},"example":["Chat deleted from WhatsApp","Chat deleted from database","Messages associated with chat deleted from database: 42"]},"errors":{"type":"array","description":"Lista de erros ocorridos, se houver","items":{"type":"string"},"example":["Error deleting chat from WhatsApp: connection timeout"]}}}}}},"400":{"description":"Erro nos parametros da requisicao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Missing number in payload"}}}}}},"401":{"description":"Token invalido ou nao fornecido"},"404":{"description":"Chat nao encontrado"},"500":{"description":"Erro interno do servidor"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostChatDelete"}},"/provider/chat/archive":{"post":{"summary":"Arquivar/desarquivar chat","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAltera o estado de arquivamento de um chat do WhatsApp.\n- Quando arquivado, o chat e movido para a secao de arquivados no WhatsApp\n- A acao e sincronizada entre todos os dispositivos conectados\n- Nao afeta as mensagens ou o conteudo do chat\n","tags":["Chats"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["number","archive"],"properties":{"number":{"type":"string","description":"Numero do telefone (formato E.164) ou ID do grupo","example":"5511999999999"},"archive":{"type":"boolean","description":"true para arquivar, false para desarquivar","example":true}}}}}}}},"responses":{"200":{"description":"Chat arquivado/desarquivado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Chat updated successfully"}}}}}},"400":{"description":"Dados da requisicao invalidos","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid phone number format"}}}}}},"401":{"description":"Token de autenticacao ausente ou invalido"},"500":{"description":"Erro ao executar a operacao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Error archiving chat"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostChatArchive"}},"/provider/chat/ephemeral":{"post":{"summary":"Configurar mensagens temporarias em chat privado","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nDefine o temporizador de mensagens temporarias (disappearing messages) de um chat privado.\n\nValores aceitos para a duracao:\n- `0` ou `off` para desativar\n- `1d`\n- `7d`\n- `90d`\n\nObservacoes:\n- este endpoint e apenas para chats privados\n- se o identificador informado for de grupo, a API retorna erro orientando usar `/group/ephemeral`\n- a resposta tambem atualiza o `wa_ephemeralExpiration` do chat no cache local\n","tags":["Chats"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["number","duration"],"properties":{"number":{"type":"string","description":"Identificador do chat privado","example":"5511999999999@s.whatsapp.net"},"duration":{"oneOf":[{"type":"string"},{"type":"integer"}],"description":"Duracao desejada para mensagens temporarias","example":"7d"}}}}}}}},"responses":{"200":{"description":"Temporizador atualizado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Ephemeral timer updated successfully"},"chat":{"$ref":"#/components/schemas/Chat"},"ephemeral":{"type":"object","properties":{"enabled":{"type":"boolean","example":true},"seconds":{"type":"integer","format":"int64","example":604800},"label":{"type":"string","example":"7d"}}}}},"examples":{"sucesso":{"summary":"Timer atualizado","value":{"response":"Ephemeral timer updated successfully","chat":{"wa_chatid":"5511999999999@s.whatsapp.net","wa_ephemeralExpiration":604800,"wa_isGroup":false},"ephemeral":{"enabled":true,"seconds":604800,"label":"7d"}}}}}}},"400":{"description":"Payload invalido, chat invalido ou duracao nao suportada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid duration. Allowed values: 0, off, 1d, 7d, 90d"}}}}}},"401":{"description":"Token invalido ou ausente"},"500":{"description":"Erro interno ao atualizar o temporizador","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Error updating chat ephemeral timer: connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostChatEphemeral"}},"/provider/chat/read":{"post":{"summary":"Marcar chat como lido/nao lido","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAtualiza o status de leitura de um chat no WhatsApp.\n\nQuando um chat e marcado como lido:\n- O contador de mensagens nao lidas e zerado\n- O indicador visual de mensagens nao lidas e removido\n- O remetente recebe confirmacao de leitura (se ativado)\n\nQuando marcado como nao lido:\n- O chat aparece como pendente de leitura\n- Nao afeta as confirmacoes de leitura ja enviadas\n","tags":["Chats"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["number","read"],"properties":{"number":{"type":"string","description":"Identificador do chat no formato:\n- Para usuarios: [numero]@s.whatsapp.net (ex: 5511999999999@s.whatsapp.net)\n- Para grupos: [id-grupo]@g.us (ex: 123456789-987654321@g.us)\n","example":"5511999999999@s.whatsapp.net"},"read":{"type":"boolean","description":"- true: marca o chat como lido\n- false: marca o chat como nao lido\n"}}}}}}}},"responses":{"200":{"description":"Status de leitura atualizado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Chat read status updated successfully"}}}}}},"401":{"description":"Token de autenticacao ausente ou invalido"},"404":{"description":"Chat nao encontrado"},"500":{"description":"Erro ao atualizar status de leitura"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostChatRead"}},"/provider/chat/mute":{"post":{"summary":"Silenciar chat","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nSilencia notificacoes de um chat por um periodo especifico. \nAs opcoes de silenciamento sao:\n* 0 - Remove o silenciamento\n* 8 - Silencia por 8 horas\n* 168 - Silencia por 1 semana (168 horas)\n* -1 - Silencia permanentemente\n","tags":["Chats"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["number","muteEndTime"],"properties":{"number":{"type":"string","description":"ID do chat no formato 123456789@s.whatsapp.net ou 123456789-123456@g.us","example":"5511999999999@s.whatsapp.net"},"muteEndTime":{"type":"integer","description":"Duracao do silenciamento:\n* 0 = Remove silenciamento\n* 8 = Silencia por 8 horas\n* 168 = Silencia por 1 semana\n* -1 = Silencia permanentemente\n","enum":[0,8,168,-1],"example":8}}}}}}}},"responses":{"200":{"description":"Chat silenciado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Chat mute settings updated successfully"}}}}}},"400":{"description":"Duracao invalida ou formato de numero incorreto"},"401":{"description":"Token invalido ou ausente"},"404":{"description":"Chat nao encontrado"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostChatMute"}},"/provider/chat/pin":{"post":{"summary":"Fixar/desafixar chat","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nFixa ou desafixa um chat no topo da lista de conversas. Chats fixados permanecem \nno topo mesmo quando novas mensagens sao recebidas em outros chats.\n","tags":["Chats"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"Numero do chat no formato internacional completo (ex: \"5511999999999\") \nou ID do grupo (ex: \"123456789-123456@g.us\")\n","example":"5511999999999"},"pin":{"type":"boolean","description":"Define se o chat deve ser fixado (true) ou desafixado (false)\n","example":true}},"required":["number","pin"]}}}}}},"responses":{"200":{"description":"Chat fixado/desafixado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","description":"Mensagem de confirmacao","example":"Chat pinned"}}}}}},"400":{"description":"Erro na requisicao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Descricao do erro","example":"Could not parse phone"}}}}}},"401":{"description":"Nao autorizado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de erro de autenticacao","example":"Invalid token"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostChatPin"}},"/provider/chat/find":{"post":{"summary":"Busca chats com filtros","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nBusca chats com diversos filtros e ordenacao. Suporta filtros em todos os campos do chat, \npaginacao e ordenacao customizada.\n\nOperadores de filtro:\n- `~` : LIKE (contem)\n- `!~` : NOT LIKE (nao contem)\n- `!=` : diferente\n- `>=` : maior ou igual\n- `>` : maior que\n- `<=` : menor ou igual\n- `<` : menor que\n- Sem operador: LIKE (contem)\n","tags":["Chats"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"operator":{"type":"string","enum":["AND","OR"],"default":"AND","description":"Operador logico entre os filtros"},"sort":{"type":"string","description":"Campo para ordenacao (+/-campo). Ex -wa_lastMsgTimestamp"},"limit":{"type":"integer","description":"Quantidade maxima de resultados a retornar","default":20},"offset":{"type":"integer","description":"Numero de registros a pular (para paginacao)","default":0},"wa_fastid":{"type":"string"},"wa_chatid":{"type":"string"},"wa_archived":{"type":"boolean"},"wa_contactName":{"type":"string"},"wa_name":{"type":"string"},"name":{"type":"string"},"wa_isBlocked":{"type":"boolean"},"wa_isGroup":{"type":"boolean"},"wa_isGroup_admin":{"type":"boolean"},"wa_isGroup_announce":{"type":"boolean"},"wa_isGroup_member":{"type":"boolean"},"wa_isPinned":{"type":"boolean"},"wa_label":{"type":"string","description":"ID da label aplicada ao chat. Use o valor retornado por `/labels`, nao o nome da etiqueta."},"wa_notes":{"type":"string"},"lead_tags":{"type":"string"},"lead_isTicketOpen":{"type":"boolean"},"lead_assignedAttendant_id":{"type":"string"},"lead_status":{"type":"string"}},"example":{"operator":"AND","sort":"-wa_lastMsgTimestamp","limit":50,"offset":0,"wa_isGroup":true,"lead_status":"~novo","wa_label":"10","wa_notes":"~vip"}}}}}}},"responses":{"200":{"description":"Lista de chats encontrados","content":{"application/json":{"schema":{"type":"object","properties":{"chats":{"type":"array","items":{"$ref":"#/components/schemas/Chat"}},"totalChatsStats":{"type":"object","description":"Contadores totais de chats"},"pagination":{"type":"object","properties":{"totalRecords":{"type":"integer","description":"Total de registros encontrados"},"limit":{"type":"integer","description":"Limite aplicado na busca"},"offset":{"type":"integer","description":"Offset usado para recuperar os resultados"}}}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostChatFind"}},"/provider/chat/notes":{"post":{"tags":["Chats"],"summary":"Consultar notas internas do chat","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nRetorna `wa_notes` de um chat usando apenas os dados ja persistidos localmente.\n\nCasos de uso:\n- ler a anotacao local ja persistida no chat\n- consultar notas mesmo durante reconexao da sessao do WhatsApp\n\nRegras:\n- envie `number`\n- para recarregar do WhatsApp, use `/chat/notes/refresh`\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"JID completo do chat","example":"5511999999999@s.whatsapp.net"}}}}}}}},"responses":{"200":{"description":"Nota do chat retornada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"chat":{"$ref":"#/components/schemas/Chat"},"wa_notes":{"type":"string","description":"Conteudo atual da nota do chat","example":"Cliente prefere contato no periodo da tarde"},"source":{"type":"string","description":"Origem usada para compor a resposta","enum":["local"],"example":"local"}}},"examples":{"sucesso_local":{"value":{"chat":{"wa_fastid":"admin:5511999999999","wa_chatid":"5511999999999@s.whatsapp.net","wa_notes":"Cliente prefere contato no periodo da tarde"},"wa_notes":"Cliente prefere contato no periodo da tarde","source":"local"}}}}}},"400":{"description":"Payload invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"number is required"}}}}}},"404":{"description":"Chat nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"chat not found"}}}}}},"500":{"description":"Erro interno ao consultar a nota local","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"failed to load chat notes from local database"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostChatNotes"}},"/provider/chat/notes/refresh":{"post":{"tags":["Chats"],"summary":"Recarregar notas internas do chat no WhatsApp","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nFaz uma nova leitura das notas internas do chat no WhatsApp antes de retornar o valor atualizado.\n\nUso recomendado:\n- tente primeiro com `force=false`\n- se isso nao atualizar a nota corretamente, tente `force=true`\n- use `force=true` apenas como tentativa de correcao, porque ele faz uma recarga mais pesada\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"JID completo do chat","example":"5511999999999@s.whatsapp.net"},"force":{"type":"boolean","description":"Tente primeiro com `false`.\nUse `true` apenas quando a recarga padrao nao funcionar bem,\npois esse modo faz uma nova leitura mais completa das notas.\n","default":false,"example":false}}}}}}}},"responses":{"200":{"description":"Nota do chat recarregada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"chat":{"$ref":"#/components/schemas/Chat"},"wa_notes":{"type":"string","description":"Conteudo atual da nota do chat","example":"Cliente prefere contato no periodo da tarde"},"source":{"type":"string","description":"Origem usada para compor a resposta","enum":["appstate_reload"],"example":"appstate_reload"}}}}}},"400":{"description":"Payload invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"number is required"}}}}}},"404":{"description":"Chat nao encontrado apos o reload","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"chat not found"}}}}}},"409":{"description":"O reload nao pode ser executado porque o history sync inicial ainda esta em andamento","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"history sync still in progress, try again in a moment"}}}}}},"500":{"description":"Erro interno ao recarregar a nota","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"failed to fetch regular_low app state: connection closed"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostChatNotesRefresh"}},"/provider/chat/notes/edit":{"post":{"tags":["Chats"],"summary":"Editar notas internas do chat","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAtualiza `wa_notes` de um chat via app state do WhatsApp e persiste o resultado localmente.\n\nRegras:\n- envie `number`\n- envie `notes` como campo principal\n- envie string vazia para limpar a nota do chat\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"JID completo do chat","example":"5511999999999@s.whatsapp.net"},"notes":{"type":"string","description":"Conteudo da nota a persistir no chat","example":"Cliente prefere contato no periodo da tarde"}}}}}}}},"responses":{"200":{"description":"Nota atualizada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","example":"Chat notes updated"},"chat":{"$ref":"#/components/schemas/Chat"},"wa_notes":{"type":"string","description":"Conteudo atual da nota apos a atualizacao","example":"Cliente prefere contato no periodo da tarde"},"source":{"type":"string","description":"Origem da atualizacao","enum":["api"],"example":"api"}}}}}},"400":{"description":"Payload invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"notes is required"}}}}}},"404":{"description":"Chat nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"chat not found"}}}}}},"409":{"description":"A edicao nao pode ser executada porque o history sync inicial ainda esta em andamento","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"history sync still in progress, try again in a moment"}}}}}},"500":{"description":"Erro interno ao atualizar a nota","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"error editing chat notes: client is not connected"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostChatNotesEdit"}},"/provider/chat/editLead":{"post":{"summary":"Edita informacoes de lead","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAtualiza as informacoes de lead associadas a um chat. Permite modificar status do ticket, \natribuicao de atendente, posicao no kanban, tags e outros campos customizados.\n\nAs alteracoes sao refletidas imediatamente no banco de dados e disparam eventos webhook/SSE\npara manter a aplicacao sincronizada.\n","tags":["CRM"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["id"],"properties":{"id":{"type":"string","description":"Identificador do chat. Pode ser:\n- wa_chatid (ex: \"5511999999999@s.whatsapp.net\")\n- wa_fastid (ex: \"5511888888888:5511999999999\")\n","example":"5511999999999@s.whatsapp.net"},"chatbot_disableUntil":{"type":"integer","format":"int64","description":"Timestamp UTC ate quando o chatbot deve ficar desativado para este chat.\nUse 0 para reativar imediatamente.\n","example":1735686000},"lead_isTicketOpen":{"type":"boolean","description":"Status do ticket associado ao lead.\n- true: Ticket esta aberto/em atendimento\n- false: Ticket esta fechado/resolvido\n","example":true},"lead_assignedAttendant_id":{"type":"string","description":"ID do atendente atribuido ao lead.\nUse string vazia (\"\") para remover a atribuicao.\n","example":"att_123456"},"lead_kanbanOrder":{"type":"integer","format":"int64","description":"Posicao do card no quadro kanban.\nValores maiores aparecem primeiro.\n","example":1000},"lead_tags":{"type":"array","items":{"type":"string"},"description":"Lista de tags associadas ao lead.\nTags inexistentes sao criadas automaticamente.\nEnvie array vazio ([]) para remover todas as tags.\n","example":["vip","suporte","prioridade-alta"]},"lead_name":{"type":"string","description":"Nome principal do lead","example":"Joao Silva"},"lead_fullName":{"type":"string","description":"Nome completo do lead","example":"Joao Silva Pereira"},"lead_email":{"type":"string","format":"email","description":"Email do lead","example":"joao@exemplo.com"},"lead_personalid":{"type":"string","description":"Documento de identificacao (CPF/CNPJ)\nApenas numeros ou formatado\n","example":"123.456.789-00"},"lead_status":{"type":"string","description":"Status do lead no funil de vendas","example":"qualificado"},"lead_notes":{"type":"string","description":"Anotacoes sobre o lead","example":"Cliente interessado em plano premium"},"lead_field01":{"type":"string","description":"Campo personalizado 1"},"lead_field02":{"type":"string","description":"Campo personalizado 2"},"lead_field03":{"type":"string","description":"Campo personalizado 3"},"lead_field04":{"type":"string","description":"Campo personalizado 4"},"lead_field05":{"type":"string","description":"Campo personalizado 5"},"lead_field06":{"type":"string","description":"Campo personalizado 6"},"lead_field07":{"type":"string","description":"Campo personalizado 7"},"lead_field08":{"type":"string","description":"Campo personalizado 8"},"lead_field09":{"type":"string","description":"Campo personalizado 9"},"lead_field10":{"type":"string","description":"Campo personalizado 10"},"lead_field11":{"type":"string","description":"Campo personalizado 11"},"lead_field12":{"type":"string","description":"Campo personalizado 12"},"lead_field13":{"type":"string","description":"Campo personalizado 13"},"lead_field14":{"type":"string","description":"Campo personalizado 14"},"lead_field15":{"type":"string","description":"Campo personalizado 15"},"lead_field16":{"type":"string","description":"Campo personalizado 16"},"lead_field17":{"type":"string","description":"Campo personalizado 17"},"lead_field18":{"type":"string","description":"Campo personalizado 18"},"lead_field19":{"type":"string","description":"Campo personalizado 19"},"lead_field20":{"type":"string","description":"Campo personalizado 20"}}}}}}}},"responses":{"200":{"description":"Lead atualizado com sucesso","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Chat"},"example":{"wa_fastid":"5511888888888:5511999999999","wa_chatid":"5511999999999@s.whatsapp.net","lead_name":"Joao Silva","lead_status":"qualificado","lead_tags":["vip","suporte"],"lead_isTicketOpen":true,"lead_assignedAttendant_id":"att_123456"}}}},"400":{"description":"Payload invalido"},"404":{"description":"Chat nao encontrado"},"500":{"description":"Erro interno do servidor"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostChatEditLead"}},"/provider/contacts":{"get":{"tags":["Contatos"],"summary":"Retorna lista de contatos do WhatsApp","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nRetorna a lista de contatos do WhatsApp conforme o filtro informado em `contactScope`.\n\nO endpoint realiza:\n- Busca todos os contatos armazenados\n- Filtra para contatos da agenda, fora da agenda ou todos\n- Usa `address_book` como padrao quando `contactScope` nao for informado\n- Retorna dados formatados incluindo JID e informacoes de nome\n","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"},{"in":"query","name":"contactScope","required":false,"schema":{"type":"string","enum":["address_book","outside_address_book","all"],"default":"address_book"},"description":"Define se a busca retorna apenas contatos da agenda, apenas fora da agenda ou todos os contatos conhecidos."}],"responses":{"200":{"description":"Lista de contatos retornada com sucesso","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"jid":{"type":"string","description":"ID unico do contato no WhatsApp (formato: numero@s.whatsapp.net)","example":"5511999999999@s.whatsapp.net"},"contact_name":{"type":"string","description":"Nome completo do contato","example":"Contato Exemplo"},"contact_FirstName":{"type":"string","description":"Primeiro nome do contato","example":"Contato"}},"example":{"jid":"5511999999999@s.whatsapp.net","contact_name":"Contato Exemplo","contact_FirstName":"Contato"}}}}}},"401":{"description":"Sem sessao ativa","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"No session"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Internal server error"}}}}}}},"operationId":"providerGetContacts"}},"/provider/contacts/list":{"post":{"tags":["Contatos"],"summary":"Listar todos os contatos com paginacao","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nRetorna uma lista paginada de contatos da conta do WhatsApp atualmente conectada.\nUse este endpoint (POST) para controlar `limit` e `offset` via corpo da requisicao.\nO campo `contactScope` permite escolher entre contatos da agenda, fora da agenda ou todos os contatos conhecidos.\nA rota GET `/contacts` continua disponivel para quem prefere a lista completa sem paginacao.\n","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"limit":{"type":"integer","description":"Quantidade maxima de resultados por pagina (padrao 100, maximo 1000)","default":100},"offset":{"type":"integer","description":"Deslocamento base zero para paginacao","default":0},"contactScope":{"type":"string","description":"Define se a busca retorna apenas contatos da agenda, apenas fora da agenda ou todos os contatos conhecidos.","enum":["address_book","outside_address_book","all"],"default":"address_book"}}}}}}}},"responses":{"200":{"description":"Lista de contatos recuperada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"contacts":{"type":"array","items":{"type":"object","properties":{"jid":{"type":"string","description":"ID unico do contato no WhatsApp (formato: numero@s.whatsapp.net)","example":"5511999999999@s.whatsapp.net"},"contact_name":{"type":"string","description":"Nome completo do contato (quando salvo)","example":"Joao Silva"},"contact_FirstName":{"type":"string","description":"Primeiro nome do contato","example":"Joao"}}}},"totalDeviceContacts":{"type":"integer","description":"Total bruto de contatos no dispositivo"},"pagination":{"type":"object","properties":{"totalRecords":{"type":"integer","description":"Total de contatos apos filtragem"},"limit":{"type":"integer","description":"Limite aplicado na pagina atual"},"offset":{"type":"integer","description":"Offset efetivamente usado na pagina atual"}}}}}}}},"401":{"description":"Token nao fornecido ou invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"No session"}}}}}},"500":{"description":"Erro interno do servidor ao recuperar contatos","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem detalhando o erro encontrado"}}}}}}},"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostContactsList"}},"/provider/contact/add":{"post":{"tags":["Contatos"],"summary":"Adiciona um contato a agenda","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAdiciona um novo contato a agenda do celular.\n\nO endpoint realiza:\n- Adiciona o contato a agenda usando o WhatsApp\n- Usa o campo 'name' tanto para o nome completo quanto para o primeiro nome\n- Salva as informacoes do contato na agenda do WhatsApp\n- Retorna informacoes do contato adicionado\n","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["number","name"],"properties":{"number":{"type":"string","description":"Numero de telefone no formato internacional com codigo do pais obrigatorio. \nPara Brasil, deve comecar com 55. Aceita variacoes com/sem simbolo +, \ncom/sem parenteses, com/sem hifen e com/sem espacos. Tambem aceita formato \nJID do WhatsApp (@s.whatsapp.net). Nao aceita contatos comerciais (@lid) \nnem grupos (@g.us).\n","examples":["+55 (21) 99999-9999","+55 21 99999-9999","+55 21 999999999","+5521999999999","5521999999999","5521999999999@s.whatsapp.net"]},"name":{"type":"string","description":"Nome completo do contato (sera usado como primeiro nome e nome completo)","example":"Joao Silva"}}}}}}}},"responses":{"200":{"description":"Contato adicionado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Contato adicionado com sucesso"},"contact":{"type":"object","properties":{"jid":{"type":"string","description":"ID unico do contato no WhatsApp (formato: numero@s.whatsapp.net)","example":"5511999999999@s.whatsapp.net"},"name":{"type":"string","description":"Nome completo do contato","example":"Joao Silva"},"phone":{"type":"string","description":"Numero de telefone","example":"5511999999999"}}}}}}}},"400":{"description":"Dados invalidos na requisicao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Numero invalido"}}}}}},"401":{"description":"Sem sessao ativa","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"No session"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Erro ao adicionar contato"}}}}}}},"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostContactAdd"}},"/provider/contact/remove":{"post":{"tags":["Contatos"],"summary":"Remove um contato da agenda","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nRemove um contato da agenda do celular.\n\nO endpoint realiza:\n- Remove o contato da agenda usando o WhatsApp AppState\n- Atualiza a lista de contatos sincronizada\n- Retorna confirmacao da remocao\n","security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["number"],"properties":{"number":{"type":"string","description":"Numero de telefone no formato internacional com codigo do pais obrigatorio. \nPara Brasil, deve comecar com 55. Aceita variacoes com/sem simbolo +, \ncom/sem parenteses, com/sem hifen e com/sem espacos. Tambem aceita formato \nJID do WhatsApp (@s.whatsapp.net). Nao aceita contatos comerciais (@lid) \nnem grupos (@g.us).\n","examples":["+55 (21) 99999-9999","+55 21 99999-9999","+55 21 999999999","+5521999999999","5521999999999","5521999999999@s.whatsapp.net"]}}}}}}}},"responses":{"200":{"description":"Contato removido com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","example":"Contato removido com sucesso"},"removed_contact":{"type":"object","properties":{"jid":{"type":"string","description":"ID unico do contato no WhatsApp (formato: numero@s.whatsapp.net)","example":"5511999999999@s.whatsapp.net"},"phone":{"type":"string","description":"Numero de telefone removido","example":"5511999999999"}}}}}}}},"400":{"description":"Dados invalidos na requisicao","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Numero invalido"}}}}}},"401":{"description":"Sem sessao ativa","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"No session"}}}}}},"404":{"description":"Contato nao encontrado","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Contato nao encontrado na agenda"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Erro ao remover contato"}}}}}}},"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostContactRemove"}},"/provider/chat/details":{"post":{"tags":["Contatos"],"summary":"Obter Detalhes Completos","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nRetorna informacoes **completas** sobre um contato ou chat, incluindo **todos os campos disponiveis** do modelo Chat.\n\n### Funcionalidades:\n- **Retorna chat completo**: Todos os campos do modelo Chat (mais de 60 campos)\n- **Busca informacoes para contatos individuais e grupos**\n- **URLs de imagem em dois tamanhos**: preview (menor) ou full (original)\n- **Combina informacoes de diferentes fontes**: WhatsApp, contatos salvos, leads\n- **Atualiza automaticamente dados desatualizados** no banco\n\n### Campos Retornados:\n- **Informacoes basicas**: id, wa_fastid, wa_chatid, owner, name, phone\n- **Dados do WhatsApp**: wa_name, wa_contactName, wa_archived, wa_isBlocked, etc.\n- **Dados de lead/CRM**: lead_name, lead_email, lead_status, lead_field01-20, etc.\n- **Informacoes de grupo**: wa_isGroup, wa_isGroup_admin, wa_isGroup_announce, etc.\n- **Chatbot**: chatbot_summary, chatbot_lastTrigger_id, chatbot_disableUntil, etc.\n- **Configuracoes**: wa_muteEndTime, wa_isPinned, wa_unreadCount, etc.\n\n**Comportamento**:\n- Para contatos individuais:\n  - Busca nome verificado do WhatsApp\n  - Verifica nome salvo nos contatos\n  - Formata numero internacional\n  - Calcula grupos em comum\n- Para grupos:\n  - Busca nome do grupo\n  - Verifica status de comunidade\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"Numero do telefone ou ID do grupo","example":"5511999999999"},"preview":{"type":"boolean","description":"Controla o tamanho da imagem de perfil retornada:\n- `true`: Retorna imagem em tamanho preview (menor, otimizada para listagens)\n- `false` (padrao): Retorna imagem em tamanho full (resolucao original, maior qualidade)\n","default":false}},"required":["number"]}}}}}},"responses":{"200":{"description":"Informacoes completas do chat retornadas com sucesso","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Chat"},{"type":"object","properties":{"common_groups":{"type":"string","description":"Grupos em comum separados por virgula, formato: nome_grupo(id_grupo)","example":"Grupo Familia(120363123456789012@g.us),Trabalho(987654321098765432@g.us)"},"imagePreview":{"type":"string","description":"URL da imagem de perfil em tamanho preview (menor) - apenas se preview=true"},"image":{"type":"string","description":"URL da imagem de perfil em tamanho full (resolucao original) - apenas se preview=false"}}}]},"examples":{"contact_example":{"summary":"Contato individual","description":"Exemplo de resposta para um contato individual","value":{"id":"r1a2b3c4d5e6f7","wa_fastid":"admin:5511999999999","wa_chatid":"5511999999999@s.whatsapp.net","wa_name":"Joao Silva","name":"Joao Silva","phone":"+55 11 99999-9999","owner":"admin","wa_archived":false,"wa_isBlocked":false,"wa_isGroup":false,"lead_name":"Joao","lead_fullName":"Joao Silva","lead_email":"joao@exemplo.com","lead_status":"ativo","wa_contactName":"Joao Silva","common_groups":"Grupo Familia(120363123456789012@g.us),Trabalho(987654321098765432@g.us)","image":"https://pps.whatsapp.net/v/t61.24694-24/12345_image.jpg"}},"group_example":{"summary":"Grupo","description":"Exemplo de resposta para um grupo","value":{"id":"r9z8y7x6w5v4u3","wa_fastid":"admin:120363123456789012@g.us","wa_chatid":"120363123456789012@g.us","wa_name":"Grupo Familia","name":"Grupo Familia","phone":"","owner":"admin","wa_archived":false,"wa_isBlocked":false,"wa_isGroup":true,"wa_isGroup_admin":true,"wa_isGroup_announce":false,"wa_isGroup_community":false,"wa_isGroup_member":true,"image":"https://pps.whatsapp.net/v/t61.24694-24/67890_group.jpg"}}}}}},"400":{"description":"Payload invalido ou numero invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Invalid request payload"}}}}}},"401":{"description":"Token nao fornecido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Unauthorized"}}}}}},"500":{"description":"Erro interno do servidor ou sessao nao iniciada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"No session"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostChatDetails"}},"/provider/chat/check":{"post":{"tags":["Contatos"],"summary":"Verificar Numeros no WhatsApp","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nVerifica se numeros fornecidos estao registrados no WhatsApp e retorna informacoes detalhadas.\n\n### Funcionalidades:\n- Verifica multiplos numeros simultaneamente\n- Suporta numeros individuais e IDs de grupo\n- Retorna nome verificado quando disponivel\n- Identifica grupos e comunidades\n- Verifica subgrupos de comunidades\n\n**Comportamento especifico**:\n- Para numeros individuais:\n  - Verifica registro no WhatsApp\n  - Retorna nome verificado se disponivel\n  - Normaliza formato do numero\n- Para grupos:\n  - Verifica existencia\n  - Retorna nome do grupo\n  - Retorna id do grupo de anuncios se buscado por id de comunidade\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"numbers":{"type":"array","items":{"type":"string"},"description":"Lista de numeros ou IDs de grupo para verificar","example":["5511999999999","123456789@g.us"]}}}}}}}},"responses":{"200":{"description":"Resultado da verificacao","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"query":{"type":"string","description":"Numero/ID original consultado"},"jid":{"type":"string","description":"JID do WhatsApp"},"lid":{"type":"string","description":"LID do WhatsApp"},"isInWhatsapp":{"type":"boolean","description":"Indica se esta no WhatsApp"},"verifiedName":{"type":"string","description":"Nome verificado se disponivel"},"groupName":{"type":"string","description":"Nome do grupo se aplicavel"},"error":{"type":"string","description":"Mensagem de erro se houver"}}}}}}},"400":{"description":"Payload invalido ou sem numeros","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Missing numbers in payload"}}}}}},"401":{"description":"Sem sessao ativa","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"No active session"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"WhatsApp client is not connected"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostChatCheck"}},"/provider/label/edit":{"post":{"tags":["Etiquetas"],"summary":"Criar, editar ou deletar etiqueta","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nCria, edita ou deleta uma etiqueta da instancia.\n\nRegras de uso:\n- Para editar uma etiqueta existente, envie o `labelid` real da etiqueta.\n- Para criar uma nova etiqueta, envie `labelid: \"new\"` com `delete: false`.\n  O backend ira gerar o proximo `labelid` numerico disponivel para a instancia.\n- Para deletar uma etiqueta existente, envie o `labelid` real com `delete: true`.\n\nObservacoes:\n- A resposta de sucesso retorna `\"Label created\"` para criacao e `\"Label edited\"` para edicao.\n- Para descobrir o `labelid` final criado, consulte `GET /labels` apos a operacao\n  ou consuma o webhook/evento de labels da instancia.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"labelid":{"type":"string","description":"ID da etiqueta.\n\nUse o ID real para editar/deletar uma etiqueta existente.\nUse `\"new\"` para criar uma nova etiqueta quando `delete` for `false`.\n","example":"25"},"name":{"type":"string","description":"Novo nome da etiqueta","example":"responder editado"},"color":{"type":"integer","description":"Codigo numerico da nova cor (0-19)","minimum":0,"maximum":19,"example":2},"delete":{"type":"boolean","description":"Indica se a etiqueta deve ser deletada","example":false}},"required":["labelid"]}}}}}},"responses":{"200":{"description":"Operacao concluida com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","enum":["Label created","Label edited"],"example":"Label edited"}}},"examples":{"created":{"summary":"Resposta ao criar uma etiqueta","value":{"response":"Label created"}},"edited":{"summary":"Resposta ao editar uma etiqueta","value":{"response":"Label edited"}}}}}},"400":{"description":"Payload invalido","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"invalid payload"}}}}}},"500":{"description":"Erro interno do servidor ou sessao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"error editing label"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostLabelEdit"}},"/provider/labels":{"get":{"tags":["Etiquetas"],"summary":"Buscar todas as etiquetas","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nRetorna a lista completa de etiquetas da instancia.\n","responses":{"200":{"description":"Lista de etiquetas retornada com sucesso","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Label"}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"Failed to fetch labels from database"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"}],"operationId":"providerGetLabels"}},"/provider/labels/refresh":{"post":{"tags":["Etiquetas"],"summary":"Iniciar recarga de etiquetas do WhatsApp","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nInicia uma nova leitura das etiquetas no WhatsApp em background.\nA resposta confirma apenas que a recarga foi iniciada ou que ja existe uma recarga em andamento.\nPara obter a lista atualizada, consulte `GET /labels` depois.\n\nEfeitos no backend:\n- a recarga tambem processa associacoes de etiquetas sincronizadas do WhatsApp\n- chats existentes podem ter o campo `wa_label` atualizado com as etiquetas corretas\n- quando uma associacao de etiqueta muda apos a sincronizacao do historico, o webhook `chat_labels` pode ser enviado com os dados completos do chat\n\nUso recomendado:\n- tente primeiro com `force=false`\n- se isso nao trouxer as etiquetas corretamente, tente `force=true`\n- use `force=true` apenas como tentativa de correcao, porque ele faz uma recarga mais pesada\n","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","required":["instanceId"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"force":{"type":"boolean","default":false,"description":"Tente primeiro com `false`.\nUse `true` apenas quando a recarga padrao nao funcionar bem,\npois esse modo faz uma nova leitura mais completa das etiquetas.\n","example":false}}}}}}}},"responses":{"202":{"description":"Recarga de etiquetas aceita para processamento em background","content":{"application/json":{"schema":{"type":"object","required":["success","status","message","force","fullSync"],"properties":{"success":{"type":"boolean","example":true},"status":{"type":"string","enum":["started","in_progress"],"example":"started"},"message":{"type":"string","example":"Label refresh started. Use GET /labels to fetch the refreshed list."},"force":{"type":"boolean","example":false},"fullSync":{"type":"boolean","example":false}}}}}},"409":{"description":"A recarga nao pode ser executada porque a sincronizacao do historico ainda esta em andamento","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"history sync still in progress, try again in a moment"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","example":"failed to reload labels from WhatsApp"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostLabelsRefresh"}},"/provider/quickreply/edit":{"post":{"tags":["Respostas Rapidas"],"summary":"Criar, atualizar ou excluir resposta rapida","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nGerencia templates de respostas rapidas para agilizar o atendimento. Por padrao, cria respostas rapidas locais.\nPara criar/sincronizar uma resposta rapida no WhatsApp Business, envie `onWhatsApp: true`.\n\n- Para criar: nao inclua o campo `id`\n- Para atualizar: inclua o `id` existente\n- Para excluir: defina `delete: true` e inclua o `id`\n\nObservacao: respostas rapidas sincronizadas com o WhatsApp suportam apenas `type: text`.\nNao e possivel converter uma resposta rapida local existente em resposta do WhatsApp; para criar no WhatsApp, envie `onWhatsApp: true` sem `id`.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","required":["shortCut","type"],"properties":{"id":{"type":"string","description":"Necessario para atualizacoes/exclusoes, omitir para criacao","example":"rb9da9c03637452"},"delete":{"type":"boolean","description":"Definir como true para excluir o template","default":false},"onWhatsApp":{"type":"boolean","description":"Quando true, cria/sincroniza a resposta rapida no WhatsApp Business via app state. Disponivel apenas para type=text.","default":false},"shortCut":{"type":"string","description":"Atalho para acesso rapido ao template","example":"saudacao1"},"type":{"type":"string","enum":["text","audio","myaudio","ptt","document","video","image"],"description":"Tipo da mensagem"},"text":{"type":"string","description":"Obrigatorio para mensagens do tipo texto","example":"Ola! Como posso ajudar hoje?"},"file":{"type":"string","description":"URL ou Base64 para tipos de midia","example":"https://exemplo.com/arquivo.pdf"},"docName":{"type":"string","description":"Nome do arquivo opcional para tipo documento","example":"apresentacao.pdf"}}}}}}}},"responses":{"200":{"description":"Operacao concluida com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","example":"Operacao concluida com sucesso"},"quickReplies":{"type":"array","items":{"$ref":"#/components/schemas/QuickReply"}}}}}}},"400":{"description":"Requisicao invalida (erro de validacao)"},"404":{"description":"Template nao encontrado"},"500":{"description":"Erro no servidor ou falha ao sincronizar com WhatsApp"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostQuickreplyEdit"}},"/provider/quickreply/showall":{"get":{"tags":["Respostas Rapidas"],"summary":"Listar todas as respostas rapidas","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nRetorna todas as respostas rapidas cadastradas para a instancia autenticada","responses":{"200":{"description":"Lista de respostas rapidas","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/QuickReply"}}}}},"500":{"description":"Erro no servidor"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"}],"operationId":"providerGetQuickreplyShowall"}},"/provider/call/make":{"post":{"tags":["Chamadas"],"summary":"Iniciar chamada de voz","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nInicia uma chamada de voz para um contato especifico. Este endpoint permite:\n1. Iniciar chamadas de voz para contatos\n2. Funciona apenas com numeros validos do WhatsApp\n3. O contato recebera uma chamada de voz\n\n**Nota**: O telefone do contato tocara normalmente, mas ao contato atender, ele nao ouvira nada, e voce tambem nao ouvira nada. \nEste endpoint apenas inicia a chamada, nao estabelece uma comunicacao de voz real.\n\n**Opcional**: Use `call_duration` para definir por quantos segundos a chamada deve tocar.\nApos esse periodo a chamada e encerrada automaticamente, sem precisar chamar `/call/reject`.\n\nExemplo de requisicao:\n```json\n{\n  \"number\": \"5511999999999\",\n  \"call_duration\": 15\n}\n```\n\nExemplo de resposta:\n```json\n{\n  \"response\": \"Call successful\"\n}\n```\n\nErros comuns:\n- 401: Chave invalida ou expirada\n- 400: Numero invalido ou ausente\n- 500: Erro ao iniciar chamada\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"number":{"type":"string","description":"Numero do contato no formato internacional (ex: 5511999999999)","example":"5511999999999"},"call_duration":{"type":"integer","description":"Duracao da chamada em segundos (opcional). Apos esse tempo a chamada e encerrada automaticamente.","example":15}},"required":["number"]}}}}}},"responses":{"200":{"description":"Chamada iniciada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","description":"Mensagem de confirmacao","example":"Call successful"}}}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Descricao do erro"}}},"examples":{"missing_number":{"summary":"Numero nao informado","value":{"error":"missing number in payload"}},"invalid_number":{"summary":"Numero invalido","value":{"error":"invalid number JID"}},"invalid_duration":{"summary":"Duracao invalida","value":{"error":"invalid call_duration"}}}}}},"401":{"description":"Chave invalida ou expirada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Descricao do erro de autenticacao","example":"client not found"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Descricao do erro interno","example":"error making call: network timeout"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostCallMake"}},"/provider/call/reject":{"post":{"tags":["Chamadas"],"summary":"Rejeitar chamada recebida","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nRejeita uma chamada recebida do WhatsApp.\n\nO body pode ser enviado vazio `{}`. Os campos `number` e `id` sao opcionais e podem ser usados para especificar uma chamada especifica.\n\nExemplo de requisicao (recomendado):\n```json\n{}\n```\n\nExemplo de requisicao com campos opcionais:\n```json\n{\n  \"number\": \"5511999999999\",\n  \"id\": \"ABEiGmo8oqkAcAKrBYQAAAAA_1\"\n}\n```\n\nExemplo de resposta:\n```json\n{\n  \"response\": \"Call rejected\"\n}\n```\n\nErros comuns:\n- 401: Chave invalida ou expirada\n- 400: Numero invalido\n- 500: Erro ao rejeitar chamada\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","example":{},"properties":{"number":{"type":"string","description":"(Opcional) Numero do contato no formato internacional (ex: 5511999999999)"},"id":{"type":"string","description":"(Opcional) ID unico da chamada a ser rejeitada"}}}}}}}},"responses":{"200":{"description":"Chamada rejeitada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","description":"Mensagem de confirmacao","example":"Call rejected"}}}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Descricao do erro","examples":["invalid number"]}}}}}},"401":{"description":"Chave invalida ou expirada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Descricao do erro de autenticacao","example":"client not found"}}}}}},"500":{"description":"Erro interno do servidor","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Descricao do erro interno","example":"error rejecting call: timeout"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostCallReject"}},"/provider/chatwoot/config":{"get":{"tags":["Integracao Chatwoot"],"summary":"Obter configuracao do Chatwoot","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nRetorna a configuracao atual da integracao com Chatwoot para a instancia.\n\n### Funcionalidades:\n- Retorna todas as configuracoes do Chatwoot incluindo credenciais\n- Mostra status de habilitacao da integracao\n- Util para verificar configuracoes atuais antes de fazer alteracoes\n","responses":{"200":{"description":"Configuracao obtida com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"chatwoot_enabled":{"type":"boolean","description":"Se a integracao com Chatwoot esta habilitada","example":true},"chatwoot_url":{"type":"string","description":"URL base da instancia Chatwoot","example":"https://app.chatwoot.com"},"chatwoot_account_id":{"type":"integer","format":"int64","description":"ID da conta no Chatwoot","example":1},"chatwoot_inbox_id":{"type":"integer","format":"int64","description":"ID da inbox no Chatwoot","example":5},"chatwoot_access_token":{"type":"string","description":"Token de acesso da API Chatwoot","example":"pXXGHHHyJPYHYgWHJHYHgJjj"},"chatwoot_ignore_groups":{"type":"boolean","description":"Se deve ignorar mensagens de grupos na sincronizacao","example":false},"chatwoot_sign_messages":{"type":"boolean","description":"Se deve assinar mensagens enviadas para o WhatsApp","example":true},"chatwoot_create_new_conversation":{"type":"boolean","description":"Sempre criar nova conversa ao inves de reutilizar conversas existentes","example":false}}}}}},"401":{"description":"Chave invalida ou expirada"},"500":{"description":"Erro interno do servidor"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"}],"operationId":"providerGetChatwootConfig"},"put":{"tags":["Integracao Chatwoot"],"summary":"Atualizar configuracao do Chatwoot","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAtualiza a configuracao da integracao com Chatwoot para a instancia.\n\n### Funcionalidades:\n- Configura todos os parametros da integracao Chatwoot\n- Reinicializa automaticamente o cliente Chatwoot quando habilitado\n- Retorna URL do webhook para configurar no Chatwoot\n- Sincronizacao bidirecional de mensagens novas entre WhatsApp e Chatwoot\n- Sincronizacao automatica de contatos (nome e telefone)\n- Atualizacao automatica LID  PN (Local ID para Phone Number)\n- Sistema de nomes inteligentes com til (~)\n\n### Configuracao no Chatwoot:\n1. Apos configurar via API, use a URL retornada no webhook settings da inbox no Chatwoot\n2. Configure como webhook URL na sua inbox do Chatwoot\n3. A integracao ficara ativa e sincronizara mensagens e contatos automaticamente\n\n###  Sistema de Nomes Inteligentes:\n- **Nomes com til (~)**: Sao atualizados automaticamente quando o contato modifica seu nome no WhatsApp\n- **Nomes especificos**: Para definir um nome fixo, remova o til (~) do nome no Chatwoot\n- **Exemplo**: \"~Joao Silva\" sera atualizado automaticamente, \"Joao Silva\" (sem til) permanecera fixo\n- **Atualizacao LIDPN**: Contatos migram automaticamente de Local ID para Phone Number quando disponivel\n- **Sem duplicacao**: Durante a migracao LIDPN, nao havera duplicacao de conversas\n- **Respostas nativas**: Todas as respostas dos agentes aparecem nativamente no Chatwoot\n\n###  AVISO IMPORTANTE - INTEGRACAO BETA:\n- **Fase Beta**: Esta integracao esta em fase de desenvolvimento e testes\n- **Uso por conta e risco**: O usuario assume total responsabilidade pelo uso\n- **Recomendacao**: Teste em ambiente nao-produtivo antes de usar em producao\n- **Suporte limitado**: Funcionalidades podem mudar sem aviso previo\n\n###  Limitacoes Conhecidas:\n- **Sincronizacao de historico**: Nao implementada - apenas mensagens novas sao sincronizadas\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Habilitar/desabilitar integracao com Chatwoot","example":true},"url":{"type":"string","description":"URL base da instancia Chatwoot (sem barra final)","example":"https://app.chatwoot.com"},"access_token":{"type":"string","description":"Token de acesso da API Chatwoot (obtido em Profile Settings > Access Token)","example":"pXXGHHHyJPYHYgWHJHYHgJjj"},"account_id":{"type":"integer","format":"int64","description":"ID da conta no Chatwoot (visivel na URL da conta)","example":1},"inbox_id":{"type":"integer","format":"int64","description":"ID da inbox no Chatwoot (obtido nas configuracoes da inbox)","example":5},"ignore_groups":{"type":"boolean","description":"Ignorar mensagens de grupos do WhatsApp na sincronizacao","example":false},"sign_messages":{"type":"boolean","description":"Assinar mensagens enviadas para WhatsApp com identificacao do agente","example":true},"create_new_conversation":{"type":"boolean","description":"Sempre criar nova conversa ao inves de reutilizar conversas existentes","example":false}},"required":["enabled","url","access_token","account_id","inbox_id"]}}}}}},"responses":{"200":{"description":"Configuracao atualizada com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string","description":"Mensagem de confirmacao","example":"Chatwoot config updated successfully, put this URL in Chatwoot inbox webhook settings:"},"chatwoot_inbox_webhook_url":{"type":"string","description":"URL do webhook para configurar na inbox do Chatwoot","example":"https://sua-api.com/chatwoot/webhook/inst_abc123"}}}}}},"400":{"description":"Dados invalidos no body da requisicao"},"401":{"description":"Chave invalida ou expirada"},"500":{"description":"Erro interno ao salvar configuracao"}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPutChatwootConfig"}},"/provider/business/get/profile":{"post":{"tags":["Business"],"summary":"Obter o perfil comercial","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nRetorna o perfil comercial da conta do WhatsApp Business atualmente conectada.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"jid":{"type":"string","description":"JID do perfil comercial a consultar","example":"5511999999999@s.whatsapp.net"}}}}}}}},"responses":{"200":{"description":"Perfil comercial recuperado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","description":"Dados do perfil comercial","properties":{"tag":{"type":"string","description":"A tag do perfil comercial."},"description":{"type":"string","description":"A descricao do perfil comercial."},"address":{"type":"string","description":"O endereco do perfil comercial."},"email":{"type":"string","description":"O email do perfil comercial."},"websites":{"type":"array","items":{"type":"string"},"description":"Os websites do perfil comercial."},"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"localized_display_name":{"type":"string"}}},"description":"As categorias do perfil comercial."}}}}}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de erro de validacao do payload ou do JID","example":"invalid payload"}}}}}},"401":{"description":"Chave invalida ou expirada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de erro de autenticacao","example":"client not found"}}}}}},"500":{"description":"Erro interno do servidor ao recuperar o perfil comercial","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem detalhando o erro encontrado"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostBusinessGetProfile"}},"/provider/business/get/categories":{"get":{"tags":["Business"],"summary":"Obter as categorias de negocios","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId como query string.\n\nRetorna as categorias de negocios disponiveis.\n","responses":{"200":{"description":"Categorias de negocios recuperadas com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"array","description":"Lista de categorias de negocios","items":{"type":"object","properties":{"id":{"type":"string"},"localized_display_name":{"type":"string"}}}}}}}}},"401":{"description":"Chave invalida ou expirada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de erro de autenticacao","example":"client not found"}}}}}},"500":{"description":"Erro interno do servidor ao recuperar as categorias de negocios","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem detalhando o erro encontrado"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":true,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Obrigatorio em chamadas GET.","example":"ch-api-atendimento-01"}],"operationId":"providerGetBusinessGetCategories"}},"/provider/business/update/profile":{"post":{"tags":["Business"],"summary":"Atualizar o perfil comercial","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nAtualiza os dados do perfil comercial da conta do WhatsApp Business atualmente conectada.\nTodos os campos sao opcionais; apenas os enviados serao atualizados.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"description":{"type":"string","description":"Nova descricao do perfil comercial.","example":"Loja de eletronicos e acessorios"},"address":{"type":"string","description":"Novo endereco do perfil comercial.","example":"Rua das Flores, 123 - Centro"},"email":{"type":"string","description":"Novo email do perfil comercial.","example":"contato@empresa.com"}}}}}}}},"responses":{"200":{"description":"Todos os campos enviados foram atualizados","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","description":"Resultado por campo"},"updated":{"type":"integer","description":"Total de campos atualizados","example":3},"failed":{"type":"integer","description":"Total de campos que falharam","example":0}}},"examples":{"sucesso_todos":{"summary":"Todos os campos atualizados","value":{"response":{"description":{"status":"updated"},"address":{"status":"updated"},"email":{"status":"updated"}},"updated":3,"failed":0}}}}}},"207":{"description":"Sucesso parcial  ao menos um campo falhou","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","description":"Resultado por campo"},"updated":{"type":"integer","example":1},"failed":{"type":"integer","example":1}}},"examples":{"parcial":{"summary":"Falha em um dos campos","value":{"response":{"description":{"status":"updated"},"address":{"status":"error","error":"upstream unavailable"}},"updated":1,"failed":1}}}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de erro de validacao"}}},"examples":{"payload_invalido":{"value":{"error":"invalid payload"}},"campo_obrigatorio":{"value":{"error":"at least one field (description, address, email) is required"}}}}}},"401":{"description":"Chave invalida ou expirada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de autenticacao","example":"client not found"}}}}}},"500":{"description":"Falha total  nenhum campo foi atualizado","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","description":"Resultado por campo"},"updated":{"type":"integer","example":0},"failed":{"type":"integer","example":3}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostBusinessUpdateProfile"}},"/provider/business/catalog/list":{"post":{"tags":["Business"],"summary":"Listar os produtos do catalogo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nLista uma pagina de produtos do catalogo de um perfil comercial no WhatsApp.\n\nObservacoes:\n- envie apenas `jid` para buscar a primeira pagina\n- a paginacao publica usa o campo `after`\n- copie exatamente o valor retornado em `response.Paging.After` e envie na proxima chamada\n- o valor de `after` e um token opaco: nao tente decodificar ou modificar\n- a integracao atual retorna ate 10 produtos por chamada\n- o retorno espelha as structs atuais da camada `whatsmeow`, entao os campos de `response` usam nomes em maiusculas (`Products`, `Paging`, etc.)\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"jid":{"type":"string","description":"JID do catalogo a consultar","example":"5511999999999@s.whatsapp.net"},"after":{"type":"string","description":"Token da proxima pagina. Use exatamente o valor retornado em `response.Paging.After`.","example":"Q1VSU09SX1BST1hJTUFfUEFHSU5B"}},"required":["jid"]}}}}}},"responses":{"200":{"description":"Produtos do catalogo recuperados com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","description":"Pagina atual do catalogo retornada pelo WhatsApp.","properties":{"JID":{"type":"object","description":"JID do catalogo consultado, serializado pela struct atual do backend.","properties":{"User":{"type":"string","example":"5511999999999"},"RawAgent":{"type":"integer","example":0},"Device":{"type":"integer","example":0},"Integrator":{"type":"integer","example":0},"Server":{"type":"string","example":"s.whatsapp.net"}}},"CartEnabled":{"type":"boolean","description":"Indica se o carrinho do catalogo esta habilitado.","example":false},"Source":{"type":"string","description":"Origem do catalogo retornada pelo WhatsApp.","example":""},"Products":{"type":"array","description":"Lista de produtos da pagina atual.","items":{"type":"object","properties":{"ID":{"type":"string","example":"1234567890"},"Name":{"type":"string","example":"Produto Exemplo"},"Description":{"type":"string","example":"Descricao do produto"},"Price":{"type":"object","nullable":true,"properties":{"Amount":{"type":"string","example":"1990"},"Currency":{"type":"string","example":"BRL"}}},"SalePrice":{"type":"string","example":""},"RetailerID":{"type":"string","example":"sku-123"},"Url":{"type":"string","example":"https://exemplo.com/produto"},"Availability":{"type":"string","example":"in stock"},"IsHidden":{"type":"boolean","example":false},"StatusInfo":{"type":"object","properties":{"Status":{"type":"string","example":"active"},"CanAppeal":{"type":"boolean","example":false}}},"MaxAvailable":{"type":"integer","example":10},"ImageFetchStatus":{"type":"string","example":"success"},"Images":{"type":"array","items":{"type":"object","properties":{"ID":{"type":"string","example":"img-1"},"OriginalDimensions":{"type":"object","properties":{"Height":{"type":"integer","example":720},"Width":{"type":"integer","example":720}}},"RequestImageUrl":{"type":"string","example":"https://mmg.whatsapp.net/v/t62.7118-24/..."},"OriginalImageUrl":{"type":"string","example":"https://lookaside.whatsapp.net/..."}}}}}}},"Paging":{"type":"object","description":"Cursores de paginacao retornados pelo WhatsApp.","properties":{"Before":{"type":"string","example":""},"After":{"type":"string","example":"Q1VSU09SX1BST1hJTUFfUEFHSU5B"}}}}}}},"examples":{"sucesso":{"value":{"response":{"JID":{"User":"5511999999999","RawAgent":0,"Device":0,"Integrator":0,"Server":"s.whatsapp.net"},"CartEnabled":false,"Source":"","Products":[{"ID":"1234567890","Name":"Produto Exemplo","Description":"Descricao do produto","Price":{"Amount":"1990","Currency":"BRL"},"SalePrice":"","RetailerID":"sku-123","Url":"https://exemplo.com/produto","Availability":"in stock","IsHidden":false,"StatusInfo":{"Status":"active","CanAppeal":false},"MaxAvailable":10,"ImageFetchStatus":"success","Images":[{"ID":"img-1","OriginalDimensions":{"Height":720,"Width":720},"RequestImageUrl":"https://mmg.whatsapp.net/v/t62.7118-24/...","OriginalImageUrl":"https://lookaside.whatsapp.net/..."}]}],"Paging":{"Before":"","After":"Q1VSU09SX1BST1hJTUFfUEFHSU5B"}}}}}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de erro de validacao do payload ou JID","example":"invalid payload"}}}}}},"401":{"description":"Chave invalida ou expirada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de erro de autenticacao","example":"client not found"}}}}}},"500":{"description":"Erro interno do servidor ao recuperar os produtos do catalogo","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem detalhando o erro encontrado"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostBusinessCatalogList"}},"/provider/business/catalog/info":{"post":{"tags":["Business"],"summary":"Obter informacoes de um produto do catalogo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nRetorna as informacoes de um produto especifico do catalogo.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"jid":{"type":"string","description":"JID do catalogo a consultar","example":"5511999999999@s.whatsapp.net"},"id":{"type":"string","description":"O ID do produto."}},"required":["jid","id"]}}}}}},"responses":{"200":{"description":"Informacoes do produto recuperadas com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"object","description":"Informacoes do produto","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"price":{"type":"string"},"currency":{"type":"string"}}}}}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de erro de validacao do payload ou JID","example":"invalid payload"}}}}}},"401":{"description":"Chave invalida ou expirada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de erro de autenticacao","example":"client not found"}}}}}},"500":{"description":"Erro interno do servidor ao recuperar as informacoes do produto","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem detalhando o erro encontrado"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostBusinessCatalogInfo"}},"/provider/business/catalog/delete":{"post":{"tags":["Business"],"summary":"Deletar um produto do catalogo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nDeleta um produto especifico do catalogo.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","description":"O ID do produto."}},"required":["id"]}}}}}},"responses":{"200":{"description":"Produto deletado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","description":"Mensagem de sucesso.","example":"Deleted product"}}}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de erro de validacao do payload","example":"invalid payload"}}}}}},"401":{"description":"Chave invalida ou expirada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de erro de autenticacao","example":"client not found"}}}}}},"500":{"description":"Erro interno do servidor ao deletar o produto","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem detalhando o erro encontrado"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostBusinessCatalogDelete"}},"/provider/business/catalog/show":{"post":{"tags":["Business"],"summary":"Mostrar um produto do catalogo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nMostra um produto especifico do catalogo.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","description":"O ID do produto."}},"required":["id"]}}}}}},"responses":{"200":{"description":"Produto mostrado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","description":"Mensagem de sucesso.","example":"Product shown"}}}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de erro de validacao do payload","example":"invalid payload"}}}}}},"401":{"description":"Chave invalida ou expirada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de erro de autenticacao","example":"client not found"}}}}}},"500":{"description":"Erro interno do servidor ao mostrar o produto","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem detalhando o erro encontrado"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostBusinessCatalogShow"}},"/provider/business/catalog/hide":{"post":{"tags":["Business"],"summary":"Ocultar um produto do catalogo","description":"Rota avancada exposta pela ConnectyHub. A autenticacao e feita pela chave ConnectyHub; a plataforma localiza a instancia pelo instanceId e aplica as permissoes do cliente antes de encaminhar a operacao.\n\nEnvie instanceId no corpo ou query string e coloque os campos especificos da operacao dentro de payload.\n\nOculta um produto especifico do catalogo.\n","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["instanceId","payload"],"properties":{"instanceId":{"type":"string","description":"ID publico da instancia ConnectyHub.","example":"ch-api-atendimento-01"},"payload":{"type":"object","properties":{"id":{"type":"string","description":"O ID do produto."}},"required":["id"]}}}}}},"responses":{"200":{"description":"Produto ocultado com sucesso","content":{"application/json":{"schema":{"type":"object","properties":{"response":{"type":"string","description":"Mensagem de sucesso.","example":"Product hidden"}}}}}},"400":{"description":"Requisicao invalida","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de erro de validacao do payload","example":"invalid payload"}}}}}},"401":{"description":"Chave invalida ou expirada","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem de erro de autenticacao","example":"client not found"}}}}}},"500":{"description":"Erro interno do servidor ao ocultar o produto","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string","description":"Mensagem detalhando o erro encontrado"}}}}}}},"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"parameters":[{"name":"instanceId","in":"query","required":false,"schema":{"type":"string"},"description":"ID publico da instancia ConnectyHub. Em metodos com body, tambem pode ser enviado no corpo.","example":"ch-api-atendimento-01"}],"operationId":"providerPostBusinessCatalogHide"}}},"x-connectyhub-uazapi-coverage":{"source":{"title":"uazapiGO - WhatsApp API","version":"2.1.1"},"counts":{"sourcePaths":132,"nativePaths":17,"providerProxyPaths":125,"intentionallyBlockedPaths":7,"unexpectedMissingPaths":0,"providerMethodGaps":0},"nativePromotionRoadmap":[{"group":"message-actions","priority":"P1","sourcePaths":["/message/history-sync","/message/download","/message/markread","/message/react","/message/delete","/message/edit","/message/pin"],"reason":"High-value customer workflows currently require provider proxy payloads instead of stable ConnectyHub contracts."},{"group":"chat-operations","priority":"P1","sourcePaths":["/chat/read","/chat/archive","/chat/mute","/chat/pin","/chat/block","/chat/labels","/chat/notes","/chat/notes/edit"],"reason":"Common inbox and CRM operations should be first-class ConnectyHub resources."},{"group":"groups","priority":"P2","sourcePaths":["/group/create","/group/list","/group/info","/group/updateParticipants","/group/updateDescription","/group/updateImage"],"reason":"Group support unlocks communities and team operations while preserving tenant permissions."},{"group":"sender-campaigns","priority":"P2","sourcePaths":["/sender/simple","/sender/advanced","/sender/listfolders","/sender/listmessages","/sender/cleardone"],"reason":"Campaign execution needs ConnectyHub billing, rate limits, audit logs and safer UX."},{"group":"newsletters","priority":"P3","sourcePaths":["/newsletter/list","/newsletter/messages","/newsletter/updates","/newsletter/search","/newsletter/follow","/newsletter/mute"],"reason":"Channels are valuable after core inbox and campaign operations are stable."},{"group":"business-catalog","priority":"P3","sourcePaths":["/business/get/profile","/business/update/profile","/business/catalog/list","/business/catalog/info","/business/catalog/show","/business/catalog/hide"],"reason":"Catalog APIs should be aligned with ConnectyHub product/catalog data before broad exposure."}],"intentionallyBlockedPaths":[{"path":"/instance/create","methods":["POST"],"reason":"Use POST /instances. Raw provider creation requires admintoken and bypasses ConnectyHub ownership, billing and webhook setup."},{"path":"/instance/all","methods":["GET"],"reason":"Use GET /instances or admin-only internal inventory. Raw provider listing exposes instances across tenants."},{"path":"/instance/updateAdminFields","methods":["POST"],"reason":"Provider admin metadata is platform-owned and must not be writable by customer API keys."},{"path":"/globalwebhook","methods":["GET","POST"],"reason":"ConnectyHub exposes tenant-scoped /webhooks instead of provider-global webhooks."},{"path":"/globalwebhook/errors","methods":["GET"],"reason":"Use /webhooks/deliveries for tenant-scoped delivery diagnostics."},{"path":"/admin/restart","methods":["POST"],"reason":"Provider process control is platform-only."},{"path":"/admin/token/rotate","methods":["POST"],"reason":"Provider admin-token rotation is platform-only."}],"unexpectedMissingPaths":[],"providerMethodGaps":[]}}