Page 1 of 1

Roblox Video Captures API: the 30 Second Limit, Voice Muting, the 20 Video Upload Quota, and Recommendations

Posted: Fri Oct 23, 2026 7:07 pm
by ice
Quick Summary
  • The Video Captures API is the part of the Moments toolkit a creator actually codes against. It lives on

    Code: Select all

    CaptureService
    and lets your experience start, stop, save, share and upload clips of up to 30 seconds.
  • Roblox reports over 80 million screenshots taken daily and about 500,000 shared daily since the screenshot Captures API launched. Video was built to extend that, not replace it.
  • Three limits bite first: 30 seconds maximum per recording, all player voices muted during the recording, and 20 video uploads per user per day.
  • The Recommendations API ranks the clips you upload. It supports seven ConfigName strategies you can use, from

    Code: Select all

    MaximizeEngagement
    to

    Code: Select all

    PlayerOwnedItems
    , plus an eighth that only Roblox Moments itself can use.
  • The full Moments experience is open. Roblox publishes its source as a 2.4 MB place you can open in Studio, which is the fastest way to see a working capture, edit and publish loop.
What the Video Captures API Actually Is

Roblox announced Moments at RDC in September 2025 as a beta experience for users 13 and older. It shipped with a Moderate content maturity label and three steps: capture, create and share. Capture means recording a clip of up to 30 seconds. Create means trimming it, adding music through a partnership with DistroKid, and writing a description. Share means publishing it to the Moments gallery.

The player-facing side is only half the story. Alongside it Roblox released the Video Captures API, which puts the same capture trigger inside your own experience so a game can fire it at a defined moment instead of waiting for a player to press a key. It sits on

Code: Select all

CaptureService
, the same service that already handled screenshots, and Roblox's framing is that authentic user-generated clips spread across other platforms and pull players back in.

The numbers Roblox attached to the screenshot version give a sense of the scale this is built on. Users were taking over 80 million screenshots a day and sharing an average of 500,000 daily. In the month before the Moments announcement, Roblox counted over 930 million screenshots and over 240 million videos captured in experiences, measured from July 24 to August 24, 2025.

The Capture Calls, and What Each One Returns
  • Code: Select all

    CaptureService:StartVideoCaptureAsync(onCaptureReady, captureParams)
    starts the recording. It returns an

    Code: Select all

    Enum.VideoCaptureStartedResult
    so you can tell whether the recording began at all. The

    Code: Select all

    onCaptureReady
    callback fires when it finishes with an

    Code: Select all

    Enum.VideoCaptureResult
    and, if it worked, a

    Code: Select all

    VideoCapture
    object.
  • Code: Select all

    CaptureService:StopVideoCapture()
    ends the recording early. If you never call it, the recording stops itself at the 30 second mark.
  • Code: Select all

    CaptureService:PromptSaveCapturesToGallery({videoCapture}, callback)
    asks the user to save. The callback gets a dictionary mapping each capture to a boolean for whether they accepted. This step is the user's choice, not automatic.
  • Code: Select all

    CaptureService:PromptShareCapture(captureContent, launchData, onAccepted, onDenied)
    opens the native share sheet. The docs are blunt that not every device can carry both a video and an invite link, and that users who cannot use share sheets get a download prompt instead.
  • Code: Select all

    CaptureService.CaptureBegan(captureType)
    and

    Code: Select all

    CaptureEnded(captureType)
    fire around the capture and pass an

    Code: Select all

    Enum.CaptureType
    so you know whether it was a screenshot or a video. Use them to hide and restore your own HUD.
Two things worth knowing before you write code against this. First, the capture is not saved to the gallery by itself. A temporary

Code: Select all

VideoCapture
object is created and the user decides whether to keep it. Second,

Code: Select all

captureParams
is currently a no-op. Roblox says it plans to add configuration there, so anything you stub out now should be treated as a placeholder.

The Limits That Will Surprise You
  • Duration: 30 seconds, hard. The recording stops automatically at that point and the result comes back as

    Code: Select all

    TimeLimitReached
    rather than an error.
  • Voice: during the recording, all user voices are muted. Roblox also strips player IDs, names and in-experience UI from the video to protect privacy.
  • Upload quota:

    Code: Select all

    UploadCaptureAsync
    allows 20 videos per day per user. Go past it and the result is

    Code: Select all

    Enum.UploadCaptureResult.UploadQuotaReached
    , which is how you tell quota exhaustion from a genuine failure.
  • Upload time: the call can take several minutes, and the player has to stay in the experience while it runs.
  • Studio only:

    Code: Select all

    RegisterItemAsync
    on the Recommendations API returns HTTP 403 from Studio. Roblox tells you to publish the experience and run it in the client.
  • Beta scope: the Upload API only accepts captures recorded in your own experience during beta. Cross-experience uploads are planned but not open yet.
One inconsistency is worth flagging rather than hiding. The

Code: Select all

ScreenshotHud.HideCoreGuiForCaptures
and

Code: Select all

ScreenshotHud.HidePlayerGuiForCaptures
properties do not currently work with video captures. Video captures hide core GUI and in-experience UI regardless of what those properties are set to. If your design depends on showing your own HUD in a clip, that is not available today.

The Recommendations API, and How Clips Get Ranked

