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:
- Requests temporary download URLs for session videos
- Downloads videos immediately and securely
- Handles URL expiration and retries
- Supports parallel downloads for high-volume workloads
- 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_IDorsessionId. 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/videoDownloadUrlRequest 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
expiresAttimestamp - 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:
- Request a new video download URL
- 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
| Pitfall | Recommendation |
|---|---|
| Saving pre-signed URLs | Always store videos, not URLs |
| Requesting URLs too early | Request immediately before download |
| Unlimited concurrency | Cap parallel downloads |
| Retrying expired URLs | Request 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.
Updated about 1 month ago
