ScrapeField
Since X began billing every read, getting posts out of it is a question of price as much as of method. There are three ways, and for reading public posts at any volume they differ by an order of magnitude.
1. X’s own API
Official, and the only way to post, reply or act as an account. Reading is billed per item: $0.005 a post and $0.010 an account, so 1,000 posts cost $5.00, up to 3 million post reads a month before an Enterprise plan. A post read again the same UTC day is free. Our comparison with the X API has its pricing page’s figures, the day they were read, and a calculator for your month.
2. A scraper that signs in
X shows little to visitors who are not signed in, so most scrapers you run yourself sign in to an account and read as it. That works until X notices the pace and limits or suspends the account, and every change to the site breaks the parser. It costs accounts, servers and upkeep, and the account at risk is whoever’s it is.
3. An API that does neither
One call with a username or a search, and the answer is posts as JSON, with the field names X’s API v2 uses. An account’s posts come about 20 a call for 13 credits, so 1,000 cost about $0.51 on our smallest pack and $0.29 on the largest. A search is 13 credits a call, with X’s own operators:
curl -H "Authorization: Bearer $SCRAPEFIELD_KEY" \
"https://api.scrapefield.com/v1/x/search?query=from%3AFerrari%20since%3A2026-09-01"Every result for a search, following the cursor, in TypeScript:
const base = 'https://api.scrapefield.com/v1/x/search';
const headers = { Authorization: `Bearer ${process.env.SCRAPEFIELD_KEY}` };
const posts = [];
let cursor: string | null = null;
do {
const q = new URLSearchParams({ query: 'from:Ferrari since:2026-09-01' });
if (cursor) q.set('cursor', cursor);
const res = await fetch(`${base}?${q}`, { headers });
const body = await res.json();
if (!res.ok) throw new Error(body.error.message);
posts.push(...body.data);
cursor = body.meta.next_cursor;
} while (cursor);And in Python:
import os, requests
base = "https://api.scrapefield.com/v1/x/search"
headers = {"Authorization": f"Bearer {os.environ['SCRAPEFIELD_KEY']}"}
posts, cursor = [], None
while True:
params = {"query": "from:Ferrari since:2026-09-01"}
if cursor:
params["cursor"] = cursor
body = requests.get(base, params=params, headers=headers).json()
if "error" in body:
raise RuntimeError(body["error"]["message"])
posts += body["data"]
cursor = body["meta"]["next_cursor"]
if cursor is None:
breakEach post has id, text, created_at, the author inside it, and public_metrics with likes, reposts, replies, quotes, bookmarks and views. Every X endpoint, with a playground that runs with no key, is on the X API page.
Which one
Posting, replying or acting as an account: X’s API. Reading a few posts by hand: the site itself. Reading accounts, searches and followers at any volume: an API, at cents per 1,000 rather than dollars. From here: every post from an account, and when a post was made, from its id.