Capturing a clip is step one. Getting it in front of people is step two, and that is the Recommendations API on

Code: Select all

RecommendationService
. You register items, generate lists, and log interactions so the ranking has data to learn from.

Step by step: a working highlight reel
  1. Call

    Code: Select all

    RecommendationService:RegisterItemAsync(player, request)
    from a server script. The request carries a

    Code: Select all

    ContentType[/code>, a [code]ReferenceId
    that is your own identifier, a

    Code: Select all

    Duration
    in seconds, a

    Code: Select all

    Visibility
    and optional

    Code: Select all

    CustomTags
    .
  2. Call

    Code: Select all

    RecommendationService:GenerateItemListAsync(request)
    . The request needs a

    Code: Select all

    ConfigName
    , a

    Code: Select all

    LocationId
    and a

    Code: Select all

    PageSize
    .

    Code: Select all

    LocationId
    does not change which items come back, it only separates your performance metrics in Creator Hub.
  3. Read the returned pages with

    Code: Select all

    GetCurrentPage()
    and advance with

    Code: Select all

    AdvanceToNextPageAsync()
    . Each item gives you an

    Code: Select all

    ItemId
    , your original

    Code: Select all

    ReferenceId
    and a

    Code: Select all

    TracingId
    .
  4. Log what players do.

    Code: Select all

    LogImpressionEvent
    takes a view event with a duration, a position and a

    Code: Select all

    DepartureIntent
    of Positive, Neutral or Negative.

    Code: Select all

    LogActionEvent
    takes an action type such as

    Code: Select all

    AddReaction
    and a

    Code: Select all

    ReactionType
    string you define.
  5. Look at the numbers in Creator Hub under Recommendation Service. Roblox built the same service behind its own Home Discovery surfaces, and the Creator Hub view is where you tune the reel.
The seven ConfigName strategies you can use
  • Code: Select all

    MaximizeTimespent
    : favours content that holds attention the longest.
  • Code: Select all

    MaximizeReactions
    : favours content that draws the most likes and favourites.
  • Code: Select all

    MaximizePlays
    : favours content that generates Play actions. Roblox recommends logging only quality plays, for example anything over 60 seconds, to cut noise.
  • Code: Select all

    MaximizeEngagement
    : a balanced mix of quality views and reactions, and the one to start with.
  • Code: Select all

    PlayerSpecific
    : public items created by the player named in the request, newest first.
  • Code: Select all

    RecentlyAdded
    : public content sorted newest first.
  • Code: Select all

    PlayerOwnedItems
    : the player's own creations sorted by creation time. It shows private items, so it needs user authentication and only works on the client.
There is an eighth that only Moments gets.

Code: Select all

MaximizeJoins
is exclusive to Roblox Moments and optimises for teleports rather than plays. If you are building a reel in your own game you cannot use it.

Age Gating, Moderation and the Source Code

The age story changed between the two Moments announcements, and the difference matters if you are planning a feature around it. At the September 2025 beta launch, Moments was playable by users 13 or older. By July 2026, the dedicated Moments tab on the app was available to age-checked players 16 or older, in Canada, New Zealand and Singapore first, with a global rollout over the following months.

Moderation is not optional and it is not yours to opt out of. Everything captured and published, whether it appears in the main Moments experience or in a reel you built yourself, is moderated before publication against Community Standards. Roblox is explicit that you will not be penalised for content surfaced through your own Recommendations API reel, because the moderation happens before it goes out.

That leaves one real rating risk. Your experience's content maturity rating is not affected just by calling the Upload API. What changes things is Cross-Experience Content. When Roblox opens cross-experience uploads, any game that lets users upload media recorded in other experiences has to answer yes to that questionnaire field, and that answer age-gates the experience to 16 and older.

The most useful thing Roblox shipped is not an API at all. The Moments experience source code is public. You open it from the Roblox Moments place with the three-dot menu and Edit in Studio, or download the

Code: Select all

roblox-moments.rbxl
file, which is 2.4 MB. It covers the whole workflow: capture, editing and publishing. If you want to see a production-quality implementation of the loop before you build your own, read that file.

FAQ

How long can a Roblox video capture be?
30 seconds maximum. The recording stops on its own at that point and reports

Code: Select all

TimeLimitReached
rather than failing.

Does video capture record voice chat?
No. All user voices are muted during a recording, and Roblox strips player IDs, names and in-experience UI from the video as a privacy measure.

Can players upload videos from other experiences into my game?
Not during the beta. The Upload API only accepts captures recorded in your own experience. Cross-experience uploads are planned, and when they arrive they come with a 16 and older age gate on any experience that enables them.

How many videos can a player upload in a day?
20 per user per day through

Code: Select all

UploadCaptureAsync
. Exceeding it returns

Code: Select all

Enum.UploadCaptureResult.UploadQuotaReached
.

Do I need the Maturity and Compliance questionnaire filled in?
Yes. Roblox notes that

Code: Select all

UploadCaptureAsync
only works properly when the Maturity and Compliance questionnaire has been completed for the experience.

Can I hide my own HUD in a video capture?
Not selectively.

Code: Select all

HideCoreGuiForCaptures
and

Code: Select all

HidePlayerGuiForCaptures
are not supported for video captures, and the capture hides core GUI and in-experience UI regardless of their values.

Sources