Erro 403 Forbidden na API do X: causas e como resolver
Um 403 Forbidden da API oficial do X significa que suas chaves funcionam, mas o X recusa esta requisição; o corpo da resposta nomeia a causa, de um app que não foi movido para o pagamento por uso a curtidas e follows removidos em 20 de abril de 2026.
Resposta curta: Registre o corpo completo da resposta e compare o texto dele: client-not-enrolled significa mover o app para o pagamento por uso, um app Read-only ou um token só de app bloqueia postar, e follows, curtidas e quote posts agora exigem um contrato Enterprise. Para ler posts e perfis públicos sem esses 403, use a Sorsa API: uma chave de API, a partir de US$ 0,014 por 1.000 tweets, e 100 requisições grátis.
- Endpoint
POST /tweet-info-bulk- Tamanho da página
- 100 tweets por requisição
- Preço
- a partir de US$ 0,014 por 1.000
#O que um 403 Forbidden significa na API oficial do X
Um 403 é o X dizendo que sabe quem você é e mesmo assim não vai fazer isso. A referência de códigos de resposta (abre em uma nova aba) do X o define como autenticação válida sem permissão para o recurso ou a ação. Um 401 é o outro caso: as próprias credenciais estão ausentes ou erradas.
Toda causa de um 403 devolve o mesmo status, então só o status não diz nada. O corpo diz. O X responde em JSON de Problem Details com um title, um detail e um type, e os erros de enrollment acrescentam um reason. Registre a resposta inteira e leia os campos você mesmo:
Dois hábitos poupam horas. Registre o corpo e o header de resposta x-transaction-id em todo 403, porque a equipe do X pede os dois antes de olhar um caso no fórum de desenvolvedores. E não tente de novo: um 403 volta igual até algo mudar no app, no token, no post ou na conta. Novas tentativas são para 429 e erros 5xx, que nosso guia de códigos de erro da API do Twitter cobre código por código.
#Encontre seu 403 pelo texto do erro
Compare o texto do corpo do seu 403 com esta tabela: cada linha nomeia a causa e a primeira solução. A maioria das linhas vem de escritas; as leituras falham por enrollment, escopos, contas protegidas e chamadas antigas da v1.1. Os textos de erro ficam em inglês, como o X os envia.
| Texto no corpo do 403 | Onde aparece | Causa | Primeira solução |
|---|---|---|---|
"reason": "client-not-enrolled", title "Client Forbidden" | Qualquer chamada v2 | App no pacote Free aposentado, avulso ou fora de um Project | Mova o app para o pagamento por uso, crie chaves novas |
| "Authenticating with OAuth 2.0 Application-Only is forbidden for this endpoint" | Postar, /2/users/me, bookmarks, DMs | Bearer token só de app | Use um token de contexto de usuário |
Um "detail": "Forbidden" sozinho | GET /2/users/me | Token sem tweet.read e users.read | Adicione os dois escopos, autorize de novo |
Qualquer 403 em uma curtida, um follow ou quote_tweet_id | /2/users/{id}/likes, /following, quote posts | Removidos do self-serve em 20 de abril de 2026 | Só com contrato Enterprise |
| "Reply to this conversation is not allowed because you have not been mentioned..." | Respostas | Regra de resposta invocada desde 23 de fevereiro de 2026 | Responda só quando for mencionado ou citado |
| Um 403 em um post com dois ou mais $cashtags | POST /2/tweets | Limite self-serve de 1 cashtag por post | Mantenha um cashtag |
| "This user is not allowed to post a video longer than N minutes." | Posts com vídeo | O limite de vídeo da conta que posta | Corte o vídeo |
| "You are not permitted to perform this action." | POST /2/tweets | O X recusou este post: uma regra acima, limites de postagem ou uma checagem de spam | Confira o conteúdo, diminua o ritmo |
| "Your account is not permitted to access this feature." | POST /2/tweets | Restrição de escrita na conta que posta | Pare as tentativas, confira a conta no x.com |
Type not-authorized-for-resource | Ler um post ou usuário | Conteúdo protegido ou privado | Nenhuma: só seguidores aprovados podem ler |
Um type dm-, ou "This operation is not permitted." | Mensagens diretas | As configurações do destinatário ou uma checagem de segurança | Leia o type; muitas vezes não há o que resolver |
| Código 453, "You currently have access to a subset of X API V2 endpoints..." | Endpoints da v1.1 | A v1.1 está fora do seu acesso | Chame o endpoint da v2 |
"reason": "client-not-enrolled", title "Client Forbidden"- Onde aparece
- Qualquer chamada v2
- Causa
- App no pacote Free aposentado, avulso ou fora de um Project
- Primeira solução
- Mova o app para o pagamento por uso, crie chaves novas
"Authenticating with OAuth 2.0 Application-Only is forbidden for this endpoint"
- Onde aparece
- Postar,
/2/users/me, bookmarks, DMs - Causa
- Bearer token só de app
- Primeira solução
- Use um token de contexto de usuário
Um
"detail": "Forbidden"sozinho- Onde aparece
GET /2/users/me- Causa
- Token sem
tweet.readeusers.read - Primeira solução
- Adicione os dois escopos, autorize de novo
Qualquer 403 em uma curtida, um follow ou
quote_tweet_id- Onde aparece
/2/users/{id}/likes,/following, quote posts- Causa
- Removidos do self-serve em 20 de abril de 2026
- Primeira solução
- Só com contrato Enterprise
"Reply to this conversation is not allowed because you have not been mentioned..."
- Onde aparece
- Respostas
- Causa
- Regra de resposta invocada desde 23 de fevereiro de 2026
- Primeira solução
- Responda só quando for mencionado ou citado
Um 403 em um post com dois ou mais $cashtags
- Onde aparece
POST /2/tweets- Causa
- Limite self-serve de 1 cashtag por post
- Primeira solução
- Mantenha um cashtag
"This user is not allowed to post a video longer than N minutes."
- Onde aparece
- Posts com vídeo
- Causa
- O limite de vídeo da conta que posta
- Primeira solução
- Corte o vídeo
"You are not permitted to perform this action."
- Onde aparece
POST /2/tweets- Causa
- O X recusou este post: uma regra acima, limites de postagem ou uma checagem de spam
- Primeira solução
- Confira o conteúdo, diminua o ritmo
"Your account is not permitted to access this feature."
- Onde aparece
POST /2/tweets- Causa
- Restrição de escrita na conta que posta
- Primeira solução
- Pare as tentativas, confira a conta no x.com
Type
not-authorized-for-resource- Onde aparece
- Ler um post ou usuário
- Causa
- Conteúdo protegido ou privado
- Primeira solução
- Nenhuma: só seguidores aprovados podem ler
Um type
dm-, ou "This operation is not permitted."- Onde aparece
- Mensagens diretas
- Causa
- As configurações do destinatário ou uma checagem de segurança
- Primeira solução
- Leia o type; muitas vezes não há o que resolver
Código 453, "You currently have access to a subset of X API V2 endpoints..."
- Onde aparece
- Endpoints da v1.1
- Causa
- A v1.1 está fora do seu acesso
- Primeira solução
- Chame o endpoint da v2
#client-not-enrolled: mova o app para o pagamento por uso
client-not-enrolled significa que o app por trás das suas chaves não está inscrito no acesso de que o endpoint precisa, então toda chamada v2 falha, leituras e escritas. Em 2026 a causa é quase sempre um app deixado no pacote Free legado, que aparece como app avulso ou fora de um Project.
{
"detail": "When authenticating requests to the X API v2 endpoints, ...",
"reason": "client-not-enrolled",
"required_enrollment": "Appropriate Level of API Access",
"title": "Client Forbidden",
"type": "https://api.x.com/2/problems/client-forbidden"
}
O detail fala de Projects, mas a equipe do X descreve a causa de 2026 com clareza: o nível Free está obsoleto, e um app deixado nele recebe esse erro até ser movido para o pagamento por uso, como mostra uma thread do fórum sobre apps avulsos travados (abre em uma nova aba). A mesma resposta observa que os endpoints de login continuam gratuitos no pagamento por uso.
Se o corpo não tem o campo reason, o enrollment não é o seu problema. A equipe do X já disse com todas as letras que um 403 simples ao postar é outro erro, então mover projetos ou gerar chaves de novo não vai tocar nele.
-
Abra o Developer Console. Entre em console.x.com e ache o app cujas chaves o seu código usa.
-
Confira o pacote dele. Ele precisa estar no pagamento por uso e no ambiente Production; um app avulso ou sob um projeto legado Free, Basic ou Pro falha.
-
Mova-o para o pagamento por uso. Adicione uma forma de pagamento e créditos; as leituras são cobradas por item, US$ 0,005 por post e US$ 0,010 por usuário, como mostra nosso detalhamento dos preços da API do X.
-
Crie chaves e tokens novos. Gere de novo o Bearer token e os tokens de acesso e publique-os: os antigos mantêm o enrollment antigo.
-
Pergunte no fórum se o console não conseguir movê-lo. Poste o App ID numérico, o endpoint e o corpo completo; a equipe do X já moveu apps travados à mão.
#Curtidas, follows e quote posts: removidos do self-serve
Desde 20 de abril de 2026, a API oficial do X não curte, não segue nem faz quote post para nenhum app self-serve, então essas chamadas devolvem 403 por mais que o app esteja configurado. A atualização de preços (abre em uma nova aba) do X lista POST e DELETE /2/users/{id}/likes, POST e DELETE /2/users/{id}/following, e qualquer post enviado com quote_tweet_id, e a referência de create-post (abre em uma nova aba) agora diz que fazer quote post exige um plano Enterprise.
O self-serve cobre o pagamento por uso e os planos legados Free, Basic e Pro. Curtidas e follows já tinham saído do nível Free em 22 de agosto de 2025, então um bot criado antes disso pode estar falhando há mais de um ano.
Nenhuma configuração os traz de volta. Tokens novos, os escopos like.write ou follows.write e mais créditos não mudam nada; só um contrato Enterprise, a partir de cerca de US$ 42.000 por mês, ainda escreve essas ações. A linha do tempo mostra quando cada um desses 403 apareceu:
Escolha o que o seu código faz para ver se o acesso self-serve ainda permite, o 403 que ele devolve e a solução:
O que o seu código faz na API oficial do X?
-
Ler posts, perfis ou buscar
Aberto no pagamento por uso
- Custo
- US$ 0,005 por post, US$ 0,010 por usuário, até 3M de leituras de posts por mês
- O 403
client-not-enrolledquando o app não está no pagamento por uso;not-authorized-for-resourceem contas protegidas- Correção
- Mude o app para o pagamento por uso em console.x.com e gere chaves novas. A Sorsa API lê os mesmos dados públicos com uma chave de API e sem app.
-
Ler seus próprios favoritos, curtidas ou seguidores
Aberto, só com token de usuário
- Custo
- US$ 0,001 por item como Owned Reads, desde April 20, 2026
- O 403
- "Unsupported Authentication" com um Bearer token só de app
- Correção
- Chame com um token de contexto de usuário: OAuth 1.0a ou OAuth 2.0 com PKCE.
-
Publicar um post
Aberto no pagamento por uso
- Custo
- US$ 0,015 por post, US$ 0,20 com uma URL
- O 403
- "You are not permitted to perform this action." ou um app Read-only
- Correção
- Configure o app como Read and write, gere novos tokens de acesso e poste com um token de usuário.
-
Responder a um post
Só quando chamado
- Desde
- February 23, 2026, só no self-serve
- O 403
- "Reply to this conversation is not allowed because you have not been mentioned or otherwise engaged by the author"
- Correção
- Responda só a posts que mencionam (@) a sua conta ou citam um post dela.
-
Citar um post
Removido do self-serve
- Desde
- April 20, 2026:
quote_tweet_idexige Enterprise - O 403
- Qualquer post que traga
quote_tweet_id - Correção
- Poste um link para o post em vez disso, ou migre para um contrato Enterprise.
-
Curtir ou descurtir
Removido do self-serve
- Desde
- April 20, 2026; fora do plano Free desde August 22, 2025
- O 403
POSTeDELETE /2/users/{id}/likes- Correção
- Nenhuma no self-serve. Só um contrato Enterprise ainda curte pela API.
-
Seguir ou deixar de seguir
Removido do self-serve
- Desde
- April 20, 2026; fora do plano Free desde August 22, 2025
- O 403
POSTeDELETE /2/users/{id}/following- Correção
- Nenhuma no self-serve. Só um contrato Enterprise ainda segue pela API.
-
Postar com $cashtags
Uma por post
- Regra
- Posts do self-serve levam no máximo 1 cashtag
- O 403
- Um post com uma segunda
$TICKER - Correção
- Mantenha uma cashtag e escreva os outros tickers sem o sinal $.
-
Postar um vídeo longo
Limitado pela conta
- Regra
- 20 minutos por padrão, 125 minutos no X Premium, documentado em September 1, 2026
- O 403
- "This user is not allowed to post a video longer than N minutes."
- Correção
- Corte o vídeo. Um orçamento maior de API não aumenta o limite.
-
Enviar uma mensagem direta
Recusada por destinatário
- Desde
- October 26, 2026: cada recusa tem o seu próprio tipo
- O 403
dm-recipient-not-accepting,dm-sender-not-verifiede outrosdm-tipos, ou "This operation is not permitted."- Correção
- Leia o tipo. A maioria das recusas vem das configurações do destinatário e não dá para corrigir no código.
-
Chamar um endpoint da v1.1
Quase tudo fechado
- Regra
- O acesso self-serve cobre a v2 e alguns endpoints da v1.1, como o upload de mídia
- O 403
- Código 453: "You currently have access to a subset of X API V2 endpoints and limited v1.1 endpoints only"
- Correção
- Chame o endpoint da v2: no tweepy,
tweepy.Clientem vez detweepy.API.
Self-serve significa pagamento por uso e os planos legados Free, Basic e Pro. Do changelog e da documentação do X, conferidos em November 2, 2026.
O que o acesso self-serve da API oficial do X permite em November 2026, ação por ação.
Um quote post tem uma alternativa simples: poste o link do post em vez de usar quote_tweet_id. O X cobra um post com URL a US$ 0,20, contra US$ 0,015 de um post simples.
#403 em POST /2/tweets: tokens, respostas, contas
Postar está aberto no pagamento por uso a US$ 0,015 por post, então um 403 em POST /2/tweets vem do token, do conteúdo do post ou da conta por trás dele. Confira-os nessa ordem.
Um app Read-only ou um token só de app
Um post precisa de um token de contexto de usuário: OAuth 1.0a com as chaves de consumidor do app mais o token e o segredo de acesso da conta, ou um token OAuth 2.0 do fluxo PKCE com o escopo tweet.write. Um Bearer token só de app recebe esta resposta:
{
"title": "Unsupported Authentication",
"detail": "Authenticating with OAuth 2.0 Application-Only is forbidden ...",
"status": 403
}
Apps novos começam com permissão Read. Mude as configurações de autenticação de usuário do app para Read and write, depois crie um novo token e segredo de acesso: os tokens emitidos antes da mudança continuam só com Read.
"Reply to this conversation is not allowed"
Desde 23 de fevereiro de 2026, os apps self-serve só podem responder quando o autor do post original invocou a conta que responde, mencionando-a ou fazendo quote de um post dela, segundo o changelog do X (abre em uma nova aba). Qualquer outra resposta devolve 403 com "Reply to this conversation is not allowed because you have not been mentioned or otherwise engaged by the author" (responder a esta conversa não é permitido porque você não foi mencionado nem acionado de outra forma pelo autor), mesmo que a mesma resposta passe no x.com. Monte bots de resposta sobre menções: leia os posts que mencionam sua conta e responda a eles. Uma resposta invocada também custa menos no X, US$ 0,010 contra US$ 0,015.
Um cashtag por post, e a duração do vídeo
Posts self-serve podem trazer um $cashtag, e um segundo faz o X recusar o post; em um caso do fórum, remover o cashtag extra foi toda a solução. Os limites de vídeo seguem a conta que posta, não o seu gasto com a API: 20 minutos por padrão e 125 minutos no X Premium. Um vídeo mais longo devolve "This user is not allowed to post a video longer than 20 minutes." (este usuário não pode postar um vídeo com mais de 20 minutos).
"You are not permitted to perform this action"
Esse 403 about:blank é a recusa genérica do X para um post. Confira primeiro as regras acima: uma resposta que ninguém invocou, um segundo cashtag, um quote. Se nenhuma se aplica, a conta esbarrou em limites de postagem ou em uma checagem de spam: diminua o ritmo, pare de postar texto duplicado e tente um post à mão no x.com.
"Your account is not permitted to access this feature"
Esse texto aponta para a conta que posta, não para o seu app. Em um caso do fórum em setembro de 2026, ele começou logo depois de um lote de posts automatizados, as leituras continuaram funcionando, e a equipe do X descreveu uma restrição de escrita no nível da conta, não uma permissão ausente nem falta de créditos. Pare a automação, confira se a conta consegue postar no x.com e poste o x-transaction-id no fórum de desenvolvedores se só a API falhar.
#403 em leituras: escopos, contas protegidas, v1.1
Uma leitura devolve 403 quando o problema é o app, o token ou a conta de destino, e só as contas protegidas ficam de fato fora de alcance. O client-not-enrolled bloqueia leituras também; as outras causas de leitura são estas:
GET /2/users/mecom um "Forbidden" simples. O token de usuário não temtweet.readeusers.read. Adicione os dois à URL de autorização e passe o usuário por ela de novo: os tokens existentes mantêm os escopos antigos.- Seus próprios bookmarks, curtidas e seguidores. Essas Owned Reads custam US$ 0,001 por item e exigem um token de contexto de usuário; um token só de app recebe "Unsupported Authentication".
- Posts e contas protegidos. Voltam com o type
not-authorized-for-resource, que a referência do X descreve como sem acesso a conteúdo privado ou protegido. Em uma consulta em lote, o mesmo type chega dentro deerrorsde uma resposta 200, ao lado dos posts que você consegue ler. - Endpoints da v1.1. O acesso self-serve cobre a v2 e alguns endpoints da v1.1, como o upload de mídia, e o resto devolve o código 453. No tweepy, chamadas de
tweepy.APIcomoupdate_statususam a v1.1; chamadas detweepy.Clientusam a v2.
Fora as contas protegidas, nenhuma dessas causas depende dos dados em si: elas vêm do app, do pacote e do token, e é por isso que ler dados públicos por outro caminho as evita.
#Imprima o corpo inteiro do 403 no tweepy e no Node.js
As bibliotecas escondem o corpo por padrão: o tweepy lança tweepy.errors.Forbidden: 403 Forbidden, e o twitter-api-v2 lança "Request failed with code 403". As duas guardam a resposta, então imprima-a antes de chutar:
import tweepy
client = tweepy.Client(
consumer_key="API_KEY", consumer_secret="API_SECRET",
access_token="ACCESS_TOKEN", access_token_secret="ACCESS_SECRET",
)
try:
client.create_tweet(text="Testing the posting path")
except tweepy.errors.Forbidden as e:
print(e.api_messages) # X's detail text
print(e.response.headers.get("x-transaction-id"))
print(e.response.text) # the whole body: reason, type, title
Depois compare o texto com a tabela acima. Um loop que tenta de novo um 403 só gasta tempo: repita respostas 429 e 5xx com backoff, e resolva um 403 antes de enviar a requisição outra vez.
Bom saber
O
detaildo X pode enganar. O texto doclient-not-enrolledpede um Project mesmo quando o app já está em um e a solução real é a mudança para o pagamento por uso, e "You are not permitted to perform this action" cobre várias recusas diferentes. Confie primeiro noreasone notype, e depois na requisição que você enviou.
#Leia dados públicos do X sem erros 403: use a Sorsa API
A maioria dos 403 de leitura vem da configuração da API oficial do X: o app, o pacote dele, os tokens e os escopos. Para ler posts, perfis, seguidores e resultados de busca públicos sem essa configuração, use a Sorsa API, uma API e scraper do Twitter (X): uma chave de API em um header ApiKey, sem app de desenvolvedor, enrollment nem OAuth, então nenhuma das causas de leitura acima pode acontecer.
Veja o que quem lê dados públicos recebe de cada lado:
| O que importa para leituras | Sorsa API | API oficial do X |
|---|---|---|
| Configuração | Uma chave de API | App de desenvolvedor, pacote de pagamento por uso, tokens OAuth |
| Preço por 1.000 posts | a partir de US$ 0,014 | US$ 5,00 |
| Velocidade | 20 requisições por segundo em todos os planos | Janelas de 15 minutos por endpoint |
| Teto mensal | Seu plano, até 10 milhões de requisições, mais requisições extras | 3 milhões de leituras de posts, depois Enterprise |
| Sua conta do X | Nunca envolvida | Tokens ligados a uma conta |
Configuração
- Sorsa API
- Uma chave de API
- API oficial do X
- App de desenvolvedor, pacote de pagamento por uso, tokens OAuth
Preço por 1.000 posts
- Sorsa API
- a partir de US$ 0,014
- API oficial do X
- US$ 5,00
Velocidade
- Sorsa API
- 20 requisições por segundo em todos os planos
- API oficial do X
- Janelas de 15 minutos por endpoint
Teto mensal
- Sorsa API
- Seu plano, até 10 milhões de requisições, mais requisições extras
- API oficial do X
- 3 milhões de leituras de posts, depois Enterprise
Sua conta do X
- Sorsa API
- Nunca envolvida
- API oficial do X
- Tokens ligados a uma conta
-
Pegue uma chave. Cadastre-se e copie a chave no painel; 100 requisições grátis vêm com ela, sem cartão.
-
Leia posts por ID. O
POST /tweet-info-bulk(abre em uma nova aba) aceita até 100 IDs ou links de posts por requisição e devolve cada post com o perfil completo do autor:Terminal curl -X POST "https://api.sorsa.io/v3/tweet-info-bulk" \ -H "ApiKey: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"tweet_links": ["1853412966240727289", "1853398071322091822"]}'Response200 OK { "tweets": [ { "id": "1853412966240727289", "full_text": "Shipped the new export page today.", "created_at": "2026-10-30T14:02:11Z", "lang": "en", "likes_count": 184, "retweet_count": 22, "reply_count": 17, "quote_count": 3, "view_count": 9120, "is_reply": false, "user": { "id": "1592041833471827968", "username": "lena_ships_daily", "display_name": "Lena Ships", "followers_count": 4210, "verified": false, "protected": false } } ] } -
Busque em vez de ler timelines. O
POST /search-tweets(abre em uma nova aba) aceita os operadores de busca do X, devolve cerca de 20 posts por página e percorre onext_cursoraté ele voltar vazio:Python import requests URL = "https://api.sorsa.io/v3/search-tweets" HEADERS = {"ApiKey": "YOUR_API_KEY"} body = {"query": "from:lena_ships_daily", "order": "latest"} posts = [] while True: r = requests.post(URL, headers=HEADERS, json=body, timeout=30) r.raise_for_status() # 403: missing key or no requests left data = r.json() posts += data.get("tweets", []) if not data.get("next_cursor"): break body["next_cursor"] = data["next_cursor"] print(len(posts), "posts") -
Acompanhe seu próprio saldo. O
GET /key-usage-info(abre em uma nova aba) mostra as requisições restantes da chave e nunca desconta delas.
A Sorsa API tem uma lista curta de erros própria. Ela devolve 403 quando o header ApiKey está ausente ("missing key in request header", ou seja, chave ausente no header da requisição) ou quando as requisições da chave acabaram, e 401 quando a chave está errada. Uma requisição com falha nunca é cobrada.
Resolvidos os 403, o preço decide o resto:
API oficial do X
US$ 5.000
para 1 milhão posts
US$ 0,005 por post
Sorsa API
a partir deUS$ 14
para 1 milhão posts
a partir de US$ 0,014 por 1.000
A Sorsa API lê só dados públicos e nunca posta, curte nem segue, então sua conta do X nunca corre risco. Para publicar, mantenha um token de contexto de usuário na API oficial do X para as escritas e leia tudo pela Sorsa API; nosso guia da API do Twitter sem conta de desenvolvedor mostra essa configuração.
#Resolva a escrita, mude as leituras
Um 403 da API oficial do X nomeia a causa no corpo. Resolva o enrollment, os tokens ou o conteúdo do post onde o X ainda vende a ação, e pare de tentar de novo curtidas, follows e quote posts, que saíram do self-serve em 20 de abril de 2026. Para ler posts e perfis públicos, a Sorsa API precisa de uma chave de API e nenhuma configuração de app, custa a partir de US$ 0,014 por 1.000 tweets, e os primeiros 10 mil tweets cabem nas 100 requisições grátis que toda conta ganha.
#Perguntas frequentes
Qual é a diferença entre 401 e 403 na API oficial do X?
Um 401 significa que o X não aceitou suas credenciais: as chaves estão ausentes, digitadas errado, revogadas ou assinadas de forma incorreta. Um 403 significa que o X as aceitou e mesmo assim recusa a requisição, por causa do enrollment do app, das permissões do token, do conteúdo do post ou da conta. Gerar chaves de novo resolve muitos erros 401 e quase nenhum 403.
Devo tentar de novo um 403 da API oficial do X?
Não. Um 403 se repete até algo mudar: o pacote do app, o token, o post ou a situação da conta. Repita só respostas 429 e 5xx, com backoff. Para um 403, registre o corpo e o header x-transaction-id, compare o texto, resolva a causa e então envie a requisição uma vez.
A API oficial do X é gratuita em 2026?
Não. O nível Free fechou para apps novos em 6 de fevereiro de 2026, a equipe do X agora o chama de obsoleto, e o pagamento por uso cobra toda leitura: US$ 0,005 por post e US$ 0,010 por usuário. Só os endpoints de login continuam gratuitos. Nossa resposta sobre a API do Twitter ser gratuita cobre o que sobrou.
Que API devo usar para ler dados do X sem erros 403?
Use a Sorsa API para ler dados públicos do X sem erros 403: ela precisa de uma chave de API e nenhum app de desenvolvedor, enrollment nem OAuth, então a configuração por trás da maioria dos 403 de leitura não existe. Ela devolve 100 posts por requisição em lote a partir de US$ 0,014 por 1.000, a 20 requisições por segundo em todos os planos, com 100 requisições grátis para começar.
A Sorsa API devolve erros 403?
Devolve, em dois casos. A Sorsa API devolve 403 quando o header ApiKey está ausente, com a mensagem "missing key in request header", e quando as requisições da chave acabaram; uma chave errada recebe 401. Um upgrade ou requisições extras restauram o acesso na hora, e requisições com falha nunca são cobradas.
#Como verificamos
Em 2 de novembro de 2026 lemos a referência de códigos de resposta, a página de preços, a referência de create-post e o changelog do X em docs.x.com, além das respostas da equipe do X nas threads do fórum de desenvolvedores linkadas acima, para cada texto de erro citado aqui. As requisições da Sorsa API seguem a referência dela no ar; a resposta mostrada é um exemplo no formato dela com dados inventados.
Fontes
- X API: Response codes and errors (abre em uma nova aba)
- X API: Pay-per-usage pricing (abre em uma nova aba)
- X API: Changelog (abre em uma nova aba)
- X API: Create post reference (abre em uma nova aba)
- X API: Manage posts (abre em uma nova aba)
- X Developer Community: pricing update effective April 20, 2026 (abre em uma nova aba)
- X Developer Community: Free tier stuck as a standalone app (abre em uma nova aba)
- X Developer Community: POST /2/tweets 403 on pay-per-use (abre em uma nova aba)
- X Developer Community: "Your account is not permitted to access this feature" (abre em uma nova aba)
- X Developer Community: 403 when replying via the API (abre em uma nova aba)
- Sorsa API reference