Is vidIQ Vision for YouTube safe?
vidIQ is medium risk. While signed in to vidIQ, browsing TikTok makes the extension record which videos you watched, how far, and rewatches, with the creator's handle, sound, and video URL, sent to vidIQ's analytics. Controlled by server-side experiment flags.
AI-generated. Findings may contain errors. Those marked Verified have been manually reviewed.
Publishers can request a review.
Findings
TikTok Watch Behavior Sent to vidIQ Analytics
While signed in to vidIQ, browsing TikTok makes the extension record which videos you watched, how far, and rewatches, with the creator's handle, sound, and video URL, sent to vidIQ's analytics.
Controlled by server-side experiment flags.
You watch a TikTok video while signed in to vidIQ.
This applies to the for-you page, following feed, search results, hashtag pages, and individual video pages.
The extension sends your watch state, the video URL, creator handle, and sound metadata to a vidIQ analytics endpoint.
Three distinct events are reported: when playback starts, when the video completes, and if you rewatch it.
| Content-Type | application/json |
{
"events": [
{
"event_type": "started watching tiktok video",
"user_properties": {
"Fetch Override TikTok resalt2": "variant"
},
"event_properties": {
"video name": "POV you're listening to✨",
"video url": "https://www.tiktok.com/@sofiacamara/video/7613882455048604949",
"video creator": "sofiacamara",
"sound name": "original sound",
"sound author": "sofiacamara",
"sound url": "https://www.tiktok.com/music/original-sound-7613882455048604949"
}
}
]
}| Field | Value | Why it matters | |
|---|---|---|---|
Your vidIQ user ID | 8421937 | Links every TikTok video you watch to your vidIQ account. | |
Video URL | https://www.tiktok.com/@sofiacamara/video/7613882455048604949 | The full URL of the TikTok video, including the creator's @handle and the numeric video ID. | |
Creator handle | sofiacamara | The TikTok username of the person who posted the video. | |
Watch state | completed_watching | Whether you started watching, watched to the end, or watched it a second time. | |
Timestamp | 1745547912384 | Millisecond-precision time when each watch event occurred. | |
Sound name and author | original sound — sofiacamara | The audio track used in the video and its creator's name. |
fetch hook injection gated by TIKTOK_FETCH_OVERRIDE server flag (tiktokDocumentStart.bundle.js)
// tiktokDocumentStart.bundle.js — document_start CS on www.tiktok.com/*
// Queries the remote experiment flag; injects the fetch-override script only
// when the server returns variant.key === 'variant'.
experimentClient.getExperimentValue(FeatureFlags.TIKTOK_FETCH_OVERRIDE)
.then((result) => {
if (result && result.variant.key === 'variant') {
// inject tiktokFetchHandler.bundle.js (WAR) into the page's MAIN world
const script = document.createElement('script');
script.src = chrome.runtime.getURL('tiktokFetchHandler.bundle.js');
document.documentElement.appendChild(script);
script.parentNode?.removeChild(script);
}
});window.fetch wrapper that intercepts TikTok API responses (tiktokFetchHandler.bundle.js)
// tiktokFetchHandler.bundle.js — injected into MAIN world on www.tiktok.com/*
// Wraps window.fetch to intercept TikTok's internal video-feed API responses.
const INTERCEPTED_PATHS = [
'/api/recommend/item_list/', // For You page
'/api/following/item_list/', // Following feed
'/api/post/item_list/', // User profile videos
'/api/challenge/item_list/', // Hashtag page
'/api/music/item_list/', // Music page
'/api/topic/item_list/', // Topic feed
'/api/search/general/full/', // Search results
'/api/related/item_list/', // Related videos
'api/explore/item_list', // Explore page
];
const PAGE_TYPE_MAP = {
recommend: 'foryou', following: 'following', post: 'channel',
challenge: 'hashtag', music: 'music', topic: 'foryou',
search: 'search', related: 'related', explore: 'explore',
};
const originalFetch = window.fetch;
window.fetch = function (...args) {
return originalFetch(...args).then(async (response) => {
const matchedPath = INTERCEPTED_PATHS.find(p => response.url?.includes(p));
if (matchedPath) {
const segment = new URL(response.url).pathname.split('/')[2];
const pageType = PAGE_TYPE_MAP[segment];
if (pageType) {
const body = await response.clone().json().catch(() => response.text());
document.dispatchEvent(new CustomEvent('tiktokAjaxResponse', {
detail: { url: response.url, data: body, page: pageType },
}));
}
}
return response;
});
};- cfriuxb2f3.execute-api.us-east-1.amazonaws.com
AWS API Gateway relay to Amplitude. Receives watch-state events (started/completed/rewatched) with video URL, creator handle, sound metadata. Confirmed in dynamic analysis.
- api.vidiq.com
vidIQ's primary API. Receives batched video feed data (IDs, view/like/comment/share counts, author info, hashtags, duration) at api/scraping/tiktok/{apiPath} via POST.
- api.vidiq.com
Experiment flag source: api.vidiq.com/experimentation/batch-by-keys controls whether the fetch hook and watch-event collection are active for a given user.