EN PT ID

X v11.90 Articles Scraper: threadgrab Long-Form 2026

11 de Junho, 2026 · 8 min de leitura · por ThreadGrab

Se você extrai Artigos do X com um script que funcionava em março de 2026, esse script provavelmente parou de funcionar no final de maio. A versão v11.90 do aplicativo móvel do X moveu a entrada Ver Todos os Artigos de uma aba oculta na página de perfil para um controle segmentado no topo, e nos bastidores trocou o endpoint REST público por uma nova rota GraphQL. Scrapers que hard-codaram a URL antiga agora recebem 200 com corpo vazio, o formato do id do artigo mudou de numérico de 18 dígitos para base64 de 19 dígitos, e o corpo do artigo agora é um JSON com spans de entidades nomeadas em vez de texto simples. Este post explica o que mudou, por que seu scraper antigo quebrou e como usar a API do threadgrab para buscar o novo layout v11.90 como Markdown limpo em uma única chamada.

O threadgrab foi atualizado para lidar com as mudanças do v11.90 nativamente. Abaixo está a nova referência de campos, dois exemplos de código prontos para usar e uma comparação lado a lado com as duas outras abordagens que desenvolvedores tentaram (GraphQL puro do X e o projeto tweet.md). Se você mantém uma ferramenta pública de arquivamento do X ou constrói dados de treinamento para LLMs a partir de criadores de conteúdo longo, este é o caminho mais curto para uma saída funcional em 2026.

Resumo. O X v11.90 descontinuou /Articles/search.json, trocou o id do artigo para base64 de 19 dígitos e transformou o corpo do artigo em uma lista JSON de entidades nomeadas. A API do threadgrab resolve todas as três mudanças: passe uma URL de artigo público e ela retorna um corpo Markdown limpo com **negrito**, [links], @menções e #hashtags preservados. Captura de artigo único: um GET, sem autenticação, ~1,2s. Extração em lote de perfil: pagine com ?cursor= a 20 artigos por página.

O que o X v11.90 Mudou no Layout de Artigos

Três coisas mudaram, e elas são independentes — um scraper pode sobreviver a uma ou duas delas, mas não às três ao mesmo tempo.

1. A entrada Ver Todos os Artigos foi movida

Antes do v11.90, o link "Ver Todos os Artigos" era uma aba na página de perfil do criador, três linhas abaixo de Posts, Respostas, Mídia e Curtidas. No v11.90, tornou-se o primeiro item em um novo controle segmentado no topo do cabeçalho do perfil, ao lado de Posts / Respostas / Mídia. A mudança visível é pequena, mas a requisição subjacente mudou: a aba antiga chamava /Articles/search.json?include_replies=false, a nova entrada chama /i/api/graphql/<hash>/ArticleTimeline. Qualquer coisa hard-codada para o caminho antigo agora recebe 200 com um array vazio.

2. O formato do id do artigo mudou

O id de artigo legado era uma string numérica de 18 dígitos (por exemplo 1823456789012345678). O novo id é uma string base64 de 19 caracteres com maiúsculas, minúsculas e dígitos (por exemplo a1B2c3D4e5F6g7H8i9J0). O novo id também é opaco — ele não codifica o timestamp de publicação como o antigo fazia, então um scraper não pode inferir a data de publicação apenas pelo id. URLs que funcionavam em março agora retornam 404 porque o fragmento do id é rejeitado pela camada de roteamento.

3. O corpo do artigo agora é uma lista JSON de entidades nomeadas

O corpo antigo era texto simples com asteriscos para negrito (**texto**) e padrões de URL com colchetes angulares para links. O novo corpo é um array JSON de spans de entidades, onde cada span tem um campo type (text, bold, link, mention, hashtag, media_ref) e um payload. Scrapers ingênuos perdem a formatação porque concatenam os spans text sem percorrer os spans bold, link e mention. Uma frase em negrito como **Liberdade de Alcance chega como três spans separados: um span text contendo a string vazia, um span bold contendo Liberdade de Alcance e um span text final. Se você os remontar errado, o negrito desaparece.

Como o threadgrab Lida com o Novo Layout

A API de perfil do threadgrab encapsula todas as três mudanças. Você passa uma URL de artigo público ou um nome de usuário, e o threadgrab retorna um corpo Markdown simples mais metadados. A lógica de conversão percorre os spans de entidades nomeadas na ordem do documento e produz Markdown padrão: text vira texto simples, bold vira **texto**, link vira [texto](url), mention vira @usuario, hashtag vira #tag e media_ref vira ![alt](image_url) com o texto alternativo extraído do campo alt_text do span quando presente.

O resultado é uma string Markdown que funciona perfeitamente em qualquer renderizador (md2rich, GitHub, Obsidian, visualização VS Code, md2pdf). O threadgrab não inventa formatação que o autor original não escreveu — se o autor não usou negrito em uma frase, a saída não usa negrito nela.

Captura de artigo único (curl)

