Free tool · no login · runs in your browser
Twitter Timestamp: find the exact time any tweet was posted
Every tweet ID since 4 November 2010 carries its own creation time, down to the millisecond. Paste post URLs or IDs below and the tool reads it out — in UTC and your time zone — without calling any API.
Reverse: date range → tweet ID bounds
Pick a UTC window to get the ID boundaries for X's since_id: and max_id: search operators.
Set both dates (after 4 Nov 2010, end after start) to see the bounds.
How a tweet ID encodes its timestamp
Since 4 November 2010, X (then Twitter) has generated post IDs with Snowflake, a 64-bit scheme in which the top bits are a timestamp. Reading from the most significant bit: one unused sign bit, 41 bits of milliseconds counted from Twitter's custom epoch, a 10-bit machine ID and a 12-bit per-machine sequence number — the layout drawn by the coloured strip above. The Twitter epoch is1288834974657ms (2010-11-04 01:42:54.657 UTC), as documented in Old Dominion University'sTweetedAt research write-up.
posted_ms = (tweet_id >> 22) + 1288834974657 machine = (tweet_id >> 12) & 0x3FF sequence = tweet_id & 0xFFF
Two IDs are worth knowing: 20, @jack's first post, is a pre-Snowflake ID; the last pre-Snowflake ID in TweetedAt's dataset is29700859247. Anything at or below it was numbered sequentially between March 2006 and November 2010 and holds no time information — the tool flags those instead of printing a wrong date. TweetedAt (source on GitHub) estimates such tweets from a lookup table, with a reported mean error of 45-59 minutes.
Fetch every tweet in a date window
Because IDs grow with time, an ID is also a date filter. X's search syntax acceptssince_id:(exclusive) andmax_id:(inclusive) — see the operator list maintained inigorbrigadir/twitter-advanced-search. The reverse calculator above turns a UTC window into those two bounds; drop them into a query on our Twitter advanced search API:
import requests
query = "from:XDevelopers since_id:2105447600747446271 max_id:2105809988617240575" # 2026-10-01 → 10-02 UTC
r = requests.get(
"https://api.twitterapi.io/twitter/tweet/advanced_search",
headers={"X-API-Key": "YOUR_API_KEY"},
params={"query": query, "queryType": "Latest"},
timeout=15,
)
for t in r.json().get("tweets", []):
print(t["id"], t["createdAt"], t["text"][:80])Cost for the same pull: TwitterAPI.io bills $0.15 per 1,000 tweets returned (pricing), X's pay-per-use API bills $0.005 per post read (docs.x.com pricing, which notes prices may change) — about 33× more for a 10,000-tweet window ($1.50 vs $50). If you only need dates by date range, the operators above also work in the X app's own search box.
The precision trap in JavaScript
Current tweet IDs are around 2 × 1018, far past JavaScript's Number.MAX_SAFE_INTEGER (253 − 1 ≈ 9 × 1015). Parse one with Number() or a default JSON.parse and the last digits silently round — you get a different, often non-existent, tweet. Keep IDs as strings and use BigInt for the shift; this page does exactly that. Responses from the tweet object in our API return id as a string for this reason.
Related
- Search tweets by date — the operator walkthrough.
- Export an account's full tweet history — when you need every post, not a window.
- Find deleted tweets — IDs and timestamps are often all that survives.