Skip to Content
Recordings

Recordings

The Recordings API allows you to upload video, audio, and text files, track their processing status, and retrieve transcripts and metadata once processing is complete.

Overview

Recordings are uploaded in a three-step process:

  1. Initiate Upload - Create a recording record and get a pre-signed upload URL
  2. Upload File - Upload your file directly to Azure Blob Storage using the pre-signed URL
  3. Complete Upload - Verify the upload and trigger AI processing

Once processing is complete, you can retrieve the full transcript, summary, and metadata.

Supported File Types

Video Formats

  • video/mp4 - MPEG-4 video
  • video/webm - WebM video
  • video/quicktime - QuickTime/MOV files
  • video/x-msvideo - AVI files
  • video/x-matroska - MKV files

Audio Formats

  • audio/mpeg - MP3 audio
  • audio/wav - WAV audio
  • audio/ogg - OGG audio
  • audio/webm - WebM audio
  • audio/x-m4a - M4A audio
  • audio/flac - FLAC audio

Text Formats

  • text/plain - Plain text files
  • text/csv - CSV files
  • application/json - JSON files
  • text/vtt - WebVTT subtitle files
  • text/srt - SubRip subtitle files

File Size Limits

TypeMaximum Size
Video400 MB (419,430,400 bytes)
Audio100 MB (104,857,600 bytes)
Text100 MB (104,857,600 bytes)

Files exceeding these limits will be rejected with a 400 Bad Request error.

Recording Statuses

StatusDescription
pending_uploadUpload initiated, waiting for file to be uploaded
pendingFile uploaded, waiting for processing to start
processingCurrently being processed by AI
completedProcessing complete, transcript and insights available
failedProcessing failed (check processingError for details)

Initiate Recording Upload

Creates a new recording and returns a pre-signed URL for direct upload to Azure Blob Storage.

POST /v2/projects/{projectId}/recordings

Note: Requires read_write permission.

Headers

HeaderTypeRequiredDescription
x-api-keystringYesYour API key (requires read_write permission)
Content-TypestringYesapplication/json

Path Parameters

ParameterTypeDescription
projectIdstringThe project’s unique identifier

Request Body

FieldTypeRequiredDescription
namestringYesRecording name (max 200 characters)
descriptionstringNoOptional description (max 1000 characters)
filenamestringYesOriginal filename (max 500 characters)
mimeTypestringYesFile MIME type (see supported types above)
fileSizenumberYesFile size in bytes (must be positive)

Request Example

{ "name": "User Interview - John Doe", "description": "Interview about checkout experience", "filename": "interview-john.mp4", "mimeType": "video/mp4", "fileSize": 104857600 }

Response

201 Created

{ "recordingId": "507f1f77bcf86cd799439013", "uploadUrl": "https://storage.blob.core.windows.net/container/path?sv=2021-06-08&ss=b&srt=co&sp=rwdlacx&se=2024-12-26T14:00:00Z&st=2024-12-26T12:00:00Z&spr=https&sig=...", "blobPath": "orgId/projectId/recordingId/filename.mp4", "expiresAt": "2024-12-26T14:00:00.000Z", "maxFileSize": 419430400 }

Response Fields

FieldTypeDescription
recordingIdstringUnique recording identifier (use this for subsequent requests)
uploadUrlstringPre-signed URL for direct upload to Azure Blob Storage
blobPathstringStorage path where the file will be stored
expiresAtstringISO 8601 timestamp when the upload URL expires (typically 2 hours)
maxFileSizenumberMaximum allowed file size in bytes for this file type

Example Request

curl -X POST "https://api.yeino.com/v2/projects/507f1f77bcf86cd799439011/recordings" \ -H "x-api-key: yno_live_abc123..." \ -H "Content-Type: application/json" \ -d '{ "name": "User Interview - John Doe", "filename": "interview-john.mp4", "mimeType": "video/mp4", "fileSize": 104857600 }'

Error Responses

Status CodeErrorDescription
400Bad RequestInvalid file type, size, or parameters
401UnauthorizedInvalid or missing API key
403ForbiddenAPI key requires read_write permission
404Not FoundProject not found

400 Bad Request Example:

{ "statusCode": 400, "message": "File size exceeds maximum allowed size of 419430400 bytes.", "error": "Bad Request" }