curl -s "https://threadgrab.com/api/profile?url=https://x.com/jack/status/a1B2c3D4e5F6g7H8i9J0" \
  | jq '.article | {title, author, published_at, body_markdown}'

A resposta é um objeto JSON com cinco campos principais: title (string), author (objeto com username, display_name, verified), published_at (string ISO 8601), body_markdown (o Markdown formatado) e media (array de objetos {type, url, alt_text} para imagens, vídeos e enquetes). Tempo médio de resposta em uma borda Cloudflare do leste dos EUA: 1,1 a 1,4 segundos para um artigo de 2.000 palavras, 0,6 a 0,9 segundos para um artigo de 500 palavras.

Extração em lote de perfil (curl com paginação por cursor)

USERNAME="naval"
CURSOR=""
LIMIT=20

while true; do
  RESP=$(curl -s "https://threadgrab.com/api/profile/${USERNAME}/articles?cursor=${CURSOR}&limit=${LIMIT}")
  echo "$RESP" | jq '.articles[] | {title, published_at, id: .article_id}'
  CURSOR=$(echo "$RESP" | jq -r '.next_cursor')
  [ -z "$CURSOR" ] || [ "$CURSOR" = "null" ] && break
  sleep 1
done

Este loop percorre o feed completo de Artigos do criador página por página. Cada chamada retorna 20 artigos mais uma string next_cursor; quando next_cursor está vazio ou null, você chegou ao final do feed público. A pausa de um segundo entre chamadas mantém a taxa de requisições no limite suave de 1 req/s/IP. Um criador com 200 artigos leva cerca de 11 segundos do início ao fim, incluindo a sobrecarga das pausas.

Referência de Campos: Formato da Resposta do threadgrab v11.90

O objeto JSON completo retornado pelo endpoint de artigo único tem a estrutura abaixo. Os campos estão estáveis a partir do threadgrab v1.18 (junho de 2026).

Campo Tipo Descrição
article_id string Novo id base64 de 19 caracteres (formato v11.90). Use para cache ou para buscar novamente depois.
title string Título do artigo definido pelo autor. Pode estar vazio para artigos muito curtos.
author.username string O handle do autor no X sem o @ inicial.
author.display_name string O nome de exibição do autor, pode incluir emoji e espaçamento incomum.
author.verified boolean True se o autor tinha algum selo de verificação do X no momento da captura.
published_at string (ISO 8601) Timestamp UTC da publicação original. Não é o timestamp de edição.
body_markdown string O corpo completo do artigo como Markdown, com negrito, links, menções e hashtags preservados.
media[] array Lista de objetos de mídia, cada um com type (image / video / poll), url e alt_text.
engagement object Instantâneo de likes, reposts, replies, quotes e views no momento da captura. Os números podem ter atraso de 24h.
canonical_url string A URL pública x.com/<user>/article/<id> do artigo.

O campo body_markdown é o que a maioria dos usuários precisa. É uma string única com quebras de linha preservadas da fonte, e a sintaxe de negrito / link / menção / hashtag / imagem é renderizada como Markdown padrão que qualquer renderizador interpretará corretamente. Se você precisar apenas de texto simples, passe o resultado por sed ou sua ferramenta Markdown-para-texto favorita para remover a sintaxe — o conteúdo textual original é recuperável em uma passada.

Comparação: threadgrab vs GraphQL Puro vs tweet.md

Três abordagens estão em uso hoje para extrair Artigos do X após a mudança do v11.90. Veja como elas se comparam nas três coisas que quebraram.

1. API threadgrab (recomendada)

Prós: lida com o novo formato de id do artigo, percorre o corpo de entidades nomeadas, retorna Markdown limpo com formatação preservada, sem autenticação necessária, sem token para gerenciar, limitado a 1 req/s/IP seguro.

Contras: apenas Artigos públicos (sem contas protegidas), sem revisões históricas (apenas a versão mais recente do Artigo é retornada), sem histórico de edição.

2. GraphQL Puro do X /ArticleTimeline

Prós: sem intermediário, você controla os cabeçalhos e o formato da requisição, pode extrair dados brutos para casos de uso incomuns (analytics de engajamento, gráficos de quote-posts).

Contras: requer manter um cookie de sessão ou token bearer do app, o hash da consulta GraphQL rotaciona a cada poucas semanas, o corpo de entidades nomeadas precisa de código personalizado para percorrer, e uma única requisição ruim pode colocar seu IP em limite de taxa por 15 minutos.

3. tweet.md (proxy local open-source)

Prós: open source, roda localmente, sem servidor terceiro, você pode fazer fork para saída Markdown personalizada.

Contras: tweet.md é otimizado para posts curtos em formato de thread, não para o corpo longo do Artigo v11.90; não preserva a formatação de entidades nomeadas; requer um cookie de sessão X funcional na primeira execução.

