Erro de escopos na API da HubSpot: por que o 403 insiste e como resolver de vez
Poucas coisas irritam mais quem está integrando com a HubSpot do que o erro 403. Você lê a mensagem, ela fala em permissão, você vai nas configurações do app, confere os escopos, e está tudo lá, habilitado, certinho. Volta para o código, roda de novo, e o 403 continua firme, te encarando, como se a HubSpot estivesse de brincadeira com você.
A boa notícia é que esse comportamento, por mais irritante que seja, tem uma causa quase sempre previsível, e a solução costuma levar menos de cinco minutos quando você entende o que está acontecendo. O 403 na API da HubSpot quer dizer, em quase todos os casos, uma coisa só: o token que você está usando não tem o escopo que aquele endpoint exige. O que confunde, sobretudo em apps OAuth, é que ter o escopo habilitado na configuração e ter o escopo ativo no token podem ser dois momentos diferentes. Neste guia, vou te mostrar por que o 403 aparece mesmo com tudo aparentemente certo, e como resolver de forma definitiva.
O que é um escopo, afinal
O token da HubSpot recebe escopos, que nada mais são do que permissões. Cada escopo libera um conjunto específico de endpoints. Para ler contatos, o token precisa do escopo crm.objects.contacts.read. Para escrever contatos, precisa do crm.objects.contacts.write. Para mexer com automação, formulários ou qualquer outra área, há escopos próprios. Os mesmos escopos valem seja com token de app privado, com uma account service key ou com um app OAuth. A lógica é granular de propósito: cada token deve ter exatamente as permissões da tarefa que cumpre, e nada além disso. É o princípio do menor privilégio, que protege o portal caso o token vaze.
Por que o 403 aparece mesmo com o escopo habilitado
Aqui está o coração da confusão, e ele depende do tipo de credencial. Com uma credencial estática, um token de app privado ou uma service key, o token reflete os escopos atuais do app assim que você salva, então um 403 que insiste costuma apontar para outra coisa, não para o token em si. Com OAuth, o token de acesso carrega os escopos consentidos na instalação, então um escopo adicionado depois só passa a valer após uma reinstalação. Existem quatro causas que respondem pela grande maioria dos casos, e vale conhecer todas.
- O escopo não foi de fato adicionado e salvo. Parece óbvio, mas a causa mais comum em credencial estática é um escopo que foi marcado mas não salvo, ou salvo em um app diferente daquele a que o seu token pertence. Depois que você adiciona o escopo e clica em Salvar, o token existente já passa a refletir, então comece confirmando que o escopo está mesmo habilitado no app certo.
- O escopo está errado para aquele endpoint específico. Alguns endpoints de esquema, por exemplo, pedem escopos crm.schemas próprios, separados do escopo de leitura do objeto. Sempre confira o escopo exato que a documentação daquele endpoint pede.
- Confusão entre leitura e escrita. Um token que só tem escopo de leitura recebe 403 na hora em que tenta criar ou atualizar um registro, mesmo que a leitura funcione perfeitamente.
- Apps OAuth precisam de reinstalação. Em apps OAuth, o token de acesso carrega os escopos consentidos na instalação. Adicionar o escopo na configuração não basta: é preciso reinstalar e reconsentir para valer. Este é o equivalente OAuth do clássico token criado antes do escopo.
Como corrigir, passo a passo
Resolver o 403 é direto quando você ataca a causa certa. O roteiro abaixo cobre o caminho que resolve a esmagadora maioria dos casos.
- Abra o app nas configurações do portal e confira com calma a lista de escopos habilitados.
- Adicione o escopo exato que o endpoint exige, prestando atenção à diferença entre leitura e escrita e entre registros e esquema.
- Salve o app para aplicar o escopo. Em credencial estática, o token existente já passa a funcionar com o novo escopo no instante em que você clica em Salvar, sem regenerar. Regenerar é só rotação de segurança, não um jeito de ganhar escopo.
- Atualize o token no seu cofre de credenciais e nas integrações que o usam, caso você o tenha rotacionado por segurança.
- Se for um app OAuth, reinstale o app no portal para que o novo escopo seja efetivamente consentido.
|
Dica de quem já apanhou: se você adicionou o escopo e o 403 continua numa credencial estática, não regenere o token achando que resolve. Confirme que o escopo foi mesmo salvo no app certo, que é o escopo exato que o endpoint pede, e que você não está confundindo leitura com escrita. No OAuth, a solução é reinstalar e reconsentir. Regenerar um token estático é para segurança, não para ganhar escopo. |
Como a HubSpot autentica hoje
Antes de sair depurando, ajuda saber qual credencial você tem em mãos, porque a solução do 403 depende disso. A autenticação da HubSpot tem mais de um caminho hoje, e eles se comportam de forma diferente quando você mexe em escopos. As antigas API Keys (hapikey) foram descontinuadas em 2022 e não são mais uma opção.
- App privado (token estático): a opção mais simples, ainda totalmente suportada. Você adiciona escopos nas configurações do app e clica em Salvar, e o token existente já reflete. Melhor quando você só precisa chamar algumas APIs.
- Account service keys (beta): uma chave estática com escopo para chamadas REST diretas, gerida em Development, Keys. Você pode adicionar escopos depois de criar a chave e usá-los na hora. Elas não autenticam webhooks nem UI extensions.
- Apps OAuth: para integrações instaladas por mais de uma conta. O token de acesso carrega os escopos consentidos na instalação, então um escopo novo exige reinstalar e reconsentir.
- Apps do novo developer platform (feitos com a CLI da HubSpot): configuração como código, autenticados por token estático ou OAuth. É aqui que webhooks, app cards, custom workflow actions e serverless existem como features do app.
- Developer API key: uma credencial do developer account, usada para gerenciar apps públicos e suas assinaturas de webhook, não para fazer chamadas de dados. Não confunda com o token que carrega escopo e dispara o 403.
Uma consequência prática: se você precisa de webhooks, precisa de um app, não de uma service key. Apps privados legados configuram as assinaturas de webhook na interface do app, enquanto os apps do novo platform configuram em código, onde o webhooks v3 funciona com token estático e o v4 exige OAuth. E uma nota de segurança que vale para todo token estático: desde outubro de 2024, a HubSpot desativa automaticamente tokens encontrados expostos publicamente, por exemplo em um repositório do GitHub, então guarde-os em um cofre. As account service keys ainda estão em beta, então trate o comportamento exato delas como sujeito a mudança.
403 e 401 não são a mesma coisa
Vale separar dois erros que muita gente confunde, porque o tratamento é diferente. O 401 é um problema de autenticação: o token está errado, ausente ou inválido, e a HubSpot nem sabe quem você é. O 403, por outro lado, é um problema de autorização: a HubSpot sabe perfeitamente quem você é, o token é válido, mas ele não tem permissão para fazer aquela operação específica. Em resumo, 401 é não sei quem você é, 403 é sei quem você é, mas você não pode fazer isso. Saber qual dos dois você está vendo já aponta para metade da solução.
Escopos por área: um mapa rápido
Os escopos seguem uma lógica de área e de ação que, uma vez entendida, evita a maioria dos 403. Para o CRM, há um escopo de leitura e um de escrita por objeto, como contatos, empresas e negócios, além de escopos separados para o esquema, ou seja, para ler e criar propriedades. Para automação, existe um escopo próprio que libera os workflows. Para formulários, outro. A regra mental é simples: pergunte qual objeto, qual ação, leitura ou escrita, e qual área, e o escopo necessário cai por gravidade. Quando um endpoint mistura áreas, como criar uma atividade já associada a um contato, ele pode exigir escopos de mais de uma área ao mesmo tempo.
Esse mapa também ajuda a aplicar o menor privilégio na prática. Em vez de marcar todos os escopos por preguiça, você marca só os que a tarefa pede, e o resultado é um token que, se vazar, dá acesso a muito menos coisa. Um token de extração para BI, por exemplo, deveria ter apenas escopos de leitura dos objetos que ele lê, e nada de escrita. Essa disciplina não é burocracia, é a sua rede de segurança.
Um checklist rápido antes de rodar em volume

