Simular conversa
/v1/instances/{id}/attendant/simulatedesde M5btoken da instância ou adminQuando usar
Roda um agente (salvo, o ativo, ou um perfil ainda não salvo em agent) contra mensagens de exemplo sem enviar nada. from: customer (padrão), agent, human, automatic. A última mensagem precisa ser do cliente (ou use trigger: "call" para a mensagem pós-ligação). É uma chamada real ao provedor e conta no limite diário.
Autenticação
Aceita o token da instância (só a própria instância) ou o token admin. Um token de outra instância recebe 403 forbidden (ou 404 not_found em webhooks de outra instância).
Parâmetros
Caminho
| Nome | Tipo | Descrição |
|---|---|---|
idobrigatório | string | Id da instância (inst_...). |
Corpo (JSON)
| Nome | Tipo | Descrição |
|---|---|---|
agent_id | string | |
agent | AttendantProfile | |
agent.nameobrigatório | string | (até 80) |
agent.mode | "vendedor" | "pedido" | "sdr" | "suporte" | "custom" | |
agent.objective | string | |
agent.steps | string[] | |
agent.tone | string | |
agent.handoff_criteria | string[] | |
agent.actions | "handoff" | "lead" | "appointment" | "order_draft"[] | |
agent.business | string | Contexto do negócio (texto livre |
agent.knowledge | object[] | (até 300 itens) |
agent.language | string | (padrão "pt-BR") |
agent.currency | string | (padrão "BRL") |
agent.voice_reply | "off" | "when_audio" | "always" | (padrão "off") |
agent.call_followup | boolean | |
agent.call_hint | string | |
agent.max_reply_chars | integer | (padrão 1000, 50–4000) |
agent.hide_contact_name | boolean | |
messages | object[] | (até 50 itens) |
trigger | "call" | |
contact_name | string |
Exemplo
curl -s -X POST "$LITEZAP_URL/v1/instances/$ID/attendant/simulate" \ -H "Authorization: Bearer $LITEZAP_TOKEN" \ -d '{"messages":[{"from":"automatic","text":"Não atendemos ligações, mande mensagem."},{"text":"quero 2 margheritas pra Rua B 5"}]}'const res = await fetch("http://localhost:8787/v1/instances/inst_7f3a9c2e5b1d4086/attendant/simulate", { method: "POST", headers: { Authorization: `Bearer ${process.env.LITEZAP_TOKEN}`, "Content-Type": "application/json" }, body: JSON.stringify({ "messages": [ { "from": "automatic", "text": "Não atendemos ligações, mande mensagem." }, { "text": "quero 2 margheritas pra Rua B 5" } ] }),});console.log(res.status, res.status === 204 ? "" : await res.json());import osimport requests
r = requests.post( "http://localhost:8787/v1/instances/inst_7f3a9c2e5b1d4086/attendant/simulate", headers={"Authorization": f"Bearer {os.environ['LITEZAP_TOKEN']}"}, json={ "messages": [ { "from": "automatic", "text": "Não atendemos ligações, mande mensagem.", }, { "text": "quero 2 margheritas pra Rua B 5", }, ], }, timeout=150,)print(r.status_code, r.json() if r.content else "")package main
import ( "fmt" "io" "net/http" "os" "strings")
func main() { req, _ := http.NewRequest("POST", "http://localhost:8787/v1/instances/inst_7f3a9c2e5b1d4086/attendant/simulate", strings.NewReader(`{"messages":[{"from":"automatic","text":"Não atendemos ligações, mande mensagem."},{"text":"quero 2 margheritas pra Rua B 5"}]}`)) req.Header.Set("Authorization", "Bearer "+os.Getenv("LITEZAP_TOKEN")) req.Header.Set("Content-Type", "application/json") resp, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer resp.Body.Close() out, _ := io.ReadAll(resp.Body) fmt.Println(resp.Status, string(out))}<?phprequire 'vendor/autoload.php'; // composer require guzzlehttp/guzzle
$client = new GuzzleHttp\Client(['base_uri' => 'http://localhost:8787']);$res = $client->request('POST', '/v1/instances/inst_7f3a9c2e5b1d4086/attendant/simulate', [ 'headers' => ['Authorization' => 'Bearer ' . getenv('LITEZAP_TOKEN')], 'json' => [ 'messages' => [ [ 'from' => 'automatic', 'text' => 'Não atendemos ligações, mande mensagem.', ], [ 'text' => 'quero 2 margheritas pra Rua B 5', ], ], ], 'http_errors' => false,]);echo $res->getStatusCode(), ' ', $res->getBody(), PHP_EOL;Nos exemplos, LITEZAP_URL é a URL base (ex.: http://localhost:8787) e o token vem deLITEZAP_TOKEN (instância) ou LITEZAP_ADMIN_TOKEN.
Resposta
200 O que o agente faria.
Campos de object
reply | string | |
voice | boolean | |
handoff | boolean | |
handoff_note | string | |
events | object[] | |
model | string | |
usage | object | |
usage.input_tokens | integer | |
usage.output_tokens | integer | |
usage.cost_usd | number |
{ "reply": "Resumo: 2x Pizza Margherita (R$ 90,00), entrega na Rua B, 5. Confirma?", "voice": false, "handoff": false, "events": [ { "type": "agent.order_draft", "items": [ { "name": "Pizza Margherita", "quantity": 2, "unit_price": 45, "subtotal": 90, "in_catalog": true } ], "total": 90, "currency": "BRL", "address": "Rua B, 5" } ], "model": "claude-sonnet-5-5", "usage": { "input_tokens": 1830, "output_tokens": 120, "cost_usd": 0.00486 }}Erros
| Código | HTTP | Retentável | O que fazer |
|---|---|---|---|
validation_failed | 400 | não | Corrija o corpo ou os parâmetros; a message diz o campo. |
unauthorized | 401 | não | Envie Authorization: Bearer <token> válido. |
forbidden | 403 | não | Use o token certo (admin, ou o da própria instância). |
not_found | 404 | não | Confira o id do recurso (mensagem, chat, contato, mídia ou webhook). |
instance_not_found | 404 | não | Confira o id da instância. |
Todo erro usa o envelope {"error":{"code","message","retryable"}}. Tabela completa em Erros.
Outras operações de Atendente IA: Ler hook de agente · Configurar hook de agente · Remover hook de agente · Ligar ou desligar o atendente numa conversa · Últimas chamadas do atendente · Ler o Atendente LiteZap · Configurar provedor do atendente · Modos prontos do atendente · Listar agentes · Criar agente · Ler agente · Alterar agente · Excluir agente · Ativar agente · Uso e custo do atendente