Upload File to Azure

After receiving the uploadUrl from the initiate endpoint, upload your file directly to Azure Blob Storage.

Note: This is a direct upload to Azure, not to the Yeino API. Use the uploadUrl from the initiate response.

Upload Request

curl -X PUT "{uploadUrl}" \ -H "x-ms-blob-type: BlockBlob" \ -H "Content-Type: video/mp4" \ --data-binary @interview-john.mp4

Headers

HeaderTypeRequiredDescription
x-ms-blob-typestringYesMust be BlockBlob
Content-TypestringYesMIME type matching the file (e.g., video/mp4)

Important Notes

  • The upload URL expires after 2 hours. Upload your file before it expires.
  • Upload the file as binary data (--data-binary in curl).
  • The file size must match the fileSize specified in the initiate request.
  • After successful upload, call the complete endpoint to verify and trigger processing.

Complete Recording Upload

Called after successfully uploading the file to Azure. Verifies the upload and triggers AI processing.

POST /v2/recordings/{recordingId}/complete

Note: Requires read_write permission.

Headers

HeaderTypeRequiredDescription
x-api-keystringYesYour API key (requires read_write permission)
Content-TypestringYesapplication/json

Path Parameters

ParameterTypeDescription
recordingIdstringThe recording ID from the initiate upload response

Request Body (Optional)

FieldTypeRequiredDescription
actualFileSizenumberNoActual file size for verification (optional)

Request Example

{}

Or with file size verification:

{ "actualFileSize": 104857600 }

Response

200 OK

{ "id": "507f1f77bcf86cd799439013", "name": "User Interview - John Doe", "status": "processing", "isUploaded": true, "createdAt": "2024-12-26T10:30:00.000Z" }

Example Request

curl -X POST "https://api.yeino.com/v2/recordings/507f1f77bcf86cd799439013/complete" \ -H "x-api-key: yno_live_abc123..." \ -H "Content-Type: application/json" \ -d '{}'

Error Responses

Status CodeErrorDescription
400Bad RequestUpload not found or invalid state
401UnauthorizedInvalid or missing API key
403ForbiddenAPI key requires read_write permission
404Not FoundRecording not found

Get Recording Details

Retrieves full recording details including transcript, summary, and metadata if processing is complete.

GET /v2/recordings/{recordingId}

Headers

HeaderTypeRequiredDescription
x-api-keystringYesYour API key (requires read permission)

Path Parameters

ParameterTypeDescription
recordingIdstringThe recording’s unique identifier

Response

200 OK

{ "id": "507f1f77bcf86cd799439013", "name": "User Interview - John Doe", "description": "Interview about checkout experience", "status": "completed", "isUploaded": true, "fileType": "video", "originalFilename": "interview-john.mp4", "mimeType": "video/mp4", "fileSize": 104857600, "fileMetadata": { "duration": 1847.5, "language": "en", "speakerCount": 2, "wordCount": 4523 }, "transcriptSummary": { "summary": "John discussed his frustrations with the current checkout process...", "keyTopics": ["checkout flow", "payment options", "error messages"], "participants": ["Interviewer", "John Doe"] }, "fullTranscript": "Welcome John. Thanks for joining us today...", "transcript": [ { "speaker": "Speaker 1", "startTime": 0.5, "endTime": 5.2, "text": "Welcome John. Thanks for joining us today." }, { "speaker": "Speaker 2", "startTime": 5.8, "endTime": 9.1, "text": "Thanks for having me. Happy to help." } ], "createdAt": "2024-12-26T10:30:00.000Z", "processedAt": "2024-12-26T10:45:00.000Z" }

Response Fields

