Unipile MCP · Caixa de entrada unificada
Crie uma caixa de entrada unificada com um agente de código
Conversas de LinkedIn, WhatsApp e e-mail em uma só lista, com resposta na mesma tela. Com o Servidor MCP da Unipile, seu agente escreve a busca e o merge.
Teste grátis de 7 dias, sem cartão de crédito.
Seu agente · support-console
Unipile MCP conectado
Crie uma caixa de entrada unificada de LinkedIn, WhatsApp e e-mail.
Executar requisiçãoGET /v2/accounts/3 contas
Adicionei GET /api/inbox: uma chamada por conta, um formato de item, ordenado por data.
Descreva o próximo recurso…
O objetivo
O que você quer construir
Mostrar aos seus usuários todas as conversas das contas que eles conectaram em uma única lista e permitir que respondam sem sair do seu produto. Começando pela parte honesta: account_id fica no path de todas as rotas, então uma caixa de entrada unificada é uma chamada por conta seguida de um merge na sua aplicação. O que a API unifica é o formato dos objetos, não o número de chamadas.
Sem isso
Um cliente por provedor, um formato para cada
Um cliente LinkedIn, um cliente WhatsApp e um cliente de e-mail, cada um com seu próprio modelo e sua própria paginação.
Um único "carregar mais" que perde mensagens assim que uma das contas fica sem páginas antes das outras.
Uma resposta que sai pela conta errada porque o chat e a conta não foram mantidos juntos.
Com o servidor MCP da Unipile
O resultado na sua aplicação
Uma lista única de conversas de LinkedIn, WhatsApp e e-mail, ordenada por data, com o canal como badge.
Um carregar mais que avança um cursor por conta e nunca perde uma mensagem.
Resposta direto da lista, pela conta dona do chat, testada na sua aplicação Development.
Prompt, etapas, código
Entregue o prompt ao seu agente
Dois prompts, cada um com os endpoints Unipile que o agente lê e executa e o que chega ao seu projeto. Os paths estão completos, sobre a URL base da API
https://api.unipile.com, com sua chave com escopo no X-API-KEY como header.Crie uma caixa de entrada unificada de LinkedIn, WhatsApp e e-mail nesta aplicação: liste as contas conectadas, busque uma página de chats e uma página de e-mails por conta, normalize tudo em um único formato de item e ordene por data.
Executar requisiçãoGET /v2/accounts/3 contas
Executar requisiçãoGET /v2/{account_id}/chats200 · next_cursor
Adicionei
GET /api/inbox: lista as contas, dispara GET /v2/{account_id}/chats e GET /v2/{account_id}/emails em paralelo, mapeia os dois para um único InboxItem (id, account_id, channel, counterpart, preview, date, unread) e ordena por data. Abrir um item chama a rota de mensagens daquele chat. Rodei na aplicação Development com uma conta de teste de LinkedIn, uma de WhatsApp e uma de Gmail.Uma chamada por conta, um formato de item, uma ordenação
O agente lê os schemas Chat e Email pelo servidor e define o formato comum mínimo: um identificador, uma data, um remetente, uma prévia e o canal. Tudo o que é específico do provedor continua disponível no objeto bruto para a visualização de detalhe. Instagram e Telegram passam pelas mesmas rotas de chat, então um quarto canal é mais uma conta, não mais um cliente.
Endpoints usados pelo agente
GET/v2/accounts/GET/v2/{account_id}/chatsGET/v2/{account_id}/emailsGET/v2/{account_id}/chats/{chat_id}/messagesPOST/v2/{account_id}/chats/{chat_id}/messages/sendPOST/v2/{account_id}/emails/send
Erro comum: Procurar um filtro de query account_id. Ele fica no path: uma chamada por conta e depois o merge na sua aplicação.
Construa o lado LinkedIn em detalhe
Adicione paginação à caixa de entrada unificada: mantenha um cursor por conta conectada, avance cada um de forma independente no carregar mais e pare uma conta quando o next_cursor dela estiver ausente.
Ler endpointGET /v2/{account_id}/chatsdata, total_count, next_cursor
Executar requisiçãoGET /v2/{account_id}/emails?cursor=…200 OK
Substituí o offset global por um
Map<account_id, next_cursor> mantido no estado da caixa de entrada. O carregar mais avança todas as contas que ainda têm cursor, em paralelo, e reordena a lista mesclada. Uma conta sem next_cursor é marcada como esgotada e ignorada. Verificado com três contas de tamanhos diferentes na aplicação Development.O envelope é o mesmo em todo lugar: data, total_count, next_cursor
Toda rota de listagem devolve o mesmo envelope. Passe o token
next_cursor no parâmetro cursor para obter a próxima página. O contrato diz para usar o cursor quando o provedor suporta e offset nos outros casos, e que limit é um teto, não uma garantia: uma página curta não é o fim da lista, só a ausência de next_cursor é.Endpoints usados pelo agente
GET/v2/{account_id}/chatsGET/v2/{account_id}/emailsGET/v2/{account_id}/chats/{chat_id}/participants
Erro comum: Um cursor para a caixa de entrada inteira. Cada conta pagina com o próprio cursor; um cursor compartilhado perde mensagens assim que uma conta termina antes das outras.
Mantenha a lista ao vivo com webhooks
Paginação
Um envelope, um cursor por conta
Extraído literalmente do contrato v2 que o agente lê pelo servidor. Os mesmos três campos voltam em toda rota de listagem.
1O envelopedata traz a página, total_count o tamanho quando o provedor informa, next_cursor o token da próxima página. Sem next_cursor, é o fim da lista daquela conta.GET https://api.unipile.com/v2/{account_id}/chats?limit=20
{ "object": "ChatList", "items": [ … ], "cursor": "…" }
2Cursor ou offsetUse next_cursor sempre que o provedor suportar, offset nos outros casos. Um código que assume um dos dois para todos os provedores quebra na primeira caixa IMAP.GET https://api.unipile.com/v2/{account_id}/emails?cursor=…&limit=20
GET https://api.unipile.com/v2/{account_id}/chats?offset=40&limit=20
3O mapa de cursoresUma entrada por conta no estado da sua aplicação. O carregar mais avança todas as contas que ainda têm cursor e descarta as que não devolveram nenhum.{ "acc_1a…": "eyJ…", "acc_9c…": null, "acc_f2…": "eyJ…" }
limit é um teto, não uma garantia
Do Development para a Production
Teste primeiro em uma aplicação Development
Seu dashboard Unipile separa uma aplicação Development da Production. Dê ao agente uma chave com escopo de Development e uma conta de teste por canal: tamanhos de página reais, nenhum cliente real.
1Buscar uma página por contaLinkedIn, WhatsApp e uma conta de e-mail, combinados em uma lista ordenada por data.
2Responder direto da listaA chamada de envio sai pela conta dona do chat.
3Carregar mais com contas desiguaisNenhuma mensagem perdida, contas esgotadas ignoradas, e então troque a chave para Production.
crm-app · DevelopmentUsada pelo seu agente
Escopodev-tests · 2 contas
Chave
scoped Account API keyContasConta de teste LinkedIn, caixa de e-mail Gmail de teste
Webhooks1 endpoint · eventos de mensagem
crm-app · ProductionSem alterações
Escopouma por workspace
Chave
scoped keys, in your backend onlyContasas próprias contas dos seus usuários, via Hosted Auth
Solução de problemas
Erros comuns e o que eles significam
Os quatro erros que quebram uma caixa de entrada unificada e a correção de cada um. Três deles são sobre paginação.
Procurar account_id como filtro de query
Espera-se que uma única chamada devolva todas as contas.
Correçãoaccount_id fica no path. Chame uma vez por conta e faça o merge na sua aplicação; a API unifica o formato, não o número de chamadas.
Um cursor único para toda a caixa de entrada
O carregar mais descarta mensagens assim que uma conta termina antes das outras.
CorreçãoMantenha um mapa de account_id para next_cursor. Avance cada conta de forma independente e pare as que não devolveram cursor.
Misturar cursor e offset
O código funciona em um provedor e quebra em outro.
CorreçãoUse next_cursor quando o provedor suportar e offset nos outros casos, como diz o contrato. Leia o envelope de cada conta em vez de supor.
Tratar limit como garantia
Uma página curta é lida como o fim da lista.
Correçãolimit é um teto. Só a ausência de next_cursor encerra a lista de uma conta; uma página com menos itens que o pedido não encerra.
6000+
Empresas que inovam com a Unipile
Com a confiança dos líderes do setor
1 API
Simplificar as operações de todos os principais canais de comunicação
2 dias
Obtenha integração ao vivo rapidamente com o mínimo de configuração
30%
Redução dos esforços e recursos de manutenção
Segurança e conformidade incorporadas
Proteção de nível empresarial para seus dados e fluxos de trabalho Saiba mais sobre nossa segurança
SOC 2 Tipo II
Certificado
Controles de segurança auditados de forma independente, garantindo a proteção dos dados e a integridade operacional.
GDPR
Em conformidade
Conformidade total com os regulamentos europeus de proteção de dados para a privacidade do usuário.
99.9%
Tempo de atividade da plataforma nos últimos 24 meses
24/7
Suporte global com API de alto desempenho
FAQ da caixa de entrada unificada
Uma chamada por conta, os endpoints necessários, paginação entre contas, formatos de mensagem e de e-mail, e como manter a lista viva.
Não, por design.
account_id faz parte do path, então você chama uma vez por conta e faz o merge na sua aplicação. O que a API unifica é o formato dos objetos, não o número de chamadas.GET /v2/accounts/ para a lista de contas, depois GET /v2/{account_id}/chats e GET /v2/{account_id}/emails por conta, e então GET /v2/{account_id}/chats/{chat_id}/messages para abrir uma conversa. As respostas saem por POST /v2/{account_id}/chats/{chat_id}/messages/send e POST /v2/{account_id}/emails/send.Um cursor por conta. Cada rota de listagem devolve
data, total_count e next_cursor. Devolva next_cursor no parâmetro cursor e mantenha um mapa de cursores, um por conta, no estado da sua aplicação.Conversas de mensageria são objetos Chat e e-mails são objetos Email, cada um com seus próprios campos. A normalização acontece na sua aplicação, em pelo menos três campos: identificador, data e remetente. O agente lê os dois schemas pelo servidor e escreve esse mapeamento.
Com um endpoint de webhook inscrito em
message.new e email.new. A página dedicada mostra como um agente configura isso.