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:lerpara listar econversas:escreverpara abrir, transferir, encerrar e esperar.filas:lereatendentes:lerpara consultar filas e quem está online. As chaves de fluxo já nascem com esses escopos.
Rotas
| Método | Rota | Escopo | O que faz |
|---|---|---|---|
| POST | /v1/contacts/:id/tickets | conversas:escrever | Abre um ticket para um contato |
| POST | /v1/tickets | conversas:escrever | Abre um ticket achando o contato por telefone ou identidade |
| GET | /v1/conversations | conversas:ler | Lista e filtra tickets |
| GET | /v1/conversations/:id | conversas:ler | Lê um ticket |
| POST | /v1/conversations/:id/transfer | conversas:escrever | Transfere para outra fila ou atendente |
| POST | /v1/conversations/:id/close | conversas:escrever | Encerra o ticket |
| POST | /v1/conversations/:id/wait | conversas:escrever | Põe em espera ou tira da espera |
| POST | /v1/conversations/:id/labels | conversas:escrever | Aplica uma etiqueta ao ticket |
| DELETE | /v1/conversations/:id/labels/:labelId | conversas:escrever | Remove uma etiqueta do ticket |
| GET | /v1/queues | filas:ler | Lista as filas, com quantos aguardam e quantos estão em atendimento |
| GET | /v1/queues/:id/online | filas:ler e atendentes:ler | Lista quem está online na fila |
| GET | /v1/attendance-hours/status | filas:ler | Diz se a fila está dentro do horário de atendimento |
| GET | /v1/agents | atendentes:ler | Lista atendentes e status |
| POST | /v1/agents/status | atendentes:escrever | Muda o status de um atendente |
Passo a passo: abrir um ticket
- Tenha o id do contato. Se só tem o telefone, use
POST /v1/tickets. - 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"}'
- 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 corpo | Para que serve |
|---|---|
queueId | Fila de destino. Sem ele valem as regras de atendimento e, depois, a fila padrão |
channelId | Canal do ticket. Sem ele, o Pipe usa o da sessão do bot, depois o último canal usado do contato |
agentId | Atribui a um atendente específico. Ele precisa ser da fila, estar Online e ter vaga, senão a resposta é 409 agent_unavailable |
reason | Até 500 caracteres, vai para a nota interna |
priority | Prioridade do ticket |
contactId, phone, channelIdentity | Só 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:
| Filtro | O que faz |
|---|---|
estado | Waiting, Assigned, Open, ClosedAttendant, ClosedClient, ClosedClientInactivity ou Transferred |
standby | true ou false, para tickets em espera |
fila_id, atendente_id, contato_id | Por fila, atendente ou contato |
closed, from, to | Encerrados ou não, e período (AAAA-MM-DD ou ISO, no máximo 92 dias) |
label_id, sequential_id | Por etiqueta ou pelo número do ticket |
limit, cursor, order_by | Paginaçã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 informechannelId. - 403 em
agents/status: a rota exigeatendentes:escrever. Veja Escopos e permissões. - Ticket duplicado no seu sistema: a API nunca duplica ticket ativo do mesmo contato. Use
createdpara saber se o ticket é novo.
Boas práticas
- Verifique
attendance-hours/statusantes de abrir ticket fora do horário, e avise o cliente se estiver fechado. - Registre o
conversationIdno seu sistema para consultar ou encerrar depois. - Use Idempotency-Key nas escritas que seu sistema pode repetir.
Próximos passos
- Envie mensagens no ticket em Enviar mensagens pela API.
- Consulte etiquetas, respostas rápidas e regras em Consultar cadastros.
- Veja como a equipe vê isso no Desk em Transferir uma conversa e Finalizar um ticket.
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.
Esse artigo foi útil?
Obrigado pelo retorno!