FieldTypeDescription
idstringRecording identifier
namestringRecording name
descriptionstring | nullOptional description
statusstringProcessing status (see statuses above)
isUploadedbooleanWhether file has been uploaded
fileTypestringvideo, audio, or text
originalFilenamestringOriginal filename
mimeTypestringFile MIME type
fileSizenumberFile size in bytes
fileMetadataobject | nullFile metadata (only if processing completed)
fileMetadata.durationnumber | nullDuration in seconds (for video/audio)
fileMetadata.languagestring | nullDetected language code
fileMetadata.speakerCountnumber | nullNumber of speakers detected
fileMetadata.wordCountnumber | nullTotal word count
transcriptSummaryobject | nullAI-generated summary (only if processing completed)
transcriptSummary.summarystringSummary text
transcriptSummary.keyTopicsstring[]Key topics identified
transcriptSummary.participantsstring[]Participant names/speakers
fullTranscriptstring | nullFull transcript as plain text
transcriptarray | nullTranscript segments with timestamps
transcript[].speakerstringSpeaker identifier
transcript[].startTimenumberStart time in seconds
transcript[].endTimenumberEnd time in seconds
transcript[].textstringTranscript text for this segment
createdAtstringISO 8601 timestamp when recording was created
processedAtstring | nullISO 8601 timestamp when processing completed

Example Request

curl -X GET "https://api.yeino.com/v2/recordings/507f1f77bcf86cd799439013" \ -H "x-api-key: yno_live_abc123..."

Notes

  • If processing is not complete (status is pending, pending_upload, or processing), the transcript, transcriptSummary, and fileMetadata fields will be null.
  • Use the Get Recording Status endpoint to check processing status without retrieving full details.
  • Transcript segments are ordered chronologically by startTime.

Error Responses

Status CodeErrorDescription
401UnauthorizedInvalid or missing API key
404Not FoundRecording not found

Get Recording Status

Quick check to see the current processing status of a recording without retrieving full details.

GET /v2/recordings/{recordingId}/status

Headers

HeaderTypeRequiredDescription
x-api-keystringYesYour API key (requires read permission)

Path Parameters

ParameterTypeDescription
recordingIdstringThe recording’s unique identifier

Response

200 OK

{ "id": "507f1f77bcf86cd799439013", "name": "User Interview - John Doe", "status": "processing", "isUploaded": true, "createdAt": "2024-12-26T10:30:00.000Z" }

Response Fields

FieldTypeDescription
idstringRecording identifier
namestringRecording name
statusstringCurrent processing status
isUploadedbooleanWhether file has been uploaded
createdAtstringISO 8601 timestamp when recording was created
processedAtstring | nullISO 8601 timestamp when processing completed (if applicable)
processingErrorobject | nullError details if status is failed

Example Request

curl -X GET "https://api.yeino.com/v2/recordings/507f1f77bcf86cd799439013/status" \ -H "x-api-key: yno_live_abc123..."

Use Cases

  • Polling for completion - Check status periodically until status is completed
  • Error monitoring - Detect failed processing and handle errors
  • Progress tracking - Show upload and processing status to users

Error Responses

Status CodeErrorDescription
401UnauthorizedInvalid or missing API key
404Not FoundRecording not found

Complete Upload Workflow

Here’s a complete example of uploading and processing a recording:

// 1. Initiate upload const initResponse = await fetch('/v2/projects/{projectId}/recordings', { method: 'POST', headers: { 'x-api-key': 'yno_live_abc123...', 'Content-Type': 'application/json', }, body: JSON.stringify({ name: 'User Interview - John Doe', filename: 'interview.mp4', mimeType: 'video/mp4', fileSize: file.size, }), }); const { recordingId, uploadUrl } = await initResponse.json(); // 2. Upload file to Azure await fetch(uploadUrl, { method: 'PUT', headers: { 'x-ms-blob-type': 'BlockBlob', 'Content-Type': 'video/mp4', }, body: file, }); // 3. Complete upload await fetch(`/v2/recordings/${recordingId}/complete`, { method: 'POST', headers: { 'x-api-key': 'yno_live_abc123...', 'Content-Type': 'application/json', }, body: JSON.stringify({}), }); // 4. Poll for completion let status = 'processing'; while (status === 'processing' || status === 'pending') { await new Promise(resolve => setTimeout(resolve, 5000)); // Wait 5 seconds const statusResponse = await fetch(`/v2/recordings/${recordingId}/status`, { headers: { 'x-api-key': 'yno_live_abc123...' }, }); const { status: currentStatus } = await statusResponse.json(); status = currentStatus; } // 5. Get full recording with transcript const recording = await fetch(`/v2/recordings/${recordingId}`, { headers: { 'x-api-key': 'yno_live_abc123...' }, }).then(r => r.json()); console.log(recording.transcriptSummary); console.log(recording.transcript);

For a more detailed end-to-end example, see the Complete Integration Example.

Last updated on