{"components":{"parameters":{"IdempotencyKey":{"description":"Opcional. Executa o pedido uma única vez por credencial, método, caminho e chave, durante 24 h. Repetir com o mesmo corpo devolve a resposta guardada com Idempotent-Replayed: true. Repetir com corpo diferente responde 409 idempotency_key_reuse. Respostas 408, 409, 423, 425, 429 e 5xx não são guardadas: repetir executa de novo.","in":"header","name":"Idempotency-Key","required":false,"schema":{"pattern":"^[A-Za-z0-9_.:-]{1,128}$","type":"string"}}},"securitySchemes":{"accountApiKey":{"description":"Chave de API da conta (ash_live_…), limitada por escopo. Ver /llms.txt.","scheme":"bearer","type":"http"},"accountSession":{"description":"Access token da sessão da conta (POST /api/v1/auth/login).","scheme":"bearer","type":"http"},"adminKey":{"description":"Chave global de administrador.","in":"header","name":"X-Ashford-Key","type":"apiKey"},"instanceToken":{"description":"Token da instância. A chave de administrador também é aceita.","in":"header","name":"X-Ashford-Token","type":"apiKey"}}},"info":{"description":"API de WhatsApp multi-instância com recuperação de mídia efêmera em sessão única.","title":"Ashford Hub","version":"1.0.0","x-contract-version":"2.0.0"},"openapi":"3.1.0","paths":{"/api/v1/account":{"get":{"operationId":"account.get","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Conta atual","tags":["Conta, assinatura e instâncias"]}},"/api/v1/account/api-keys":{"get":{"description":"Devolve as chaves da conta, mais novas primeiro, incluindo revogadas. Nunca devolve o segredo: só o prefixo. grantable lista os escopos que o seu papel concede.","operationId":"account.apiKeys.list","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Listar chaves de API","tags":["Chaves de API da conta"]},"post":{"description":"Devolve o segredo em secret uma única vez; guarde-o num cofre. Escopo fora da lista: 422; escopo que o seu papel não concede: 403; mais de 25 chaves ativas: 409. Uma chave não cria outra chave.","operationId":"account.apiKeys.create","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"expiresAt":{"description":"RFC 3339 no futuro; vazio = não expira","example":"2026-12-31T23:59:59Z","type":"string"},"name":{"description":"Até 60 caracteres","example":"CRM de vendas","type":"string"},"scopes":{"description":"instances:read, instances:write, messages:send, messages:read, webhooks:manage, presence:write, calls:control, calls:media, messages:service","example":["messages:send"],"items":{"type":"string"},"type":"array"}},"required":["name","scopes"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Criar chave de API","tags":["Chaves de API da conta"]}},"/api/v1/account/api-keys/{id}":{"delete":{"description":"Efeito imediato: o próximo pedido com a chave recebe 401. Chave de outra conta ou inexistente: 404.","operationId":"account.apiKeys.revoke","parameters":[{"description":"ID do registro.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Revogar chave de API","tags":["Chaves de API da conta"]}},"/api/v1/account/contacts/provenance":{"get":{"description":"Origem, base legal informada e instrução do cliente para o número, e se ele tem opt-out.","operationId":"account.provenance.get","parameters":[{"description":"","in":"query","name":"phone","required":true,"schema":{"example":"5511988887777","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Consultar procedência","tags":["Opt-out e procedência de contatos"]},"put":{"description":"Grava ou substitui. Não altera o opt-out. Cada campo até 500 caracteres.","operationId":"account.provenance.save","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"instruction":{"example":"só pós-venda","type":"string"},"legalBasis":{"example":"consentimento","type":"string"},"origin":{"example":"formulário do site","type":"string"},"phone":{"example":"5511988887777","type":"string"}},"required":["phone"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Registrar procedência","tags":["Opt-out e procedência de contatos"]}},"/api/v1/account/instances":{"get":{"operationId":"account.instances.list","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Listar instâncias da conta","tags":["Conta, assinatura e instâncias"]},"post":{"description":"409 quando a conta chegou ao teto do plano (50).","operationId":"account.instances.create","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"autostart":{"example":true,"type":"boolean"},"name":{"example":"vendas","type":"string"}},"required":["name"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Criar instância na conta","tags":["Conta, assinatura e instâncias"]}},"/api/v1/account/instances/{id}":{"delete":{"operationId":"account.instances.delete","parameters":[{"description":"ID do registro.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Excluir instância da conta","tags":["Conta, assinatura e instâncias"]},"get":{"operationId":"account.instances.get","parameters":[{"description":"ID do registro.","in":"path","name":"id","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Detalhar instância da conta","tags":["Conta, assinatura e instâncias"]}},"/api/v1/account/instances/{id}/token":{"post":{"description":"Proprietário ou administrador. O token antigo para de funcionar na hora; o novo sai uma única vez. Instância de outra conta: 404.","operationId":"account.instances.rotateToken","parameters":[{"description":"ID do registro.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Rotacionar o token de uma instância","tags":["Chaves de API da conta"]}},"/api/v1/account/subscription":{"get":{"description":"Plano, estado, fim do período, instâncias em uso e teto.","operationId":"account.subscription.get","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Assinatura","tags":["Conta, assinatura e instâncias"]}},"/api/v1/account/subscription/cancel":{"post":{"description":"Preserva o período pago (cancelamento agendado). Repetir devolve o estado atual.","operationId":"account.subscription.cancel","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Cancelar assinatura","tags":["Conta, assinatura e instâncias"]}},"/api/v1/account/subscription/checkout":{"post":{"description":"Devolve a URL do checkout hospedado. Self-hosted sem checkout: 503.","operationId":"account.subscription.checkout","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"plan":{"example":"mensal","type":"string"}},"required":["plan"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Abrir checkout","tags":["Conta, assinatura e instâncias"]}},"/api/v1/account/subscription/plan":{"post":{"description":"422 se o plano novo comporta menos instâncias do que as em uso.","operationId":"account.subscription.plan","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"plan":{"example":"anual","type":"string"}},"required":["plan"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Trocar plano","tags":["Conta, assinatura e instâncias"]}},"/api/v1/account/subscription/status":{"get":{"operationId":"account.subscription.status","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Estado do checkout","tags":["Conta, assinatura e instâncias"]}},"/api/v1/account/suppressions":{"delete":{"description":"Só com nova autorização do contato, declarada em reason (10+ caracteres, auditado). Proprietário ou administrador. Número fora da lista: 404.","operationId":"account.suppressions.remove","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"phone":{"example":"5511988887777","type":"string"},"reason":{"description":"10+ caracteres","example":"autorizou por escrito em 07/10","type":"string"}},"required":["phone","reason"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Remover opt-out","tags":["Opt-out e procedência de contatos"]},"get":{"description":"Até 500, mais recentes primeiro. phone vem mascarado.","operationId":"account.suppressions.list","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Listar contatos com opt-out","tags":["Opt-out e procedência de contatos"]},"post":{"description":"201 na primeira inclusão; repetir (inclusive com o número em outra forma, com ou sem o 9) devolve 200 sem mudar nada.","operationId":"account.suppressions.add","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"phone":{"description":"Só dígitos ou formatado; 8 a 15 dígitos","example":"5511988887777","type":"string"},"reason":{"example":"respondeu SAIR","type":"string"},"source":{"description":"Padrão api","enum":["api","ui","n8n","import","titular","automacao"],"example":"n8n","type":"string"}},"required":["phone"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Incluir opt-out","tags":["Opt-out e procedência de contatos"]}},"/api/v1/account/webhooks/dropped":{"get":{"description":"Soma e detalhe por instância da conta dos eventos que a fila de entrega descartou. Proprietário, administrador, desenvolvedor ou chave com webhooks:manage.","operationId":"account.webhooks.dropped","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Eventos descartados por instância","tags":["Conta, assinatura e instâncias"]}},"/api/v1/accounts":{"post":{"description":"Sempre 403 com code signup_requires_purchase e plansUrl: a conta nasce da compra e do link de ativação.","operationId":"auth.signup","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Cadastro (fechado)","tags":["Autenticação da conta"]}},"/api/v1/accounts/{account}/suspension":{"delete":{"operationId":"accounts.suspension.clear","parameters":[{"description":"ID da conta.","in":"path","name":"account","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Reativar conta","tags":["Operação da plataforma"]},"get":{"operationId":"accounts.suspension.get","parameters":[{"description":"ID da conta.","in":"path","name":"account","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Ver suspensão da conta","tags":["Operação da plataforma"]},"post":{"description":"Derruba sessões; chaves e tokens passam a receber 402/403.","operationId":"accounts.suspension.set","parameters":[{"description":"ID da conta.","in":"path","name":"account","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"reason":{"example":"","type":"string"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Suspender conta","tags":["Operação da plataforma"]}},"/api/v1/audit":{"get":{"description":"Ações sensíveis com proxies, IPs e segredos já removidos do texto.","operationId":"audit.list","parameters":[{"description":"","in":"query","name":"limit","required":false,"schema":{"example":100,"type":"number"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Trilha de auditoria","tags":["Plataforma"]}},"/api/v1/auth/email/verify/confirm":{"get":{"operationId":"auth.email.verifyConfirm","parameters":[{"description":"","in":"query","name":"token","required":true,"schema":{"example":"","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Confirmar e-mail pelo link","tags":["Autenticação da conta"]}},"/api/v1/auth/email/verify/request":{"post":{"description":"Só o proprietário. Envia o link de confirmação ao e-mail da conta.","operationId":"auth.email.verifyRequest","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Enviar verificação de e-mail","tags":["Autenticação da conta"]}},"/api/v1/auth/login":{"post":{"description":"Devolve access e refresh token. Tentativas erradas sofrem limite por e-mail e por IP (429 com Retry-After).","operationId":"auth.login","requestBody":{"content":{"application/json":{"schema":{"properties":{"email":{"example":"dono@empresa.com","type":"string"},"password":{"example":"","type":"string"}},"required":["email","password"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Entrar","tags":["Autenticação da conta"]}},"/api/v1/auth/logout":{"post":{"description":"Revoga a sessão do token informado (Bearer ou refresh_token).","operationId":"auth.logout","requestBody":{"content":{"application/json":{"schema":{"properties":{"refresh_token":{"description":"Alternativa ao header Authorization","example":"","type":"string"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Sair","tags":["Autenticação da conta"]}},"/api/v1/auth/password":{"post":{"operationId":"auth.password","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"currentPassword":{"example":"","type":"string"},"newPassword":{"example":"","type":"string"}},"required":["currentPassword","newPassword"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Trocar senha","tags":["Autenticação da conta"]}},"/api/v1/auth/password-recovery/confirm":{"post":{"operationId":"auth.recovery.confirm","requestBody":{"content":{"application/json":{"schema":{"properties":{"code":{"example":"","type":"string"},"email":{"example":"dono@empresa.com","type":"string"},"newPassword":{"example":"","type":"string"}},"required":["email","code","newPassword"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Confirmar recuperação","tags":["Autenticação da conta"]}},"/api/v1/auth/password-recovery/request":{"post":{"description":"Resposta igual para e-mail existente ou não (sem enumeração).","operationId":"auth.recovery.request","requestBody":{"content":{"application/json":{"schema":{"properties":{"email":{"example":"dono@empresa.com","type":"string"}},"required":["email"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Pedir código de recuperação","tags":["Autenticação da conta"]}},"/api/v1/auth/refresh":{"post":{"description":"Rotaciona o refresh token (Bearer ou campo refresh_token). Reuso de refresh antigo revoga a família inteira.","operationId":"auth.refresh","requestBody":{"content":{"application/json":{"schema":{"properties":{"refresh_token":{"description":"Alternativa ao header Authorization","example":"","type":"string"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Renovar sessão","tags":["Autenticação da conta"]}},"/api/v1/auth/sessions":{"delete":{"description":"Revoga todas as sessões do usuário menos a atual. Outros usuários da conta não são afetados.","operationId":"auth.sessions.revokeOthers","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Encerrar outras sessões","tags":["Sessões da conta"]},"get":{"description":"Devolve as sessões vivas do próprio usuário, mais novas primeiro. current marca a sessão do token usado na chamada.","operationId":"auth.sessions.list","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Listar sessões ativas","tags":["Sessões da conta"]}},"/api/v1/auth/sessions/{id}":{"delete":{"description":"Revoga a sessão (access e refresh da família, ou o cookie do painel). Revogar a sessão atual equivale a logout. Sessão de outro usuário ou inexistente responde 404.","operationId":"auth.sessions.revoke","parameters":[{"description":"ID do registro.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"accountSession":[]}],"summary":"Encerrar uma sessão","tags":["Sessões da conta"]}},"/api/v1/billing/cakto/webhook":{"post":{"description":"Só para a Cakto: autenticado pelo segredo do webhook no corpo. Não é rota de cliente.","operationId":"billing.caktoWebhook","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Webhook da Cakto","tags":["Operação da plataforma"]}},"/api/v1/groups/queue":{"get":{"description":"Devolve a fila de links com situação (pending, joined ou failed), tentativas e o total de entradas do dia.","operationId":"groups.queue.list","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Listar fila","tags":["Entrada em grupos"]},"post":{"description":"Aceita o link completo (https://chat.whatsapp.com/...) ou somente o código do convite. Links repetidos são recusados.","operationId":"groups.queue.add","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"link":{"example":"https://chat.whatsapp.com/AbC123XyZ9","type":"string"}},"required":["link"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Adicionar link","tags":["Entrada em grupos"]}},"/api/v1/groups/queue/batch":{"post":{"description":"Aceita vários links de uma vez, separados por linha, vírgula ou espaço. Devolve quantos entraram, quantos já estavam na fila e quantos são inválidos.","operationId":"groups.queue.batch","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"links":{"example":"https://chat.whatsapp.com/AbC123XyZ9\nhttps://chat.whatsapp.com/DeF456UvW8","type":"string"}},"required":["links"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Adicionar links em lote","tags":["Entrada em grupos"]}},"/api/v1/groups/queue/validate":{"post":{"description":"Confere cada link pendente no servidor do WhatsApp e remove da fila os que foram revogados ou não existem. Também acontece automaticamente uma vez por dia.","operationId":"groups.queue.validate","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Validar links agora","tags":["Entrada em grupos"]}},"/api/v1/groups/queue/{id}":{"delete":{"description":"Remove o link da fila. Entradas já concluídas não são desfeitas.","operationId":"groups.queue.remove","parameters":[{"description":"ID do registro.","in":"path","name":"id","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Remover da fila","tags":["Entrada em grupos"]}},"/api/v1/instances":{"get":{"description":"Devolve todas as instâncias cadastradas com status de conexão, número pareado e configurações.","operationId":"instances.list","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Listar instâncias","tags":["Instâncias"]},"post":{"description":"Cria a instância e devolve o token que autentica todas as rotas dela. Guarde o token: ele só aparece inteiro nesta resposta e na rotação.","operationId":"instances.create","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"autostart":{"description":"Reconecta sozinha quando o servidor sobe","example":true,"type":"boolean"},"connect":{"description":"Já abre o pareamento após criar","example":true,"type":"boolean"},"name":{"description":"Identificador curto, sem espaços","example":"vendas","type":"string"}},"required":["name"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Criar instância","tags":["Instâncias"]}},"/api/v1/instances/{instance}":{"delete":{"description":"Encerra a sessão, apaga o device store, as capturas e as assinaturas. A ação não tem volta.","operationId":"instances.delete","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Excluir instância","tags":["Instâncias"]},"get":{"description":"Traz status atual, número pareado, proxy configurado e o bloco completo de configurações.","operationId":"instances.get","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Detalhar instância","tags":["Instâncias"]},"patch":{"operationId":"instances.update","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"autostart":{"example":true,"type":"boolean"},"name":{"example":"vendas-sp","type":"string"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Renomear ou alterar autostart","tags":["Instâncias"]}},"/api/v1/instances/{instance}/calls":{"post":{"description":"Liga para o número informado usando a pilha VoIP nativa. Sem o campo text, a chamada emite ruído branco. Com text, o texto é sintetizado em voz e reproduzido assim que a chamada é atendida — útil para avisos automáticos. Só funciona para número individual; grupos são recusados. A chamada é encerrada sozinha ao fim da duração.","operationId":"warmup.call.test","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"audio":{"description":"browser: o áudio vem do navegador pela ponte .../calls/{callId}/audio (T94); vazio usa ruído/voz sintética","enum":["browser"],"example":"","type":"string"},"durationSec":{"description":"Entre 5 e 300; padrão 30","example":30,"type":"number"},"provider":{"description":"Vazio usa o primeiro configurado","enum":["openai","minimax"],"example":"","type":"string"},"repeat":{"description":"Entre 1 e 5","example":1,"type":"number"},"text":{"description":"Até 900 caracteres. Exige um provedor com suporte a voz","example":"Sua entrega chega em dez minutos","type":"string"},"to":{"description":"Número com DDI ou JID individual","example":"5511999998888","type":"string"},"voiceModel":{"example":"","type":"string"},"voiceName":{"example":"","type":"string"}},"required":["to"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Fazer uma chamada","tags":["Aquecimento"]}},"/api/v1/instances/{instance}/calls/answer-test":{"post":{"description":"Faz outra instância sua ligar para esta e cronometra quanto tempo levou até atender. Aplica o modo pedido apenas durante o teste e restaura as configurações originais ao terminar, mesmo se a chamada falhar. Serve para confirmar o comportamento sem esperar o aquecimento sortear uma chamada.","operationId":"warmup.call.answer","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"from":{"description":"Instância que fará a chamada; vazio escolhe a primeira conectada","example":"","type":"string"},"mode":{"description":"instant atende na hora; ring deixa tocar antes","enum":["instant","ring"],"example":"instant","type":"string"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Testar o atendimento automático","tags":["Aquecimento"]}},"/api/v1/instances/{instance}/calls/arm":{"delete":{"operationId":"warmup.call.disarm","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Desarmar atendimento automático","tags":["Aquecimento"]},"post":{"description":"Atende sozinha a próxima chamada de qualquer origem pelo prazo (padrão 180 s, máximo 900 s).","operationId":"warmup.call.arm","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"seconds":{"description":"Segundos","example":180,"type":"number"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Armar atendimento automático","tags":["Aquecimento"]}},"/api/v1/instances/{instance}/calls/capabilities":{"get":{"description":"voice=true só quando a instância está conectada e o caminho da mídia foi comprovado (sem proxy, ou proxy socks5 cujo probe UDP via STUN respondeu). video é sempre false.","operationId":"calls.capabilities","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Capacidade de chamada de voz","tags":["Aquecimento"]}},"/api/v1/instances/{instance}/calls/test":{"post":{"description":"Liga para o número informado e, assim que a chamada é atendida, reproduz o áudio embarcado que fala \"Ligações funcionando\". A chamada é encerrada sozinha ao terminar as repetições.","operationId":"warmup.call.voice","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"repeat":{"description":"Quantas vezes a mensagem toca; entre 1 e 5, padrão 2","example":2,"type":"number"},"to":{"description":"Número com DDI ou JID individual","example":"5511999998888","type":"string"}},"required":["to"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Ligação de teste com mensagem falada","tags":["Aquecimento"]}},"/api/v1/instances/{instance}/calls/{callId}":{"delete":{"description":"Encerra a chamada antes da duração programada.","operationId":"warmup.call.end","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"ID da chamada.","in":"path","name":"callId","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Encerrar chamada","tags":["Aquecimento"]},"get":{"description":"Estado atual da chamada: initiating, ringing, active ou ended.","operationId":"warmup.call.status","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"ID da chamada.","in":"path","name":"callId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Status da chamada","tags":["Aquecimento"]}},"/api/v1/instances/{instance}/calls/{callId}/accept":{"post":{"description":"Atende a chamada que está tocando no painel (evento call.event com stage ringing; exige settings.panelCalls). O áudio vem da ponte do navegador. Chamada de vídeo é recusada com 422.","operationId":"calls.accept","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"ID da chamada.","in":"path","name":"callId","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Atender chamada recebida","tags":["Aquecimento"]}},"/api/v1/instances/{instance}/calls/{callId}/audio":{"get":{"description":"WebSocket binário: PCM s16le mono 16 kHz em quadros de 20 ms (640 bytes) nos dois sentidos. Só aceita Origin do próprio host. Um navegador por chamada.","operationId":"calls.audio","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"ID da chamada.","in":"path","name":"callId","required":true,"schema":{"type":"string"}}],"responses":{"101":{"description":"Upgrade para WebSocket"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Ponte de áudio (WebSocket)","tags":["Aquecimento"]}},"/api/v1/instances/{instance}/calls/{callId}/mute":{"post":{"description":"Mute no servidor: com muted=true o áudio enviado pelo stream não chega ao contato; o que ele fala continua chegando. Escopo calls:control. Enquanto o servidor não suportar, responde 501 com code not_implemented.","operationId":"calls.mute","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"ID da chamada.","in":"path","name":"callId","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"muted":{"example":true,"type":"boolean"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Mudo na chamada","tags":["Aquecimento"]}},"/api/v1/instances/{instance}/calls/{callId}/reject":{"post":{"description":"Recusa a chamada que está tocando.","operationId":"calls.reject","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"ID da chamada.","in":"path","name":"callId","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Recusar chamada recebida","tags":["Aquecimento"]}},"/api/v1/instances/{instance}/chats":{"get":{"description":"Conversas presentes no histórico local, da mais recente para a mais antiga, com o nome da agenda, o total de mensagens e a última mensagem de cada uma.","operationId":"archive.chats","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"Máximo de 500","in":"query","name":"limit","required":false,"schema":{"description":"Máximo de 500","example":50,"type":"number"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Listar conversas","tags":["Histórico"]}},"/api/v1/instances/{instance}/connection":{"delete":{"description":"Derruba a sessão sem desparear. O QR não é pedido de novo ao reconectar.","operationId":"connection.stop","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Desconectar","tags":["Conexão"]},"get":{"description":"Traz também o bloco device, com o navegador que esta instância apresenta ao WhatsApp. Cada instância recebe um navegador diferente, sorteado entre os menos usados, e o mesmo perfil é mantido enquanto o pareamento durar.","operationId":"connection.status","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Status da conexão","tags":["Conexão"]},"post":{"description":"Sobe a sessão. Se ainda não houver pareamento, o QR fica disponível na rota de QR code.","operationId":"connection.start","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Conectar","tags":["Conexão"]}},"/api/v1/instances/{instance}/connection/logout":{"post":{"description":"Remove o aparelho da lista de dispositivos conectados. Um novo QR será necessário.","operationId":"connection.logout","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Desparear","tags":["Conexão"]}},"/api/v1/instances/{instance}/connection/pair":{"post":{"description":"Alternativa ao QR: gera um código de 8 caracteres para digitar no celular.","operationId":"connection.pair","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"phone":{"description":"Com DDI, apenas dígitos","example":"5511999998888","type":"string"}},"required":["phone"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Parear por código","tags":["Conexão"]}},"/api/v1/instances/{instance}/connection/qr":{"get":{"description":"Devolve o código em texto e em PNG base64. O código gira sozinho a cada ~20 segundos até o pareamento.","operationId":"connection.qr","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"png devolve a imagem direto","in":"query","name":"format","required":false,"schema":{"description":"png devolve a imagem direto","enum":["json","png"],"example":"json","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Obter QR code","tags":["Conexão"]}},"/api/v1/instances/{instance}/connection/restart":{"post":{"operationId":"connection.restart","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Reiniciar sessão","tags":["Conexão"]}},"/api/v1/instances/{instance}/contacts":{"get":{"operationId":"contacts.list","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"Filtra por nome ou número","in":"query","name":"search","required":false,"schema":{"description":"Filtra por nome ou número","example":"","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Listar contatos","tags":["Contatos e grupos"]},"post":{"description":"Grava o contato na agenda da conta do WhatsApp, propagando para os aparelhos vinculados. Use o número de telefone; um LID é recusado. Não apaga contatos.","operationId":"contacts.save","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"firstName":{"description":"Deduzido do nome completo quando ausente","example":"João","type":"string"},"name":{"example":"João Silva","type":"string"},"phone":{"description":"Número com DDI, sem sinais","example":"5511999998888","type":"string"},"saveOnPhone":{"description":"Pede ao aparelho principal que grave também na agenda do sistema","example":false,"type":"boolean"}},"required":["phone","name"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Salvar contato na agenda da conta","tags":["Contatos e grupos"]}},"/api/v1/instances/{instance}/contacts/check":{"post":{"description":"Diz quais números existem no WhatsApp e devolve o JID correto de cada um.","operationId":"contacts.check","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"numbers":{"example":["5511999998888"],"items":{"type":"string"},"type":"array"}},"required":["numbers"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Verificar números no WhatsApp","tags":["Contatos e grupos"]}},"/api/v1/instances/{instance}/contacts/{jid}/avatar":{"get":{"operationId":"contacts.avatar","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"JID do contato ou grupo.","in":"path","name":"jid","required":true,"schema":{"type":"string"}},{"description":"Baixa a versão pequena","in":"query","name":"preview","required":false,"schema":{"description":"Baixa a versão pequena","example":false,"type":"boolean"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Foto de perfil de um contato","tags":["Contatos e grupos"]}},"/api/v1/instances/{instance}/deliveries":{"get":{"description":"Status HTTP, latência, tentativas, erro e eventId de cada entrega de webhook. O corpo do evento nunca é exposto.","operationId":"deliveries.list","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"1 a 500","in":"query","name":"limit","required":false,"schema":{"description":"1 a 500","example":100,"type":"number"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Histórico de entregas","tags":["Conexão"]}},"/api/v1/instances/{instance}/deliveries/dropped":{"delete":{"description":"Zera o contador e reinicia since.","operationId":"deliveries.dropped.reset","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Zerar descartados","tags":["Conexão"]},"get":{"description":"Quantos eventos desta instância a fila de entrega descartou desde since (fila cheia ou instância acima da sua fatia da fila). Contagem em memória: reinicia com o servidor. Só a própria instância.","operationId":"deliveries.dropped","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Eventos descartados","tags":["Conexão"]}},"/api/v1/instances/{instance}/deliveries/{delivery}/replay":{"post":{"description":"Reenvia o corpo original com o mesmo X-Ashford-Delivery (id do evento) para o receptor deduplicar; timestamp e assinatura são novos. 409 para evento de teste ou webhook removido.","operationId":"deliveries.replay","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"ID da entrega de webhook.","in":"path","name":"delivery","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Reenviar entrega","tags":["Conexão"]}},"/api/v1/instances/{instance}/events":{"get":{"description":"Stream server-sent events com os mesmos eventos entregues aos webhooks. Útil para acompanhar em tempo real sem expor uma URL pública.","operationId":"connection.events","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"Lista separada por vírgula","in":"query","name":"events","required":false,"schema":{"description":"Lista separada por vírgula","example":"message.received","type":"string"}}],"responses":{"200":{"content":{"text/event-stream":{"schema":{"type":"string"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Fluxo de eventos (SSE)","tags":["Conexão"]}},"/api/v1/instances/{instance}/groups":{"get":{"operationId":"groups.list","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Listar grupos","tags":["Contatos e grupos"]},"post":{"operationId":"groups.create","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"participants":{"example":["5511999998888"],"items":{"type":"string"},"type":"array"},"subject":{"example":"Equipe de campo","type":"string"}},"required":["subject","participants"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Criar grupo","tags":["Contatos e grupos"]}},"/api/v1/instances/{instance}/groups/{jid}":{"get":{"operationId":"groups.get","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"JID do contato ou grupo.","in":"path","name":"jid","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Detalhar grupo","tags":["Contatos e grupos"]}},"/api/v1/instances/{instance}/groups/{jid}/invite":{"get":{"operationId":"groups.invite","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"JID do contato ou grupo.","in":"path","name":"jid","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Link de convite","tags":["Contatos e grupos"]}},"/api/v1/instances/{instance}/groups/{jid}/leave":{"post":{"operationId":"groups.leave","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"JID do contato ou grupo.","in":"path","name":"jid","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Sair do grupo","tags":["Contatos e grupos"]}},"/api/v1/instances/{instance}/groups/{jid}/participants":{"post":{"operationId":"groups.participants","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"JID do contato ou grupo.","in":"path","name":"jid","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"action":{"enum":["add","remove","promote","demote"],"example":"add","type":"string"},"participants":{"example":["5511999998888"],"items":{"type":"string"},"type":"array"}},"required":["action","participants"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Gerenciar participantes","tags":["Contatos e grupos"]}},"/api/v1/instances/{instance}/messages":{"get":{"description":"Filtra o histórico local por conversa, remetente, trecho de texto, tipo, direção e período. Devolve o total de resultados além da página pedida.","operationId":"archive.search","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"Número com DDI ou JID; grupos terminam em @g.us","in":"query","name":"chat","required":false,"schema":{"description":"Número com DDI ou JID; grupos terminam em @g.us","example":"5511999998888","type":"string"}},{"description":"Número com DDI ou JID de quem enviou","in":"query","name":"sender","required":false,"schema":{"description":"Número com DDI ou JID de quem enviou","example":"","type":"string"}},{"description":"Busca sem diferenciar maiúsculas","in":"query","name":"q","required":false,"schema":{"description":"Busca sem diferenciar maiúsculas","example":"orcamento","type":"string"}},{"description":"","in":"query","name":"type","required":false,"schema":{"enum":["text","image","video","audio","document","sticker","location","contact","poll","reaction","buttons","list"],"example":"","type":"string"}},{"description":"in recebidas, out enviadas","in":"query","name":"direction","required":false,"schema":{"description":"in recebidas, out enviadas","enum":["in","out"],"example":"","type":"string"}},{"description":"Data ISO 8601","in":"query","name":"since","required":false,"schema":{"description":"Data ISO 8601","example":"2026-09-01T00:00:00Z","type":"string"}},{"description":"Data ISO 8601","in":"query","name":"until","required":false,"schema":{"description":"Data ISO 8601","example":"2026-09-30T23:59:59Z","type":"string"}},{"description":"Máximo de 500","in":"query","name":"limit","required":false,"schema":{"description":"Máximo de 500","example":50,"type":"number"}},{"description":"Para paginar","in":"query","name":"offset","required":false,"schema":{"description":"Para paginar","example":0,"type":"number"}},{"description":"nextCursor da página anterior; mais estável que offset (T112)","in":"query","name":"cursor","required":false,"schema":{"description":"nextCursor da página anterior; mais estável que offset (T112)","example":"","type":"string"}},{"description":"desc traz as mais recentes primeiro","in":"query","name":"order","required":false,"schema":{"description":"desc traz as mais recentes primeiro","enum":["desc","asc"],"example":"desc","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Buscar mensagens","tags":["Histórico"]}},"/api/v1/instances/{instance}/messages/actions":{"post":{"description":"Botões que abrem link, ligam, copiam um código ou respondem. É o formato interativo com melhor compatibilidade nos aplicativos atuais.","operationId":"messages.actions","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"actions":{"description":"type aceita reply, url, call ou copy. value é a url, o telefone, o código ou o id da resposta.","example":[{"text":"Acompanhar","type":"url","value":"https://exemplo.com/p/1234"},{"text":"Ligar","type":"call","value":"+5511999998888"}],"items":{"properties":{"text":{"example":"Acompanhar","type":"string"},"type":{"enum":["reply","url","call","copy"],"example":"url","type":"string"},"value":{"example":"https://exemplo.com","type":"string"}},"type":"object"},"type":"array"},"body":{"example":"Seu pedido esta pronto","type":"string"},"footer":{"example":"Precisa de ajuda?","type":"string"},"headerBase64":{"example":"","type":"string"},"headerFileName":{"example":"","type":"string"},"headerMimeType":{"example":"","type":"string"},"headerType":{"enum":["none","image","video","document"],"example":"none","type":"string"},"headerUrl":{"example":"","type":"string"},"mentions":{"description":"Números que serão marcados no texto","items":{"type":"string"},"type":"array"},"quotedId":{"description":"ID da mensagem que será citada","example":"","type":"string"},"quotedParticipant":{"description":"Obrigatório apenas em grupos","example":"","type":"string"},"title":{"example":"Pedido 1234","type":"string"},"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"}},"required":["to","body","actions"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Enviar botões de ação","tags":["Mensagens"]}},"/api/v1/instances/{instance}/messages/audio":{"post":{"operationId":"messages.audio","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"base64":{"example":"","type":"string"},"mentions":{"description":"Números que serão marcados no texto","items":{"type":"string"},"type":"array"},"mimeType":{"description":"Detectado sozinho quando omitido","example":"audio/ogg; codecs=opus","type":"string"},"quotedId":{"description":"ID da mensagem que será citada","example":"","type":"string"},"quotedParticipant":{"description":"Obrigatório apenas em grupos","example":"","type":"string"},"seconds":{"description":"Ajuda o app a mostrar o tempo antes de baixar","example":0,"type":"number"},"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"},"url":{"description":"Use url ou base64","example":"https://exemplo.com/audio.ogg","type":"string"},"voice":{"description":"Exibe a onda sonora no WhatsApp","example":true,"type":"boolean"}},"required":["to"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Enviar áudio ou nota de voz","tags":["Mensagens"]}},"/api/v1/instances/{instance}/messages/buttons":{"post":{"description":"Até 3 botões de resposta rápida. O clique volta como evento message.received do tipo buttonReply, trazendo o id do botão. Leia a nota de compatibilidade na aba Guias antes de usar em produção.","operationId":"messages.buttons","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"body":{"example":"Como prefere receber seu pedido?","type":"string"},"buttons":{"description":"Cada item aceita id e text. Máximo de 3.","example":[{"id":"retirada","text":"Retirar na loja"},{"id":"entrega","text":"Receber em casa"}],"items":{"properties":{"id":{"description":"Volta no evento do clique","example":"retirada","type":"string"},"text":{"example":"Retirar na loja","type":"string"}},"type":"object"},"type":"array"},"footer":{"example":"Responda tocando em um botão","type":"string"},"header":{"description":"Ignorado quando há cabeçalho de mídia","example":"Pedido 1234","type":"string"},"headerBase64":{"example":"","type":"string"},"headerFileName":{"example":"","type":"string"},"headerMimeType":{"example":"","type":"string"},"headerType":{"enum":["none","text","image","video","document"],"example":"none","type":"string"},"headerUrl":{"description":"Usada quando headerType é image, vídeo ou document","example":"","type":"string"},"mentions":{"description":"Números que serão marcados no texto","items":{"type":"string"},"type":"array"},"quotedId":{"description":"ID da mensagem que será citada","example":"","type":"string"},"quotedParticipant":{"description":"Obrigatório apenas em grupos","example":"","type":"string"},"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"}},"required":["to","body","buttons"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Enviar botões de resposta","tags":["Mensagens"]}},"/api/v1/instances/{instance}/messages/carousel":{"post":{"description":"Cards deslizáveis, cada um com título, subtítulo, texto e até 3 botões próprios. Até 10 cards por mensagem.","operationId":"messages.carousel","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"body":{"example":"Escolha seu plano","type":"string"},"cards":{"description":"Cada card tem title, subtitle, body, um cabeçalho de mídia e até 3 botões.","example":[{"body":"Tudo do básico mais relatórios","buttons":[{"text":"Assinar","type":"url","value":"https://exemplo.com/pro"}],"headerType":"image","headerUrl":"https://exemplo.com/pro.jpg","subtitle":"R$ 99/mês","title":"Plano Pro"}],"items":{"properties":{"body":{"example":"Tudo do básico mais relatórios","type":"string"},"buttons":{"description":"type aceita reply, url, call ou copy","items":{"properties":{"text":{"example":"Assinar","type":"string"},"type":{"enum":["reply","url","call","copy"],"example":"url","type":"string"},"value":{"description":"A url, o telefone, o código ou o id da resposta","example":"https://exemplo.com/pro","type":"string"}},"type":"object"},"type":"array"},"headerBase64":{"example":"","type":"string"},"headerType":{"enum":["none","image","video","document"],"example":"image","type":"string"},"headerUrl":{"example":"","type":"string"},"subtitle":{"example":"R$ 99/mês","type":"string"},"title":{"example":"Plano Pro","type":"string"}},"type":"object"},"type":"array"},"footer":{"example":"Preços por mês","type":"string"},"mentions":{"description":"Números que serão marcados no texto","items":{"type":"string"},"type":"array"},"quotedId":{"description":"ID da mensagem que será citada","example":"","type":"string"},"quotedParticipant":{"description":"Obrigatório apenas em grupos","example":"","type":"string"},"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"}},"required":["to","cards"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Carrossel de cards","tags":["Mensagens"]}},"/api/v1/instances/{instance}/messages/contact":{"post":{"operationId":"messages.contact","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"contacts":{"description":"Cada item aceita fullName, phone e org","items":{"properties":{"fullName":{"example":"Suporte Ashford","type":"string"},"org":{"example":"","type":"string"},"phone":{"example":"5511999998888","type":"string"},"vcard":{"description":"Quando informado, os outros campos são ignorados","example":"","type":"string"}},"type":"object"},"type":"array"},"mentions":{"description":"Números que serão marcados no texto","items":{"type":"string"},"type":"array"},"quotedId":{"description":"ID da mensagem que será citada","example":"","type":"string"},"quotedParticipant":{"description":"Obrigatório apenas em grupos","example":"","type":"string"},"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"}},"required":["to","contacts"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Enviar contato","tags":["Mensagens"]}},"/api/v1/instances/{instance}/messages/link":{"post":{"operationId":"messages.link","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"description":{"example":"Status atualizado","type":"string"},"mentions":{"description":"Números que serão marcados no texto","items":{"type":"string"},"type":"array"},"quotedId":{"description":"ID da mensagem que será citada","example":"","type":"string"},"quotedParticipant":{"description":"Obrigatório apenas em grupos","example":"","type":"string"},"text":{"example":"Acompanhe seu pedido aqui","type":"string"},"title":{"example":"Pedido 1234","type":"string"},"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"},"url":{"example":"https://exemplo.com/pedido/1234","type":"string"}},"required":["to","url"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Enviar link com prévia","tags":["Mensagens"]}},"/api/v1/instances/{instance}/messages/list":{"post":{"description":"Menu com seções e opções. A escolha volta como evento message.received do tipo listReply, trazendo o id da linha. Limite de 10 opções somando todas as seções.","operationId":"messages.list","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"body":{"example":"Escolha um horário para a entrega","type":"string"},"buttonText":{"description":"Padrão: Ver opções","example":"Ver horários","type":"string"},"footer":{"example":"Toque para ver as opções","type":"string"},"mentions":{"description":"Números que serão marcados no texto","items":{"type":"string"},"type":"array"},"quotedId":{"description":"ID da mensagem que será citada","example":"","type":"string"},"quotedParticipant":{"description":"Obrigatório apenas em grupos","example":"","type":"string"},"sections":{"description":"Cada seção tem title e rows; cada row tem id, title e description.","example":[{"rows":[{"id":"h14","title":"14h às 16h"},{"id":"h16","title":"16h às 18h"}],"title":"Hoje"}],"items":{"properties":{"rows":{"items":{"properties":{"description":{"example":"Chegamos nesse intervalo","type":"string"},"id":{"description":"Volta no evento da escolha","example":"h14","type":"string"},"title":{"example":"14h às 16h","type":"string"}},"type":"object"},"type":"array"},"title":{"example":"Hoje","type":"string"}},"type":"object"},"type":"array"},"title":{"example":"Agendamento","type":"string"},"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"}},"required":["to","body","sections"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Enviar lista de opções","tags":["Mensagens"]}},"/api/v1/instances/{instance}/messages/location":{"post":{"operationId":"messages.location","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"address":{"example":"Av. Paulista, 1000","type":"string"},"latitude":{"description":"Dispensável quando syntheticPhone for informado","example":-23.5613,"type":"number"},"longitude":{"description":"Dispensável quando syntheticPhone for informado","example":-46.6565,"type":"number"},"mentions":{"description":"Números que serão marcados no texto","items":{"type":"string"},"type":"array"},"name":{"example":"Loja Paulista","type":"string"},"quotedId":{"description":"ID da mensagem que será citada","example":"","type":"string"},"quotedParticipant":{"description":"Obrigatório apenas em grupos","example":"","type":"string"},"syntheticPhone":{"description":"Gera coordenadas plausíveis a partir do DDD do número, com jitter aleatório","example":"5511999998888","type":"string"},"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"}},"required":["to"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Enviar localização","tags":["Mensagens"]}},"/api/v1/instances/{instance}/messages/media":{"post":{"description":"Informe a mídia por url pública ou base64. O tipo define como o WhatsApp exibe o arquivo.","operationId":"messages.media","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"animated":{"description":"Para gifs enviados como vídeo","example":false,"type":"boolean"},"base64":{"description":"Aceita data url completa","example":"","type":"string"},"caption":{"example":"Segue o comprovante","type":"string"},"fileName":{"description":"Recomendado para documentos","example":"comprovante.pdf","type":"string"},"height":{"description":"Em pixels","example":0,"type":"number"},"mentions":{"description":"Números que serão marcados no texto","items":{"type":"string"},"type":"array"},"mimeType":{"description":"Detectado sozinho quando omitido","example":"","type":"string"},"quotedId":{"description":"ID da mensagem que será citada","example":"","type":"string"},"quotedParticipant":{"description":"Obrigatório apenas em grupos","example":"","type":"string"},"seconds":{"description":"Em segundos","example":0,"type":"number"},"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"},"type":{"enum":["image","video","document"],"example":"image","type":"string"},"url":{"description":"Use url ou base64","example":"https://exemplo.com/foto.jpg","type":"string"},"viewOnce":{"description":"Some do aparelho depois de aberta","example":false,"type":"boolean"},"width":{"description":"Em pixels; ajuda a montar a prévia","example":0,"type":"number"}},"required":["to","type"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Enviar imagem, vídeo ou documento","tags":["Mensagens"]}},"/api/v1/instances/{instance}/messages/poll":{"post":{"description":"Os votos chegam pelo evento poll.vote.","operationId":"messages.poll","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"mentions":{"description":"Números que serão marcados no texto","items":{"type":"string"},"type":"array"},"options":{"description":"Mínimo de duas","example":["Manhã","Tarde","Noite"],"items":{"type":"string"},"type":"array"},"question":{"example":"Qual o melhor horário?","type":"string"},"quotedId":{"description":"ID da mensagem que será citada","example":"","type":"string"},"quotedParticipant":{"description":"Obrigatório apenas em grupos","example":"","type":"string"},"selectableCount":{"example":1,"type":"number"},"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"}},"required":["to","question","options"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Enviar enquete","tags":["Mensagens"]}},"/api/v1/instances/{instance}/messages/reaction":{"post":{"description":"Envie o emoji vazio para remover a reação.","operationId":"messages.reaction","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"emoji":{"description":"Vazio remove a reação","example":"👍","type":"string"},"messageId":{"example":"3EB0…","type":"string"},"participant":{"description":"Obrigatório em grupos","example":"","type":"string"},"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"}},"required":["to","messageId"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Reagir a uma mensagem","tags":["Mensagens"]}},"/api/v1/instances/{instance}/messages/read":{"post":{"operationId":"messages.read","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"messageIds":{"example":["3EB0…"],"items":{"type":"string"},"type":"array"},"participant":{"description":"Obrigatório em grupos","example":"","type":"string"},"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"}},"required":["to","messageIds"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Marcar como lida","tags":["Mensagens"]}},"/api/v1/instances/{instance}/messages/sticker":{"post":{"description":"O arquivo precisa estar em webp. Figurinhas animadas usam webp animado.","operationId":"messages.sticker","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"animated":{"example":false,"type":"boolean"},"base64":{"example":"","type":"string"},"mentions":{"description":"Números que serão marcados no texto","items":{"type":"string"},"type":"array"},"mimeType":{"example":"image/webp","type":"string"},"quotedId":{"description":"ID da mensagem que será citada","example":"","type":"string"},"quotedParticipant":{"description":"Obrigatório apenas em grupos","example":"","type":"string"},"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"},"url":{"example":"https://exemplo.com/fig.webp","type":"string"}},"required":["to"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Enviar figurinha","tags":["Mensagens"]}},"/api/v1/instances/{instance}/messages/text":{"post":{"description":"Mensagem simples. Se informar quotedId, a mensagem sai como resposta a outra.","operationId":"messages.text","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"mentions":{"description":"Números que serão marcados no texto","items":{"type":"string"},"type":"array"},"quotedId":{"description":"ID da mensagem que será citada","example":"","type":"string"},"quotedParticipant":{"description":"Obrigatório apenas em grupos","example":"","type":"string"},"text":{"example":"Olá! Sua entrega saiu para o endereço.","type":"string"},"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"}},"required":["to","text"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Enviar texto","tags":["Mensagens"]}},"/api/v1/instances/{instance}/messages/typing":{"post":{"description":"composing/recording repetido em menos de 3 s por chat não vai ao WhatsApp e responde throttled=true, mas renova o TTL. paused nunca é limitado; enviar mensagem no chat também encerra o digitando.","operationId":"messages.typing","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"durationMs":{"description":"TTL: sem renovação, o servidor manda paused sozinho (padrão 10 s, máximo 60 s)","example":10000,"type":"number"},"state":{"enum":["composing","recording","paused"],"example":"composing","type":"string"},"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"}},"required":["to","state"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Mostrar digitando ou gravando","tags":["Mensagens"]}},"/api/v1/instances/{instance}/messages/{messageId}":{"delete":{"description":"Só alcança mensagens enviadas pela própria instância. Mensagens de terceiros não podem ser apagadas no aparelho deles.","operationId":"messages.delete","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"ID da mensagem no WhatsApp.","in":"path","name":"messageId","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"participant":{"description":"Obrigatório em grupos","example":"","type":"string"},"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"}},"required":["to"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Apagar para todos","tags":["Mensagens"]},"get":{"description":"Reconstrói a mensagem completa a partir do histórico: texto, mídia com dimensões e duração, localização, contatos, enquete, reação, citação e menções.","operationId":"archive.message","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"ID da mensagem no WhatsApp.","in":"path","name":"messageId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Detalhar mensagem","tags":["Histórico"]},"patch":{"description":"Funciona apenas em mensagens de texto que você enviou, dentro da janela permitida pelo WhatsApp.","operationId":"messages.edit","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"ID da mensagem no WhatsApp.","in":"path","name":"messageId","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"text":{"example":"Corrigindo: a entrega sai amanhã","type":"string"},"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"}},"required":["to","text"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Editar mensagem","tags":["Mensagens"]}},"/api/v1/instances/{instance}/network":{"get":{"description":"Devolve se existe proxy e um rótulo mascarado. Usuário e senha do proxy nunca saem do servidor (T91). A rota exige a chave de administrador ou o token da instância.","operationId":"instances.network.get","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Ler rede","tags":["Instâncias"]},"put":{"description":"Aceita http, https, socks5 e socks5h. Envie o campo vazio para remover. Sem fallback direto: se o proxy cair, a instância não conecta.","operationId":"instances.network.update","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"proxyUrl":{"description":"Deixe vazio para remover","example":"socks5://usuario:senha@host:1080","type":"string"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Definir proxy","tags":["Instâncias"]}},"/api/v1/instances/{instance}/network/test":{"post":{"description":"Faz uma chamada de saída pelo proxy e devolve latência e IP de saída.","operationId":"instances.network.test","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"proxyUrl":{"description":"Deixe vazio para testar o proxy já salvo","example":"","type":"string"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Testar proxy","tags":["Instâncias"]}},"/api/v1/instances/{instance}/presence/subscribe":{"post":{"description":"Pede ao WhatsApp os eventos contact.presence (online/visto) do contato. O WhatsApp só entrega se a instância estiver available (opção sempre online).","operationId":"presence.subscribe","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"to":{"description":"Número com DDI, ou JID completo. Grupos usam o JID terminado em @g.us","example":"5511999998888","type":"string"}},"required":["to"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Assinar presença do contato","tags":["Mensagens"]}},"/api/v1/instances/{instance}/profile":{"get":{"operationId":"profile.get","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Ler o próprio perfil","tags":["Contatos e grupos"]}},"/api/v1/instances/{instance}/profile/status":{"put":{"operationId":"profile.status","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"status":{"example":"Atendemos de 9h às 18h","type":"string"}},"required":["status"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Alterar recado","tags":["Contatos e grupos"]}},"/api/v1/instances/{instance}/recovery/captures":{"get":{"description":"Histórico com contato, número, horário original e link da mídia recuperada. Capturas vindas de grupo trazem chatName com o nome do grupo.","operationId":"recovery.list","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"Máximo de 500","in":"query","name":"limit","required":false,"schema":{"description":"Máximo de 500","example":50,"type":"number"}},{"description":"","in":"query","name":"kind","required":false,"schema":{"enum":["viewonce","revoked"],"example":"","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Listar capturas","tags":["Recuperação"]}},"/api/v1/instances/{instance}/recovery/transcribe":{"post":{"description":"Transcreve um áudio já recebido pela instância. Informe o ID da mensagem de áudio.","operationId":"recovery.transcribe","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"messageId":{"example":"3EB0…","type":"string"},"provider":{"enum":["groq","openai"],"example":"groq","type":"string"}},"required":["messageId"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Transcrever áudio","tags":["Recuperação"]}},"/api/v1/instances/{instance}/recovery/{captureId}/media":{"get":{"description":"Devolve o arquivo original com o tipo MIME correto.","operationId":"recovery.media","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"ID da captura registrada.","in":"path","name":"captureId","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/octet-stream":{"schema":{"format":"binary","type":"string"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Baixar mídia recuperada","tags":["Recuperação"]}},"/api/v1/instances/{instance}/settings":{"get":{"operationId":"instances.settings.get","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Ler configurações","tags":["Instâncias"]},"put":{"description":"Enquanto a recuperação de efêmeras estiver ligada, o modo sempre online fica desativado: manter a sessão online suprime as notificações do celular, e a captura depende delas. A captura (recovery.captureEphemeral/captureRevoked) vem desligada e é opt-in: quem liga é responsável por informar os contatos; o conteúdo fica guardado por 2 dias.","operationId":"instances.settings.update","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"alwaysOnline":{"description":"Incompatível com a recuperação de efêmeras","example":false,"type":"boolean"},"assistant":{"properties":{"enabled":{"example":false,"type":"boolean"},"maxTurns":{"example":24,"type":"number"},"model":{"example":"","type":"string"},"optInWords":{"example":["iniciar"],"items":{"type":"string"},"type":"array"},"optOutWords":{"example":["parar"],"items":{"type":"string"},"type":"array"},"provider":{"enum":["openai","minimax","groq"],"example":"openai","type":"string"},"replyGroups":{"example":false,"type":"boolean"},"requireOptIn":{"description":"Só responde depois de INICIAR","example":true,"type":"boolean"},"systemPrompt":{"example":"","type":"string"}},"type":"object"},"fudgeMedia":{"description":"Altera metadados de imagem e áudio antes do envio","example":true,"type":"boolean"},"ignoreBroadcast":{"example":false,"type":"boolean"},"ignoreGroups":{"description":"Filtra apenas o que sai nos webhooks","example":false,"type":"boolean"},"ignoreOwn":{"example":true,"type":"boolean"},"readMessages":{"description":"Visualizações únicas ficam de fora","example":false,"type":"boolean"},"recovery":{"properties":{"captureEphemeral":{"example":false,"type":"boolean"},"captureRevoked":{"example":false,"type":"boolean"},"requestStubs":{"example":true,"type":"boolean"},"target":{"description":"self envia para a sua própria conversa","enum":["self","jid"],"example":"self","type":"string"},"targetJid":{"description":"Usado apenas quando o destino é jid","example":"","type":"string"}},"type":"object"},"rejectCallMessage":{"example":"Não aceito chamadas por aqui","type":"string"},"rejectCalls":{"example":false,"type":"boolean"},"transcribe":{"properties":{"command":{"example":"/transcrever","type":"string"},"cooldownMs":{"description":"Milissegundos entre pedidos do mesmo remetente","example":8000,"type":"number"},"enabled":{"example":false,"type":"boolean"}},"type":"object"},"warmup":{"description":"Motor de aquecimento entre instâncias próprias","properties":{"activityPercent":{"description":"0 a 100","example":70,"type":"number"},"autoEdit":{"example":false,"type":"boolean"},"autoRead":{"example":true,"type":"boolean"},"autoReply":{"example":true,"type":"boolean"},"autoReplyDelaySec":{"description":"Até 300","example":6,"type":"number"},"autoRevoke":{"example":false,"type":"boolean"},"buttonsChancePercent":{"description":"0 a 50","example":10,"type":"number"},"callAnswerMode":{"description":"instant atende na hora; ring deixa chamando","enum":["instant","ring"],"example":"ring","type":"string"},"callAutoAccept":{"example":true,"type":"boolean"},"callChancePercent":{"description":"0 a 50","example":8,"type":"number"},"callEnabled":{"example":false,"type":"boolean"},"callMaxDurSec":{"description":"5 a 600","example":90,"type":"number"},"callMinDurSec":{"description":"5 a 600","example":20,"type":"number"},"callRingMaxSec":{"description":"1 a 8; acima disso o WhatsApp encerra a chamada antes de o outro lado atender","example":6,"type":"number"},"callRingMinSec":{"description":"1 a 8","example":3,"type":"number"},"callVoice":{"description":"Usa voz gerada por IA nos dois lados; sem provedor de voz cai para ruído branco","example":true,"type":"boolean"},"dailyTarget":{"description":"Até 2000 ações por dia","example":60,"type":"number"},"enabled":{"example":false,"type":"boolean"},"joinGroups":{"example":false,"type":"boolean"},"locationChancePercent":{"description":"0 a 50","example":4,"type":"number"},"maxIntervalSec":{"description":"Até 3600","example":480,"type":"number"},"mediaChancePercent":{"description":"0 a 50","example":8,"type":"number"},"minIntervalSec":{"description":"Nunca menor que 30","example":90,"type":"number"},"model":{"example":"","type":"string"},"provider":{"description":"Vazio usa o provedor padrão","enum":["groq","openai","minimax"],"example":"","type":"string"},"voiceModel":{"description":"Vazio usa o padrão do provedor","example":"tts-1","type":"string"},"voiceName":{"description":"Vazio usa o timbre padrão do provedor","example":"alloy","type":"string"}},"type":"object"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Salvar configurações","tags":["Instâncias"]}},"/api/v1/instances/{instance}/socket":{"get":{"description":"Mesmos eventos do SSE em mensagens de texto JSON. Credencial revalidada a cada 20 s; revogada fecha o socket.","operationId":"connection.socket","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"Lista separada por vírgula","in":"query","name":"events","required":false,"schema":{"description":"Lista separada por vírgula","example":"message.received","type":"string"}}],"responses":{"101":{"description":"Upgrade para WebSocket"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Fluxo de eventos (WebSocket)","tags":["Conexão"]}},"/api/v1/instances/{instance}/subscriptions":{"get":{"operationId":"subscriptions.list","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Listar webhooks","tags":["Conexão"]},"post":{"description":"Cada evento vira um POST JSON. Se houver segredo, a requisição leva a assinatura HMAC-SHA256 no cabeçalho X-Ashford-Signature.","operationId":"subscriptions.create","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"active":{"example":true,"type":"boolean"},"events":{"description":"Use * para receber tudo","example":["message.received"],"items":{"type":"string"},"type":"array"},"headers":{"additionalProperties":{"type":"string"},"description":"Pares chave e valor enviados em toda entrega","type":"object"},"secret":{"description":"Assina o corpo com HMAC-SHA256","example":"","type":"string"},"url":{"example":"https://n8n.exemplo.com/webhook/ashford","type":"string"}},"required":["url"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Cadastrar webhook","tags":["Conexão"]}},"/api/v1/instances/{instance}/subscriptions/{subscription}":{"delete":{"operationId":"subscriptions.delete","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"ID da assinatura de webhook.","in":"path","name":"subscription","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Remover webhook","tags":["Conexão"]}},"/api/v1/instances/{instance}/subscriptions/{subscription}/test":{"post":{"description":"Entrega agora um evento webhook.test com data.test=true, assinado como os reais, em uma tentativa. Devolve status, latência e erro.","operationId":"subscriptions.test","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"description":"ID da assinatura de webhook.","in":"path","name":"subscription","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Enviar evento de teste","tags":["Conexão"]}},"/api/v1/instances/{instance}/token":{"post":{"description":"Gera um token novo e invalida o anterior imediatamente.","operationId":"instances.token","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Rotacionar token","tags":["Instâncias"]}},"/api/v1/instances/{instance}/warmup":{"get":{"description":"Devolve as configurações do motor, total de ações do dia, última atividade e a contagem por tipo de ação.","operationId":"warmup.status","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Status do aquecimento","tags":["Aquecimento"]}},"/api/v1/instances/{instance}/warmup/level":{"post":{"description":"Grava o preset inteiro do nível no bloco warmup. Não liga nem desliga o motor.","operationId":"warmup.level","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"level":{"enum":["chip_novo","d3","d5","d7","d15","d30","agressivo","radical"],"example":"d7","type":"string"}},"required":["level"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Aplicar nível de aquecimento","tags":["Aquecimento"]}},"/api/v1/instances/{instance}/warmup/log":{"get":{"description":"Últimas ações executadas pelo motor: tipo, instância parceira, mensagem e detalhe.","operationId":"warmup.log","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Histórico de ações","tags":["Aquecimento"]}},"/api/v1/instances/{instance}/warmup/run":{"post":{"description":"Força uma ação imediata do motor (mensagem, mídia, localização ou chamada) sem esperar a cadência.","operationId":"warmup.run","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Executar ação agora","tags":["Aquecimento"]}},"/api/v1/instances/{instance}/warmup/start":{"post":{"description":"Liga o motor de aquecimento da instância (equivale a ativar settings.warmup.enabled).","operationId":"warmup.start","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Ativar aquecimento","tags":["Aquecimento"]}},"/api/v1/instances/{instance}/warmup/stop":{"post":{"description":"Pausa o motor de aquecimento sem perder o histórico.","operationId":"warmup.stop","parameters":[{"description":"ID ou nome da instância.","in":"path","name":"instance","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"instanceToken":[]},{"accountApiKey":[]},{"adminKey":[]}],"summary":"Desativar aquecimento","tags":["Aquecimento"]}},"/api/v1/meta/catalog":{"get":{"description":"A mesma fonte que alimenta esta documentação e o gerador de cURL.","operationId":"meta.catalog","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Catálogo de endpoints","tags":["Plataforma"]}},"/api/v1/meta/events":{"get":{"description":"Lista todos os eventos que podem ser assinados, com uma descrição de cada um.","operationId":"meta.events","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Catálogo de eventos","tags":["Plataforma"]}},"/api/v1/meta/providers":{"get":{"operationId":"meta.providers","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Catálogo de provedores de IA","tags":["Operação da plataforma"]}},"/api/v1/plans":{"get":{"operationId":"meta.plans","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Planos à venda","tags":["Operação da plataforma"]}},"/api/v1/providers":{"get":{"description":"As chaves nunca voltam inteiras: apenas a marca de que existem e as últimas letras.","operationId":"providers.list","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Listar provedores de IA","tags":["Plataforma"]}},"/api/v1/providers/codex/install":{"post":{"operationId":"codex.install","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Instalar codex","tags":["Operação da plataforma"]}},"/api/v1/providers/codex/login":{"delete":{"operationId":"codex.loginCancel","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Cancelar login do codex","tags":["Operação da plataforma"]},"post":{"operationId":"codex.login","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Iniciar login do codex","tags":["Operação da plataforma"]}},"/api/v1/providers/codex/login/complete":{"post":{"operationId":"codex.loginComplete","parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"redirectUrl":{"description":"URL para onde o navegador foi redirecionado","example":"","type":"string"}},"required":["redirectUrl"],"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Concluir login do codex","tags":["Operação da plataforma"]}},"/api/v1/providers/codex/status":{"get":{"operationId":"codex.status","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Estado do codex","tags":["Operação da plataforma"]}},"/api/v1/providers/{kind}":{"put":{"description":"A chave é cifrada antes de ir para o banco. Envie o campo vazio para manter a chave atual. O provedor codex não usa chave: ele executa o programa codex instalado no servidor e consome a assinatura, configurado pelo mapa models (binary, home, sandbox, timeoutSec).","operationId":"providers.save","parameters":[{"description":"Provedor de IA: openai, minimax ou groq.","in":"path","name":"kind","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"active":{"example":true,"type":"boolean"},"apiKey":{"description":"Vazio mantém a chave já salva","example":"","type":"string"},"baseUrl":{"description":"Útil para gateways compatíveis","example":"","type":"string"},"models":{"additionalProperties":{"type":"string"},"description":"Pares como chat, transcribe, image","type":"object"}},"type":"object"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Configurar provedor","tags":["Plataforma"]}},"/api/v1/providers/{kind}/test":{"post":{"operationId":"providers.test","parameters":[{"description":"Provedor de IA: openai, minimax ou groq.","in":"path","name":"kind","required":true,"schema":{"type":"string"}},{"$ref":"#/components/parameters/IdempotencyKey"}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"409":{"description":"idempotency_key_reuse (mesma Idempotency-Key com outro corpo) ou idempotency_in_progress (pedido original ainda em andamento; repita após Retry-After)"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Testar provedor","tags":["Plataforma"]}},"/api/v1/stats":{"get":{"description":"Instâncias conectadas, fila de eventos, saúde das entregas e contadores de mensagens por hora.","operationId":"platform.stats","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[{"adminKey":[]}],"summary":"Panorama do servidor","tags":["Plataforma"]}},"/api/v1/storefront":{"get":{"operationId":"meta.storefront","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Vitrine","tags":["Operação da plataforma"]}},"/healthz":{"get":{"operationId":"health","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Saúde do serviço","tags":["Plataforma"]}},"/llms-full.txt":{"get":{"description":"Todas as rotas com método, credencial, campos tipados, curl pronto e formato da resposta, mais uma seção final de armadilhas conhecidas. Gerado do mesmo catálogo desta documentação.","operationId":"meta.llmsFull","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Referência completa para agentes de IA","tags":["Plataforma"]}},"/llms.txt":{"get":{"description":"Texto puro no formato llms.txt: o que a ferramenta é, como autenticar, o formato do destinatário e para onde ir em seguida. Escrito para ser lido inteiro por um modelo.","operationId":"meta.llms","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Índice para agentes de IA","tags":["Plataforma"]}},"/openapi":{"get":{"description":"Responde 301 para /openapi.json.","operationId":"meta.openapi.redirect","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Atalho para /openapi.json","tags":["Operação da plataforma"]}},"/openapi.json":{"get":{"description":"Gerada deste catálogo. info.x-contract-version traz a versão do contrato (docs/API-CONTRACT-v2.md).","operationId":"meta.openapi","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Especificação OpenAPI","tags":["Operação da plataforma"]}},"/readyz":{"get":{"operationId":"ready","responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Sucesso"},"401":{"description":"Credencial ausente ou inválida"},"404":{"description":"Recurso não encontrado"},"422":{"description":"Dados inválidos"}},"security":[],"summary":"Prontidão","tags":["Operação da plataforma"]}}},"servers":[{"url":"https://ashfordhub.online"}]}
