HomeDocumentationAPI Reference
Documentation

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 session videos from interaction tests or think-out-loud tests 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 of an interaction test or think-out-loud test, referred to as SESSION_ID or sessionId. Use the GET /api/v2/sessionResults endpoint to find all completed sessions within an interaction 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.