Upload a new asset
Uploads a new asset file (image or video) along with its metadata to the specified library. If no library_id is provided and the user only has one library, uses that library. If the user has multiple libraries, library_id is required.
Body
Response
Successful Response
Represents a photo or video asset with metadata and access URLs.
Unique asset identifier with 'asset_' prefix
MIME type of the file (e.g., 'image/jpeg', 'video/mp4')
Original filename when the asset was uploaded
When the photo/video was taken, in the device's local timezone
When this asset record was created in the database
When this asset record was last updated
File/provenance scalars (device IDs, file timestamps, checksums, file size) grouped into one nested object. null when not requested via include=file_data; when present, every field is populated (checksum_sha1 may still be null for legacy rows).
Asset metadata — camera/EXIF fields, GPS, and location names. null when not requested via include=metadata.
ML-generated quality scores and other metrics. null when not requested via include=metrics.
Named asset variants. Images: 'original', 'thumbnail', 'small', 'preview', 'fullsize'. Videos: 'original', plus 'thumbnail_image', 'small_image', 'preview_image', 'fullsize_image' pointing at the extracted still. Variant URLs are stable: a derived variant may briefly 404 until its artifact is generated, then serve from the same URL.
AI-generated description of the asset's content, quality, and composition. null means description generation has not yet run; empty string means the model refused to describe the asset. Distinct from metadata.description (camera-embedded EXIF metadata).
Base64-encoded ThumbHash placeholder (~28 chars). Clients decode with the thumbhash library (JS / Swift / Kotlin) to render an instant blurred preview before the CDN thumbnail arrives. null while generation is pending.
All faces detected in this asset. null when not requested via include=faces; [] when requested but the asset has no faces.
All unique people identified in this asset (deduplicated from faces). null when not requested via include=people; [] when requested but none are identified.
Width of the asset in pixels
Height of the asset in pixels
Video length in seconds. null for images and for videos whose duration has not been extracted yet.
When this asset was moved to trash (ISO 8601, UTC). null for live assets. Trashed assets are excluded from default list/search results and are purged after the configured retention window.