Pular para o conteúdo

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:

Anatomy of an official X API 403 response: status line, x-transaction-id header, detail, reason and type HTTP/1.1 403 Forbidden x-transaction-id: 7f3a91c2e05b44d1 { "title": "Client Forbidden", "detail": "When authenticating requests to the X API v2 endpoints, you must use keys and tokens from a developer App that is attached to a Project. You can create a ..." "reason": "client-not-enrolled", "required_enrollment": "...", "type": ".../problems/client-forbidden" } 1 Status 403 Entendido e recusado. 2 x-transaction-id O ID que o suporte do X pede quando você reporta um 403. 3 detail Palavras do X. Pode citar Project quando a solução real é mover o app para pague por uso. 4 reason e type A causa em uma forma que seu código consegue casar. Registre-os.
O status diz "recusado"; o reason, o type e o detail dizem por quê. Registre todos, mais o x-transaction-id.

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 403Onde apareceCausaPrimeira solução
"reason": "client-not-enrolled", title "Client Forbidden"Qualquer chamada v2App no pacote Free aposentado, avulso ou fora de um ProjectMova 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, DMsBearer token só de appUse um token de contexto de usuário
Um "detail": "Forbidden" sozinhoGET /2/users/meToken sem tweet.read e users.readAdicione os dois escopos, autorize de novo
Qualquer 403 em uma curtida, um follow ou quote_tweet_id/2/users/{id}/likes, /following, quote postsRemovidos do self-serve em 20 de abril de 2026Só com contrato Enterprise
"Reply to this conversation is not allowed because you have not been mentioned..."RespostasRegra de resposta invocada desde 23 de fevereiro de 2026Responda só quando for mencionado ou citado
Um 403 em um post com dois ou mais $cashtagsPOST /2/tweetsLimite self-serve de 1 cashtag por postMantenha um cashtag
"This user is not allowed to post a video longer than N minutes."Posts com vídeoO limite de vídeo da conta que postaCorte o vídeo
"You are not permitted to perform this action."POST /2/tweetsO X recusou este post: uma regra acima, limites de postagem ou uma checagem de spamConfira o conteúdo, diminua o ritmo
"Your account is not permitted to access this feature."POST /2/tweetsRestrição de escrita na conta que postaPare as tentativas, confira a conta no x.com
Type not-authorized-for-resourceLer um post ou usuárioConteúdo protegido ou privadoNenhuma: só seguidores aprovados podem ler
Um type dm-, ou "This operation is not permitted."Mensagens diretasAs configurações do destinatário ou uma checagem de segurançaLeia 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.1A v1.1 está fora do seu acessoChame 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.read e users.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.

Corpo do 403
{
  "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.

  1. Abra o Developer Console. Entre em console.x.com e ache o app cujas chaves o seu código usa.

  2. 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.

  3. 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.

  4. 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.

  5. 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:

Six official X API changes from August 2025 to October 2026 that created new 403 errors 22 ago 2025 Curtidas e follows saem do plano Free 23 fev 2026 Respostas só quando o autor te chamou 1 set 2026 Duração do vídeo limitada pela conta que posta 6 fev 2026 Pague por uso abre; o Free fecha para apps novos 20 abr 2026 Follows, curtidas e quotes saem de todo plano self-service 26 out 2026 Recusas de DM têm tipos próprios
Seis mudanças em 14 meses criaram a maioria dos 403 que os desenvolvedores encontram hoje. O dia 20 de abril de 2026 removeu três ações de uma vez.

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-enrolled quando o app não está no pagamento por uso; not-authorized-for-resource em 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_id exige 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
    POST e DELETE /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
    POST e DELETE /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-verified e outros dm- 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.Client em vez de tweepy.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:

Corpo do 403
{
  "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/me com um "Forbidden" simples. O token de usuário não tem tweet.read e users.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 de errors de 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.API como update_status usam a v1.1; chamadas de tweepy.Client usam 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.

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 detail do X pode enganar. O texto do client-not-enrolled pede 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 no reason e no type, 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 leiturasSorsa APIAPI oficial do X
ConfiguraçãoUma chave de APIApp de desenvolvedor, pacote de pagamento por uso, tokens OAuth
Preço por 1.000 postsa partir de US$ 0,014US$ 5,00
Velocidade20 requisições por segundo em todos os planosJanelas de 15 minutos por endpoint
Teto mensalSeu plano, até 10 milhões de requisições, mais requisições extras3 milhões de leituras de posts, depois Enterprise
Sua conta do XNunca envolvidaTokens 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
  1. Pegue uma chave. Cadastre-se e copie a chave no painel; 100 requisições grátis vêm com ela, sem cartão.

  2. 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
          }
        }
      ]
    }
    
  3. 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 o next_cursor até 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")
    
  4. 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:

Posts lidos

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.

Pela equipe da Sorsa API. Construímos e operamos a Sorsa API, a API e scraper somente leitura do Twitter (X), em produção desde 2022 (antiga TweetScout API), com mais de 6 bilhões de requisições atendidas. Sobre a Sorsa API

O que mudou
  • Primeira publicação.