Safe example
What one history entry looks like
A typical file starts with an array and contains one object per recorded activity. This example uses placeholder titles and URLs; it does not contain real viewing data.
You do not need to paste or upload your history to inspect its structure. A local text editor can open JSON, and Playback Stats reads the selected file only inside your browser tab.
[
{
"header": "YouTube",
"title": "Watched Example video title",
"titleUrl": "https://www.youtube.com/watch?v=example",
"subtitles": [
{
"name": "Example channel",
"url": "https://www.youtube.com/channel/example"
}
],
"time": "2026-07-24T12:34:56.000Z",
"products": ["YouTube"],
"activityControls": ["YouTube watch history"]
}
]Field reference
How Playback Stats reads each field
Google may omit fields when a video, channel, or activity detail is unavailable. Playback Stats keeps usable records and limits each calculation to the data actually present.
| Field | Shape | What it contains | How it is used |
|---|---|---|---|
| title | string | The activity label shown in the export, usually including the video title. | Used as the video label. If it is missing but titleUrl exists, the event is kept with an “Unknown Video” label. |
| titleUrl | string | The YouTube URL associated with the activity, when Google can provide one. | Used to group repeat views of the same video. Missing URLs make reliable URL-based grouping impossible. |
| subtitles | array | Optional source information. A YouTube record commonly stores the channel in the first item. | The first subtitles[].name value is used for channel rankings. Records without it remain usable but have no channel attribution. |
| time | ISO 8601 string | The timestamp attached to the activity event. | Used for daily, monthly, weekday, hourly, and streak calculations when it is a valid date. |
| header | string | The Google product heading for the activity entry. | Not needed for Playback Stats calculations. |
| products / activityControls | arrays | Google product and activity-setting metadata included with some records. | Not needed for Playback Stats calculations. |
Common variations
Why some records have fewer details
A video or channel is unavailable
Deleted, private, or otherwise unavailable videos may have a generic title and no usable URL or channel. The event can still exist in the export.
Channel metadata is missing
The subtitles array is optional. Playback Stats can still count the event, but it cannot include that record in channel rankings without subtitles[].name.
The timestamp is missing or invalid
A record without a valid time value cannot contribute to timelines, hourly patterns, date ranges, or streak calculations.
Important limitation
An activity event is not a watch-duration record
YouTube watch-history.json does not include reliable minutes watched, completion percentage, or resume position for each event. It can support viewing counts and patterns, but not an accurate lifetime watch-time total.
What the file can support
- Video and channel frequency when identifying fields are available
- Daily, monthly, weekday, and hourly activity from valid timestamps
- First and latest recorded events, busiest days, and active-day streaks
- Patterns within the exported records—not activity removed or never saved by Google
Ready to analyze your export?
Select the original watch-history.json file on Playback Stats. Parsing and analysis happen locally, with no YouTube login, API key, or file upload to a server.
Learn how channel and repeat-video rankings workBrowser only
No upload endpoint
Original JSON
No conversion needed
Open source
Inspect the parser