# Changelog of X (Twitter) Tweet Details Scraper — URL to Full Record (`foxlabs/x-tweet-details-scraper`) Actor

- **URL**: https://apify.com/foxlabs/x-tweet-details-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/foxlabs/x-tweet-details-scraper.md

## Changelog

### 0.1 — 2026-10-19 — first release

- Reads X's own embed (syndication) backend: no login, no API key, no browser. Lines can be tweet addresses (`x.com/...`, `twitter.com/...`, with a `/photo/1` suffix or a query string) or bare numeric ids; duplicate lines are read once and charged once.
- One row per tweet: text, exact time, language, likes, replies, **reposts and quotes**, the engagement total, engagement per 1,000 followers of the author, engagement per hour, age in hours, media (type, direct URL, size), hashtags, mentions, expanded links, the conversation id, the sensitive flag, the edit flags and the edit count, the quoted tweet and the tweet it replies to.
- **Author enrichment** (`enrichAuthor`, on by default) — the reason this Actor exists. X states only the like count and the reply count on a single tweet, and only eight fields about its author (measured 2026-10-19). Each author's newest page is read **once per run**, which adds the repost and quote counts for every tweet on that page and the author's full record (followers, following, posts, bio, location, website, verification and its type, join date) to every row. Those reads are not charged to you.
- **`countsFrom` / `countsComplete` on every row.** `author-page` means all four counts are X's own; `tweet-endpoint` means the tweet was not on its author's newest page, so likes and replies are X's and the repost and quote counts are `null` — never 0.
- **Reads tweets of any age.** The tweet endpoint answered id `20` (21 March 2006) with 200: history the account timeline cannot reach.
- Optional `includeAuthorRows`: one extra row per author whose page was read, with the same fields as the X Profile Scraper's rows.
- Filters applied before a row is charged: posted within N days, minimum engagement, and a cap for the whole run.
- Free status rows for every line that cannot be delivered: not a tweet address or id, a tweet X has no public record of (deleted, protected or suspended — X answers 404), an id X does not recognise at all (X answers 400), or a tweet the run could not read. Nothing is charged for them.
- Work goes in chunks of 200 lines with the author cache carried across them, so a run of thousands of lines keeps its memory flat and never reads an author twice.
- States the source's limits in the run message and in `SOURCE_REPORT`: no view counts, no reply texts (X's conversation endpoint answers 404), and no repost or quote count for a tweet older than its author's newest page.
- Measured on the platform 2026-10-19 while verifying the family's profile Actor: the host that serves the author pages refuses bursts (ten pages read eight at a time met fifteen HTTP 429s; three at a time, none). The tweet reads keep the speed you set — the tweet endpoint answered 25 reads in 12 seconds with no refusal — while the author pages are now read at most three at a time.
- Found on the platform right after that: when the author host refuses a burst, *every* author page of the run can come back refused, and the rows fall back to likes and replies only — the shallow row this Actor exists to avoid. An author page X rate-limits is now read again at the end of the chunk, one at a time, and the run message says how many had to be recovered that way.
