API · Atualizado em 12/10/2026

Conversas e tickets pela API

Abra tickets para contatos, liste e filtre conversas, transfira, encerre, ponha em espera, etiquete e consulte filas, atendentes e horário.

Na API, conversa e ticket são a mesma coisa: um atendimento de um contato com a equipe. Daqui você abre tickets, filtra a fila de trabalho, transfere e encerra, sempre dentro do fluxo da sua chave.

Quando usar

  • Para passar para um atendente um cliente que pediu ajuda em outro sistema, ou que ficou preso no bot.
  • Para fechar, transferir ou pôr em espera tickets a partir do seu sistema.
  • Para decidir, no seu sistema ou no n8n, se vale chamar a equipe agora (fila aberta e com gente online).

Pré-requisitos

  • conversas:ler para listar e conversas:escrever para abrir, transferir, encerrar e esperar.
  • filas:ler e atendentes:ler para consultar filas e quem está online. As chaves de fluxo já nascem com esses escopos.

Rotas

MétodoRotaEscopoO que faz
POST/v1/contacts/:id/ticketsconversas:escreverAbre um ticket para um contato
POST/v1/ticketsconversas:escreverAbre um ticket achando o contato por telefone ou identidade
GET/v1/conversationsconversas:lerLista e filtra tickets
GET/v1/conversations/:idconversas:lerLê um ticket
POST/v1/conversations/:id/transferconversas:escreverTransfere para outra fila ou atendente
POST/v1/conversations/:id/closeconversas:escreverEncerra o ticket
POST/v1/conversations/:id/waitconversas:escreverPõe em espera ou tira da espera
POST/v1/conversations/:id/labelsconversas:escreverAplica uma etiqueta ao ticket
DELETE/v1/conversations/:id/labels/:labelIdconversas:escreverRemove uma etiqueta do ticket
GET/v1/queuesfilas:lerLista as filas, com quantos aguardam e quantos estão em atendimento
GET/v1/queues/:id/onlinefilas:ler e atendentes:lerLista quem está online na fila
GET/v1/attendance-hours/statusfilas:lerDiz se a fila está dentro do horário de atendimento
GET/v1/agentsatendentes:lerLista atendentes e status
POST/v1/agents/statusatendentes:escreverMuda o status de um atendente

Passo a passo: abrir um ticket

  1. Tenha o id do contato. Se só tem o telefone, use POST /v1/tickets.
  2. Chame a rota. Todos os campos são opcionais:
curl -s -X POST https://http.pipebr.app/v1/contacts/b3a1c9de-0000-4000-8000-000000000010/tickets \
  -H "Authorization: Bearer $PIPE_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{"queueId": "b3a1c9de-0000-4000-8000-000000000001", "reason": "Cliente pediu atendimento humano"}'
  1. A resposta é 201 quando o ticket nasce:
{
  "conversationId": "b3a1c9de-0000-4000-8000-000000000100",
  "created": true,
  "state": "Waiting",
  "queueId": "b3a1c9de-0000-4000-8000-000000000001",
  "agentId": null,
  "adoptedBotExecutionId": "b3a1c9de-0000-4000-8000-000000000600"
}

Se o contato já tinha ticket ativo, a resposta é 200 com { "conversationId": "...", "created": false, "state": "Open" }, e nada é duplicado.

Campo do corpoPara que serve
queueIdFila de destino. Sem ele valem as regras de atendimento e, depois, a fila padrão
channelIdCanal do ticket. Sem ele, o Pipe usa o da sessão do bot, depois o último canal usado do contato
agentIdAtribui a um atendente específico. Ele precisa ser da fila, estar Online e ter vaga, senão a resposta é 409 agent_unavailable
reasonAté 500 caracteres, vai para a nota interna
priorityPrioridade do ticket
contactId, phone, channelIdentitySó em POST /v1/tickets, para achar o contato. phone em E.164

Se o contato estava só no bot, o ticket adota a sessão do bot: o histórico do bot entra no ticket e o bot fica em silêncio. O ticket aparece no Desk na fila escolhida.

Listar e filtrar tickets

GET /v1/conversations aceita:

