{
  "openapi": "3.1.0",
  "info": {
    "title": "Wafly — Managed WhatsApp API",
    "version": "1.0.0",
    "description": "Managed WhatsApp API connected by QR code. Send messages through REST, receive webhooks and operate multiple instances. Instance credentials are created in the dashboard.",
    "contact": {
      "name": "Suporte Wafly",
      "url": "https://wafly.io/api-docs"
    }
  },
  "servers": [
    {
      "url": "https://wafly.io",
      "description": "Produção"
    }
  ],
  "paths": {
    "/api-managment/external/instances": {
      "post": {
        "operationId": "partner-create-instance",
        "summary": "Criar instância (parceiro)",
        "description": "Cria uma instância trial de 3 dias no fluxo parceiro. Requer Client-Token de um usuário com isPartner=true. Não usa JWT.\n\nExclusivo para contas parceiras (isPartner=true).\n\nUse o Client-Token disponível em Segurança no painel Wafly.\n\nA instância é provisionada no resource manager (pods + fila), diferente do POST /instances/create do bridge.",
        "tags": [
          "Parceiros"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "receivedCallbackUrl": {
                    "type": "string",
                    "description": "Webhook de mensagens recebidas.",
                    "example": "https://seu-sistema.com/webhook/received"
                  },
                  "deliveryCallbackUrl": {
                    "type": "string",
                    "description": "Webhook de entrega de mensagens.",
                    "example": "https://seu-sistema.com/webhook/delivery"
                  },
                  "disconnectedCallbackUrl": {
                    "type": "string",
                    "description": "Webhook de desconexão.",
                    "example": "https://seu-sistema.com/webhook/disconnected"
                  },
                  "messageStatusCallbackUrl": {
                    "type": "string",
                    "description": "Webhook de status de mensagem.",
                    "example": "https://seu-sistema.com/webhook/status"
                  }
                }
              },
              "example": {
                "receivedCallbackUrl": "https://seu-sistema.com/webhook/received",
                "deliveryCallbackUrl": "https://seu-sistema.com/webhook/delivery",
                "disconnectedCallbackUrl": "https://seu-sistema.com/webhook/disconnected",
                "messageStatusCallbackUrl": "https://seu-sistema.com/webhook/status"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "id": "EE1922ABCDEF",
                  "instance": "EE1922ABCDEF",
                  "token": "abc123...",
                  "statusInstance": "TRIAL",
                  "isTrial": true,
                  "billingStatus": "trial",
                  "expirationTime": 1710000000000
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/status": {
      "get": {
        "operationId": "get-status",
        "summary": "Status da sessão",
        "description": "Retorna o estado atual da conexão da instância.\n\nValores possíveis: INITIALIZING | CONNECTED | CLOSED | QRCODE\n\nQRCODE = aguardando escaneamento; CONNECTED = ativo; CLOSED = desconectado.",
        "tags": [
          "Instância"
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": "CONNECTED"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/qr-code/image": {
      "get": {
        "operationId": "get-qr-code",
        "summary": "QR Code para conexão",
        "description": "Retorna o QR Code em base64 para autenticar o WhatsApp.\n\nSe a instância já estiver conectada, retorna { \"value\": \"connected\" }.",
        "tags": [
          "Instância"
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": "data:image/png;base64,iVBORw0KGgo..."
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/passkey-challenge": {
      "get": {
        "operationId": "passkey-challenge",
        "summary": "Desafio de passkey (WebAuthn)",
        "description": "Para contas do WhatsApp protegidas por passkey: após o QR ser escaneado, retorna o desafio WebAuthn que o navegador do dono da conta deve assinar.\n\nFluxo recomendado: use o botão \"Conectar com passkey\" na página da instância do painel, com a extensão Wafly Passkey Connector instalada — ela executa a assinatura automaticamente.\n\nA assinatura só pode ser feita numa página de origem whatsapp.com (regra do WebAuthn) — por isso a extensão é necessária.",
        "tags": [
          "Instância"
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/passkey-response": {
      "post": {
        "operationId": "passkey-response",
        "summary": "Enviar assinatura de passkey",
        "description": "Recebe a assertion WebAuthn assinada no navegador do dono da conta e conclui o pareamento no WhatsApp.\n\nEnvie o JSON da assertion EXATAMENTE como gerado pelo navegador (credential.toJSON(), base64url sem padding) — não reserializar.\n\nUse Content-Type: text/plain para preservar o corpo verbatim.\n\nO desafio é de uso único e o QR renova a cada ~20s: escaneie o QR e envie a assinatura em seguida (pode precisar de 1-2 tentativas).",
        "tags": [
          "Instância"
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "accepted": true,
                  "message": "assertion encaminhada ao WhatsApp"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/phone-exists-batch": {
      "post": {
        "operationId": "phone-exists-batch",
        "summary": "Verificar números no WhatsApp",
        "description": "Verifica em lote quais números possuem conta no WhatsApp.",
        "tags": [
          "Instância"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phones": {
                    "type": "array",
                    "items": {},
                    "description": "Lista de números a verificar (formato internacional: 5511...).",
                    "example": "[\"5511999999999\",\"5511888888888\"]"
                  }
                },
                "required": [
                  "phones"
                ]
              },
              "example": {
                "phones": [
                  "5511999999999",
                  "5511888888888"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": [
                  {
                    "phone": "5511999999999",
                    "exists": true
                  },
                  {
                    "phone": "5511888888888",
                    "exists": false
                  }
                ]
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/device": {
      "get": {
        "operationId": "get-device",
        "summary": "Informações do dispositivo",
        "description": "Retorna dados do dispositivo conectado ao WhatsApp.",
        "tags": [
          "Instância"
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/connect": {
      "post": {
        "operationId": "connect",
        "summary": "Conectar instância",
        "description": "Inicia ou reconecta a sessão da instância. Recomendado antes de obter QR Code ou código de pareamento.\n\nChame este endpoint antes de /pairing-code ou /qr-code quando a instância estiver desconectada.",
        "tags": [
          "Instância"
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true,
                  "message": "Reconnect success"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/disconnect": {
      "get": {
        "operationId": "disconnect",
        "summary": "Desconectar instância",
        "description": "Encerra a sessão ativa do WhatsApp.",
        "tags": [
          "Instância"
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/restart": {
      "get": {
        "operationId": "restart",
        "summary": "Reiniciar instância",
        "description": "Reinicia a sessão sem desconectar o WhatsApp.",
        "tags": [
          "Instância"
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/pairing-code": {
      "get": {
        "operationId": "pairing-code",
        "summary": "Código de emparelhamento (GET)",
        "description": "Gera um código de pareamento para conectar o WhatsApp sem QR Code. O número deve ser enviado na query string.\n\nAlternativa ao QR Code para ambientes sem câmera.\n\nChame POST /connect antes se a instância estiver desconectada.\n\nNo WhatsApp: Aparelhos conectados → Conectar aparelho → Conectar com número de telefone.",
        "tags": [
          "Instância"
        ],
        "parameters": [
          {
            "name": "phone",
            "in": "query",
            "required": true,
            "description": "Número de telefone da conta WhatsApp a conectar (formato internacional, ex: 5511999999999).",
            "schema": {
              "type": "string",
              "description": "Número de telefone da conta WhatsApp a conectar (formato internacional, ex: 5511999999999).",
              "example": "5511999999999"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "code": "ABCD-1234",
                  "message": "Successfully requested pairing code"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      },
      "post": {
        "operationId": "pairing-code-post",
        "summary": "Código de emparelhamento (POST)",
        "description": "Mesmo comportamento do GET: gera o código de pareamento. O número deve ser enviado na query string (?phone=).\n\nNão envie o telefone no body — use sempre o parâmetro de query ?phone=.",
        "tags": [
          "Instância"
        ],
        "parameters": [
          {
            "name": "phone",
            "in": "query",
            "required": true,
            "description": "Número de telefone da conta WhatsApp a conectar (formato internacional, ex: 5511999999999).",
            "schema": {
              "type": "string",
              "description": "Número de telefone da conta WhatsApp a conectar (formato internacional, ex: 5511999999999).",
              "example": "5511999999999"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "code": "ABCD-1234",
                  "message": "Successfully requested pairing code"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/restart-with-disconnect": {
      "post": {
        "operationId": "restart-with-disconnect",
        "summary": "Reiniciar com desconexão",
        "description": "Reinicia a sessão forçando desconexão do WhatsApp antes de reiniciar.",
        "tags": [
          "Instância"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "connected": {
                    "type": "boolean",
                    "description": "Se true, mantém a sessão conectada após reiniciar. Padrão: false."
                  }
                }
              },
              "example": {
                "connected": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/inbound-config": {
      "put": {
        "operationId": "set-inbound-config",
        "summary": "Agrupar mensagens picotadas (buffer)",
        "description": "Agrupa mensagens seguidas do mesmo contato em UMA chamada de webhook. Ninguém escreve um parágrafo no WhatsApp: a pessoa manda \"oi\", depois \"tudo bem?\", depois \"queria saber o preço\" — três webhooks, e um agente de IA responde três vezes. Com o buffer ligado, chega uma chamada só.\n\nO payload do webhook mantém a mesma estrutura: os textos chegam juntos em text.message, mais um campo informativo buffered. Quando só chega uma mensagem, o payload sai idêntico ao de antes, sem campo extra.\n\nMídia, reação e resposta de botão NUNCA são agrupadas — e se houver texto esperando na janela, ele é entregue ANTES delas, então a ordem da conversa nunca se inverte.\n\nValor fora dos limites não é aceito em silêncio: é ajustado e a correção volta no campo notes da resposta.",
        "tags": [
          "Instância"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "buffer.enabled": {
                    "type": "boolean",
                    "description": "Liga o agrupamento. Sem configuração, a instância entrega um webhook por mensagem."
                  },
                  "buffer.window_ms": {
                    "type": "number",
                    "description": "Janela de silêncio em ms. REINICIA a cada mensagem nova, então a entrega sai quando a pessoa para de digitar. Padrão 8000, máximo 20000."
                  },
                  "buffer.max_wait_ms": {
                    "type": "number",
                    "description": "Teto absoluto desde a primeira mensagem, para quem digita sem parar não adiar a entrega para sempre. Padrão e máximo 30000."
                  },
                  "buffer.max_messages": {
                    "type": "number",
                    "description": "Entrega imediatamente ao acumular N mensagens. Padrão 10, máximo 50."
                  },
                  "buffer.mode": {
                    "type": "string",
                    "description": "concat (padrão) junta os textos no campo de sempre — sua integração não muda uma linha. batch adiciona o array bufferedMessages e muda o formato do payload.",
                    "enum": [
                      "concat",
                      "batch"
                    ]
                  },
                  "buffer.include_groups": {
                    "type": "boolean",
                    "description": "Estende o agrupamento a grupos. O agrupamento é por PARTICIPANTE: falas de pessoas diferentes nunca se misturam. Padrão false."
                  }
                },
                "required": [
                  "buffer.enabled"
                ]
              },
              "example": {
                "buffer": {
                  "enabled": true,
                  "window_ms": 8000,
                  "max_messages": 10,
                  "mode": "concat"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "instanceId": "MINHA_INSTANCE",
                  "buffer": {
                    "enabled": true,
                    "window_ms": 8000,
                    "max_wait_ms": 30000,
                    "max_messages": 10,
                    "mode": "concat",
                    "include_groups": false
                  },
                  "notes": []
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      },
      "get": {
        "operationId": "get-inbound-config",
        "summary": "Consultar config de entrega",
        "description": "Retorna a configuração de entrega de mensagens recebidas. Sem configuração, a instância entrega uma chamada de webhook por mensagem. O campo source diz de onde veio a configuração efetiva: instance quando foi você que gravou, default quando veio do padrão da instância.",
        "tags": [
          "Instância"
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "instanceId": "MINHA_INSTANCE",
                  "source": "instance",
                  "buffer": {
                    "enabled": true,
                    "window_ms": 8000,
                    "mode": "concat"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      },
      "delete": {
        "operationId": "delete-inbound-config",
        "summary": "Voltar ao padrão",
        "description": "Remove a configuração da instância e volta ao padrão. Atenção: voltar ao padrão não é o mesmo que desligar o agrupamento — a resposta traz a configuração efetiva resultante. Para desligar de forma explícita, use PUT com buffer.enabled = false.",
        "tags": [
          "Instância"
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "instanceId": "MINHA_INSTANCE"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/ai-config": {
      "put": {
        "operationId": "set-ai-config",
        "summary": "Transcrever áudio recebido (chave sua)",
        "description": "Liga a transcrição automática de áudio recebido. Metade da conversa no WhatsApp brasileiro é áudio, e um agente de IA não escuta — com isso ligado, o texto já chega no webhook e você não precisa montar download + speech-to-text. A chave do provedor é SUA: o custo cai na sua conta da OpenAI e a Wafly não cobra nada por isso.\n\nO webhook de áudio ganha um campo transcription com o texto: { \"status\": \"ok\", \"text\": \"...\", \"latency_ms\": 1180 }. O resto do payload nao muda.\n\nFalha nunca engole a mensagem: se o provedor recusar, o webhook sai igual ao de sempre com transcription.status = error e o motivo (invalid_api_key, quota_exceeded, cap_reached, audio_too_long, provider_timeout).\n\nA chave é gravada cifrada e vinculada à instância: o registro não funciona se for copiado para outra instância.\n\nInstância sem essa configuração não recebe nem o campo transcription — comportamento idêntico ao de antes.",
        "tags": [
          "Instância"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "provider": {
                    "type": "string",
                    "description": "Provedor de transcrição. Hoje apenas openai. Padrão: openai.",
                    "enum": [
                      "openai"
                    ]
                  },
                  "api_key": {
                    "type": "string",
                    "description": "Sua chave do provedor. É gravada cifrada (AES-256-GCM) e NUNCA é devolvida: no GET vem mascarada. Envie vazio em chamadas seguintes para manter a chave já cadastrada e alterar só os demais campos."
                  },
                  "transcription.enabled": {
                    "type": "boolean",
                    "description": "Liga a transcrição do áudio recebido."
                  },
                  "transcription.model": {
                    "type": "string",
                    "description": "Modelo de transcrição. Padrão: whisper-1."
                  },
                  "transcription.max_audio_seconds": {
                    "type": "number",
                    "description": "Ignora áudios mais longos que isso, protegendo você de custo inesperado. Padrão 300."
                  },
                  "transcription.monthly_minutes_cap": {
                    "type": "number",
                    "description": "Teto de minutos transcritos por mês. Se você não informar, aplicamos 500 por padrão — deixar ilimitado faria você descobrir o custo pela fatura do provedor."
                  }
                },
                "required": [
                  "api_key",
                  "transcription.enabled"
                ]
              },
              "example": {
                "provider": "openai",
                "api_key": "sk-proj-...",
                "transcription": {
                  "enabled": true,
                  "max_audio_seconds": 300,
                  "monthly_minutes_cap": 500
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "instanceId": "MINHA_INSTANCE",
                  "provider": "openai",
                  "api_key": "sk-••••••••x9f2",
                  "transcription": {
                    "enabled": true,
                    "model": "whisper-1",
                    "max_audio_seconds": 300,
                    "monthly_minutes_cap": 500
                  },
                  "usage": {
                    "month": "2026-07",
                    "minutes_used": 12,
                    "minutes_cap": 500
                  }
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      },
      "get": {
        "operationId": "get-ai-config",
        "summary": "Consultar config de transcrição",
        "description": "Retorna a configuração de transcrição e o consumo do mês. A chave nunca é devolvida — só a máscara.",
        "tags": [
          "Instância"
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "instanceId": "MINHA_INSTANCE",
                  "provider": "openai",
                  "api_key": "sk-••••••••x9f2",
                  "transcription": {
                    "enabled": true,
                    "model": "whisper-1"
                  },
                  "usage": {
                    "month": "2026-07",
                    "minutes_used": 12,
                    "minutes_cap": 500
                  }
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      },
      "delete": {
        "operationId": "delete-ai-config",
        "summary": "Remover chave e desligar transcrição",
        "description": "Apaga a credencial cadastrada e desliga a transcrição.",
        "tags": [
          "Instância"
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "instanceId": "MINHA_INSTANCE",
                  "removed": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/send-text": {
      "post": {
        "operationId": "send-text",
        "summary": "Enviar mensagem de texto",
        "description": "Envia uma mensagem de texto simples para um número privado, grupo ou newsletter/canal.\n\nFormato do destinatário: número privado (ex: 5511999999999), grupo (ID-group) ou newsletter/canal (ID@newsletter).",
        "tags": [
          "Mensagens"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Destinatário. Número privado ex: 5511999999999 | Grupo: ID-group | Newsletter: ID@newsletter",
                    "example": "5511999999999"
                  },
                  "message": {
                    "type": "string",
                    "description": "Conteúdo da mensagem.",
                    "example": "Olá! Mensagem via API Wafly"
                  },
                  "delayMessage": {
                    "type": "number",
                    "description": "Tempo de espera em milissegundos antes de enviar (simula digitação).",
                    "example": "1500"
                  },
                  "messageId": {
                    "type": "string",
                    "description": "ID de uma mensagem existente para responder (reply)."
                  },
                  "editMessageId": {
                    "type": "string",
                    "description": "ID de uma mensagem sua já enviada para editar o conteúdo."
                  },
                  "fromMe": {
                    "type": "boolean",
                    "description": "Obrigatório junto de editMessageId: confirma que a mensagem a editar é sua. Sem ele a edição é ignorada.",
                    "example": "true"
                  },
                  "isGroup": {
                    "type": "boolean",
                    "description": "Declara que o destino é um grupo. Se true, o sufixo -group é adicionado ao phone quando faltar; se false e o phone for de grupo, a requisição é rejeitada.",
                    "example": "false"
                  },
                  "mentioned": {
                    "type": "array",
                    "items": {},
                    "description": "Lista de números mencionados na mensagem (apenas em grupos).",
                    "example": "[\"5511999999999\"]"
                  }
                },
                "required": [
                  "phone",
                  "message"
                ]
              },
              "example": {
                "phone": "5511999999999",
                "message": "Olá! Mensagem via API Wafly"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true,
                  "messageId": "3EB0XXXX"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/send-image": {
      "post": {
        "operationId": "send-image",
        "summary": "Enviar imagem",
        "description": "Envia uma imagem usando URL pública ou string base64.\n\nFormato do destinatário: número privado (ex: 5511999999999), grupo (ID-group) ou newsletter/canal (ID@newsletter).",
        "tags": [
          "Mensagens"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Destinatário.",
                    "example": "5511999999999"
                  },
                  "image": {
                    "type": "string",
                    "description": "URL pública da imagem ou string base64 (data:image/jpeg;base64,...)",
                    "example": "https://exemplo.com/imagem.jpg"
                  },
                  "caption": {
                    "type": "string",
                    "description": "Legenda exibida abaixo da imagem."
                  },
                  "messageId": {
                    "type": "string",
                    "description": "ID de mensagem para responder."
                  },
                  "mentioned": {
                    "type": "array",
                    "items": {},
                    "description": "Números mencionados (apenas grupos)."
                  }
                },
                "required": [
                  "phone",
                  "image"
                ]
              },
              "example": {
                "phone": "5511999999999",
                "image": "https://exemplo.com/imagem.jpg",
                "caption": "Legenda opcional"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true,
                  "messageId": "3EB0XXXX"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/send-audio": {
      "post": {
        "operationId": "send-audio",
        "summary": "Enviar áudio",
        "description": "Envia um arquivo de áudio (mp3/ogg) por URL ou base64.\n\nFormato do destinatário: número privado (ex: 5511999999999), grupo (ID-group) ou newsletter/canal (ID@newsletter).",
        "tags": [
          "Mensagens"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Destinatário."
                  },
                  "audio": {
                    "type": "string",
                    "description": "URL pública do áudio ou base64."
                  },
                  "delayMessage": {
                    "type": "number",
                    "description": "Delay em ms antes de enviar."
                  },
                  "messageId": {
                    "type": "string",
                    "description": "ID para reply."
                  }
                },
                "required": [
                  "phone",
                  "audio"
                ]
              },
              "example": {
                "phone": "5511999999999",
                "audio": "https://exemplo.com/audio.mp3"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true,
                  "messageId": "3EB0XXXX"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/send-video": {
      "post": {
        "operationId": "send-video",
        "summary": "Enviar vídeo",
        "description": "Envia um vídeo por URL ou base64.\n\nFormato do destinatário: número privado (ex: 5511999999999), grupo (ID-group) ou newsletter/canal (ID@newsletter).",
        "tags": [
          "Mensagens"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Destinatário."
                  },
                  "video": {
                    "type": "string",
                    "description": "URL ou base64 do vídeo."
                  },
                  "caption": {
                    "type": "string",
                    "description": "Legenda do vídeo."
                  },
                  "messageId": {
                    "type": "string",
                    "description": "ID para reply."
                  },
                  "isPtv": {
                    "type": "boolean",
                    "description": "Envia o vídeo como mensagem de vídeo circular (formato \"recadinho\").",
                    "example": "true"
                  },
                  "mentioned": {
                    "type": "array",
                    "items": {},
                    "description": "Lista de números mencionados (apenas em grupos)."
                  }
                },
                "required": [
                  "phone",
                  "video"
                ]
              },
              "example": {
                "phone": "5511999999999",
                "video": "https://exemplo.com/video.mp4",
                "caption": "Legenda opcional"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true,
                  "messageId": "3EB0XXXX"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/send-document/{type}": {
      "post": {
        "operationId": "send-document",
        "summary": "Enviar documento",
        "description": "Envia um documento (PDF, XLSX, etc) por URL ou base64. O parâmetro de rota {type} define a extensão, ex: pdf.\n\nFormato do destinatário: número privado (ex: 5511999999999), grupo (ID-group) ou newsletter/canal (ID@newsletter).",
        "tags": [
          "Mensagens"
        ],
        "parameters": [
          {
            "name": "type",
            "in": "path",
            "required": true,
            "description": "Extensão do arquivo",
            "schema": {
              "type": "string",
              "description": "Extensão do arquivo",
              "enum": [
                "pdf",
                "xlsx",
                "docx",
                "csv",
                "txt"
              ]
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Destinatário."
                  },
                  "document": {
                    "type": "string",
                    "description": "URL ou base64 do documento."
                  },
                  "fileName": {
                    "type": "string",
                    "description": "Nome do arquivo exibido."
                  },
                  "caption": {
                    "type": "string",
                    "description": "Legenda."
                  },
                  "messageId": {
                    "type": "string",
                    "description": "ID para reply."
                  }
                },
                "required": [
                  "phone",
                  "document"
                ]
              },
              "example": {
                "phone": "5511999999999",
                "document": "https://exemplo.com/arquivo.pdf",
                "fileName": "relatorio.pdf"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true,
                  "messageId": "3EB0XXXX"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/send-link": {
      "post": {
        "operationId": "send-link",
        "summary": "Enviar link com prévia",
        "description": "Envia um link com card de prévia (título, descrição e imagem).\n\nFormato do destinatário: número privado (ex: 5511999999999), grupo (ID-group) ou newsletter/canal (ID@newsletter).",
        "tags": [
          "Mensagens"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Destinatário."
                  },
                  "message": {
                    "type": "string",
                    "description": "Texto que acompanha o link."
                  },
                  "linkUrl": {
                    "type": "string",
                    "description": "URL do link."
                  },
                  "title": {
                    "type": "string",
                    "description": "Título exibido no card."
                  },
                  "linkDescription": {
                    "type": "string",
                    "description": "Descrição exibida no card."
                  },
                  "delayMessage": {
                    "type": "number",
                    "description": "Delay em ms."
                  }
                },
                "required": [
                  "phone",
                  "message",
                  "linkUrl"
                ]
              },
              "example": {
                "phone": "5511999999999",
                "message": "Confira nossa plataforma",
                "linkUrl": "https://wafly.com.br",
                "title": "Wafly",
                "linkDescription": "API WhatsApp gerenciada"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true,
                  "messageId": "3EB0XXXX"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/send-poll": {
      "post": {
        "operationId": "send-poll",
        "summary": "Enviar enquete",
        "description": "Cria uma enquete com opções de resposta.\n\nFormato do destinatário: número privado (ex: 5511999999999), grupo (ID-group) ou newsletter/canal (ID@newsletter).",
        "tags": [
          "Mensagens"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Destinatário."
                  },
                  "message": {
                    "type": "string",
                    "description": "Pergunta da enquete."
                  },
                  "poll": {
                    "type": "array",
                    "items": {},
                    "description": "Lista de opções da enquete.",
                    "example": "[{\"optionName\":\"Sim\"},{\"optionName\":\"Não\"}]"
                  },
                  "pollMaxOptions": {
                    "type": "number",
                    "description": "Máximo de opções que o usuário pode selecionar. Padrão: 1.",
                    "example": "1"
                  },
                  "messageId": {
                    "type": "string",
                    "description": "ID para reply."
                  }
                },
                "required": [
                  "phone",
                  "message",
                  "poll"
                ]
              },
              "example": {
                "phone": "5511999999999",
                "message": "Qual sua cor favorita?",
                "poll": [
                  {
                    "optionName": "Azul"
                  },
                  {
                    "optionName": "Verde"
                  },
                  {
                    "optionName": "Vermelho"
                  }
                ],
                "pollMaxOptions": 1
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true,
                  "messageId": "3EB0XXXX"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/send-contacts": {
      "post": {
        "operationId": "send-contacts",
        "summary": "Enviar contato",
        "description": "Envia um card de contato.\n\nFormato do destinatário: número privado (ex: 5511999999999), grupo (ID-group) ou newsletter/canal (ID@newsletter).",
        "tags": [
          "Mensagens"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Destinatário."
                  },
                  "contactPhone": {
                    "type": "string",
                    "description": "Número do contato a ser enviado."
                  },
                  "contactName": {
                    "type": "string",
                    "description": "Nome do contato."
                  },
                  "contacts": {
                    "type": "array",
                    "items": {},
                    "description": "Lista de números para enviar múltiplos contatos de uma vez."
                  }
                },
                "required": [
                  "phone"
                ]
              },
              "example": {
                "phone": "5511999999999",
                "contactPhone": "5511888888888",
                "contactName": "João Silva"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true,
                  "messageId": "3EB0XXXX"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/delete-message": {
      "delete": {
        "operationId": "delete-message",
        "summary": "Deletar mensagem",
        "description": "Remove uma mensagem enviada do chat.\n\nA exclusão para todos (owner=true) só é possível dentro de 60 minutos do envio.",
        "tags": [
          "Mensagens"
        ],
        "parameters": [
          {
            "name": "messageId",
            "in": "query",
            "required": true,
            "description": "ID da mensagem a deletar.",
            "schema": {
              "type": "string",
              "description": "ID da mensagem a deletar."
            }
          },
          {
            "name": "phone",
            "in": "query",
            "required": true,
            "description": "Destinatário do chat onde a mensagem foi enviada.",
            "schema": {
              "type": "string",
              "description": "Destinatário do chat onde a mensagem foi enviada."
            }
          },
          {
            "name": "owner",
            "in": "query",
            "required": true,
            "description": "true para apagar para todos; false para apagar somente para você.",
            "schema": {
              "type": "boolean",
              "description": "true para apagar para todos; false para apagar somente para você."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/pin-message": {
      "post": {
        "operationId": "pin-message",
        "summary": "Fixar mensagem",
        "description": "Fixa ou desafixa uma mensagem no topo do chat.",
        "tags": [
          "Mensagens"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Chat onde a mensagem está.",
                    "example": "5511999999999"
                  },
                  "messageId": {
                    "type": "string",
                    "description": "ID da mensagem a fixar.",
                    "example": "77DF5293EBC176FFA6A88838E7A6AD83"
                  },
                  "messageAction": {
                    "type": "string",
                    "description": "Fixar ou desafixar.",
                    "enum": [
                      "pin",
                      "unpin"
                    ],
                    "example": "pin"
                  },
                  "pinMessageDuration": {
                    "type": "string",
                    "description": "Por quanto tempo a mensagem fica fixada.",
                    "enum": [
                      "24_hours",
                      "7_days",
                      "30_days"
                    ],
                    "example": "7_days"
                  },
                  "sender": {
                    "type": "string",
                    "description": "Autor da mensagem. Necessário quando o chat é um grupo.",
                    "example": "5511888888888"
                  }
                },
                "required": [
                  "phone",
                  "messageId",
                  "messageAction",
                  "pinMessageDuration"
                ]
              },
              "example": {
                "phone": "5511999999999",
                "messageId": "77DF5293EBC176FFA6A88838E7A6AD83",
                "messageAction": "pin",
                "pinMessageDuration": "7_days"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/send-option-list": {
      "post": {
        "operationId": "send-option-list",
        "summary": "Enviar lista de opções",
        "description": "Envia uma mensagem interativa com lista de opções para o usuário selecionar.",
        "tags": [
          "Mensagens"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Formato do destinatário: número privado (ex: 5511999999999), grupo (ID-group) ou newsletter/canal (ID@newsletter).",
                    "example": "5511999999999"
                  },
                  "message": {
                    "type": "string",
                    "description": "Texto exibido acima da lista."
                  },
                  "optionList": {
                    "type": "object",
                    "description": "Objeto com title (string), buttonLabel (string) e options (array de { id, title, description })."
                  },
                  "messageId": {
                    "type": "string",
                    "description": "ID de mensagem para responder."
                  },
                  "mentioned": {
                    "type": "array",
                    "items": {},
                    "description": "Menções (apenas grupos)."
                  }
                },
                "required": [
                  "phone",
                  "message",
                  "optionList"
                ]
              },
              "example": {
                "phone": "5511999999999",
                "message": "Escolha o que melhor descreve a Wafly:",
                "optionList": {
                  "title": "Selecione uma opção abaixo:",
                  "buttonLabel": "Clique aqui",
                  "options": [
                    {
                      "id": "1",
                      "title": "Eficiência",
                      "description": "A melhor plataforma de automação"
                    },
                    {
                      "id": "2",
                      "title": "Suporte",
                      "description": "Atendimento excepcional ao cliente"
                    }
                  ]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/send-gif": {
      "post": {
        "operationId": "send-gif",
        "summary": "Enviar GIF",
        "description": "Envia um GIF via URL pública ou base64.",
        "tags": [
          "Mensagens"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Formato do destinatário: número privado (ex: 5511999999999), grupo (ID-group) ou newsletter/canal (ID@newsletter).",
                    "example": "5511999999999"
                  },
                  "gif": {
                    "type": "string",
                    "description": "URL pública ou base64 do GIF."
                  },
                  "caption": {
                    "type": "string",
                    "description": "Legenda exibida abaixo do GIF."
                  },
                  "messageId": {
                    "type": "string",
                    "description": "ID de mensagem para responder."
                  },
                  "fromMe": {
                    "type": "boolean",
                    "description": "true se a mensagem é do próprio usuário."
                  },
                  "mentioned": {
                    "type": "array",
                    "items": {},
                    "description": "Menções (grupos)."
                  }
                },
                "required": [
                  "phone",
                  "gif"
                ]
              },
              "example": {
                "phone": "5511999999999",
                "gif": "https://devzapp.com.br/v2/animation.gif",
                "caption": "Confira este GIF!"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/send-ptv": {
      "post": {
        "operationId": "send-ptv",
        "summary": "Enviar vídeo redondo (PTV)",
        "description": "Envia um vídeo no formato circular — aparece como vídeo redondo (PTV) no WhatsApp.",
        "tags": [
          "Mensagens"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Formato do destinatário: número privado (ex: 5511999999999), grupo (ID-group) ou newsletter/canal (ID@newsletter).",
                    "example": "5511999999999"
                  },
                  "ptv": {
                    "type": "string",
                    "description": "URL pública ou base64 do vídeo."
                  },
                  "messageId": {
                    "type": "string",
                    "description": "ID de mensagem para responder."
                  },
                  "fromMe": {
                    "type": "boolean",
                    "description": "true se a mensagem é do próprio usuário."
                  },
                  "mentioned": {
                    "type": "array",
                    "items": {},
                    "description": "Menções (grupos)."
                  }
                },
                "required": [
                  "phone",
                  "ptv"
                ]
              },
              "example": {
                "phone": "5511999999999",
                "ptv": "https://devzapp.com.br/v2/video.mp4"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/send-event": {
      "post": {
        "operationId": "send-event",
        "summary": "Enviar evento",
        "description": "Envia um evento do WhatsApp com data, localização e link de chamada.",
        "tags": [
          "Mensagens"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Formato do destinatário: número privado (ex: 5511999999999), grupo (ID-group) ou newsletter/canal (ID@newsletter).",
                    "example": "5511999999999"
                  },
                  "event": {
                    "type": "object",
                    "description": "Objeto do evento: { name, description, dateTime (ISO 8601), location: { name }, callLinkType, canceled }."
                  },
                  "messageId": {
                    "type": "string",
                    "description": "ID de mensagem para responder."
                  },
                  "editMessageId": {
                    "type": "string",
                    "description": "ID de um evento existente para editar."
                  },
                  "fromMe": {
                    "type": "boolean",
                    "description": "true se a mensagem é do próprio usuário."
                  },
                  "mentioned": {
                    "type": "array",
                    "items": {},
                    "description": "Menções (grupos)."
                  }
                },
                "required": [
                  "phone",
                  "event"
                ]
              },
              "example": {
                "phone": "5511999999999",
                "event": {
                  "name": "Webinar Wafly",
                  "description": "Automação de WhatsApp com IA",
                  "dateTime": "2026-04-01T10:00:00",
                  "location": {
                    "name": "Online"
                  },
                  "callLinkType": "ZOOM",
                  "canceled": false
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/send-button-actions": {
      "post": {
        "operationId": "send-button-actions",
        "summary": "Enviar botões de ação",
        "description": "Envia uma mensagem com botões que executam ações (ligar ou abrir URL).",
        "tags": [
          "Mensagens"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Formato do destinatário: número privado (ex: 5511999999999), grupo (ID-group) ou newsletter/canal (ID@newsletter).",
                    "example": "551199999999"
                  },
                  "message": {
                    "type": "string",
                    "description": "Texto principal da mensagem."
                  },
                  "title": {
                    "type": "string",
                    "description": "Título exibido no topo."
                  },
                  "footer": {
                    "type": "string",
                    "description": "Rodapé exibido abaixo dos botões."
                  },
                  "buttonActions": {
                    "type": "array",
                    "items": {},
                    "description": "Lista de botões. Cada item: { id, label, type (\"CALL\" | \"URL\"), phone (para CALL), url (para URL) }.",
                    "enum": [
                      "CALL",
                      "URL"
                    ]
                  },
                  "messageId": {
                    "type": "string",
                    "description": "ID de mensagem para responder."
                  },
                  "fromMe": {
                    "type": "boolean",
                    "description": "true se do próprio usuário."
                  }
                },
                "required": [
                  "phone",
                  "buttonActions"
                ]
              },
              "example": {
                "phone": "551199999999",
                "message": "Como podemos ajudar?",
                "title": "Atendimento",
                "footer": "Responda em segundos",
                "buttonActions": [
                  {
                    "id": "1",
                    "type": "URL",
                    "label": "Visitar site",
                    "url": "https://wafly.com.br"
                  },
                  {
                    "id": "2",
                    "type": "CALL",
                    "label": "Ligar agora",
                    "phone": "551199999999"
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/send-button-list": {
      "post": {
        "operationId": "send-button-list",
        "summary": "Enviar lista de botões",
        "description": "Envia uma mensagem com lista de botões simples de resposta rápida.",
        "tags": [
          "Mensagens"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Formato do destinatário: número privado (ex: 5511999999999), grupo (ID-group) ou newsletter/canal (ID@newsletter).",
                    "example": "551199999999"
                  },
                  "message": {
                    "type": "string",
                    "description": "Texto da mensagem."
                  },
                  "buttonList": {
                    "type": "object",
                    "description": "Objeto: { image (URL opcional), video (URL opcional), buttons: [{ id, label }] }."
                  },
                  "messageId": {
                    "type": "string",
                    "description": "ID de mensagem para responder."
                  },
                  "fromMe": {
                    "type": "boolean",
                    "description": "true se do próprio usuário."
                  },
                  "mentioned": {
                    "type": "array",
                    "items": {},
                    "description": "Menções (grupos)."
                  }
                },
                "required": [
                  "phone",
                  "buttonList"
                ]
              },
              "example": {
                "phone": "551199999999",
                "message": "Z-API é bom?",
                "buttonList": {
                  "image": "https://imagem.url/foto.jpg",
                  "buttons": [
                    {
                      "id": "sim",
                      "label": "Sim!"
                    },
                    {
                      "id": "nao",
                      "label": "Não"
                    }
                  ]
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/send-button-otp": {
      "post": {
        "operationId": "send-button-otp",
        "summary": "Enviar botão OTP",
        "description": "Envia uma mensagem com botão para copiar um código OTP (One-Time Password).",
        "tags": [
          "Mensagens"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Formato do destinatário: número privado (ex: 5511999999999), grupo (ID-group) ou newsletter/canal (ID@newsletter).",
                    "example": "551199999999"
                  },
                  "message": {
                    "type": "string",
                    "description": "Texto da mensagem."
                  },
                  "code": {
                    "type": "string",
                    "description": "Código OTP a ser copiado pelo usuário."
                  },
                  "image": {
                    "type": "string",
                    "description": "URL de imagem opcional."
                  },
                  "buttonText": {
                    "type": "string",
                    "description": "Texto do botão de cópia. Padrão: \"Copiar código\"."
                  },
                  "messageId": {
                    "type": "string",
                    "description": "ID de mensagem para responder."
                  },
                  "fromMe": {
                    "type": "boolean",
                    "description": "true se do próprio usuário."
                  }
                },
                "required": [
                  "phone",
                  "code"
                ]
              },
              "example": {
                "phone": "551199999999",
                "message": "Seu código de verificação:",
                "code": "123456",
                "buttonText": "Copiar código"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/send-button-pix": {
      "post": {
        "operationId": "send-button-pix",
        "summary": "Enviar botão PIX",
        "description": "Envia uma mensagem com chave PIX e botão de pagamento.",
        "tags": [
          "Mensagens"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Formato do destinatário: número privado (ex: 5511999999999), grupo (ID-group) ou newsletter/canal (ID@newsletter).",
                    "example": "551199999999"
                  },
                  "pixKey": {
                    "type": "string",
                    "description": "Chave PIX (e-mail, CPF, CNPJ, telefone ou chave aleatória)."
                  },
                  "type": {
                    "type": "string",
                    "description": "Tipo da chave PIX.",
                    "enum": [
                      "EMAIL",
                      "CPF",
                      "CNPJ",
                      "PHONE",
                      "EVP"
                    ]
                  },
                  "name": {
                    "type": "string",
                    "description": "Nome do recebedor/empresa exibido no card de pagamento."
                  },
                  "totalAmount": {
                    "type": "number",
                    "description": "Valor exibido no card (ex.: 149.90). Sem valor, exibe R$ 0,00 e o pagador digita o valor."
                  },
                  "description": {
                    "type": "string",
                    "description": "Descrição do item/cobrança exibida no card."
                  },
                  "documentUrl": {
                    "type": "string",
                    "description": "URL de PDF de fatura para anexar (muda o formato para documento + botão copiar)."
                  },
                  "documentTitle": {
                    "type": "string",
                    "description": "Título do PDF anexado."
                  },
                  "messageId": {
                    "type": "string",
                    "description": "ID de mensagem para responder."
                  },
                  "fromMe": {
                    "type": "boolean",
                    "description": "true se do próprio usuário."
                  }
                },
                "required": [
                  "phone",
                  "pixKey"
                ]
              },
              "example": {
                "phone": "551199999999",
                "pixKey": "pagamentos@wafly.com.br",
                "type": "EMAIL",
                "name": "Wafly",
                "totalAmount": 149.9,
                "description": "Plano mensal"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/send-carousel": {
      "post": {
        "operationId": "send-carousel",
        "summary": "Enviar carrossel",
        "description": "Envia um carrossel de cards com imagens e botões interativos.",
        "tags": [
          "Mensagens"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Formato do destinatário: número privado (ex: 5511999999999), grupo (ID-group) ou newsletter/canal (ID@newsletter).",
                    "example": "551199999999"
                  },
                  "message": {
                    "type": "string",
                    "description": "Texto introdutório antes do carrossel."
                  },
                  "carousel": {
                    "type": "array",
                    "items": {},
                    "description": "Lista de cards. Cada card: { text, image (URL), buttons: [{ id, label, type (\"URL\"|\"REPLY\"), url }] }."
                  },
                  "messageId": {
                    "type": "string",
                    "description": "ID de mensagem para responder."
                  },
                  "fromMe": {
                    "type": "boolean",
                    "description": "true se do próprio usuário."
                  },
                  "mentioned": {
                    "type": "array",
                    "items": {},
                    "description": "Menções (grupos)."
                  }
                },
                "required": [
                  "phone",
                  "carousel"
                ]
              },
              "example": {
                "phone": "551199999999",
                "message": "Confira nossos planos:",
                "carousel": [
                  {
                    "text": "Plano Starter",
                    "image": "https://wafly.com.br/starter.jpg",
                    "buttons": [
                      {
                        "id": "b1",
                        "label": "Saiba mais",
                        "type": "URL",
                        "url": "https://wafly.com.br/starter"
                      }
                    ]
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/groups": {
      "get": {
        "operationId": "list-groups",
        "summary": "Listar grupos",
        "description": "Retorna a lista de grupos associados à instância com paginação.",
        "tags": [
          "Grupos"
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": false,
            "description": "Número da página. Padrão: 1.",
            "schema": {
              "type": "number",
              "description": "Número da página. Padrão: 1."
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "required": false,
            "description": "Itens por página. Padrão: 20.",
            "schema": {
              "type": "number",
              "description": "Itens por página. Padrão: 20."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "groups": [
                    {
                      "id": "120363XXXX-group",
                      "name": "Grupo Exemplo",
                      "participantsCount": 15
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/create-group": {
      "post": {
        "operationId": "create-group",
        "summary": "Criar grupo",
        "description": "Cria um novo grupo e adiciona participantes.",
        "tags": [
          "Grupos"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "groupName": {
                    "type": "string",
                    "description": "Nome do grupo."
                  },
                  "phones": {
                    "type": "array",
                    "items": {},
                    "description": "Lista de números dos participantes iniciais.",
                    "example": "[\"5511999999999\",\"5511888888888\"]"
                  },
                  "autoInvite": {
                    "type": "boolean",
                    "description": "Se true, envia convite automático para participantes não-contatos."
                  }
                },
                "required": [
                  "groupName",
                  "phones"
                ]
              },
              "example": {
                "groupName": "Meu Grupo",
                "phones": [
                  "5511999999999",
                  "5511888888888"
                ],
                "autoInvite": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true,
                  "groupId": "120363XXXX-group"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/add-participant": {
      "post": {
        "operationId": "add-participant",
        "summary": "Adicionar participante",
        "description": "Adiciona um ou mais participantes a um grupo existente.",
        "tags": [
          "Grupos"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "groupId": {
                    "type": "string",
                    "description": "ID do grupo (formato: ID-group)."
                  },
                  "phones": {
                    "type": "array",
                    "items": {},
                    "description": "Números a adicionar."
                  },
                  "contacts": {
                    "type": "string",
                    "description": "Alternativa a phones: números separados por vírgula numa única string. Só é lido quando phones não vem preenchido.",
                    "example": "\"5511777777777,5511888888888\""
                  },
                  "autoInvite": {
                    "type": "boolean",
                    "description": "Enviar convite automático se o participant não for contato."
                  }
                },
                "required": [
                  "groupId",
                  "phones"
                ]
              },
              "example": {
                "groupId": "120363XXXX-group",
                "phones": [
                  "5511777777777"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/remove-participant": {
      "post": {
        "operationId": "remove-participant",
        "summary": "Remover participante",
        "description": "Remove um participante do grupo.",
        "tags": [
          "Grupos"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "groupId": {
                    "type": "string",
                    "description": "ID do grupo."
                  },
                  "phones": {
                    "type": "array",
                    "items": {},
                    "description": "Números a remover. Sempre um array, mesmo para um único número.",
                    "example": "[\"5511777777777\"]"
                  }
                },
                "required": [
                  "groupId",
                  "phones"
                ]
              },
              "example": {
                "groupId": "120363XXXX-group",
                "phones": [
                  "5511777777777"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/update-group-name": {
      "post": {
        "operationId": "update-group-name",
        "summary": "Alterar nome do grupo",
        "description": "Muda o nome de um grupo (requer ser administrador).",
        "tags": [
          "Grupos"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "groupId": {
                    "type": "string",
                    "description": "ID do grupo (ID-group)."
                  },
                  "groupName": {
                    "type": "string",
                    "description": "Novo nome do grupo."
                  }
                },
                "required": [
                  "groupId",
                  "groupName"
                ]
              },
              "example": {
                "groupId": "120363XXXX-group",
                "groupName": "Novo Nome do Grupo"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/add-admin": {
      "post": {
        "operationId": "add-admin",
        "summary": "Promover a administrador",
        "description": "Concede privilégios de administrador a um participante.",
        "tags": [
          "Grupos"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "groupId": {
                    "type": "string",
                    "description": "ID do grupo."
                  },
                  "phones": {
                    "type": "array",
                    "items": {},
                    "description": "Números a promover. Sempre um array, mesmo para um único número.",
                    "example": "[\"5511999999999\"]"
                  }
                },
                "required": [
                  "groupId",
                  "phones"
                ]
              },
              "example": {
                "groupId": "120363XXXX-group",
                "phones": [
                  "5511999999999"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/remove-admin": {
      "post": {
        "operationId": "remove-admin",
        "summary": "Remover administrador",
        "description": "Remove os privilégios de administrador de um participante.",
        "tags": [
          "Grupos"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "groupId": {
                    "type": "string",
                    "description": "ID do grupo."
                  },
                  "phones": {
                    "type": "array",
                    "items": {},
                    "description": "Números a rebaixar. Sempre um array, mesmo para um único número.",
                    "example": "[\"5511999999999\"]"
                  }
                },
                "required": [
                  "groupId",
                  "phones"
                ]
              },
              "example": {
                "groupId": "120363XXXX-group",
                "phones": [
                  "5511999999999"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/update-group-settings": {
      "post": {
        "operationId": "update-group-settings",
        "summary": "Atualizar configurações do grupo",
        "description": "Altera permissões do grupo como envio de mensagens e adição de membros.",
        "tags": [
          "Grupos"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "ID do grupo (ID-group)."
                  },
                  "adminOnlyMessage": {
                    "type": "boolean",
                    "description": "true = somente admins enviam mensagens."
                  },
                  "adminOnlySettings": {
                    "type": "boolean",
                    "description": "true = somente admins alteram as configurações."
                  },
                  "requireAdminApproval": {
                    "type": "boolean",
                    "description": "true = novos membros precisam de aprovação de admin para entrar."
                  },
                  "adminOnlyAddMember": {
                    "type": "boolean",
                    "description": "true = somente admins podem adicionar membros."
                  }
                },
                "required": [
                  "phone"
                ]
              },
              "example": {
                "phone": "120363XXXX-group",
                "adminOnlyMessage": true,
                "requireAdminApproval": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/group/invite-link": {
      "get": {
        "operationId": "group-invite-link",
        "summary": "Obter link de convite",
        "description": "Retorna o link de convite do grupo.",
        "tags": [
          "Grupos"
        ],
        "parameters": [
          {
            "name": "group_id",
            "in": "query",
            "required": true,
            "description": "ID do grupo (ID-group).",
            "schema": {
              "type": "string",
              "description": "ID do grupo (ID-group)."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": "https://chat.whatsapp.com/XXXXXXXX"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/group-metadata/{phone}": {
      "get": {
        "operationId": "group-metadata",
        "summary": "Metadados do grupo",
        "description": "Retorna informações detalhadas do grupo incluindo participantes.",
        "tags": [
          "Grupos"
        ],
        "parameters": [
          {
            "name": "phone",
            "in": "path",
            "required": true,
            "description": "ID do grupo (ID-group).",
            "schema": {
              "type": "string",
              "description": "ID do grupo (ID-group)."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/leave-group": {
      "post": {
        "operationId": "leave-group",
        "summary": "Sair do grupo",
        "description": "Remove a instância do grupo.",
        "tags": [
          "Grupos"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "groupId": {
                    "type": "string",
                    "description": "ID do grupo (ID-group)."
                  }
                },
                "required": [
                  "groupId"
                ]
              },
              "example": {
                "groupId": "120363XXXX-group"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/update-group-photo": {
      "post": {
        "operationId": "update-group-photo",
        "summary": "Atualizar foto do grupo",
        "description": "Atualiza a foto do grupo usando base64 ou URL.",
        "tags": [
          "Grupos"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "groupId": {
                    "type": "string",
                    "description": "ID do grupo (ID-group)."
                  },
                  "groupPhoto": {
                    "type": "string",
                    "description": "Foto em base64 ou URL."
                  },
                  "image": {
                    "type": "string",
                    "description": "Alias de groupPhoto (base64 ou URL)."
                  }
                },
                "required": [
                  "groupId"
                ]
              },
              "example": {
                "groupId": "120363XXXX-group",
                "image": "https://imagem.url/foto.jpg"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/group/photo": {
      "post": {
        "operationId": "group-photo-url",
        "summary": "Atualizar foto do grupo (por URL)",
        "description": "Atualiza a foto do grupo fornecendo uma URL pública de imagem.",
        "tags": [
          "Grupos"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "groupId": {
                    "type": "string",
                    "description": "ID do grupo (ID-group)."
                  },
                  "photoUrl": {
                    "type": "string",
                    "description": "URL pública da imagem."
                  },
                  "image": {
                    "type": "string",
                    "description": "Imagem em base64 (alternativa ao photoUrl)."
                  }
                },
                "required": [
                  "groupId"
                ]
              },
              "example": {
                "groupId": "120363XXXX-group",
                "photoUrl": "https://imagem.url/foto.jpg"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/approve-participant": {
      "post": {
        "operationId": "approve-participant",
        "summary": "Aprovar solicitação de entrada",
        "description": "Aprova pedidos de participação em grupos com aprovação obrigatória habilitada.",
        "tags": [
          "Grupos"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "groupId": {
                    "type": "string",
                    "description": "ID do grupo."
                  },
                  "phones": {
                    "type": "array",
                    "items": {},
                    "description": "Números a aprovar."
                  }
                },
                "required": [
                  "groupId",
                  "phones"
                ]
              },
              "example": {
                "groupId": "120363XXXX-group",
                "phones": [
                  "5511777777777"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/reject-participant": {
      "post": {
        "operationId": "reject-participant",
        "summary": "Rejeitar solicitação de entrada",
        "description": "Rejeita pedidos de participação em grupos com aprovação obrigatória.",
        "tags": [
          "Grupos"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "groupId": {
                    "type": "string",
                    "description": "ID do grupo."
                  },
                  "phones": {
                    "type": "array",
                    "items": {},
                    "description": "Números a rejeitar."
                  }
                },
                "required": [
                  "groupId",
                  "phones"
                ]
              },
              "example": {
                "groupId": "120363XXXX-group",
                "phones": [
                  "5511777777777"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/redefine-invitation-link/{id}": {
      "post": {
        "operationId": "redefine-invitation-link",
        "summary": "Redefinir link de convite",
        "description": "Invalida o link de convite atual e gera um novo. Funciona para grupos e comunidades.",
        "tags": [
          "Grupos"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "ID do grupo ou comunidade.",
            "schema": {
              "type": "string",
              "description": "ID do grupo ou comunidade."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": "https://chat.whatsapp.com/NOVOID"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/update-group-description": {
      "post": {
        "operationId": "update-group-description",
        "summary": "Atualizar descrição do grupo",
        "description": "Define ou atualiza a descrição/bio do grupo.",
        "tags": [
          "Grupos"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "groupId": {
                    "type": "string",
                    "description": "ID do grupo (ID-group)."
                  },
                  "groupDescription": {
                    "type": "string",
                    "description": "Novo texto da descrição (campo principal)."
                  },
                  "description": {
                    "type": "string",
                    "description": "Alias de groupDescription (use um ou outro)."
                  }
                },
                "required": [
                  "groupId"
                ]
              },
              "example": {
                "groupId": "120363XXXX-group",
                "groupDescription": "Grupo oficial de suporte Wafly"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/newsletter": {
      "get": {
        "operationId": "list-newsletters",
        "summary": "Listar newsletters",
        "description": "Retorna todas as newsletters da instância (próprias e seguidas).",
        "tags": [
          "Newsletter / Canais"
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/create-newsletter": {
      "post": {
        "operationId": "create-newsletter",
        "summary": "Criar newsletter",
        "description": "Cria um novo canal/newsletter.",
        "tags": [
          "Newsletter / Canais"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Nome da newsletter."
                  },
                  "description": {
                    "type": "string",
                    "description": "Descrição exibida no canal."
                  }
                },
                "required": [
                  "name"
                ]
              },
              "example": {
                "name": "Meu Canal",
                "description": "Notícias e atualizações"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "newsletterId": "abcd1234@newsletter",
                  "name": "Meu Canal"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/newsletter/metadata/{newsletterId}": {
      "get": {
        "operationId": "newsletter-metadata",
        "summary": "Metadados da newsletter",
        "description": "Retorna informações detalhadas de uma newsletter.",
        "tags": [
          "Newsletter / Canais"
        ],
        "parameters": [
          {
            "name": "newsletterId",
            "in": "path",
            "required": true,
            "description": "ID da newsletter (@newsletter).",
            "schema": {
              "type": "string",
              "description": "ID da newsletter (@newsletter)."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/follow-newsletter": {
      "put": {
        "operationId": "follow-newsletter",
        "summary": "Seguir newsletter",
        "description": "A instância começa a seguir a newsletter.",
        "tags": [
          "Newsletter / Canais"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID da newsletter."
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "abcd1234@newsletter"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/unfollow-newsletter": {
      "put": {
        "operationId": "unfollow-newsletter",
        "summary": "Deixar de seguir newsletter",
        "description": "A instância para de seguir a newsletter.",
        "tags": [
          "Newsletter / Canais"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID da newsletter."
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "abcd1234@newsletter"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/newsletter/settings/{newsletterId}": {
      "post": {
        "operationId": "newsletter-settings",
        "summary": "Configurações da newsletter",
        "description": "Atualiza as configurações de reação da newsletter.",
        "tags": [
          "Newsletter / Canais"
        ],
        "parameters": [
          {
            "name": "newsletterId",
            "in": "path",
            "required": true,
            "description": "ID da newsletter.",
            "schema": {
              "type": "string",
              "description": "ID da newsletter."
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "reactionCodes": {
                    "type": "string",
                    "description": "Tipo de reações permitidas.",
                    "enum": [
                      "basic",
                      "all"
                    ]
                  }
                }
              },
              "example": {
                "reactionCodes": "all"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/mute-newsletter": {
      "put": {
        "operationId": "mute-newsletter",
        "summary": "Silenciar newsletter",
        "description": "Silencia as notificações de uma newsletter.",
        "tags": [
          "Newsletter / Canais"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID da newsletter."
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "abcd1234@newsletter"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/delete-newsletter": {
      "delete": {
        "operationId": "delete-newsletter",
        "summary": "Deletar newsletter",
        "description": "Remove permanentemente uma newsletter.",
        "tags": [
          "Newsletter / Canais"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID da newsletter."
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "abcd1234@newsletter"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/unmute-newsletter": {
      "put": {
        "operationId": "unmute-newsletter",
        "summary": "Reativar som da newsletter",
        "description": "Reativa as notificações de uma newsletter silenciada.",
        "tags": [
          "Newsletter / Canais"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID da newsletter."
                  }
                },
                "required": [
                  "id"
                ]
              },
              "example": {
                "id": "abcd1234@newsletter"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/update-newsletter-picture": {
      "post": {
        "operationId": "update-newsletter-picture",
        "summary": "Atualizar imagem da newsletter",
        "description": "Atualiza a foto/capa da newsletter.",
        "tags": [
          "Newsletter / Canais"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID da newsletter."
                  },
                  "pictureUrl": {
                    "type": "string",
                    "description": "URL pública da nova imagem."
                  }
                },
                "required": [
                  "id",
                  "pictureUrl"
                ]
              },
              "example": {
                "id": "abcd1234@newsletter",
                "pictureUrl": "https://imagens.exemplo.com/capa.jpg"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/update-newsletter-name": {
      "post": {
        "operationId": "update-newsletter-name",
        "summary": "Alterar nome da newsletter",
        "description": "Atualiza o nome/título da newsletter.",
        "tags": [
          "Newsletter / Canais"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID da newsletter."
                  },
                  "name": {
                    "type": "string",
                    "description": "Novo nome do canal."
                  }
                },
                "required": [
                  "id",
                  "name"
                ]
              },
              "example": {
                "id": "abcd1234@newsletter",
                "name": "Canal Wafly Oficial"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/update-newsletter-description": {
      "post": {
        "operationId": "update-newsletter-description",
        "summary": "Alterar descrição da newsletter",
        "description": "Atualiza a descrição exibida no canal.",
        "tags": [
          "Newsletter / Canais"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "ID da newsletter."
                  },
                  "description": {
                    "type": "string",
                    "description": "Nova descrição do canal."
                  }
                },
                "required": [
                  "id",
                  "description"
                ]
              },
              "example": {
                "id": "abcd1234@newsletter",
                "description": "Notícias e novidades da Wafly"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/search-newsletter": {
      "post": {
        "operationId": "search-newsletter",
        "summary": "Buscar newsletters",
        "description": "Busca newsletters para descoberta/exploração com filtros de visualização e país.",
        "tags": [
          "Newsletter / Canais"
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "limit": {
                    "type": "number",
                    "description": "Máximo de resultados. Padrão: 50."
                  },
                  "view": {
                    "type": "string",
                    "description": "Tipo de listagem.",
                    "enum": [
                      "TRENDING",
                      "POPULAR",
                      "RECOMMENDED",
                      "NEW"
                    ]
                  },
                  "searchText": {
                    "type": "string",
                    "description": "Texto de pesquisa livre."
                  },
                  "filters": {
                    "type": "object",
                    "description": "Filtros adicionais: { countryCodes: string[] } — filtra por código de país (ex: [\"BR\"])."
                  }
                }
              },
              "example": {
                "limit": 20,
                "view": "TRENDING",
                "searchText": "tecnologia"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/newsletter/accept-admin-invite/{newsletterId}": {
      "post": {
        "operationId": "newsletter-accept-admin-invite",
        "summary": "Aceitar convite de admin",
        "description": "Aceita um convite para se tornar administrador da newsletter.",
        "tags": [
          "Newsletter / Canais"
        ],
        "parameters": [
          {
            "name": "newsletterId",
            "in": "path",
            "required": true,
            "description": "ID da newsletter.",
            "schema": {
              "type": "string",
              "description": "ID da newsletter."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/newsletter/remove-admin/{newsletterId}": {
      "post": {
        "operationId": "newsletter-remove-admin",
        "summary": "Remover administrador da newsletter",
        "description": "Remove os privilégios de administrador de um membro.",
        "tags": [
          "Newsletter / Canais"
        ],
        "parameters": [
          {
            "name": "newsletterId",
            "in": "path",
            "required": true,
            "description": "ID da newsletter.",
            "schema": {
              "type": "string",
              "description": "ID da newsletter."
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Número do admin a remover."
                  }
                },
                "required": [
                  "phone"
                ]
              },
              "example": {
                "phone": "5511999999999"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/newsletter/revoke-admin-invite/{newsletterId}": {
      "post": {
        "operationId": "newsletter-revoke-admin-invite",
        "summary": "Revogar convite de admin",
        "description": "Cancela um convite de administrador pendente.",
        "tags": [
          "Newsletter / Canais"
        ],
        "parameters": [
          {
            "name": "newsletterId",
            "in": "path",
            "required": true,
            "description": "ID da newsletter.",
            "schema": {
              "type": "string",
              "description": "ID da newsletter."
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Número cujo convite será revogado."
                  }
                },
                "required": [
                  "phone"
                ]
              },
              "example": {
                "phone": "5511999999999"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/newsletter/transfer-ownership/{newsletterId}": {
      "post": {
        "operationId": "newsletter-transfer-ownership",
        "summary": "Transferir propriedade da newsletter",
        "description": "Transfere a titularidade (ownership) da newsletter para outro número.\n\nAção irreversível — a instância atual perderá o controle administrativo da newsletter.",
        "tags": [
          "Newsletter / Canais"
        ],
        "parameters": [
          {
            "name": "newsletterId",
            "in": "path",
            "required": true,
            "description": "ID da newsletter.",
            "schema": {
              "type": "string",
              "description": "ID da newsletter."
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Número do novo proprietário."
                  }
                },
                "required": [
                  "phone"
                ]
              },
              "example": {
                "phone": "5511888888888"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/chats": {
      "get": {
        "operationId": "list-chats",
        "summary": "Listar conversas",
        "description": "Retorna a lista de chats com paginação obrigatória.",
        "tags": [
          "Chats"
        ],
        "parameters": [
          {
            "name": "page",
            "in": "query",
            "required": true,
            "description": "Número da página.",
            "schema": {
              "type": "number",
              "description": "Número da página."
            }
          },
          {
            "name": "pageSize",
            "in": "query",
            "required": true,
            "description": "Itens por página.",
            "schema": {
              "type": "number",
              "description": "Itens por página."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": [
                  {
                    "id": "5511999999999",
                    "name": "Maria Silva",
                    "lastMessage": "Olá!",
                    "timestamp": 1700000000
                  }
                ]
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/modify-chat": {
      "post": {
        "operationId": "modify-chat",
        "summary": "Marcar chat como lido/não lido",
        "description": "Altera o estado de leitura de uma conversa.",
        "tags": [
          "Chats"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Chat a modificar.",
                    "example": "5511999999999"
                  },
                  "action": {
                    "type": "string",
                    "description": "Estado desejado do chat.",
                    "enum": [
                      "read",
                      "unread"
                    ],
                    "example": "read"
                  }
                },
                "required": [
                  "phone",
                  "action"
                ]
              },
              "example": {
                "phone": "5511999999999",
                "action": "read"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/chats/{phone}": {
      "get": {
        "operationId": "chat-metadata",
        "summary": "Metadados de um chat",
        "description": "Retorna informações detalhadas de uma conversa específica.",
        "tags": [
          "Chats"
        ],
        "parameters": [
          {
            "name": "phone",
            "in": "path",
            "required": true,
            "description": "Número ou ID do chat.",
            "schema": {
              "type": "string",
              "description": "Número ou ID do chat."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/update-webhook-received": {
      "put": {
        "operationId": "update-webhook-received",
        "summary": "Webhook — mensagem recebida",
        "description": "URL chamada sempre que a instância receber uma mensagem.",
        "tags": [
          "Webhooks"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "value": {
                    "type": "string",
                    "description": "URL de destino do webhook. Deixe vazio (\"\") para remover.",
                    "example": "https://meuservidor.com/webhook/received"
                  }
                },
                "required": [
                  "value"
                ]
              },
              "example": {
                "value": "https://meuservidor.com/webhook/received"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/update-webhook-delivery": {
      "put": {
        "operationId": "update-webhook-delivery",
        "summary": "Webhook — confirmação de entrega",
        "description": "URL chamada quando uma mensagem enviada é confirmada como entregue.",
        "tags": [
          "Webhooks"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "value": {
                    "type": "string",
                    "description": "URL de destino do webhook."
                  }
                },
                "required": [
                  "value"
                ]
              },
              "example": {
                "value": "https://meuservidor.com/webhook/delivery"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/update-webhook-connected": {
      "put": {
        "operationId": "update-webhook-connected",
        "summary": "Webhook — instância conectada",
        "description": "URL chamada quando a instância se conecta ao WhatsApp.",
        "tags": [
          "Webhooks"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "value": {
                    "type": "string",
                    "description": "URL de destino."
                  }
                },
                "required": [
                  "value"
                ]
              },
              "example": {
                "value": "https://meuservidor.com/webhook/connected"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/update-webhook-disconnected": {
      "put": {
        "operationId": "update-webhook-disconnected",
        "summary": "Webhook — instância desconectada",
        "description": "URL chamada quando a instância se desconecta.",
        "tags": [
          "Webhooks"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "value": {
                    "type": "string",
                    "description": "URL de destino."
                  }
                },
                "required": [
                  "value"
                ]
              },
              "example": {
                "value": "https://meuservidor.com/webhook/disconnected"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/communities": {
      "get": {
        "operationId": "list-communities",
        "summary": "Listar comunidades",
        "description": "Retorna todas as comunidades da instância.",
        "tags": [
          "Comunidades"
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      },
      "post": {
        "operationId": "create-community",
        "summary": "Criar comunidade",
        "description": "Cria uma nova comunidade com participantes iniciais.",
        "tags": [
          "Comunidades"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "name": {
                    "type": "string",
                    "description": "Nome da comunidade."
                  },
                  "description": {
                    "type": "string",
                    "description": "Descrição."
                  },
                  "participants": {
                    "type": "array",
                    "items": {},
                    "description": "Números iniciais."
                  }
                },
                "required": [
                  "name"
                ]
              },
              "example": {
                "name": "Minha Comunidade",
                "description": "Grupos de clientes"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/communities/link": {
      "post": {
        "operationId": "link-community",
        "summary": "Vincular grupos à comunidade",
        "description": "Adiciona grupos existentes a uma comunidade.",
        "tags": [
          "Comunidades"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "communityId": {
                    "type": "string",
                    "description": "ID da comunidade."
                  },
                  "groupsPhones": {
                    "type": "array",
                    "items": {},
                    "description": "IDs dos grupos (ID-group)."
                  }
                },
                "required": [
                  "communityId",
                  "groupsPhones"
                ]
              },
              "example": {
                "communityId": "comID-group",
                "groupsPhones": [
                  "120363XXXX-group"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/communities/unlink": {
      "post": {
        "operationId": "unlink-community",
        "summary": "Desvincular grupos da comunidade",
        "description": "Remove grupos de uma comunidade.",
        "tags": [
          "Comunidades"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "communityId": {
                    "type": "string",
                    "description": "ID da comunidade."
                  },
                  "groupsPhones": {
                    "type": "array",
                    "items": {},
                    "description": "IDs dos grupos."
                  }
                },
                "required": [
                  "communityId",
                  "groupsPhones"
                ]
              },
              "example": {
                "communityId": "comID-group",
                "groupsPhones": [
                  "120363XXXX-group"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/communities-metadata/{communityId}": {
      "get": {
        "operationId": "community-metadata",
        "summary": "Metadados da comunidade",
        "description": "Retorna informações detalhadas da comunidade incluindo grupos vinculados e participantes.",
        "tags": [
          "Comunidades"
        ],
        "parameters": [
          {
            "name": "communityId",
            "in": "path",
            "required": true,
            "description": "ID da comunidade.",
            "schema": {
              "type": "string",
              "description": "ID da comunidade."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/communities/settings": {
      "post": {
        "operationId": "community-settings",
        "summary": "Configurações da comunidade",
        "description": "Atualiza permissões da comunidade, como quem pode adicionar novos grupos.",
        "tags": [
          "Comunidades"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "communityId": {
                    "type": "string",
                    "description": "ID da comunidade."
                  },
                  "whoCanAddNewGroups": {
                    "type": "string",
                    "description": "Define quem pode adicionar novos grupos à comunidade.",
                    "enum": [
                      "admins",
                      "all"
                    ]
                  }
                },
                "required": [
                  "communityId",
                  "whoCanAddNewGroups"
                ]
              },
              "example": {
                "communityId": "comID-group",
                "whoCanAddNewGroups": "admins"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/communities/{communityId}": {
      "delete": {
        "operationId": "delete-community",
        "summary": "Desativar comunidade",
        "description": "Desativa e remove permanentemente uma comunidade.\n\nAção irreversível — todos os grupos vinculados serão desassociados da comunidade.",
        "tags": [
          "Comunidades"
        ],
        "parameters": [
          {
            "name": "communityId",
            "in": "path",
            "required": true,
            "description": "ID da comunidade.",
            "schema": {
              "type": "string",
              "description": "ID da comunidade."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/call/config": {
      "get": {
        "operationId": "call-config-get",
        "summary": "Ver configuração de chamadas",
        "description": "Retorna como a instância trata chamadas recebidas. onIncoming vazio significa que nada foi configurado e a ligação toca normalmente no celular.\n\nBeta: as chamadas de voz precisam ser ativadas para a sua instância. Enquanto não estiverem, todos os endpoints desta seção respondem 503. Fale com o suporte para habilitar.",
        "tags": [
          "Chamadas (beta)"
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "instanceId": "MINHA_INSTANCE",
                  "onIncoming": "mp3",
                  "mp3": {
                    "url": "https://exemplo.com/recado.mp3",
                    "hangupAfter": true
                  },
                  "ai": {
                    "voiceId": "pt-BR-female",
                    "aiEndpoint": "https://meu-agente/voz"
                  },
                  "human": {
                    "notifyUrl": "https://meu-crm/chamada"
                  }
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      },
      "put": {
        "operationId": "call-config-set",
        "summary": "Configurar chamadas recebidas",
        "description": "Define o que fazer quando alguém liga para o número da instância.\n\nBeta: as chamadas de voz precisam ser ativadas para a sua instância. Enquanto não estiverem, todos os endpoints desta seção respondem 503. Fale com o suporte para habilitar.\n\nNos modos ai e human esta versão atende a ligação e dispara o webhook; o áudio de ida e volta com a IA ainda não está ligado.",
        "tags": [
          "Chamadas (beta)"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "onIncoming": {
                    "type": "string",
                    "description": "reject recusa a ligação; mp3 atende e toca o áudio configurado; ai atende e dispara o webhook ai_incoming; human dispara o webhook human_needed. Se ficar vazio, a ligação toca normalmente no celular.",
                    "enum": [
                      "reject",
                      "mp3",
                      "ai",
                      "human"
                    ],
                    "example": "mp3"
                  },
                  "mp3": {
                    "type": "object",
                    "description": "Usado quando onIncoming=mp3. Campos: url (áudio a tocar) e hangupAfter (desligar ao terminar).",
                    "example": "{ \"url\": \"https://exemplo.com/recado.mp3\", \"hangupAfter\": true }"
                  },
                  "ai": {
                    "type": "object",
                    "description": "Usado quando onIncoming=ai. Campos: voiceId e aiEndpoint."
                  },
                  "human": {
                    "type": "object",
                    "description": "Usado quando onIncoming=human. Campo: notifyUrl."
                  }
                },
                "required": [
                  "onIncoming"
                ]
              },
              "example": {
                "onIncoming": "mp3",
                "mp3": {
                  "url": "https://exemplo.com/recado.mp3",
                  "hangupAfter": true
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "value": true
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/call/start": {
      "post": {
        "operationId": "call-start",
        "summary": "Iniciar chamada",
        "description": "Faz uma chamada de voz para um número.\n\nBeta: as chamadas de voz precisam ser ativadas para a sua instância. Enquanto não estiverem, todos os endpoints desta seção respondem 503. Fale com o suporte para habilitar.\n\nLigar para quem nunca falou com o seu número é o mesmo risco de bloqueio de qualquer contato frio.",
        "tags": [
          "Chamadas (beta)"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "phone": {
                    "type": "string",
                    "description": "Número a chamar.",
                    "example": "5511999999999"
                  },
                  "video": {
                    "type": "boolean",
                    "description": "Chamada de vídeo em vez de voz."
                  },
                  "mp3Url": {
                    "type": "string",
                    "description": "Áudio a tocar assim que a chamada for atendida."
                  },
                  "mp3Base64": {
                    "type": "string",
                    "description": "Alternativa a mp3Url, com o áudio embutido em base64."
                  },
                  "hangupAfter": {
                    "type": "boolean",
                    "description": "Desliga automaticamente quando o áudio terminar."
                  }
                },
                "required": [
                  "phone"
                ]
              },
              "example": {
                "phone": "5511999999999",
                "mp3Url": "https://exemplo.com/recado.mp3",
                "hangupAfter": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "callId": "3EB0XXXX"
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/call/accept": {
      "post": {
        "operationId": "call-accept",
        "summary": "Atender chamada",
        "description": "Atende uma chamada em curso.\n\nBeta: as chamadas de voz precisam ser ativadas para a sua instância. Enquanto não estiverem, todos os endpoints desta seção respondem 503. Fale com o suporte para habilitar.",
        "tags": [
          "Chamadas (beta)"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "callId": {
                    "type": "string",
                    "description": "ID da chamada."
                  }
                },
                "required": [
                  "callId"
                ]
              },
              "example": {
                "callId": "3EB0XXXX"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/call/reject": {
      "post": {
        "operationId": "call-reject",
        "summary": "Recusar chamada",
        "description": "Recusa uma chamada recebida.\n\nBeta: as chamadas de voz precisam ser ativadas para a sua instância. Enquanto não estiverem, todos os endpoints desta seção respondem 503. Fale com o suporte para habilitar.",
        "tags": [
          "Chamadas (beta)"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "callId": {
                    "type": "string",
                    "description": "ID da chamada."
                  }
                },
                "required": [
                  "callId"
                ]
              },
              "example": {
                "callId": "3EB0XXXX"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/call/terminate": {
      "post": {
        "operationId": "call-terminate",
        "summary": "Encerrar chamada",
        "description": "Desliga uma chamada em andamento.\n\nBeta: as chamadas de voz precisam ser ativadas para a sua instância. Enquanto não estiverem, todos os endpoints desta seção respondem 503. Fale com o suporte para habilitar.",
        "tags": [
          "Chamadas (beta)"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "callId": {
                    "type": "string",
                    "description": "ID da chamada."
                  }
                },
                "required": [
                  "callId"
                ]
              },
              "example": {
                "callId": "3EB0XXXX"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/call/play": {
      "post": {
        "operationId": "call-play",
        "summary": "Tocar áudio na chamada",
        "description": "Reproduz um MP3 dentro de uma chamada ativa.\n\nBeta: as chamadas de voz precisam ser ativadas para a sua instância. Enquanto não estiverem, todos os endpoints desta seção respondem 503. Fale com o suporte para habilitar.",
        "tags": [
          "Chamadas (beta)"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "callId": {
                    "type": "string",
                    "description": "ID da chamada."
                  },
                  "url": {
                    "type": "string",
                    "description": "URL do MP3 a tocar."
                  },
                  "base64": {
                    "type": "string",
                    "description": "Alternativa a url, com o áudio embutido."
                  },
                  "hangupAfter": {
                    "type": "boolean",
                    "description": "Desliga quando o áudio terminar."
                  }
                },
                "required": [
                  "callId"
                ]
              },
              "example": {
                "callId": "3EB0XXXX",
                "url": "https://exemplo.com/recado.mp3",
                "hangupAfter": true
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/call/say": {
      "post": {
        "operationId": "call-say",
        "summary": "Falar texto na chamada (TTS)",
        "description": "Converte texto em voz e reproduz dentro da chamada.\n\nBeta: as chamadas de voz precisam ser ativadas para a sua instância. Enquanto não estiverem, todos os endpoints desta seção respondem 503. Fale com o suporte para habilitar.",
        "tags": [
          "Chamadas (beta)"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "callId": {
                    "type": "string",
                    "description": "ID da chamada."
                  },
                  "text": {
                    "type": "string",
                    "description": "Texto a ser falado."
                  },
                  "voiceId": {
                    "type": "string",
                    "description": "Voz a usar na síntese."
                  },
                  "hangupAfter": {
                    "type": "boolean",
                    "description": "Desliga quando terminar de falar."
                  }
                },
                "required": [
                  "callId",
                  "text"
                ]
              },
              "example": {
                "callId": "3EB0XXXX",
                "text": "Olá, sua entrega chega hoje às 14h."
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/call/webrtc": {
      "post": {
        "operationId": "call-webrtc",
        "summary": "Ponte WebRTC",
        "description": "Troca o SDP para ligar a chamada a um cliente WebRTC (ex.: atendimento humano pelo navegador).\n\nBeta: as chamadas de voz precisam ser ativadas para a sua instância. Enquanto não estiverem, todos os endpoints desta seção respondem 503. Fale com o suporte para habilitar.",
        "tags": [
          "Chamadas (beta)"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "callId": {
                    "type": "string",
                    "description": "ID da chamada."
                  },
                  "sdpOffer": {
                    "type": "string",
                    "description": "SDP offer do cliente."
                  }
                },
                "required": [
                  "callId",
                  "sdpOffer"
                ]
              },
              "example": {
                "callId": "3EB0XXXX",
                "sdpOffer": "v=0\r\no=- ..."
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/call/{callId}/record/start": {
      "post": {
        "operationId": "call-record-start",
        "summary": "Iniciar gravação",
        "description": "Começa a gravar o áudio da chamada.\n\nBeta: as chamadas de voz precisam ser ativadas para a sua instância. Enquanto não estiverem, todos os endpoints desta seção respondem 503. Fale com o suporte para habilitar.\n\nGravar chamada exige base legal e, em geral, aviso ao interlocutor.",
        "tags": [
          "Chamadas (beta)"
        ],
        "parameters": [
          {
            "name": "callId",
            "in": "path",
            "required": true,
            "description": "ID da chamada.",
            "schema": {
              "type": "string",
              "description": "ID da chamada."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/call/{callId}/record/stop": {
      "post": {
        "operationId": "call-record-stop",
        "summary": "Parar gravação",
        "description": "Encerra a gravação em andamento.\n\nBeta: as chamadas de voz precisam ser ativadas para a sua instância. Enquanto não estiverem, todos os endpoints desta seção respondem 503. Fale com o suporte para habilitar.",
        "tags": [
          "Chamadas (beta)"
        ],
        "parameters": [
          {
            "name": "callId",
            "in": "path",
            "required": true,
            "description": "ID da chamada.",
            "schema": {
              "type": "string",
              "description": "ID da chamada."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/call/{callId}/recording": {
      "get": {
        "operationId": "call-recording",
        "summary": "Baixar gravação",
        "description": "Retorna o MP3 da chamada gravada. Responde 404 quando não há gravação para o callId.\n\nBeta: as chamadas de voz precisam ser ativadas para a sua instância. Enquanto não estiverem, todos os endpoints desta seção respondem 503. Fale com o suporte para habilitar.\n\nA resposta é o binário do áudio (audio/mpeg), não JSON.",
        "tags": [
          "Chamadas (beta)"
        ],
        "parameters": [
          {
            "name": "callId",
            "in": "path",
            "required": true,
            "description": "ID da chamada.",
            "schema": {
              "type": "string",
              "description": "ID da chamada."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    },
    "/api-bridge-whats/instances/{instance}/token/{token}/call/{callId}/transcript": {
      "get": {
        "operationId": "call-transcript-get",
        "summary": "Ver transcrição",
        "description": "Retorna a transcrição da chamada, segmentada por quem falou.\n\nBeta: as chamadas de voz precisam ser ativadas para a sua instância. Enquanto não estiverem, todos os endpoints desta seção respondem 503. Fale com o suporte para habilitar.",
        "tags": [
          "Chamadas (beta)"
        ],
        "parameters": [
          {
            "name": "callId",
            "in": "path",
            "required": true,
            "description": "ID da chamada.",
            "schema": {
              "type": "string",
              "description": "ID da chamada."
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "callId": "3EB0XXXX",
                  "instanceId": "MINHA_INSTANCE",
                  "segments": [
                    {
                      "speaker": "caller",
                      "text": "Alô?",
                      "at": 1700000000000
                    },
                    {
                      "speaker": "ai",
                      "text": "Olá! Em que posso ajudar?",
                      "at": 1700000002000
                    }
                  ],
                  "updated": 1700000002000
                }
              }
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      },
      "post": {
        "operationId": "call-transcript-post",
        "summary": "Anexar transcrição",
        "description": "Adiciona segmentos à transcrição da chamada. Serve para quem roda o próprio motor de fala e quer guardar o resultado junto da chamada.\n\nBeta: as chamadas de voz precisam ser ativadas para a sua instância. Enquanto não estiverem, todos os endpoints desta seção respondem 503. Fale com o suporte para habilitar.",
        "tags": [
          "Chamadas (beta)"
        ],
        "parameters": [
          {
            "name": "callId",
            "in": "path",
            "required": true,
            "description": "ID da chamada.",
            "schema": {
              "type": "string",
              "description": "ID da chamada."
            }
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "segments": {
                    "type": "array",
                    "items": {},
                    "description": "Trechos da conversa. Cada item tem speaker (caller, ai ou agent), text e at (unix ms)."
                  }
                },
                "required": [
                  "segments"
                ]
              },
              "example": {
                "segments": [
                  {
                    "speaker": "caller",
                    "text": "Alô?",
                    "at": 1700000000000
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {}
            }
          },
          "401": {
            "description": "Credenciais inválidas ou ausentes"
          },
          "402": {
            "description": "Assinatura inadimplente ou trial expirado"
          }
        }
      }
    }
  },
  "tags": [
    {
      "name": "Parceiros",
      "description": "Criação de instâncias via API para clientes parceiros (provisionamento completo)."
    },
    {
      "name": "Instância",
      "description": "Gerenciamento de sessão: conexão, status, QR Code e dispositivo."
    },
    {
      "name": "Mensagens",
      "description": "Envio de mensagens de texto, mídia, interativas e muito mais."
    },
    {
      "name": "Grupos",
      "description": "Criação, gerenciamento e configurações de grupos WhatsApp."
    },
    {
      "name": "Newsletter / Canais",
      "description": "Gerenciamento de newsletters e canais (@newsletter)."
    },
    {
      "name": "Chats",
      "description": "Listagem e metadados de conversas."
    },
    {
      "name": "Webhooks",
      "description": "Configuração de URLs de callback para eventos da instância."
    },
    {
      "name": "Comunidades",
      "description": "Super-grupos: criação, gestão e configurações de comunidades."
    },
    {
      "name": "Chamadas (beta)",
      "description": "Chamadas de voz por WhatsApp: atender, recusar, tocar áudio, falar por TTS, gravar e transcrever. Requer ativação."
    }
  ]
}
