X post extraction API
X / Twitter Scraper - Extract Public Posts
Convert a public X or legacy Twitter status URL into clean Markdown or normalized post JSON through one cacheable GET request.
Live playground
Try X extraction.
Use an example or paste your own public URL. The playground calls the same cacheable GET API your agent will use.
Supported inputs
Built for normal public URLs.
- Public x.com status URLs
- Legacy twitter.com status URLs
- Author profile images when available
- Raw Markdown and normalized JSON
Clear boundaries
Know exactly what to expect.
- No private, deleted, login-only, or age-gated posts
- One public post is extracted per request
- Complete threads, replies, and account timelines are not included
One GET request
Add X data to your agent.
No SDK and no account are required during the public preview. Choose JSON for typed entities or Markdown for direct model context.
Read the quickstartcurl --get 'https://extractor.sh/api/extract' \
--data-urlencode 'url=https://x.com/jack/status/20' \
--data-urlencode 'format=json'const params = new URLSearchParams({
url: 'https://x.com/jack/status/20',
format: 'json',
});
const response = await fetch(
`https://extractor.sh/api/extract?${params}`,
);
const data = await response.json();from json import load
from urllib.parse import urlencode
from urllib.request import urlopen
params = urlencode({
"url": "https://x.com/jack/status/20",
"format": "json",
})
with urlopen(f"https://extractor.sh/api/extract?{params}") as response:
data = load(response)Common questions
X scraper FAQ
What X URLs can extractor.sh process?
Public posts. Use an ordinary public URL from the platform.
What does the X extraction API return?
One normalized post with author, text, media, and source URL. Choose raw Markdown or schema-versioned JSON for every request.
What are the limits of X extraction?
No private, deleted, login-only, or age-gated posts. One public post is extracted per request. Complete threads, replies, and account timelines are not included.
More sources