🎬 YouTube View Generator avatar

🎬 YouTube View Generator

Pricing

from $4.99 / 1,000 results

Go to Apify Store
🎬 YouTube View Generator

🎬 YouTube View Generator

YouTube View Generator: Automate video view activity for testing and traffic simulations. Configure target videos, viewing parameters, and activity settings to evaluate video performance, analytics workflows, and system behavior in controlled environments.

Pricing

from $4.99 / 1,000 results

Rating

5.0

(1)

Developer

Scraper Engine

Scraper Engine

Maintained by Community

Actor stats

0

Bookmarked

222

Total users

25

Monthly active users

10 days ago

Last modified

Share

Generate realistic YouTube video traffic using headless browser sessions. This Actor opens your video URLs, plays content for a configurable watch duration, and streams live session metrics to the output table β€” perfect for boosting visibility and monitoring playback quality.

Why choose this Actor?

  • ⚑ Parallel browser workers β€” run multiple sessions concurrently for faster results
  • πŸ›‘οΈ Smart proxy fallback β€” starts direct, escalates to datacenter β†’ residential if blocked
  • πŸ“Š Live output table β€” sessions, per-URL stats, summary, and config appear in real time
  • 🎯 Realistic browsing β€” randomized viewports, user agents, mouse movement, and scrolling
  • πŸ”„ Automatic retries β€” failed sessions retry with upgraded proxy tiers

Key features

  • πŸ“Ί Bulk URL input β€” process many videos in one run
  • πŸ‘οΈ Configurable views per video
  • ⏱️ Adjustable watch time (120s recommended for YouTube)
  • 🌐 Concurrent browser workers
  • πŸ€– Optional robots.txt compliance
  • πŸ“ˆ Per-session video metrics (currentTime, duration, buffered, etc.)

Input

{
"urls": ["https://www.youtube.com/watch?v=krsBRQbOPQ4"],
"viewCounts": 2,
"watchTime": 120,
"browsers": 2,
"proxyConfiguration": { "useApifyProxy": false },
"respectRobotsTxt": true,
"rateLimitMs": 1000,
"retries": 3,
"playerBudgetSec": 75
}
FieldDescription
urlsπŸ“Ί Video URLs to visit (bulk supported)
viewCountsπŸ‘οΈ Sessions per URL
watchTime⏱️ Seconds to watch each video
browsers🌐 Parallel browser workers
proxyConfigurationπŸ›‘οΈ Apify Proxy settings for fallback tiers
respectRobotsTxtπŸ€– Skip disallowed URLs
rateLimitMs⏸️ Delay between sessions per worker
retriesπŸ” Retry attempts for recoverable failures. Terminal outcomes (private / removed / age-restricted / embed-disabled) are never retried
playerBudgetSec⏱️ Max seconds spent locating the <video> element and driving it into a playing state

Output

Results are saved in four sections in the output table:

SectionContent
configβš™οΈ Run configuration snapshot
sessionπŸ“Š Live per-session results with real video & behavior telemetry
byUrlπŸ“ˆ Aggregated stats per URL
summary🏁 Final run summary with success rate and failure breakdown

Exactly one session row is written per planned session (urls Γ— viewCounts). Retries do not add extra rows, so summary.total always equals the number of planned sessions.

Session telemetry

Every value under video is read directly off the live HTMLVideoElement (video.currentTime, video.duration, video.paused, video.readyState, video.buffered, video.getVideoPlaybackQuality()). Nothing is estimated. If a value genuinely does not exist β€” for example duration on a live stream, which is NaN in the DOM β€” it is reported as null rather than being filled in.

The key metrics are also mirrored to top-level columns (videoCurrentTime, videoDuration, videoPaused, videoReadyState, videoBuffered, playbackAdvancedSec, …) so they render in the dataset table view, which cannot display nested objects.

Example session row (real output, trimmed):

{
"section": "session",
"sessionId": "a965a34a",
"url": "https://fast.wistia.net/embed/iframe/26sk4lmiix",
"status": "success",
"attempts": 1,
"durationMs": 14053,
"proxy": "direct",
"httpStatus": 200,
"videoProvider": "wistia",
"playerType": "html5",
"videoCurrentTime": 12.577,
"videoDuration": 44.378,
"videoPaused": false,
"videoReadyState": 4,
"videoBuffered": 17.531,
"playbackAdvancedSec": 11.612,
"watchedSeconds": 12,
"video": {
"provider": "wistia",
"playerType": "html5",
"currentTime": 12.577,
"duration": 44.378,
"paused": false,
"ended": false,
"readyState": 4,
"networkState": 2,
"buffered": 17.531,
"bufferedRanges": 1,
"videoWidth": 1280,
"videoHeight": 720,
"muted": true,
"startCurrentTime": 0.965,
"playbackAdvancedSec": 11.612,
"playbackStarted": true,
"totalVideoFrames": 308,
"droppedVideoFrames": 13
},
"behavior": {
"plannedWatchTime": 15,
"actualWatchTime": 12,
"measuredWatchSeconds": 12,
"mouseMovements": 3,
"scrollEvents": 3,
"consentDismissed": false,
"viewportWidth": 1366,
"viewportHeight": 768
},
"errorCode": null,
"error": null
}

