Uploads
Get Upload URL
Generate a pre-signed URL to upload a file directly to S3
POST
Generate a pre-signed S3 URL for uploading a file to a recording. Supports audio, image, and video files. Upload the file directly to S3 using the returned URL. After all files are uploaded, call the Complete Upload endpoint.Documentation Index
Fetch the complete documentation index at: https://docs.bota.dev/llms.txt
Use this file to discover all available pages before exploring further.
Authentication
This endpoint accepts two authentication methods:| Auth | Use case |
|---|---|
| API key | Backend uploading on behalf of devices (BLE sync) |
| Device token | 4G/WiFi devices uploading directly |
Path Parameters
The recording’s unique identifier (e.g.,
rec_abc123).Request Body
Media type:
audio, image, or video.MIME type of the file. Defaults based on
type:- Audio (default:
audio/opus):audio/opus,audio/wav,audio/mpeg,audio/mp4,audio/webm,audio/ogg,audio/flac - Image:
image/jpeg,image/png - Video:
video/mp4
Expected file size in bytes. Used for validation.
ISO 8601 timestamp of when the media was captured. Used to align images/video with the recording timeline. Optional for audio.
Response
Returns a media record ID, a pre-signed S3 upload URL, required headers, and an expiration timestamp.Response Fields
| Field | Type | Description |
|---|---|---|
media_id | string | Identifier for the created media record (med_*) |
upload_url | string | Pre-signed S3 URL for uploading the file via PUT request |
expires_at | string | ISO 8601 timestamp when the upload URL expires (1 hour from creation) |
headers | object | HTTP headers to include when uploading to S3 (e.g., Content-Type) |
Uploading the File
After obtaining the pre-signed URL, upload the file directly to S3:cURL
Node.js
Python
Multi-File Upload
A single recording can have multiple media files. Call this endpoint once per file:Upload URLs expire after 1 hour. If expired, request a new URL. After all files are uploaded, call the Complete Upload endpoint to finalize.

