Process Session Videos at Scale

Securely download and manage session videos at scale using temporary pre-signed URLs

Introduction

This tutorial shows how to securely download and manage UserTesting session videos at scale using the Results API. Session videos are one of UserTesting’s most valuable assets, enabling deep qualitative analysis, multimodal AI workflows, and long-term research archiving.

Because videos are large and sensitive, the API uses temporary pre-signed URLs. This tutorial explains how to work with those URLs safely and efficiently in production-grade pipelines.

What you’ll build

A scalable video ingestion workflow that:

  1. Requests temporary download URLs for session videos
  2. Downloads videos immediately and securely
  3. Handles URL expiration and retries
  4. Supports parallel downloads for high-volume workloads
  5. Stores videos in long-term object storage

Target audience

  • Media pipeline engineers
  • ML / computer vision teams
  • Data platform engineers
  • Research infrastructure teams

This tutorial is especially relevant for organizations running:

  • Multimodal AI (speech + vision)
  • Large-scale video archives
  • Offline or batch video processing jobs

Prerequisites

  • A valid access token (ACCESS_TOKEN). Go to Authorization for details.
  • A known session ID, referred to as SESSION_ID or sessionId. Use the GET /api/v2/sessionResults endpoint to find all completed sessions within a test.
  • Object storage (S3, GCS, Azure Blob, etc.)
  • A runtime capable of streaming large files (Python, Java, Go, etc.)

How session video access works

UserTesting videos are accessed via pre-signed URLs:

  • URLs are generated on demand
  • URLs expire after one hour
  • URLs provide temporary, scoped access to a single video

This design ensures:

  • Secure access
  • No long-lived public URLs
  • Minimal exposure risk

Steps

Step 1 — Request a video download URL

Endpoint

GET /api/v2/sessionResults/SESSION_ID/videoDownloadUrl

Request sample

curl --location 'https://api.use2.usertesting.com/api/v2/sessionResults/SESSION_ID/videoDownloadUrl' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer ACCESS_TOKEN'

What this returns

  • A temporary videoUrl
  • An expiresAt timestamp
  • The associated sessionId

Step 2 — Download the video immediately

👍

Critical rule: Always download the video as soon as the URL is issued.

❗️

Do not:

  • Store the URL
  • Share the URL
  • Reuse the URL later

Recommended download behavior

  • Stream the response directly to disk or object storage
  • Avoid loading the entire file into memory
  • Validate successful completion

Step 3 — Handle URL expiration and retries

Pre-signed URLs cannot be refreshed. If a download fails due to expiration:

  1. Request a new video download URL
  2. Restart the download

Retry strategy

  • Retry only on network failures or expired URLs
  • Limit retry attempts to avoid rate limits (maximum 10 per minute)
  • Use backoff between retries

Step 4 — Store videos in long-term storage

Once downloaded, videos should be moved to secure object storage.

Recommended storage metadata

  • session_id
  • test_id
  • ingestion_timestamp
  • original_filename
  • storage_path
  • checksum (optional)

Example storage path

s3://ux-research-videos/
  └── test_id=abc/
      └── session_id=xyz/
          └── session.mp4

Step 5 — Parallel downloads (safely)

Large studies may include hundreds or thousands of sessions.


Best practices for parallelism

  • Limit concurrency (e.g., 3–5 parallel downloads)
  • Request URLs just-in-time
  • Do not prefetch URLs in bulk
  • Monitor API rate limits

Example workflow (pseudo-code)

for session_id in session_ids:
    url = get_video_download_url(session_id)

    try:
        stream_download(url, destination_path)
        record_success(session_id)
    except ExpiredUrlError:
        retry_with_new_url(session_id)
🖥️

Code overview: This pseudo-code loops through session IDs to download session videos, records successful downloads, and retries with a new URL if the download fails due to an expired link.


Step 6 — Integrate with AI and media pipelines

Once videos are stored, they can be used for:

  • Speech-to-text (ASR)
  • Emotion detection
  • Visual attention modeling
  • Multimodal UX analysis
  • Training internal AI models

Rate limits and performance considerations

  • Video URL requests are rate-limited (maximum 10 requests per minute)
  • Download bandwidth depends on the storage provider
  • Use monitoring to detect failures early

Common pitfalls

PitfallRecommendation
Saving pre-signed URLsAlways store videos, not URLs
Requesting URLs too earlyRequest immediately before download
Unlimited concurrencyCap parallel downloads
Retrying expired URLsRequest a fresh URL

What you can build next

With a reliable video pipeline, teams can:

  • Build large-scale multimodal datasets
  • Power AI-driven UX analysis
  • Archive research for compliance
  • Create highlight reels and clips automatically

Summary

You now have a robust pattern to:

  • Securely access session videos
  • Download them at scale
  • Manage expiration, retries, and concurrency
  • Prepare video data for AI and analytics pipelines

Handled correctly, session video ingestion becomes a strategic advantage, unlocking insights that text-only data cannot provide.