Como obter um tweet em JSON sem chave de API do X

Como obter um tweet em JSON sem chave de API do X
Unif Cookbooks team
Unif Cookbooks team

Atualizado

Cinco formas testadas de ler um post público do X em JSON sem conta de desenvolvedor: FxTwitter, vxTwitter, syndication, oEmbed e UnifAPI.

Em resumo: você não precisa de conta de desenvolvedor do X para ler um post público em JSON. No dia 7 de outubro de 2026, buscamos o mesmo post da NASA com curl em cinco lugares que respondem sem chave. O FxTwitter e o vxTwitter devolvem um objeto JSON limpo para um post ou um usuário individual. O endpoint de syndication do próprio X também devolve o post em JSON, sem documentação e sujeito a mudar. O endpoint oEmbed do X devolve um trecho de HTML embrulhado em JSON, não dados. O /tools/x/post da UnifAPI, grátis, sem fazer login e com limite por visitante, devolve o post com autor, mídia, post citado e todas as métricas, com os mesmos nomes de campo dos seus endpoints de busca, respostas e timeline. Se você só precisa de um post e nada mais, o FxTwitter basta. Se o post é o primeiro passo de um fluxo de trabalho que depois busca, lê respostas ou percorre uma timeline, use um endpoint cujo envelope continue o mesmo em todas essas etapas.

A pergunta "como pegar um tweet em JSON" (ou, em inglês, "get tweet json without api key") tem uma resposta diferente da que tinha em 2022. A API oficial continua funcionando, mas o nível gratuito é uma cota de tokens que um agente consome em uma tarde, e o nível pago começa em uma mensalidade que a maioria dos projetos paralelos não vai justificar por um punhado de leituras. Enquanto isso, um conjunto de endpoints públicos cresceu em torno do caso de uso de embed e prévia de link, e eles respondem a requisições HTTP simples sem credencial nenhuma.

Este post é o teste que fizemos antes de decidir o que construir. Toda requisição abaixo é reproduzível; copie o comando e rode.

O teste

Um post público, https://x.com/NASA/status/2107237881668313108, buscado com curl e User-Agent padrão, sem cookies, sem chave. Registramos o código de status, o content type e se o corpo continha o texto do post e a contagem de curtidas como campos estruturados.

EndpointStatusCorpoTexto + métricas como camposURLs de mídiaPost citadoTambém faz
api.fxtwitter.com/NASA/status/<id>200JSON, 3,3 KBSimSimSimUm usuário
api.vxtwitter.com/NASA/status/<id>200JSON, 1,6 KBSimSimSim (URL)Nada mais
cdn.syndication.twimg.com/tweet-result?id=<id>&token=x200JSON, 3,2 KBSó curtidas e contagem de respostasSimSimNada mais
publish.twitter.com/oembed?url=…200JSON embrulhando HTMLNão (blockquote em HTML)NãoNãoNada mais
unifapi.com/tools/x/post?id=<id>200JSON, mesmo modelo de busca, respostas, perfilSimSimSimBusca, respostas, mídia, seguidores, tendências, comunidades

Nada nessa tabela exige chave. Três dos cinco entregam um registro utilizável do post. As diferenças estão no que mais eles conseguem fazer, em quão estáveis são e em se você consegue continuar usando os mesmos nomes de campo quando a tarefa cresce.

Os dois projetos existem para fazer links do X se expandirem no Discord e no Telegram. A API deles é um efeito colateral disso, e é um bom efeito colateral.

curl -s "https://api.fxtwitter.com/NASA/status/2107237881668313108" | jq '.tweet | {text, likes, retweets, views, created_at}'

Devolve o texto, as contagens de curtidas, reposts, respostas e visualizações, o objeto do autor, a mídia com tamanhos e variantes MP4, o post citado e um timestamp created_at. O vxTwitter devolve um objeto mais plano com os mesmos itens essenciais e um array mediaURLs.

O que eles não fazem: busca, respostas abaixo de um post, a timeline de um usuário, seguidores. O endpoint de usuário (api.fxtwitter.com/NASA) devolve as contagens e a bio, mas nenhum post. Eles também rodam em infraestrutura voluntária, sem limite de requisições publicado, então um fluxo de trabalho que se espalha por centenas de posts é um convidado, não um cliente.

O endpoint de syndication do X: oficial, sem documentação, frágil

O X serve timelines incorporadas a partir de cdn.syndication.twimg.com. A variante de post único responde em JSON:

curl -s "https://cdn.syndication.twimg.com/tweet-result?id=2107237881668313108&token=x" | jq '{text, favorite_count, created_at, user: .user.screen_name}'

