Presigned URLs are temporary and expire after a limited time. Always fetch them on demand — do not
cache or persist them.
Endpoints
| Endpoint | Description |
|---|---|
GET /public/workspace/{workspaceId}/recordings/{recordingId}/video | Recording video |
GET /public/workspace/{workspaceId}/recordings/{recordingId}/thumbnail | Recording thumbnail image |
GET /public/workspace/{workspaceId}/recordings/{recordingId}/console-log | Browser console logs |
GET /public/workspace/{workspaceId}/recordings/{recordingId}/network-log | Network request logs |
GET /public/workspace/{workspaceId}/recordings/{recordingId}/action | Client action replay data |
Path parameters
string
required
The workspace ID
string
required
The recording ID
Response
string
Status message
object
Show data
Show data
string
Recording ID
object
Show resource
Show resource
string | null
Presigned URL for the resource.
null if the resource is not available.string
Status message describing the resource availability
string | null
MIME type of the resource
array
integer | null
File size in bytes
integer | null
Duration in milliseconds (video only)
boolean
Whether this resource type was captured for this recording
Example
- Video
- Thumbnail
- Console Log
- Network Log
- Action
curl https://api.userplane.io/api/v1/public/workspace/ws_abc123/recordings/rec_abc123/video \
-H "Authorization: Bearer uspl_your_api_key"
const response = await fetch(
"https://api.userplane.io/api/v1/public/workspace/ws_abc123/recordings/rec_abc123/video",
{ headers: { Authorization: "Bearer uspl_your_api_key" } }
);
const { data } = await response.json();
// Use data.resource.url or data.resource.sources for playback
Response
{
"message": "Recording video retrieved successfully",
"data": {
"recordingId": "rec_abc123",
"resource": {
"url": "https://s3.amazonaws.com/userplane-recordings/rec_abc123/video.webm?X-Amz-...",
"message": "Video available",
"type": "video/webm",
"sources": [
{
"url": "https://s3.amazonaws.com/userplane-recordings/rec_abc123/video.webm?X-Amz-...",
"type": "video/webm"
}
],
"size": 2456789,
"durationMs": 45200,
"captureEnabled": true
}
}
}
curl https://api.userplane.io/api/v1/public/workspace/ws_abc123/recordings/rec_abc123/thumbnail \
-H "Authorization: Bearer uspl_your_api_key"
Response
{
"message": "Recording thumbnail retrieved successfully",
"data": {
"recordingId": "rec_abc123",
"resource": {
"url": "https://s3.amazonaws.com/userplane-recordings/rec_abc123/thumb.jpg?X-Amz-...",
"message": "Thumbnail available",
"type": "image/jpeg",
"size": 34567,
"captureEnabled": true
}
}
}
curl https://api.userplane.io/api/v1/public/workspace/ws_abc123/recordings/rec_abc123/console-log \
-H "Authorization: Bearer uspl_your_api_key"
Response
{
"message": "Recording console log retrieved successfully",
"data": {
"recordingId": "rec_abc123",
"resource": {
"url": "https://s3.amazonaws.com/userplane-recordings/rec_abc123/console.json?X-Amz-...",
"message": "Console log available",
"type": "application/json",
"size": 12345,
"captureEnabled": true
}
}
}
curl https://api.userplane.io/api/v1/public/workspace/ws_abc123/recordings/rec_abc123/network-log \
-H "Authorization: Bearer uspl_your_api_key"
Response
{
"message": "Recording network log retrieved successfully",
"data": {
"recordingId": "rec_abc123",
"resource": {
"url": "https://s3.amazonaws.com/userplane-recordings/rec_abc123/network.json?X-Amz-...",
"message": "Network log available",
"type": "application/json",
"size": 89012,
"captureEnabled": true
}
}
}
curl https://api.userplane.io/api/v1/public/workspace/ws_abc123/recordings/rec_abc123/action \
-H "Authorization: Bearer uspl_your_api_key"
Response
{
"message": "Recording action replay retrieved successfully",
"data": {
"recordingId": "rec_abc123",
"resource": {
"url": "https://s3.amazonaws.com/userplane-recordings/rec_abc123/action.json?X-Amz-...",
"message": "Action data available",
"type": "application/json",
"size": 5678,
"captureEnabled": true
}
}
}
Errors
| Error code | Status | Description |
|---|---|---|
RECORDING_NOT_FOUND | 404 | Recording does not exist |
RECORDING_GONE | 410 | Recording has already been deleted |
Related
Get Recording
Full recording details and metadata
List Recordings
Find recordings to download resources from
Best Practices
Handle presigned URLs and transient resources
Error Handling
Handle 404 and 410 errors for recordings