ZynzapAPI
Cobrança e cotações

Criar cotação

Calcula e reserva o preço máximo de uma operação paga antes de executá-la. A cotação vale por 15 minutos e fica presa ao method, ao request exato e aos números envolvidos: mudou o conteúdo, peça outra.

Operações cotáveis: SendMessage, SendImageMessage, SendVoiceNote, SendVideoMessage, SendDocumentMessage, SendConversationMessage, StartCampaign, StartCampaignWithTemplate, StartWarmup, ResumeWarmupRun, ResumeCampaign, CorrectMessage, SummarizeConversation, SuggestReply, SuggestLeadClassification.

Permissão: a mesma da operação cotada. Limite: 60 cotações por minuto por conta.

Respostas grátis dentro da janela de 24 horas do atendimento voltam com coverage: "inbox_window" e custo zero, mas ainda assim precisam do quoteId.

POST
/billing/quotes
AuthorizationBearer <token>

Chave de API criada no painel (API e integrações). Prefixos: zz_live_, zz_test_ (e os antigos wl_live_/wl_test_).

In: header

methodstring

Operação a cotar.

Value in"SendMessage" | "SendImageMessage" | "SendVoiceNote" | "SendVideoMessage" | "SendDocumentMessage" | "SendConversationMessage" | "StartCampaign" | "StartCampaignWithTemplate" | "StartWarmup" | "ResumeWarmupRun" | "ResumeCampaign" | "CorrectMessage" | "SummarizeConversation" | "SuggestReply" | "SuggestLeadClassification"
requestobject

Exatamente o request que será enviado depois em /rpc/{method}.

Empty Object

paymentMode?string

budget (padrão) usa o saldo e a franquia da conta; individual cobra a operação à parte.

Default"budget"
Value in"budget" | "individual"

Response Body

curl -X POST "https://api.zynzap.com.br/v1/billing/quotes" \  -H "Authorization: Bearer $ZYNZAP_API_KEY" \  -H "Content-Type: application/json" \  -d '{  "method": "SendMessage",  "request": {    "session_id": "8c1f7a52-4d1e-4b8a-9a43-2f6f5d0c9e11",    "to_jid": "5511987654321",    "text": "Olá! Seu pedido #1234 saiu para entrega."  }}'
{
  "quoteId": "0b8f2c1e-3a4d-4e5f-8a9b-1c2d3e4f5a6b",
  "kind": "send",
  "input": {
    "messages": 1
  },
  "paymentMode": "budget",
  "coverage": null,
  "coverageNote": null,
  "maxMicrobrl": "50000",
  "coveredMicrobrl": "50000",
  "prepaidCoveredMicrobrl": "50000",
  "monthlyOverageMicrobrl": "0",
  "dueCents": 0,
  "expiresAt": "2026-10-12T14:15:00.000Z",
  "priceVersion": "2026-10"
}
{
  "error": {
    "code": "VALIDATION_FAILED",
    "message": "Requisição inválida para esta operação.",
    "requestId": "7f3c1a9e-2b4d-4c6e-8f10-a1b2c3d4e5f6",
    "reason": "RPC_REQUEST_INVALID"
  }
}
{
  "error": {
    "code": "UNAUTHENTICATED",
    "message": "Credencial de API ausente, inválida ou revogada.",
    "requestId": "7f3c1a9e-2b4d-4c6e-8f10-a1b2c3d4e5f6",
    "reason": "API_AUTH_REQUIRED"
  }
}
{
  "error": {
    "code": "FORBIDDEN",
    "message": "Este endereço IP não está autorizado a usar esta chave de API.",
    "requestId": "7f3c1a9e-2b4d-4c6e-8f10-a1b2c3d4e5f6",
    "reason": "API_KEY_IP_FORBIDDEN"
  }
}
{
  "error": {
    "code": "NOT_FOUND",
    "message": "Não encontramos o recurso solicitado.",
    "requestId": "7f3c1a9e-2b4d-4c6e-8f10-a1b2c3d4e5f6"
  }
}
{
  "error": {
    "code": "CONFLICT",
    "message": "A cotação expirou. Revise os custos novamente.",
    "requestId": "7f3c1a9e-2b4d-4c6e-8f10-a1b2c3d4e5f6",
    "reason": "BILLING_QUOTE_EXPIRED"
  }
}
{
  "error": {
    "code": "VALIDATION_FAILED",
    "message": "Requisição inválida para esta operação.",
    "requestId": "7f3c1a9e-2b4d-4c6e-8f10-a1b2c3d4e5f6",
    "reason": "RPC_REQUEST_INVALID"
  }
}
{
  "error": {
    "code": "RATE_LIMITED",
    "message": "Limite de requisições desta chave atingido. Aguarde um instante.",
    "requestId": "7f3c1a9e-2b4d-4c6e-8f10-a1b2c3d4e5f6",
    "reason": "API_KEY_RATE_LIMITED"
  }
}
{
  "error": {
    "code": "UNAVAILABLE",
    "message": "Resultado incerto. Confira o estado antes de repetir a operação.",
    "requestId": "7f3c1a9e-2b4d-4c6e-8f10-a1b2c3d4e5f6",
    "reason": "OUTCOME_UNCERTAIN"
  }
}