A pior hora de descobrir um escopo faltante é no meio de uma execução de milhares de registros, quando a rotina já rodou metade e trava. A melhor hora é antes de começar, em segundos. Por isso, antes de qualquer carga grande, faça uma chamada de teste a cada endpoint que a rotina vai usar. Se algum responder 403, você descobre o escopo faltante na hora, com calma, e corrige antes de o problema custar tempo e dados pela metade. Esse pequeno ritual de teste prévio economiza horas de retrabalho.
Na prática: a integração que travava na escrita
Uma operação montou uma integração que lia contatos da HubSpot sem o menor problema durante o desenvolvimento inteiro. Tudo parecia pronto. Na hora de ativar a parte que atualizava os contatos, veio o 403, e o time travou, achando que tinha um bug profundo na lógica de escrita. Não tinha. O token havia sido criado só com o escopo de leitura, porque durante o desenvolvimento só leitura era necessária.
A correção foi adicionar o escopo de escrita ao app e salvar, e o token existente já passou a funcionar. Cinco minutos de trabalho para um problema que tinha consumido a manhã inteira de depuração no lugar errado. Desde então, a equipe adotou o ritual de testar cada endpoint, leitura e escrita, antes de considerar uma integração pronta.
Erros comuns que geram 403 sem necessidade
Além do caso OAuth de um escopo adicionado depois da instalação, alguns hábitos produzem 403 que poderiam ser evitados. Um deles é reaproveitar o mesmo token para tudo, de leitura a escrita, de uma área a outra, o que dificulta raciocinar sobre o que ele pode de fato fazer. Outro hábito problemático é não documentar quais escopos cada integração usa, o que transforma cada 403 numa investigação do zero, em vez de uma conferência rápida numa lista conhecida.
Há também o erro de testar só o caminho feliz durante o desenvolvimento. Se você só exercita a leitura porque é o que está pronto primeiro, o escopo de escrita nunca é validado, e o 403 só aparece quando a parte de escrita entra em produção, no pior momento. A prática que evita tudo isso é simples: um token por integração, com escopos mínimos e documentados, e cada endpoint testado isoladamente antes de confiar nele. Disciplina de escopo é, no fundo, disciplina de segurança.
Checklist contra o 403
- O app tem habilitado o escopo exato que o endpoint exige?
- Você diferenciou leitura de escrita ao escolher o escopo?
- Salvou o escopo, e reinstalou o app se for OAuth, depois de adicionar?
- O escopo está habilitado no mesmo app a que o seu token pertence?
- Testou cada endpoint com uma chamada isolada antes de rodar em volume?
Perguntas frequentes
Adicionei o escopo e ainda recebo 403. Por quê?
Em credencial estática (app privado ou service key), um escopo salvo passa a valer no token existente na hora, então, se o 403 persiste, confirme que o escopo foi mesmo salvo no app certo, que é o correto para o endpoint, e que você não está confundindo leitura com escrita. Regenerar o token não adiciona escopo. No OAuth, o escopo só passa a valer depois que você reinstala e reconsente.
Como sei qual escopo um endpoint exige?
A documentação de cada endpoint lista o escopo necessário. Preste atenção à diferença entre o escopo de registros e o de esquema, e entre os escopos de leitura e de escrita.
403 e 401 são a mesma coisa?
Não. 401 é autenticação inválida: token errado ou ausente. 403 é autenticação válida sem permissão: o token está certo, mas falta o escopo para aquela operação.
Preciso reinstalar o app para o escopo valer?
Em credencial estática (app privado ou service key), não: adicione o escopo, clique em Salvar, e o token existente já reflete. Em apps OAuth, sim: além de adicionar o escopo na configuração, é preciso reinstalar e reconsentir para valer.
Um token de leitura pode escrever se eu precisar?
Não. Um token só com escopo de leitura recebe 403 ao tentar criar ou atualizar. Adicione o escopo de escrita e salve o app (reinstale, se for OAuth).
Como evito descobrir o 403 só no meio de uma carga grande?
Faça uma chamada de teste a cada endpoint que a rotina vai usar antes de rodar em volume. Assim qualquer escopo faltante aparece em segundos, e não no meio de uma execução de milhares de registros.
Cansou de caçar escopo faltante no meio de uma integração? Na Insight Sales configuramos apps e tokens com o princípio de menor privilégio e testamos cada endpoint antes de operar. Fale com a gente e descubra como podemos ajudar.
Pronto para levar sua operação ao próximo nível.
Fale com um especialista e descubra como podemos ajudar.