A API da Engage usa três tokens com nomes parecidos — e trocar um pelo outro é a causa mais comum de erro 401 no primeiro dia de integração. Este artigo explica o papel de cada um, como renovar o acesso sem repetir o login e por que um login pode derrubar outro.
Neste artigo
- Antes de começar
- Os três tokens
- Renovar o acesso
- Saber se o token ainda vale
- Por que um login derruba outro
- O customer_token em detalhe
- No Postman
- Problemas comuns
Antes de começar
- Gere seu primeiro token seguindo Passo 2 — Obtendo o access_token (POST /auth).
- As credenciais usadas aqui são as mesmas, reunidas em Comece por aqui: credenciais para integrar com a API da Engage.
- Teste em homologação (
https://sandbox.engage.bz/api/v1) antes de apontar para produção.
Os três tokens
access_token | refresh_token | customer_token | |
|---|---|---|---|
| Para que serve | Autentica as chamadas da sua integração | Renova o acesso sem reenviar a senha | Identifica a instância — não autentica ninguém |
| De onde vem | Resposta do POST /auth | Resposta do POST /auth | GET /{customer_id}/infos/token |
| Onde é enviado | Cabeçalho Authorization: Bearer | Corpo do POST /auth, com grant_type=refresh_token | Query string ?customerToken= |
| Muda? | Sim, a cada login ou renovação | Sim, a cada renovação | Não, é fixo da instância |
Cuidado
O customer_token não substitui o access_token. Enviá-lo no cabeçalho Authorization resulta em 401 — e o inverso também: o access_token não substitui o customerToken da query string.
Renovar o acesso
Há duas formas de manter a integração autenticada. Escolha conforme a resposta do seu login.
Forma 1 — Repetir o login. Quando o token expira, faça de novo o POST /auth com grant_type=password. É o cenário mais comum em integração servidor a servidor, e é perfeitamente aceitável: uma rotina que roda de hora em hora pode simplesmente autenticar a cada execução.
Forma 2 — Usar o refresh_token. Só está disponível se a resposta do login trouxer um refresh_token — isso depende de como a aplicação foi registrada. Serve para quem precisa manter a sessão viva sem guardar a senha.
1Envie o refresh_token
POST https://sandbox.engage.bz/api/v1/auth
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token&refresh_token={refresh_token}&customer_id={customer_id}&client_id={client_id}| Campo | Obrigatório | Valor | Observação |
|---|---|---|---|
grant_type | Sim | refresh_token | Fixo |
refresh_token | Sim | o recebido no login anterior | Sempre o mais recente |
customer_id | Sim | o seu customer_id | Mesma instância do login |
client_id | Sim | o seu client_id | Precisa ser o mesmo que emitiu o token |
2Guarde o novo refresh_token
A resposta tem o mesmo formato do login: um novo access_token, o expires_in e um novo refresh_token.
Atenção
O refresh_token é de uso único. Cada renovação queima o token usado e devolve outro. Se a sua integração guardar sempre o primeiro, a segunda renovação falha — grave o refresh_token novo a cada resposta.
Saber se o token ainda vale
Para conferir sem fazer uma chamada de negócio:
GET https://sandbox.engage.bz/api/v1/{customer_id}/login/authenticated
Authorization: Bearer {access_token}A resposta é 200 quando o token é válido e 401 quando não é. Útil para separar "o token expirou" de outros problemas.
Por que um login derruba outro
Gerar um token novo derruba o anterior. A regra vale para a mesma combinação de usuário, instância, client_id e device: dois processos seus autenticando com o mesmo usuário e o mesmo device vão se derrubar em rodízio.
Dica
O usuário de serviço da integração é a exceção — logins de integração permitem sessões simultâneas e não sofrem essa invalidação. É mais um motivo para nunca usar o login de uma pessoa. Para esses usuários, a resposta do login também não traz os campos key, is_blocked e is_admin; é o comportamento esperado.
O customer_token em detalhe
Ele é obtido sem autenticação:
GET https://sandbox.engage.bz/api/v1/{customer_id}/infos/token{
"result": {
"customer_id": "meucliente",
"name": "Meu Cliente",
"status": true,
"token": "{customer_token}",
"platform_url": "https://meucliente.engage.bz"
}
}O campo token é o customer_token: 32 caracteres que não mudam. Obtenha uma vez e guarde junto da configuração da sua integração.
- HTTP 200 com
{"result": null}não é sucesso. É a resposta quando ocustomer_idnão existe ou a instância está inativa. Trate esse caso e nunca gravenullcomocustomer_token. - Continue enviando
?customerToken=nos endpoints que o pedem, como os de usuários e grupos. É o contrato publicado da API. - O
customer_tokennão é um segredo forte. Ele identifica a instância, é devolvido por um endpoint público e, por ir na URL, aparece em logs de servidor e de proxy. Trate com higiene — não versione, não registre em log —, mas não construa controle de acesso em cima dele.
Importante
O segredo que protege a integração é o client_secret. Ele nunca vai para versionamento, log, código de navegador ou e-mail.
No Postman
A pasta 02 - Autenticação traz uma chamada para cada situação deste artigo:
| Request | Para que serve |
|---|---|
| Renovar access_token (grant_type=refresh_token) | Troca o refresh_token guardado por um par novo de tokens |
| Verificar se o token ainda é válido | Responde 200 se o access_token ainda vale, 401 se não |
| Obter customer_token da instância | Busca o customer_token e salva na variável customerToken — sem autenticação |
Pasta 02 - Autenticação aberta no Postman, com os quatro requests na ordem de uso

Resposta do request Obter customer_token da instância. O valor do token está oculto.
Problemas comuns
| O que aparece | Causa provável | O que fazer |
|---|---|---|
invalid_grant na renovação | refresh_token já usado, expirado ou desativado | Faça um novo POST /auth com grant_type=password |
invalid_clientId — Refresh token is issued to a different clientId | Renovação com client_id diferente do login | Use o mesmo client_id nos dois |
invalid_customer_id | customer_id errado, vazio ou instância inativa | Confira o valor do customer_id |
HTTP 401 em /login/authenticated | Token expirado ou derrubado por um login mais recente | Gere um novo token |
| HTTP 401 logo depois de gerar o token | Cabeçalho mal formado ou customer_id da rota diferente do token | Use exatamente Authorization: Bearer {access_token} e a mesma instância na rota |
{"result": null} em /infos/token | customer_id incorreto ou instância inativa | Não é erro de credencial: corrija o customer_id |
A pasta 98 - Erros comuns da coleção reúne o catálogo completo de erros da API e três chamadas de diagnóstico.
Próximo passo
Com a autenticação dominada, comece a cadastrar usuários em Integração de usuários.
Precisa de ajuda?
Escreva para meajuda@engage.bz informando o customer_id, o ambiente e a mensagem de erro completa. Nunca envie senhas, tokens ou o client_secret por e-mail.
Este artigo foi útil?
Que bom!
Obrigado pelo seu feedback
Desculpe! Não conseguimos ajudar você
Obrigado pelo seu feedback
Feedback enviado
Agradecemos seu esforço e tentaremos corrigir o artigo