Para um caso de uso como "quero ler este Artigo offline como Markdown" ou "quero construir um corpus de posts longos para treinamento de LLM", o threadgrab é o caminho mais curto. Para um caso de uso como "estou construindo um produto de analytics em tempo real do X e preciso de dados de engajamento brutos", a rota GraphQL é inevitável. O tweet.md é uma boa opção para posts curtos e threads, menos para o novo corpo do Artigo.

Limitações e o que o threadgrab Não Faz

Ser honesto sobre os limites da ferramenta importa mais do que superestimá-la. A lista abaixo é o que o threadgrab v1.18 não faz, a partir de junho de 2026.

FAQ

O que mudou na entrada "Ver Todos os Artigos" do X v11.90?

O X v11.90 moveu a entrada "Ver Todos os Artigos" de uma aba oculta na página de perfil para um controle segmentado no topo do cabeçalho do perfil do criador. A nova entrada exibe todo post longo (Artigos, Threads com mais de 1.000 caracteres e Quote-Articles) como uma lista unificada, paginada de 20 em 20. Nos bastidores, a entrada agora chama um novo endpoint GraphQL (/ArticleTimeline) em vez da rota REST legada /Articles/search.json, então scrapers que acessam o endpoint antigo recebem um 404 ou um array vazio.

Por que meu scraper antigo de Artigos do X quebrou após o v11.90?

Três razões. Primeiro, o endpoint /Articles/search.json foi descontinuado no final de maio de 2026 e agora retorna 200 com corpo vazio para a maioria das contas. Segundo, o X adicionou um novo campo article_id no v11.90 que é uma string base64 de 19 dígitos, substituindo o id numérico antigo de 18 dígitos; scrapers que tentam construir URLs a partir do padrão antigo recebem 404. Terceiro, o corpo do artigo agora é servido como um JSON com spans de entidades nomeadas (negrito, link, menção, hashtag) em vez de texto simples com asteriscos, então scrapers ingênuos perdem a formatação.

Como extrair o novo layout de artigos do X v11.90 com threadgrab?

Passe a URL do artigo ou o novo article_id para a API do threadgrab. O threadgrab resolve o novo endpoint GraphQL /ArticleTimeline, busca o corpo JSON de entidades nomeadas, achata para Markdown (preservando negrito, links, menções e hashtags) e retorna o texto limpo mais metadados. Uma requisição típica é GET https://threadgrab.com/api/profile?url=https://x.com/<user>/article/<id> sem autenticação, e a resposta é um objeto JSON com title, body_markdown, author, published_at e array media.

Posso extrair em lote todos os artigos do perfil de um criador?

Sim. Use o endpoint de lote do perfil do threadgrab: GET https://threadgrab.com/api/profile/<username>/articles?cursor=<next_cursor>&limit=20. A resposta inclui um campo next_cursor que você passa para a próxima chamada até receber um cursor vazio. O endpoint é paginado 20 artigos por vez para espelhar a paginação do X e funciona com o novo layout v11.90. Para uma extração única de 100+ artigos, espere a chamada levar de 8 a 15 segundos dependendo dos anexos de mídia.

O threadgrab preserva a formatação em negrito, links e menções do novo corpo do artigo?

Sim. O novo corpo do artigo do X v11.90 é uma lista JSON de spans de entidades (cada span tem um campo type: text, bold, link, mention, hashtag ou media_ref). O threadgrab percorre a lista e produz Markdown padrão: spans bold viram **texto**, spans link viram [texto](url), spans mention viram @usuario, spans hashtag viram #tag e spans media_ref viram ![alt](image_url). A saída funciona perfeitamente em qualquer renderizador Markdown (md2rich, GitHub, Obsidian) sem perder a formatação original.

Extrair artigos do X v11.90 com threadgrab é legal e dentro dos limites de taxa?

O threadgrab busca apenas Artigos públicos, que são páginas web públicas que o X publica explicitamente para indexação e compartilhamento. A API threadgrab impõe um limite de 1 requisição por segundo por IP e um teto suave de 5.000 capturas de artigos por dia, bem abaixo dos limites anti-abuso do X. Extrair conteúdo público para leitura pessoal, pesquisa ou arquivamento é geralmente permitido nos Termos de Serviço do X; republicar ou comercializar o texto capturado sem o consentimento do autor não é.

Experimente em um Artigo Público

A maneira mais rápida de ver o novo layout v11.90 passar pelo threadgrab é pegar qualquer Artigo público no x.com, copiar a URL e executar o exemplo curl de artigo único acima. Você deve receber uma resposta JSON limpa em 1,5 segundos em uma borda dos EUA ou UE, com o corpo em Markdown que você pode colar no Obsidian, em um gist do GitHub ou no conversor md2rich para uma prévia lado a lado de como a formatação é renderizada.

Extraia um Artigo do X agora — sem login, sem instalação.

O threadgrab lida com o layout v11.90, o novo id do artigo e o corpo de entidades nomeadas. Cole qualquer URL pública x.com/<user>/article/<id>.

Abrir ThreadGrab

Leitura Relacionada