FiltroO que faz
estadoWaiting, Assigned, Open, ClosedAttendant, ClosedClient, ClosedClientInactivity ou Transferred
standbytrue ou false, para tickets em espera
fila_id, atendente_id, contato_idPor fila, atendente ou contato
closed, from, toEncerrados ou não, e período (AAAA-MM-DD ou ISO, no máximo 92 dias)
label_id, sequential_idPor etiqueta ou pelo número do ticket
limit, cursor, order_byPaginação e ordenação por criada_em ou ultima_mensagem_em

Cada ticket traz state, emStandby, sequentialId, priority, datas, queue, agent e contact.

Transferir, encerrar e esperar

Transferir envia o ticket para uma fila (forQueueId) ou um atendente (forAgentId, com forAgentQueueId opcional para a fila onde o novo ticket nasce). O ticket atual é encerrado como Transferred e um novo nasce no destino:

curl -s -X POST https://http.pipebr.app/v1/conversations/b3a1c9de-0000-4000-8000-000000000100/transfer \
  -H "Authorization: Bearer $PIPE_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{"forQueueId": "b3a1c9de-0000-4000-8000-000000000002", "reason": "Assunto financeiro"}'
{
  "ofConversationId": "b3a1c9de-0000-4000-8000-000000000100",
  "forConversationId": "b3a1c9de-0000-4000-8000-000000000101",
  "state": "Waiting"
}

Encerrar aceita closedBy: atendente (padrão) ou cliente, para quando o cliente desistiu em outro canal. Se houver etiquetas obrigatórias no encerramento, envie etiqueta_ids (ou etiqueta_id). A resposta traz state e reasonClosure.

Espera alterna o ticket entre em atendimento e em espera, e responde state, emStandby e pausado_seg.

Chamar transfer, close ou wait com o id de um contato (que não tem ticket) dá 404 no_active_ticket e aponta para a rota de abrir ticket.

Filas, horário e quem está online

curl -s "https://http.pipebr.app/v1/attendance-hours/status?queueId=b3a1c9de-0000-4000-8000-000000000001" \
  -H "Authorization: Bearer $PIPE_CHAVE"
{
  "queueId": "b3a1c9de-0000-4000-8000-000000000001",
  "at": "2026-10-12T14:30:00.000Z",
  "open": true,
  "agentsOnline": 2,
  "available": true
}

open segue a mesma regra de distribuição do Pipe (horário da fila, depois o regular da conta, com exceções). available exige também alguém online. Use at (ISO) para perguntar sobre outro momento. Veja como cadastrar horários em Horários e SLA.

GET /v1/queues/:id/online devolve agentsOnline e a lista agents, com id, nome, desde e conversationsActive.

POST /v1/agents/status aceita state (Online, Pause, Invisible ou Offline), userId e, para pausa, motivo_pausa_id.

Resultado esperado

O cliente aparece no Desk, na fila certa, com o histórico do bot junto, e seu sistema sabe se há quem atenda antes de chamar.

Problemas comuns

  • 404 ao abrir ticket: o contato, a fila ou o canal não existe ou está fora do fluxo da chave.
  • 409 contact_without_channel: o contato não tem um canal ativo com caixa de entrada. Conecte um canal ou informe channelId.
  • 403 em agents/status: a rota exige atendentes:escrever. Veja Escopos e permissões.
  • Ticket duplicado no seu sistema: a API nunca duplica ticket ativo do mesmo contato. Use created para saber se o ticket é novo.

Boas práticas

  • Verifique attendance-hours/status antes de abrir ticket fora do horário, e avise o cliente se estiver fechado.
  • Registre o conversationId no seu sistema para consultar ou encerrar depois.
  • Use Idempotency-Key nas escritas que seu sistema pode repetir.

Próximos passos

Perguntas frequentes

Como abro um ticket para um contato?

Com POST /v1/contacts/:id/tickets, ou POST /v1/tickets informando o telefone. Se o contato já tem ticket ativo, a resposta é 200 com created: false e nenhum ticket novo é criado.

O bot continua respondendo depois que abro o ticket?

Não. Com ticket ativo, o bot fica em silêncio. Se o contato estava com o bot, a sessão dele é adotada: o histórico do bot passa a fazer parte do ticket.

A transferência mantém o mesmo ticket?

Não. Transferir encerra o ticket atual como Transferred e abre um novo no destino. A resposta traz os dois ids.

Como sei se uma fila está aberta e tem gente online?

GET /v1/attendance-hours/status?queueId=... devolve open, agentsOnline e available. GET /v1/queues/:id/online lista quem está online.