Skip to content
tt

The raw page blob

Print a page's whole universal-data JSON, the source the SSR commands read from.

The reliable commands (video, user, hashtag, sound) all read one thing: the __UNIVERSAL_DATA_FOR_REHYDRATION__ JSON blob a TikTok page ships inside its HTML. raw prints that whole blob as pretty JSON, before tt picks it apart into a record:

tt raw https://www.tiktok.com/@tiktok/video/7106594312292453675

Because it reads the page directly with no signing, raw answers from anywhere, the same as video. It takes a url, not a bare id, since it fetches an actual page.

Why reach for it

raw is the escape hatch for the fields the typed records leave out. A record is a flat, stable subset; the blob has everything the page loaded. Pull a value the record does not carry with jq:

tt raw https://www.tiktok.com/@tiktok | jq '.__DEFAULT_SCOPE__ | keys'

From there you can drill into whatever node you need:

tt raw https://www.tiktok.com/@tiktok/video/7106594312292453675 \
  | jq '.__DEFAULT_SCOPE__["webapp.video-detail"].itemInfo.itemStruct.statsV2'

Telling a real page from a challenge

When an IP is gated, TikTok returns a short firewall challenge page instead of the data. raw prints whatever the page shipped, so a tiny blob with no detail node is the sign you have been served the challenge rather than the content. The typed commands detect this and exit 4 or 3; raw hands you the bytes so you can see it yourself. See troubleshooting for the full surface map.