Failure codes

A failed session reports a specific errorCode instead of a generic timeout, so an unplayable video can be told apart from a blocked exit IP:

errorCodeMeaningRetried?Escalates proxy?
VIDEO_UNAVAILABLEProvider says the video is unavailablenono
VIDEO_PRIVATEVideo is privatenono
VIDEO_REMOVEDVideo or uploader account removednono
AGE_RESTRICTEDRequires a signed-in, age-verified accountnono
EMBED_DISABLEDOwner disabled off-site playbacknono
MEMBERS_ONLYMembers-only contentnono
LIVE_NOT_STARTEDScheduled stream/premiere has not begunnono
GEO_BLOCKEDNot available from the current exit IPyesyes
BOT_CHECKProvider bot/"unusual traffic" interstitialyesyes
CONSENT_WALLConsent page could not be dismissedyesyes
HTTP_ERROR / RATE_LIMITED4xx/5xx or 429 from the pageyesyes
NAVIGATION_FAILEDPage never loadedyesyes
PROXY_TUNNEL_FAILEDProxy refused/never completed the CONNECT tunnelyes β€” on a direct connectionde-escalates to direct
PLAYER_NOT_FOUNDNo <video> element ever appearedyesno
PLAYBACK_STALLEDPlayer found but currentTime never advancedyesno
PLAYER_ERROR / MEDIA_ERRORPlayer or HTMLMediaElement reported an erroryesno
SESSION_TIMEOUTAttempt exceeded its wall-clock budgetyesno

Sessions that fail after finding a player still carry their measured video telemetry, so you can see exactly how far playback got.

Retries stop early when the same error code repeats on the same proxy tier twice in a row β€” a deterministic failure is reported immediately rather than burning every remaining retry on an identical outcome.

Resolved: Google-owned hosts via Apify Proxy

Earlier builds could not load any Google-owned host (www.youtube.com, m.youtube.com, www.google.com) through Apify Proxy β€” the navigation never committed, which looked like a proxy that refused the CONNECT tunnel. It was not. A Chromium netlog capture showed the tunnel returning

200 Connection Established
, TLS 1.3 completing and HTTP/2 being negotiated normally.

The real cause: YouTube advertises Accept-CH over the HTTP/2 ALPS extension, asking for the Sec-CH-UA-Arch / -Bitness / -Model / -WoW64 / -Platform-Version / -Full-Version-List client hints. Chromium aborts the in-flight navigation (ERR_ABORTED, net_error: -3) so it can restart the request carrying those hints β€” and through an authenticating CONNECT proxy that restart never completes. Only Google hosts send ACCEPT_CH over ALPS, which is why non-Google hosts were unaffected, and curl does not implement client hints, which is why curl through the identical proxy always succeeded.

Launching Chromium with --disable-features=AcceptCHFrame removes the restart. www.youtube.com then commits in ~2s over the same residential proxy, and playback verification succeeds with readyState=4 and real decoded-frame counts.

Note on exit IPs: the Apify compute IP itself is still a datacenter range that Google serves a "Sign in to confirm you're not a bot" interstitial to, so the direct tier reports BOT_CHECK. The Actor detects that from the page text in ~8s and escalates to the residential tier, which plays normally. Supplying proxyConfiguration with the RESIDENTIAL group skips the wasted direct attempt.

πŸš€ How to use the Actor (via Apify Console)

  1. Log in at https://console.apify.com β†’ Actors
  2. Find 🎬 YouTube View Generator and open it
  3. Paste your video URLs and configure views, watch time, and workers
  4. Click ▢️ Start
  5. Watch live logs and session results in the Output tab
  6. Export results as JSON, CSV, or Excel

Best use cases

  • πŸ“ˆ Increase view counts for YouTube videos
  • πŸ”„ Schedule daily runs for consistent traffic
  • πŸ§ͺ Test video embed players across platforms
  • πŸ“Š Monitor playback metrics across sessions

Frequently asked questions

How long until views appear on YouTube? Views may take up to 24 hours to reflect in YouTube Analytics.

Why use 120 seconds watch time? YouTube typically requires meaningful watch time before counting a view. 120 seconds is the recommended default.

What happens if YouTube blocks my IP? The Actor automatically escalates: direct β†’ datacenter proxy β†’ residential proxy (sticky for remaining sessions).

Can I run multiple videos at once? Yes β€” add as many URLs as you need. Each gets the configured number of views.

Notes

  • YouTube may not count views that appear illegitimate (many simultaneous views from the same IP)
  • Scheduling once daily helps maintain natural-looking traffic patterns
  • Use residential proxy fallback for best results on heavily protected content

Support and feedback

For issues or feature requests, contact the Actor maintainer through Apify Console.

Only use this Actor on content you own or have permission to promote. Users are responsible for compliance with YouTube Terms of Service and applicable laws.