São os dados que o próprio widget de embed do X renderiza, então são precisos, mas carregam só o que o widget mostra: favorite_count e conversation_count, sem reposts, sem visualizações. Também não tem documentação, o parâmetro token já mudou de significado mais de uma vez, e alguns posts voltam como um stub com um tombstone no lugar do texto. Use como contraprova, não como dependência.

oEmbed: não são dados

publish.twitter.com/oembed é o endpoint que os CMSs usam para incorporar um post. Ele devolve JSON, mas o payload é um blockquote em HTML com o texto dentro e uma tag de script. Não há métricas nem URLs de mídia. Se você quer o texto, vai acabar extraindo HTML de dentro de JSON, que é o pior dos dois mundos.

O endpoint gratuito de post da UnifAPI

curl -s "https://unifapi.com/tools/x/post?id=2107237881668313108"
{
  "post": {
    "id": "2107237881668313108",
    "text": "Time to bring them home 🌎\n\nAfter nearly eight months aboard the @Space_Station, the four members of Crew-12 will soon head back to Earth…",
    "createdAt": "2026-10-05T22:33:56.000Z",
    "language": "en",
    "url": "https://x.com/NASA/status/2107237881668313108",
    "author": {
      "id": "11348282",
      "handle": "NASA",
      "name": "NASA",
      "verified": true,
      "followers": 92373840
    },
    "metrics": {
      "likes": 7210,
      "reposts": 846,
      "replies": 262,
      "quotes": 60,
      "bookmarks": 197,
      "views": 2823329
    },
    "media": [
      {
        "kind": "photo",
        "url": "https://pbs.twimg.com/media/HT5pcNwXwAAKdoM.jpg",
        "width": 2048,
        "height": 1365
      }
    ],
    "quoted": null
  }
}

O parâmetro id também aceita a URL completa do status em x.com ou twitter.com, então um agente pode repassar o que quer que o usuário tenha colado. Adicione format=md ou envie Accept: text/markdown para receber o mesmo post em Markdown, que é mais barato de colocar no contexto de um modelo do que JSON.

Três propriedades importam para agentes:

  • O envelope é compartilhado. post, author, metrics e media têm o mesmo formato em /tools/x/search, /tools/x/replies, /tools/x/profile e /tools/x/media. Um prompt que lê .metrics.likes em um deles funciona em todos.
  • O limite vem impresso. Toda resposta traz X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset. O limite gratuito é de 20 consultas a cada 10 minutos por visitante, e uma busca conta como duas; um 429 inclui Retry-After e a URL onde o limite é levantado (a API do X / Twitter medida, pay as you go, sem assinatura).
  • Os erros são tipados. Um id ausente ou malformado é { "error": { "type": "validation_error", … } }; um post apagado é not_found. Um agente pode ramificar em error.type sem precisar interpretar uma mensagem.

A tabela completa de parâmetros e uma amostra capturada de cada endpoint estão na página em Markdown de cada ferramenta, por exemplo /tools/x-post-viewer/index.md, e em /llms.txt.

Qual usar

  • Um post, em um bot que expande links: FxTwitter. É para isso que ele foi feito.
  • Uma contraprova de que o texto de um post é o que o X serve: o endpoint de syndication.
  • Um post que é o passo um de algo maior (ler o post, depois as respostas, depois buscar reações, depois ver quem respondeu): os endpoints gratuitos da UnifAPI, porque os passos seguintes existem e compartilham o formato.
  • Volume, histórico além da janela recente ou garantias: a API medida com uma chave de workspace. Os nomes de campo batem com os dos endpoints gratuitos, então o prompt não muda.

FAQ

Preciso de conta de desenvolvedor do Twitter para ler um tweet público?

Não. Os cinco endpoints deste post respondem sem uma. A API oficial é o que você precisa para escrever, para dados privados e para vazão garantida.

Raspar o x.com diretamente é uma opção?

Não com curl. x.com/NASA/status/<id> devolve uma casca em HTML de 147 KB; o post é renderizado por JavaScript depois que a página carrega. Você precisaria de um navegador headless, que é mais lento, custa mais e quebra quando a marcação muda.

O endpoint da UnifAPI consegue ler o post de uma conta protegida?

Não. Posts protegidos e apagados devolvem not_found. Os endpoints leem apenas dados públicos e nunca contornam as configurações de privacidade do X.

Qual é o limite gratuito?

20 consultas a cada 10 minutos por visitante, somando todos os endpoints /tools/x/* (uma busca conta como duas), informado nos headers da resposta. Usar os endpoints é grátis, sem fazer login e sem precisar de conta; levantar o limite é pay as you go com uma chave de workspace da UnifAPI; não existe um nível de chave gratuita para solicitar.