π¬ YouTube View Generator
Pricing
from $4.99 / 1,000 results
π¬ 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
Maintained by CommunityActor stats
0
Bookmarked
222
Total users
25
Monthly active users
10 days ago
Last modified
Categories
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}
| Field | Description |
|---|---|
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:
| Section | Content |
|---|---|
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:
errorCode | Meaning | Retried? | Escalates proxy? |
|---|---|---|---|
VIDEO_UNAVAILABLE | Provider says the video is unavailable | no | no |
VIDEO_PRIVATE | Video is private | no | no |
VIDEO_REMOVED | Video or uploader account removed | no | no |
AGE_RESTRICTED | Requires a signed-in, age-verified account | no | no |
EMBED_DISABLED | Owner disabled off-site playback | no | no |
MEMBERS_ONLY | Members-only content | no | no |
LIVE_NOT_STARTED | Scheduled stream/premiere has not begun | no | no |
GEO_BLOCKED | Not available from the current exit IP | yes | yes |
BOT_CHECK | Provider bot/"unusual traffic" interstitial | yes | yes |
CONSENT_WALL | Consent page could not be dismissed | yes | yes |
HTTP_ERROR / RATE_LIMITED | 4xx/5xx or 429 from the page | yes | yes |
NAVIGATION_FAILED | Page never loaded | yes | yes |
PROXY_TUNNEL_FAILED | Proxy refused/never completed the CONNECT tunnel | yes β on a direct connection | de-escalates to direct |
PLAYER_NOT_FOUND | No <video> element ever appeared | yes | no |
PLAYBACK_STALLED | Player found but currentTime never advanced | yes | no |
PLAYER_ERROR / MEDIA_ERROR | Player or HTMLMediaElement reported an error | yes | no |
SESSION_TIMEOUT | Attempt exceeded its wall-clock budget | yes | no |
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 EstablishedThe 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)
- Log in at https://console.apify.com β Actors
- Find π¬ YouTube View Generator and open it
- Paste your video URLs and configure views, watch time, and workers
- Click βΆοΈ Start
- Watch live logs and session results in the Output tab
- 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.
β οΈ Legal & ethical notice
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.