Download OpenAPI specification:
Media management system API with asset features
Get aggregated processing activity per queue, including recent error samples
| error_limit | integer Recent error samples per queue (default: 5, max: 20) |
{ }{- "generated_at": "string",
- "queues": [
- {
- "attention_jobs": 0,
- "average_latency_ms": 0,
- "average_runtime_ms": 0,
- "error_samples": [
- {
- "attempt": 0,
- "attempted_at": "string",
- "created_at": "string",
- "finalized_at": "string",
- "job_id": 0,
- "kind": "string",
- "last_error": "string",
- "max_attempts": 0,
- "scheduled_at": "string",
- "state": "string"
}
], - "latest_activity_at": "string",
- "name": "string",
- "oldest_remaining_at": "string",
- "processed_jobs": 0,
- "remaining_jobs": 0,
- "running_jobs": 0,
- "total_jobs": 0
}
]
}Get aggregated statistics about jobs by state
{ }{- "available": 0,
- "cancelled": 0,
- "completed": 0,
- "discarded": 0,
- "retryable": 0,
- "running": 0,
- "scheduled": 0
}[- {
- "count": 24,
- "created_at": "string",
- "layout": {
- "h": 4,
- "w": 4,
- "x": 0,
- "y": 0
}, - "mode": "frozen",
- "pin_id": "7d4df41e-9aa2-4d44-9a3d-111111111111",
- "summary": "string",
- "title": "Kyoto 2025",
- "truncated": true,
- "widget": "asset_grid"
}
]Copy a session ref into a durable board widget. Live mode replays the producing plan on hydration when replayable; otherwise the pin freezes the snapshot.
Pin request
{ }{- "count": 24,
- "created_at": "string",
- "layout": {
- "h": 4,
- "w": 4,
- "x": 0,
- "y": 0
}, - "mode": "frozen",
- "pin_id": "7d4df41e-9aa2-4d44-9a3d-111111111111",
- "summary": "string",
- "title": "Kyoto 2025",
- "truncated": true,
- "widget": "asset_grid"
}Get a page of assets for a pinned widget. Frozen pins serve the stored snapshot; live pins replay their plan.
| id required | string Pin ID |
| limit | integer Page size (default 50, max 200) |
| offset | integer Page offset (default 0) |
{- "assets": [
- {
- "asset_id": "string",
- "capture_offset_minutes": 0,
- "deleted_at": "string",
- "duration": 0,
- "file_size": 0,
- "hash": "string",
- "height": 0,
- "is_deleted": true,
- "liked": true,
- "mime_type": "string",
- "original_filename": "string",
- "owner_id": 0,
- "rating": 0,
- "repository_id": "string",
- "species_predictions": [
- {
- "label": "string",
- "score": 0
}
], - "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}
], - "pagination": {
- "limit": 20,
- "offset": 0
}, - "total": 97
}Persist the board grid placement for one or more pins.
Layout updates
{ }{- "message": "Operation completed successfully"
}Get metadata and facet summary for an agent ref. Refs are scoped to the requesting user and thread.
| id required | string Ref ID |
| thread_id required | string Thread (conversation) the ref belongs to |
{- "count": 97,
- "created_at": "string",
- "facets": {
- "cameras": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "count": 0,
- "date_range": {
- "from": "string",
- "to": "string"
}, - "histogram": [
- {
- "bucket": "2025-04",
- "count": 12
}
], - "liked_count": 0,
- "rating_dist": [
- 0
], - "top_people": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "top_places": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "types": {
- "property1": 0,
- "property2": 0
}
}, - "op": "combine",
- "ref_id": "r3_kyoto",
- "truncated": true
}Get a page of assets for an agent ref, in snapshot order.
| id required | string Ref ID |
| thread_id required | string Thread (conversation) the ref belongs to |
| limit | integer Page size (default 50, max 200) |
| offset | integer Page offset (default 0) |
{- "assets": [
- {
- "asset_id": "string",
- "capture_offset_minutes": 0,
- "deleted_at": "string",
- "duration": 0,
- "file_size": 0,
- "hash": "string",
- "height": 0,
- "is_deleted": true,
- "liked": true,
- "mime_type": "string",
- "original_filename": "string",
- "owner_id": 0,
- "rating": 0,
- "repository_id": "string",
- "species_predictions": [
- {
- "label": "string",
- "score": 0
}
], - "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}
], - "pagination": {
- "limit": 20,
- "offset": 0
}, - "total": 97
}Retrieve a paginated list of albums for the authenticated user
| limit | integer Default: 20 Maximum number of results (max 100) |
| offset | integer Default: 0 Number of results to skip for pagination |
| repository_id | string Optional repository UUID filter |
{ }{- "albums": [
- {
- "album_id": 0,
- "album_name": "string",
- "album_type": "string",
- "asset_count": 0,
- "cover_asset_id": "string",
- "created_at": "string",
- "description": "string",
- "display_cover_asset_id": "string",
- "updated_at": "string",
- "user_id": 0
}
], - "limit": 0,
- "offset": 0,
- "total": 0
}Create a new album for the authenticated user
Album creation data
{ }{- "album_id": 0,
- "album_name": "string",
- "album_type": "string",
- "asset_count": 0,
- "cover_asset_id": "string",
- "created_at": "string",
- "description": "string",
- "display_cover_asset_id": "string",
- "updated_at": "string",
- "user_id": 0
}Delete an album by its ID
| id required | integer Album ID |
{ }{- "message": "Operation completed successfully"
}Retrieve a specific album by its ID
| id required | integer Album ID |
| repository_id | string Optional repository UUID filter |
{ }{- "album_id": 0,
- "album_name": "string",
- "album_type": "string",
- "asset_count": 0,
- "cover_asset_id": "string",
- "created_at": "string",
- "description": "string",
- "display_cover_asset_id": "string",
- "updated_at": "string",
- "user_id": 0
}Update an existing album's information
| id required | integer Album ID |
Album update data
{ }{- "album_id": 0,
- "album_name": "string",
- "album_type": "string",
- "asset_count": 0,
- "cover_asset_id": "string",
- "created_at": "string",
- "description": "string",
- "display_cover_asset_id": "string",
- "updated_at": "string",
- "user_id": 0
}Retrieve all assets in a specific album
| id required | integer Album ID |
| repository_id | string Optional repository UUID filter |
{ }{- "album_id": 0,
- "assets": [
- {
- "added_time": "string",
- "asset_id": "string",
- "capture_offset_minutes": 0,
- "deleted_at": "string",
- "duration": 0,
- "file_size": 0,
- "hash": "string",
- "height": 0,
- "is_deleted": true,
- "liked": true,
- "mime_type": "string",
- "original_filename": "string",
- "owner_id": 0,
- "position": 0,
- "rating": 0,
- "repository_id": "string",
- "species_predictions": [
- {
- "label": "string",
- "score": 0
}
], - "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}
], - "count": 0
}Remove an asset from a specific album
| id required | integer Album ID |
| assetId required | string Asset ID (UUID format) |
{ }{- "message": "Operation completed successfully"
}Add an asset to a specific album
| id required | integer Album ID |
| assetId required | string Asset ID (UUID format) |
Asset position in album
{ }{- "message": "Operation completed successfully"
}Update the position of an asset within a specific album
| id required | integer Album ID |
| assetId required | string Asset ID (UUID format) |
New position data
{ }{- "message": "Operation completed successfully"
}Queue BioCLIP processing for photo assets in a bio album that do not yet have species predictions.
| id required | integer Album ID |
{ }{- "message": "BioCLIP processing queued successfully",
- "queued_assets": 12,
- "status": "queued"
}Retrieve all albums that contain a specific asset
| id required | string Asset ID (UUID format) |
{ }{- "albums": [
- {
- "added_time": "string",
- "album_id": 0,
- "album_name": "string",
- "album_type": "string",
- "asset_count": 0,
- "cover_asset_id": "string",
- "created_at": "string",
- "description": "string",
- "display_cover_asset_id": "string",
- "position": 0,
- "updated_at": "string",
- "user_id": 0
}
], - "asset_id": "string",
- "count": 0
}Upload a single photo, video, audio file, or document to the system. The file is staged in a repository and queued for processing.
| X-Content-Hash | string Client-calculated BLAKE3 hash of the file |
Asset file to upload | Repository UUID (uses default repository if not provided)
{- "content_hash": "abcd1234567890",
- "file_name": "photo.jpg",
- "message": "File received and queued for processing",
- "size": 1048576,
- "status": "processing",
- "task_id": 12345
}Soft delete an asset by marking it as deleted. The physical file is not removed.
| id required | string Example: "550e8400-e29b-41d4-a716-446655440000" Asset ID (UUID format) |
{ }{- "message": "Operation completed successfully"
}Retrieve detailed information about a specific asset. Optionally include thumbnails, tags, albums, species predictions, OCR results, face recognition, and captions.
| id required | string Example: "550e8400-e29b-41d4-a716-446655440000" Asset ID (UUID format) |
| include_thumbnails | boolean Default: true Include thumbnails |
| include_tags | boolean Default: true Include tags |
| include_albums | boolean Default: true Include albums |
| include_species | boolean Default: true Include species predictions |
| include_ocr | boolean Default: false Include OCR results |
| include_faces | boolean Default: false Include face recognition |
{ }{- "albums": [
- {
- "added_time": "string",
- "album_id": 0,
- "album_name": "string",
- "position": 0
}
], - "asset_id": "string",
- "capture_offset_minutes": 0,
- "deleted_at": "string",
- "duration": 0,
- "face_result": {
- "created_at": "string",
- "faces": [
- {
- "age_group": "string",
- "bounding_box": { },
- "cluster_id": 0,
- "cluster_name": "string",
- "confidence": 0,
- "ethnicity": "string",
- "expression": "string",
- "face_id": "string",
- "gender": "string",
- "id": 0,
- "is_primary": true
}
], - "model_id": "string",
- "processing_time_ms": 0,
- "total_faces": 0,
- "updated_at": "string"
}, - "file_size": 0,
- "hash": "string",
- "height": 0,
- "is_deleted": true,
- "liked": true,
- "mime_type": "string",
- "ocr_result": {
- "created_at": "string",
- "model_id": "string",
- "processing_time_ms": 0,
- "text_items": [
- {
- "area_pixels": 0,
- "bounding_box": { },
- "confidence": 0,
- "id": 0,
- "text_content": "string",
- "text_length": 0
}
], - "total_count": 0,
- "updated_at": "string"
}, - "original_filename": "string",
- "owner_id": 0,
- "rating": 0,
- "repository_id": "string",
- "species_predictions": [
- {
- "label": "string",
- "score": 0
}
], - "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "tags": [
- {
- "confidence": 0,
- "tag_id": 0,
- "tag_name": "string"
}
], - "taken_time": "string",
- "thumbnails": [
- {
- "mime_type": "string",
- "size": "string",
- "storage_path": "string",
- "thumbnail_id": "string"
}
], - "type": "string",
- "upload_time": "string",
- "width": 0
}Update the specific metadata of an asset (e.g., photo EXIF data, video metadata).
| id required | string Example: "550e8400-e29b-41d4-a716-446655440000" Asset ID (UUID format) |
Asset metadata
dbtypes.PhotoSpecificMetadata (object) or dbtypes.VideoSpecificMetadata (object) or dbtypes.AudioSpecificMetadata (object) |
{- "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}
}{- "message": "Operation completed successfully"
}Associate an asset with a specific album by asset ID and album ID.
| id required | string Example: "550e8400-e29b-41d4-a716-446655440000" Asset ID (UUID format) |
| albumId required | integer Example: 123 Album ID |
{ }{- "message": "Operation completed successfully"
}Update the description metadata of an asset
| id required | string Asset ID |
Description data
| description | string |
{- "description": "A beautiful sunset photo"
}{- "message": "Operation completed successfully"
}Retrieve the full exiftool JSON object stored for an asset during metadata processing.
| id required | string Example: "550e8400-e29b-41d4-a716-446655440000" Asset ID (UUID format) |
{ }{- "asset_id": "string",
- "exif_raw": { }
}Re-encode an asset's original file to JPEG, PNG, WebP, or AVIF with optional max dimensions and quality, and stream it back as a download.
| id required | string Asset ID |
| format required | string Output format (jpeg, png, webp, avif) |
| quality | integer Quality 1-100 for lossy formats |
| max_width | integer Maximum output width in pixels |
| max_height | integer Maximum output height in pixels |
| filename | string Base download filename (without extension) |
Update the like/favorite status of a specific asset
| id required | string Asset ID |
Like data
| liked | boolean |
{- "liked": true
}{- "message": "Operation completed successfully"
}Update the rating (0-5) of a specific asset
| id required | string Asset ID |
Rating data
| rating | integer [ 0 .. 5 ] |
{- "rating": 5
}{- "message": "Operation completed successfully"
}Update both the rating (0-5) and like/favorite status of a specific asset
| id required | string Asset ID |
Rating and like data
| liked | boolean |
| rating | integer [ 0 .. 5 ] |
{- "liked": true,
- "rating": 5
}{- "message": "Operation completed successfully"
}Reprocess a failed or warning asset by resetting its status and re-enqueuing for processing
| id required | string Asset ID |
Reprocessing tasks (optional)
| force_full_retry | boolean |
| tasks | Array of strings |
{- "force_full_retry": false,
- "tasks": [
- "thumbnail_small",
- "thumbnail_medium",
- "transcode_1080p"
]
}{- "asset_id": "550e8400-e29b-41d4-a716-446655440000",
- "failed_tasks": [
- "thumbnail_small",
- "transcode_1080p"
], - "message": "Reprocessing job queued successfully",
- "retry_tasks": [
- "thumbnail_small",
- "transcode_1080p"
], - "status": "queued"
}Restore a soft-deleted asset from Trash. The original file is not moved.
| id required | string Example: "550e8400-e29b-41d4-a716-446655440000" Asset ID (UUID format) |
{ }{- "message": "Operation completed successfully"
}Retrieve the non-destructive Studio edit sidecar stored under the asset repository .lumilio directory.
| id required | string Example: "550e8400-e29b-41d4-a716-446655440000" Asset ID (UUID format) |
{ }{- "asset_id": "550e8400-e29b-41d4-a716-446655440000",
- "exists": true,
- "sidecar": {
- "adjustments": {
- "blacks": 0,
- "clarity": 0,
- "contrast": 0,
- "crop": {
- "height": 800,
- "width": 1000,
- "x": 0,
- "y": 0
}, - "exposure": 0,
- "flipHorizontal": false,
- "flipVertical": false,
- "highlights": 0,
- "noiseReduction": 0,
- "rotation": 0,
- "saturation": 0,
- "shadows": 0,
- "sharpness": 0,
- "temperature": 0,
- "tint": 0,
- "vibrance": 0,
- "whites": 0
}, - "asset_id": "550e8400-e29b-41d4-a716-446655440000",
- "source": {
- "file_size": 1048576,
- "hash": "abcd1234567890",
- "height": 4000,
- "mime_type": "image/jpeg",
- "original_filename": "IMG_0001.jpg",
- "storage_path": "inbox/2026/05/IMG_0001.jpg",
- "width": 6000
}, - "updated_at": "2026-05-26T10:00:00Z",
- "version": 1
}
}Store non-destructive Studio edit data under the asset repository .lumilio directory.
| id required | string Example: "550e8400-e29b-41d4-a716-446655440000" Asset ID (UUID format) |
Sidecar payload
object (dto.StudioEditAdjustmentsDTO) | |
| asset_id | string |
object (dto.LumilioSidecarSourceDTO) | |
| updated_at | string |
| version | integer |
{- "adjustments": {
- "blacks": 0,
- "clarity": 0,
- "contrast": 0,
- "crop": {
- "height": 800,
- "width": 1000,
- "x": 0,
- "y": 0
}, - "exposure": 0,
- "flipHorizontal": false,
- "flipVertical": false,
- "highlights": 0,
- "noiseReduction": 0,
- "rotation": 0,
- "saturation": 0,
- "shadows": 0,
- "sharpness": 0,
- "temperature": 0,
- "tint": 0,
- "vibrance": 0,
- "whites": 0
}, - "asset_id": "550e8400-e29b-41d4-a716-446655440000",
- "source": {
- "file_size": 1048576,
- "hash": "abcd1234567890",
- "height": 4000,
- "mime_type": "image/jpeg",
- "original_filename": "IMG_0001.jpg",
- "storage_path": "inbox/2026/05/IMG_0001.jpg",
- "width": 6000
}, - "updated_at": "2026-05-26T10:00:00Z",
- "version": 1
}{- "asset_id": "550e8400-e29b-41d4-a716-446655440000",
- "exists": true,
- "sidecar": {
- "adjustments": {
- "blacks": 0,
- "clarity": 0,
- "contrast": 0,
- "crop": {
- "height": 800,
- "width": 1000,
- "x": 0,
- "y": 0
}, - "exposure": 0,
- "flipHorizontal": false,
- "flipVertical": false,
- "highlights": 0,
- "noiseReduction": 0,
- "rotation": 0,
- "saturation": 0,
- "shadows": 0,
- "sharpness": 0,
- "temperature": 0,
- "tint": 0,
- "vibrance": 0,
- "whites": 0
}, - "asset_id": "550e8400-e29b-41d4-a716-446655440000",
- "source": {
- "file_size": 1048576,
- "hash": "abcd1234567890",
- "height": 4000,
- "mime_type": "image/jpeg",
- "original_filename": "IMG_0001.jpg",
- "storage_path": "inbox/2026/05/IMG_0001.jpg",
- "width": 6000
}, - "updated_at": "2026-05-26T10:00:00Z",
- "version": 1
}
}Returns the stack (group) that contains the specified asset
| id required | string Asset ID |
{- "asset_id": "string",
- "stack": {
- "member_count": 3,
- "members": [
- {
- "asset_id": "550e8400-e29b-41d4-a716-446655440001",
- "position": 0,
- "relation": "raw_original"
}
], - "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo"
}
}Retrieve a specific thumbnail image for an asset by asset ID and size parameter. Returns the image file directly.
| id required | string Example: "550e8400-e29b-41d4-a716-446655440000" Asset ID (UUID format) |
| size | string Default: "medium" Enum: "small" "medium" "large" Thumbnail size |
Unified batch upload endpoint that supports both small files and chunked large files. Field names should follow format: single_{session_id} for single files or chunk_{session_id}{index}{total} for chunks.
Repository UUID (uses default repository if not provided) | Single file upload - use format: single_{session_id} | Chunked file upload - use format: chunk_{session_id}{index}{total}
{- "results": [
- {
- "content_hash": "string",
- "error": "string",
- "file_name": "string",
- "message": "string",
- "size": 0,
- "status": "string",
- "success": true,
- "task_id": 0
}
]
}Get current upload configuration including chunk size and concurrency limits based on system memory
{ }{- "chunk_size": 0,
- "max_concurrent": 0,
- "max_in_flight_requests": 0,
- "memory_buffer": 0,
- "merge_concurrency": 0
}Get detailed progress information for upload sessions
| session_ids | string Comma-separated session IDs (optional) |
{ }{- "sessions": [
- {
- "bytes_done": 0,
- "bytes_total": 0,
- "filename": "string",
- "last_activity": "string",
- "progress": 0,
- "received_chunks": 0,
- "session_id": "string",
- "status": "string",
- "total_chunks": 0
}
], - "summary": {
- "active_sessions": 0,
- "completed_files": 0,
- "failed_sessions": 0,
- "overall_progress": 0,
- "total_sessions": 0
}
}Serve original files for the requested asset IDs as a zip archive.
Asset IDs to download
| asset_ids required | Array of strings |
{- "asset_ids": [
- "550e8400-e29b-41d4-a716-446655440000",
- "550e8400-e29b-41d4-a716-446655440001"
]
}Select a small set of featured photos using deterministic weighted sampling (A-ES) with diversity constraints.
| count | integer Default: 8 Number of featured photos to return |
| candidate_limit | integer Default: 240 Max candidate photos considered before selection |
| days | integer Default: 3650 Only consider photos from the last N days (0 disables date cutoff) |
| seed | string Deterministic seed (default: current UTC date YYYY-MM-DD) |
| repository_id | string Optional repository UUID filter |
{ }{- "assets": [
- {
- "asset_id": "string",
- "capture_offset_minutes": 0,
- "deleted_at": "string",
- "duration": 0,
- "file_size": 0,
- "hash": "string",
- "height": 0,
- "is_deleted": true,
- "liked": true,
- "mime_type": "string",
- "original_filename": "string",
- "owner_id": 0,
- "rating": 0,
- "repository_id": "string",
- "species_predictions": [
- {
- "label": "string",
- "score": 0
}
], - "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}
], - "candidate_count": 240,
- "count": 8,
- "generated_at_time": "2026-02-10T12:00:00Z",
- "seed": "2026-02-10",
- "strategy": "weighted_aes_v1"
}Queue a background batch that backfills AI indexing for existing photos.
Reindex request
| limit | integer [ 1 .. 500 ] |
| missing_only | boolean |
| repository_id | string |
| tasks | Array of strings |
{- "limit": 200,
- "missing_only": true,
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "tasks": [
- "semantic",
- "ocr"
]
}{- "disabled_tasks": [
- "string"
], - "job_id": 123,
- "limit": 200,
- "message": "Index rebuild job queued successfully",
- "missing_only": true,
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "requested_tasks": [
- "string"
], - "status": "queued"
}Return repositories that can be used to scope indexing stats and reindex requests.
{ }{- "repositories": [
- {
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "is_primary": false,
- "name": "Photos Library",
- "path": "/Volumes/Media/Photos",
- "role": "regular"
}
]
}Return indexing coverage and queued job counts for photo AI tasks.
| repository_id | string Optional repository UUID filter |
{ }{- "photo_total": 2400,
- "reindex_jobs": 1,
- "tasks": {
- "bioclip": {
- "indexed_count": 1200,
- "queued_jobs": 12,
- "total_count": 2400
}, - "face": {
- "indexed_count": 1200,
- "queued_jobs": 12,
- "total_count": 2400
}, - "ocr": {
- "indexed_count": 1200,
- "queued_jobs": 12,
- "total_count": 2400
}, - "semantic": {
- "indexed_count": 1200,
- "queued_jobs": 12,
- "total_count": 2400
}
}
}Get all assets that have been liked/favorited
| limit | integer Default: 20 Number of assets to return |
| offset | integer Default: 0 Number of assets to skip |
{ }{- "assets": [
- {
- "asset_id": "string",
- "capture_offset_minutes": 0,
- "deleted_at": "string",
- "duration": 0,
- "file_size": 0,
- "hash": "string",
- "height": 0,
- "is_deleted": true,
- "liked": true,
- "mime_type": "string",
- "original_filename": "string",
- "owner_id": 0,
- "rating": 0,
- "repository_id": "string",
- "species_predictions": [
- {
- "label": "string",
- "score": 0
}
], - "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}
], - "limit": 20,
- "offset": 0,
- "total": 150
}Unified endpoint for listing, filtering, and searching assets. Replaces separate /filter and /search endpoints.
Query parameters
object (dto.AssetFilterDTO) Unified filter options | |
object (dto.PaginationDTO) limit, offset | |
| query | string Search keyword (optional) |
| search_type | string Enum: "filename" "semantic" "filename" (default) | "semantic" |
| sort_by | string Enum: "recently_added" "date_captured" |
| stack_mode | string Enum: "collapsed" "expanded" |
| viewer_timezone | string |
{- "filter": {
- "album_id": 123,
- "camera_model": "Canon EOS R5",
- "date": {
- "from": "string",
- "to": "string"
}, - "filename": {
- "operator": "starts_with",
- "value": "IMG_"
}, - "is_deleted": false,
- "lens": "EF 50mm f/1.8",
- "liked": true,
- "location": {
- "east": -122.3,
- "north": 37.9,
- "south": 37.7,
- "west": -122.5
}, - "owner_id": 123,
- "rating": 5,
- "raw": true,
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "tag_name": "document",
- "tag_source": "zeroshot",
- "type": "PHOTO",
- "types": [
- "PHOTO",
- "VIDEO"
]
}, - "pagination": {
- "limit": 20,
- "offset": 0
}, - "query": "sunset photo",
- "search_type": "filename",
- "sort_by": "date_captured",
- "stack_mode": "collapsed",
- "viewer_timezone": "America/New_York"
}{- "items": [
- {
- "asset": {
- "asset_id": "string",
- "capture_offset_minutes": 0,
- "deleted_at": "string",
- "duration": 0,
- "file_size": 0,
- "hash": "string",
- "height": 0,
- "is_deleted": true,
- "liked": true,
- "mime_type": "string",
- "original_filename": "string",
- "owner_id": 0,
- "rating": 0,
- "repository_id": "string",
- "species_predictions": [
- {
- "label": "string",
- "score": 0
}
], - "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "id": "stack:550e8400-e29b-41d4-a716-446655440000",
- "stack": {
- "cover_asset": {
- "asset_id": "string",
- "capture_offset_minutes": 0,
- "deleted_at": "string",
- "duration": 0,
- "file_size": 0,
- "hash": "string",
- "height": 0,
- "is_deleted": true,
- "liked": true,
- "mime_type": "string",
- "original_filename": "string",
- "owner_id": 0,
- "rating": 0,
- "repository_id": "string",
- "species_predictions": [
- {
- "label": "string",
- "score": 0
}
], - "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "cover_asset_id": "550e8400-e29b-41d4-a716-446655440001",
- "matched_member_ids": [
- "string"
], - "member_asset_ids": [
- "string"
], - "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "type": "stack"
}
], - "limit": 20,
- "offset": 0,
- "stack_mode": "collapsed",
- "total_assets": 150,
- "total_visible": 120
}Return lightweight paginated photo records containing only map-related fields (asset ID, filename, times, GPS lat/lon).
| limit | integer Default: 1000 Page size (1-5000) |
| offset | integer Default: 0 Page offset |
| repository_id | string Optional repository UUID filter |
{ }{- "limit": 1000,
- "offset": 0,
- "points": [
- {
- "asset_id": "550e8400-e29b-41d4-a716-446655440000",
- "gps_latitude": 37.7749,
- "gps_longitude": -122.4194,
- "original_filename": "IMG_1234.HEIC",
- "taken_time": "2026-02-09T08:30:00Z",
- "upload_time": "2026-02-10T12:00:00Z"
}
], - "total": 1500
}Get assets with a specific rating (0-5)
| rating required | integer Rating (0-5) |
| limit | integer Default: 20 Number of assets to return |
| offset | integer Default: 0 Number of assets to skip |
{ }{- "assets": [
- {
- "asset_id": "string",
- "capture_offset_minutes": 0,
- "deleted_at": "string",
- "duration": 0,
- "file_size": 0,
- "hash": "string",
- "height": 0,
- "is_deleted": true,
- "liked": true,
- "mime_type": "string",
- "original_filename": "string",
- "owner_id": 0,
- "rating": 0,
- "repository_id": "string",
- "species_predictions": [
- {
- "label": "string",
- "score": 0
}
], - "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}
], - "limit": 20,
- "offset": 0,
- "total": 150
}Search assets with optional top results enhancement and filename fallback.
Search parameters
| debug | boolean |
| enhancement_mode | string Enum: "auto" "off" "only" |
object (dto.AssetFilterDTO) Unified filter options | |
object (dto.PaginationDTO) limit, offset | |
| query | string |
| sort_by | string Enum: "recently_added" "date_captured" |
| stack_mode | string Enum: "collapsed" "expanded" |
| top_results_limit | integer [ 1 .. 200 ] |
| viewer_timezone | string |
{- "debug": true,
- "enhancement_mode": "auto",
- "filter": {
- "album_id": 123,
- "camera_model": "Canon EOS R5",
- "date": {
- "from": "string",
- "to": "string"
}, - "filename": {
- "operator": "starts_with",
- "value": "IMG_"
}, - "is_deleted": false,
- "lens": "EF 50mm f/1.8",
- "liked": true,
- "location": {
- "east": -122.3,
- "north": 37.9,
- "south": 37.7,
- "west": -122.5
}, - "owner_id": 123,
- "rating": 5,
- "raw": true,
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "tag_name": "document",
- "tag_source": "zeroshot",
- "type": "PHOTO",
- "types": [
- "PHOTO",
- "VIDEO"
]
}, - "pagination": {
- "limit": 20,
- "offset": 0
}, - "query": "red bird on branch",
- "sort_by": "date_captured",
- "stack_mode": "collapsed",
- "top_results_limit": 200,
- "viewer_timezone": "America/New_York"
}{- "limit": 20,
- "offset": 0,
- "result_items": [
- {
- "asset": {
- "asset_id": "string",
- "capture_offset_minutes": 0,
- "deleted_at": "string",
- "duration": 0,
- "file_size": 0,
- "hash": "string",
- "height": 0,
- "is_deleted": true,
- "liked": true,
- "mime_type": "string",
- "original_filename": "string",
- "owner_id": 0,
- "rating": 0,
- "repository_id": "string",
- "species_predictions": [
- {
- "label": "string",
- "score": 0
}
], - "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "id": "stack:550e8400-e29b-41d4-a716-446655440000",
- "stack": {
- "cover_asset": {
- "asset_id": "string",
- "capture_offset_minutes": 0,
- "deleted_at": "string",
- "duration": 0,
- "file_size": 0,
- "hash": "string",
- "height": 0,
- "is_deleted": true,
- "liked": true,
- "mime_type": "string",
- "original_filename": "string",
- "owner_id": 0,
- "rating": 0,
- "repository_id": "string",
- "species_predictions": [
- {
- "label": "string",
- "score": 0
}
], - "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "cover_asset_id": "550e8400-e29b-41d4-a716-446655440001",
- "matched_member_ids": [
- "string"
], - "member_asset_ids": [
- "string"
], - "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "type": "stack"
}
], - "results_total_assets": 150,
- "results_total_visible": 120,
- "stack_mode": "collapsed",
- "top_items": [
- {
- "asset": {
- "asset_id": "string",
- "capture_offset_minutes": 0,
- "deleted_at": "string",
- "duration": 0,
- "file_size": 0,
- "hash": "string",
- "height": 0,
- "is_deleted": true,
- "liked": true,
- "mime_type": "string",
- "original_filename": "string",
- "owner_id": 0,
- "rating": 0,
- "repository_id": "string",
- "species_predictions": [
- {
- "label": "string",
- "score": 0
}
], - "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "id": "stack:550e8400-e29b-41d4-a716-446655440000",
- "stack": {
- "cover_asset": {
- "asset_id": "string",
- "capture_offset_minutes": 0,
- "deleted_at": "string",
- "duration": 0,
- "file_size": 0,
- "hash": "string",
- "height": 0,
- "is_deleted": true,
- "liked": true,
- "mime_type": "string",
- "original_filename": "string",
- "owner_id": 0,
- "rating": 0,
- "repository_id": "string",
- "species_predictions": [
- {
- "label": "string",
- "score": 0
}
], - "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "cover_asset_id": "550e8400-e29b-41d4-a716-446655440001",
- "matched_member_ids": [
- "string"
], - "member_asset_ids": [
- "string"
], - "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "type": "stack"
}
], - "top_results_meta": {
- "candidate_count": 0,
- "candidate_pool_size": 0,
- "debug": [
- {
- "asset_id": "string",
- "contributions": {
- "property1": {
- "rank": 0,
- "raw_score": 0,
- "rrf_score": 0,
- "weight": 0
}, - "property2": {
- "rank": 0,
- "raw_score": 0,
- "rrf_score": 0,
- "weight": 0
}
}, - "score": 0
}
], - "degraded": true,
- "enabled": true,
- "reason": "runtime_unavailable",
- "source_types": [
- "embedding",
- "ocr",
- "place"
], - "sources": [
- {
- "candidate_count": 0,
- "duration_ms": 0,
- "error": "string",
- "type": "string",
- "weight": 0
}
]
}
}Manually groups the specified assets into a new stack
Asset IDs to stack
| asset_ids | Array of strings |
{- "asset_ids": [
- "550e8400-e29b-41d4-a716-446655440000",
- "550e8400-e29b-41d4-a716-446655440001"
]
}{- "member_count": 3,
- "members": [
- {
- "asset_id": "550e8400-e29b-41d4-a716-446655440001",
- "position": 0,
- "relation": "raw_original"
}
], - "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo"
}Authenticate user with username and password. Returns an MFA challenge instead of session tokens when TOTP is enabled.
Login credentials
{ }{- "bootstrap_admin": true,
- "expiresAt": "string",
- "mfa_methods": [
- "string"
], - "mfa_token": "string",
- "refreshToken": "string",
- "requires_mfa": true,
- "token": "string",
- "user": {
- "avatar_asset_id": "string",
- "created_at": "string",
- "display_name": "string",
- "is_active": true,
- "last_login": "string",
- "permissions": [
- "string"
], - "role": "string",
- "updated_at": "string",
- "user_id": 0,
- "username": "string"
}
}Revoke the user's refresh token
Refresh token to revoke
{ }{- "message": "Operation completed successfully"
}Get information about the currently authenticated user
{ }{- "avatar_asset_id": "string",
- "created_at": "string",
- "display_name": "string",
- "is_active": true,
- "last_login": "string",
- "permissions": [
- "string"
], - "role": "string",
- "updated_at": "string",
- "user_id": 0,
- "username": "string"
}Generate a short-lived media token for image/video/audio URL authorization in browser media elements.
{ }{- "expires_at": "string",
- "token": "string"
}Get the authenticated user's MFA status, including TOTP enablement and remaining recovery codes.
{ }{- "available_methods": [
- "string"
], - "passkey_count": 0,
- "recovery_codes_generated_at": "string",
- "recovery_codes_remaining": 0,
- "totp_enabled": true
}List the authenticated user's enrolled passkeys.
{ }{- "credentials": [
- {
- "created_at": "string",
- "label": "string",
- "last_used_at": "string",
- "passkey_id": 0,
- "transports": [
- "string"
]
}
], - "total": 0
}Delete one enrolled passkey for the authenticated user.
| id required | integer Passkey ID |
{ }{- "message": "Operation completed successfully"
}Create WebAuthn registration options to add a new passkey to the authenticated account.
{ }{- "challenge_token": "string",
- "options": null
}Verify a passkey enrollment response and attach the new passkey to the authenticated account.
Passkey enrollment verification payload
{ }{- "created_at": "string",
- "label": "string",
- "last_used_at": "string",
- "passkey_id": 0,
- "transports": [
- "string"
]
}Generate a fresh set of recovery codes for the authenticated user.
Recovery code regeneration payload
{ }{- "generated_at": "string",
- "recovery_codes": [
- "string"
], - "status": {
- "available_methods": [
- "string"
], - "passkey_count": 0,
- "recovery_codes_generated_at": "string",
- "recovery_codes_remaining": 0,
- "totp_enabled": true
}
}Disable TOTP MFA and invalidate recovery codes for the authenticated user.
Disable TOTP payload
{ }{- "available_methods": [
- "string"
], - "passkey_count": 0,
- "recovery_codes_generated_at": "string",
- "recovery_codes_remaining": 0,
- "totp_enabled": true
}Verify a TOTP setup code and enable TOTP MFA for the authenticated user.
TOTP enable payload
{ }{- "generated_at": "string",
- "recovery_codes": [
- "string"
], - "status": {
- "available_methods": [
- "string"
], - "passkey_count": 0,
- "recovery_codes_generated_at": "string",
- "recovery_codes_remaining": 0,
- "totp_enabled": true
}
}Generate a new TOTP secret and setup token for the authenticated user.
{ }{- "account_name": "string",
- "issuer": "string",
- "otpauth_uri": "string",
- "secret": "string",
- "setup_token": "string"
}Verify a pending MFA login challenge with a TOTP code or recovery code.
MFA verification payload
{ }{- "bootstrap_admin": true,
- "expiresAt": "string",
- "mfa_methods": [
- "string"
], - "mfa_token": "string",
- "refreshToken": "string",
- "requires_mfa": true,
- "token": "string",
- "user": {
- "avatar_asset_id": "string",
- "created_at": "string",
- "display_name": "string",
- "is_active": true,
- "last_login": "string",
- "permissions": [
- "string"
], - "role": "string",
- "updated_at": "string",
- "user_id": 0,
- "username": "string"
}
}Create WebAuthn login options for a username-first passkey login flow.
Username for passkey login
{ }{- "challenge_token": "string",
- "options": null
}Verify a passkey login assertion and issue session tokens.
Passkey login verification payload
{ }{- "bootstrap_admin": true,
- "expiresAt": "string",
- "mfa_methods": [
- "string"
], - "mfa_token": "string",
- "refreshToken": "string",
- "requires_mfa": true,
- "token": "string",
- "user": {
- "avatar_asset_id": "string",
- "created_at": "string",
- "display_name": "string",
- "is_active": true,
- "last_login": "string",
- "permissions": [
- "string"
], - "role": "string",
- "updated_at": "string",
- "user_id": 0,
- "username": "string"
}
}Generate a new access token using a valid refresh token
Refresh token
{ }{- "bootstrap_admin": true,
- "expiresAt": "string",
- "mfa_methods": [
- "string"
], - "mfa_token": "string",
- "refreshToken": "string",
- "requires_mfa": true,
- "token": "string",
- "user": {
- "avatar_asset_id": "string",
- "created_at": "string",
- "display_name": "string",
- "is_active": true,
- "last_login": "string",
- "permissions": [
- "string"
], - "role": "string",
- "updated_at": "string",
- "user_id": 0,
- "username": "string"
}
}Create a new account from a username and password and issue session tokens. MFA (TOTP/passkey) is optional and added afterwards.
Registration data
{ }{- "bootstrap_admin": true,
- "expiresAt": "string",
- "mfa_methods": [
- "string"
], - "mfa_token": "string",
- "refreshToken": "string",
- "requires_mfa": true,
- "token": "string",
- "user": {
- "avatar_asset_id": "string",
- "created_at": "string",
- "display_name": "string",
- "is_active": true,
- "last_login": "string",
- "permissions": [
- "string"
], - "role": "string",
- "updated_at": "string",
- "user_id": 0,
- "username": "string"
}
}Return a de-sensitized view of backend ML and LLM runtime capabilities without exposing secrets.
{ }{- "llm": {
- "agent_enabled": true,
- "configured": true,
- "model_name": "gpt-4.1-mini",
- "provider": "openai"
}, - "ml": {
- "active_node_count": 1,
- "discovered_node_count": 2,
- "tasks": {
- "bioclip_classify": {
- "available": true,
- "enabled": true
}, - "face_recognition": {
- "available": true,
- "enabled": true
}, - "ocr": {
- "available": true,
- "enabled": true
}, - "semantic_image_embed": {
- "available": true,
- "enabled": true
}, - "semantic_text_embed": {
- "available": true,
- "enabled": true
}
}
}
}Embed positive/negative prompts with semantic and return library assets whose contrastive score exceeds the threshold. Used to tune prompts and thresholds before persisting a smart album. Requires the semantic embedding pipeline and a reachable semantic text-embed task.
Prompts and threshold
{ }{- "count": 0,
- "matches": [
- {
- "asset_id": "string",
- "score": 0
}
]
}List configured cloud credentials without exposing secrets.
{- "credentials": [
- {
- "created_at": "string",
- "display_name": "Personal cloud account",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "provider": "icloud",
- "provider_title": "iCloud",
- "public_config": {
- "property1": "string",
- "property2": "string"
}, - "status": "connected",
- "updated_at": "string"
}
]
}Authenticate with a cloud provider and save a repo-reusable credential. Provider-specific challenges return auth_status=challenge_required.
Cloud credential
{ }{- "auth_status": "connected",
- "challenge": {
- "description": "Enter the code sent to your trusted devices.",
- "fields": [
- {
- "autocomplete": "username",
- "help_text": "string",
- "label": "Apple ID",
- "name": "username",
- "options": [
- {
- "label": "Global",
- "value": "com"
}
], - "required": true,
- "type": "email"
}
], - "title": "Verification required",
- "type": "verification_code"
}, - "credential": {
- "created_at": "string",
- "display_name": "Personal cloud account",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "provider": "icloud",
- "provider_title": "iCloud",
- "public_config": {
- "property1": "string",
- "property2": "string"
}, - "status": "connected",
- "updated_at": "string"
}
}Permanently delete a cloud credential, its session data, and unbind associated repositories.
| id required | string Credential UUID |
{- "message": "Operation completed successfully"
}Submit challenge inputs to complete cloud credential creation.
| id required | string Credential UUID |
Challenge inputs
{ }{- "auth_status": "connected",
- "credential": {
- "created_at": "string",
- "display_name": "Personal cloud account",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "provider": "icloud",
- "provider_title": "iCloud",
- "public_config": {
- "property1": "string",
- "property2": "string"
}, - "status": "connected",
- "updated_at": "string"
}
}Re-authenticate a disconnected or errored credential. If no password is provided, attempts to reuse the existing session.
| id required | string Credential UUID |
Reconnect inputs
{ }{- "auth_status": "connected",
- "challenge": {
- "description": "Enter the code sent to your trusted devices.",
- "fields": [
- {
- "autocomplete": "username",
- "help_text": "string",
- "label": "Apple ID",
- "name": "username",
- "options": [
- {
- "label": "Global",
- "value": "com"
}
], - "required": true,
- "type": "email"
}
], - "title": "Verification required",
- "type": "verification_code"
}, - "credential": {
- "created_at": "string",
- "display_name": "Personal cloud account",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "provider": "icloud",
- "provider_title": "iCloud",
- "public_config": {
- "property1": "string",
- "property2": "string"
}, - "status": "connected",
- "updated_at": "string"
}
}Return a cloud import run by ID.
| id required | string Import run UUID |
{- "created_at": "string",
- "credential_id": "550e8400-e29b-41d4-a716-446655440000",
- "downloaded_count": 80,
- "error": "string",
- "failed_count": 5,
- "finished_at": "string",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "imported_count": 75,
- "provider": "icloud",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "skipped_count": 40,
- "started_at": "string",
- "status": "running",
- "total_seen": 120,
- "updated_at": "string"
}List cloud provider descriptors for credential creation.
{- "providers": [
- {
- "challenge_fields": [
- {
- "autocomplete": "username",
- "help_text": "string",
- "label": "Apple ID",
- "name": "username",
- "options": [
- {
- "label": "Global",
- "value": "com"
}
], - "required": true,
- "type": "email"
}
], - "description": "Import originals from iCloud Photos.",
- "form_fields": [
- {
- "autocomplete": "username",
- "help_text": "string",
- "label": "Apple ID",
- "name": "username",
- "options": [
- {
- "label": "Global",
- "value": "com"
}
], - "required": true,
- "type": "email"
}
], - "id": "icloud",
- "security_note": "string",
- "status": "enabled",
- "title": "iCloud"
}
]
}Return cloud credential binding and latest import run for a repository.
| id required | string Repository UUID |
{- "credential": {
- "created_at": "string",
- "display_name": "Personal cloud account",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "provider": "icloud",
- "provider_title": "iCloud",
- "public_config": {
- "property1": "string",
- "property2": "string"
}, - "status": "connected",
- "updated_at": "string"
}, - "enabled": true,
- "last_import_run_id": "string",
- "latest_run": {
- "created_at": "string",
- "credential_id": "550e8400-e29b-41d4-a716-446655440000",
- "downloaded_count": 80,
- "error": "string",
- "failed_count": 5,
- "finished_at": "string",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "imported_count": 75,
- "provider": "icloud",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "skipped_count": 40,
- "started_at": "string",
- "status": "running",
- "total_seen": 120,
- "updated_at": "string"
}, - "provider": "icloud"
}Start an import run for the repository's configured cloud credential.
| id required | string Repository UUID |
{- "run": {
- "created_at": "string",
- "credential_id": "550e8400-e29b-41d4-a716-446655440000",
- "downloaded_count": 80,
- "error": "string",
- "failed_count": 5,
- "finished_at": "string",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "imported_count": 75,
- "provider": "icloud",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "skipped_count": 40,
- "started_at": "string",
- "status": "running",
- "total_seen": 120,
- "updated_at": "string"
}
}Rebuilds the pending duplicate graph for a repository by combining exact-hash and pHash edges.
Repository to scan
{ }{- "assets_affected": 18,
- "exact_groups": 4,
- "generated_at": "2026-05-12T08:23:45Z",
- "groups": 7,
- "mixed_groups": 1,
- "phash_groups": 2
}Paginated list of duplicate groups, scoped by repository and status (default pending).
| repository_id | string Repository UUID |
| status | string pending | merged | dismissed (defaults to pending) |
| limit | integer Default: 20 Page size |
| offset | integer Default: 0 Page offset |
{ }{- "groups": [
- {
- "asset_count": 3,
- "assets": [
- {
- "asset": {
- "asset_id": "string",
- "capture_offset_minutes": 0,
- "deleted_at": "string",
- "duration": 0,
- "file_size": 0,
- "hash": "string",
- "height": 0,
- "is_deleted": true,
- "liked": true,
- "mime_type": "string",
- "original_filename": "string",
- "owner_id": 0,
- "rating": 0,
- "repository_id": "string",
- "species_predictions": [
- {
- "label": "string",
- "score": 0
}
], - "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "file_size": 6291456,
- "role": "keeper"
}
], - "detected_at": "2026-05-12T08:23:45Z",
- "detection_version": "duplicates-v2",
- "edges": [
- {
- "asset_id_a": "550e8400-e29b-41d4-a716-446655440000",
- "asset_id_b": "660e8400-e29b-41d4-a716-446655440001",
- "confidence": 1,
- "distance": 0,
- "method": "exact"
}
], - "group_id": "7c0a4220-1f15-4eb5-94e1-1f4b1d3e4f12",
- "keeper_asset_id": "550e8400-e29b-41d4-a716-446655440000",
- "method": "mixed",
- "recommended_keeper_asset_id": "550e8400-e29b-41d4-a716-446655440000",
- "recoverable_bytes": 10485760,
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "resolved_at": "2026-05-12T08:25:00Z",
- "status": "pending",
- "total_size": 15728640
}
], - "limit": 20,
- "offset": 0,
- "total": 7
}Returns one duplicate group with all assets and evidence edges.
| id required | string Duplicate group UUID |
{ }{- "asset_count": 3,
- "assets": [
- {
- "asset": {
- "asset_id": "string",
- "capture_offset_minutes": 0,
- "deleted_at": "string",
- "duration": 0,
- "file_size": 0,
- "hash": "string",
- "height": 0,
- "is_deleted": true,
- "liked": true,
- "mime_type": "string",
- "original_filename": "string",
- "owner_id": 0,
- "rating": 0,
- "repository_id": "string",
- "species_predictions": [
- {
- "label": "string",
- "score": 0
}
], - "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "file_size": 6291456,
- "role": "keeper"
}
], - "detected_at": "2026-05-12T08:23:45Z",
- "detection_version": "duplicates-v2",
- "edges": [
- {
- "asset_id_a": "550e8400-e29b-41d4-a716-446655440000",
- "asset_id_b": "660e8400-e29b-41d4-a716-446655440001",
- "confidence": 1,
- "distance": 0,
- "method": "exact"
}
], - "group_id": "7c0a4220-1f15-4eb5-94e1-1f4b1d3e4f12",
- "keeper_asset_id": "550e8400-e29b-41d4-a716-446655440000",
- "method": "mixed",
- "recommended_keeper_asset_id": "550e8400-e29b-41d4-a716-446655440000",
- "recoverable_bytes": 10485760,
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "resolved_at": "2026-05-12T08:25:00Z",
- "status": "pending",
- "total_size": 15728640
}Marks a duplicate group as dismissed without merging any assets.
| id required | string Duplicate group UUID |
{ }{- "message": "Operation completed successfully"
}Keeps the chosen asset, unions metadata from duplicates, and soft-deletes the remaining members.
| id required | string Duplicate group UUID |
Merge configuration
{ }{- "group_id": "7c0a4220-1f15-4eb5-94e1-1f4b1d3e4f12",
- "keeper_asset_id": "550e8400-e29b-41d4-a716-446655440000",
- "merged_duplicates": [
- "660e8400-e29b-41d4-a716-446655440001"
], - "recovered_bytes": 10485760
}Returns counts and recoverable space for pending duplicate groups, scoped by optional repository_id.
| repository_id | string Repository UUID to scope the summary |
{ }{- "dismissed_groups": 0,
- "last_detected_at": "2026-05-12T08:23:45Z",
- "merged_groups": 2,
- "pending_assets": 18,
- "pending_groups": 7,
- "recoverable_assets": 11,
- "recoverable_bytes": 68157440
}Return paginated persisted photo location clusters with cached labels when available.
| limit | integer Default: 100 Page size (1-1000) |
| offset | integer Default: 0 Page offset |
| repository_id | string Optional repository UUID filter |
| geohash | string Optional geohash filter |
{ }{- "clusters": [
- {
- "centroid_latitude": 37.7749,
- "centroid_longitude": -122.4194,
- "city": "San Francisco",
- "cluster_id": "550e8400-e29b-41d4-a716-446655440000",
- "country": "United States",
- "geocode_status": "resolved",
- "geocoded_at": "2026-02-10T12:00:00Z",
- "geohash": "9q8yyk8",
- "label": "San Francisco, California, United States",
- "photo_count": 42,
- "precision": 7,
- "provider": "nominatim",
- "region": "California",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000"
}
], - "limit": 100,
- "offset": 0,
- "total": 150
}Queue a location cluster rebuild for all photos or one repository.
Rebuild request
{ }{- "job_id": 123,
- "message": "Location cluster rebuild queued successfully",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "status": "queued"
}List recognized people for the current repository scope.
| repository_id | string Optional repository UUID filter |
| limit | integer Default: 24 Maximum number of results (max 100) |
| offset | integer Default: 0 Number of results to skip |
{- "limit": 0,
- "offset": 0,
- "people": [
- {
- "asset_count": 0,
- "cover_face_image_path": "string",
- "created_at": "string",
- "is_confirmed": true,
- "member_count": 0,
- "name": "string",
- "person_id": 0,
- "representative_asset_id": "string",
- "updated_at": "string"
}
], - "total": 0
}Get a single recognized person by cluster ID.
| id required | integer Person ID |
| repository_id | string Optional repository UUID filter |
{- "asset_count": 0,
- "cover_face_image_path": "string",
- "created_at": "string",
- "is_confirmed": true,
- "member_count": 0,
- "name": "string",
- "person_id": 0,
- "representative_asset_id": "string",
- "updated_at": "string"
}Rename a recognized person. Successful updates mark the person as confirmed.
| id required | integer Person ID |
| repository_id | string Optional repository UUID filter |
Person update payload
{ }{- "asset_count": 0,
- "cover_face_image_path": "string",
- "created_at": "string",
- "is_confirmed": true,
- "member_count": 0,
- "name": "string",
- "person_id": 0,
- "representative_asset_id": "string",
- "updated_at": "string"
}List assets scoped to a specific person while reusing the unified asset query filters.
| id required | integer Person ID |
Asset query parameters
{ }{- "items": [
- {
- "asset": {
- "asset_id": "string",
- "capture_offset_minutes": 0,
- "deleted_at": "string",
- "duration": 0,
- "file_size": 0,
- "hash": "string",
- "height": 0,
- "is_deleted": true,
- "liked": true,
- "mime_type": "string",
- "original_filename": "string",
- "owner_id": 0,
- "rating": 0,
- "repository_id": "string",
- "species_predictions": [
- {
- "label": "string",
- "score": 0
}
], - "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "id": "stack:550e8400-e29b-41d4-a716-446655440000",
- "stack": {
- "cover_asset": {
- "asset_id": "string",
- "capture_offset_minutes": 0,
- "deleted_at": "string",
- "duration": 0,
- "file_size": 0,
- "hash": "string",
- "height": 0,
- "is_deleted": true,
- "liked": true,
- "mime_type": "string",
- "original_filename": "string",
- "owner_id": 0,
- "rating": 0,
- "repository_id": "string",
- "species_predictions": [
- {
- "label": "string",
- "score": 0
}
], - "specific_metadata": {
- "camera_model": "string",
- "capture_offset_minutes": 0,
- "content_identifier": "string",
- "description": "string",
- "dimensions": "string",
- "exposure": 0,
- "exposure_time": "string",
- "f_number": 0,
- "focal_length": 0,
- "gps_latitude": 0,
- "gps_longitude": 0,
- "is_raw": true,
- "iso_speed": 0,
- "lens_model": "string",
- "resolution": "string",
- "taken_time": "string"
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "cover_asset_id": "550e8400-e29b-41d4-a716-446655440001",
- "matched_member_ids": [
- "string"
], - "member_asset_ids": [
- "string"
], - "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "live_photo",
- "stack_size": 3
}, - "type": "stack"
}
], - "limit": 20,
- "offset": 0,
- "stack_mode": "collapsed",
- "total_assets": 150,
- "total_visible": 120
}Rebuild recognized people for the selected repository scope using HDBSCAN over face embeddings.
| repository_id | string Optional repository UUID filter |
{- "algorithm": "string",
- "candidate_faces": 0,
- "clustered_faces": 0,
- "clusters_created": 0,
- "clusters_reused": 0,
- "clusters_total": 0,
- "duration_ms": 0,
- "noise_faces": 0,
- "repository_id": "string"
}{- "repositories": [
- {
- "default_owner_id": 0,
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "is_primary": false,
- "local_settings": {
- "handle_duplicate_filenames": "uuid"
}, - "name": "Family Photos",
- "path": "/data/storage/family-photos",
- "role": "regular",
- "storage_strategy": "date"
}
]
}Create a repository folder under the server storage root. If the target folder already contains a .lumiliorepo file, it is registered instead.
Repository name
{ }{- "cloud_import_error": "string",
- "cloud_import_run_id": "string",
- "repository": {
- "default_owner_id": 0,
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "is_primary": false,
- "local_settings": {
- "handle_duplicate_filenames": "uuid"
}, - "name": "Family Photos",
- "path": "/data/storage/family-photos",
- "role": "regular",
- "storage_strategy": "date"
}
}Return a single repository.
| id required | string Repository UUID |
{- "default_owner_id": 0,
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "is_primary": false,
- "local_settings": {
- "handle_duplicate_filenames": "uuid"
}, - "name": "Family Photos",
- "path": "/data/storage/family-photos",
- "role": "regular",
- "storage_strategy": "date"
}Update mutable repository fields (name, storage_strategy, local_settings, default_owner_id).
| id required | string Repository UUID |
Fields to update
{ }{- "default_owner_id": 0,
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "is_primary": false,
- "local_settings": {
- "handle_duplicate_filenames": "uuid"
}, - "name": "Family Photos",
- "path": "/data/storage/family-photos",
- "role": "regular",
- "storage_strategy": "date"
}Queue a manual scan for a repository free workspace.
| id required | string Repository UUID |
Scan request
{ }{- "job_id": 12345,
- "mode": "manual",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "status": "queued"
}List recent scan runs for a repository.
| id required | string Repository UUID |
| limit | integer Default: 20 Limit |
| offset | integer Default: 0 Offset |
{- "scans": [
- {
- "deleted_count": 1,
- "discovered_count": 10,
- "error": "string",
- "finished_at": "string",
- "mode": "manual",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "requested_by": "edwin",
- "scan_id": "550e8400-e29b-41d4-a716-446655440000",
- "skipped_count": 4,
- "started_at": "string",
- "status": "completed",
- "updated_count": 2
}
]
}Return the latest scan run for a repository.
| id required | string Repository UUID |
{- "deleted_count": 1,
- "discovered_count": 10,
- "error": "string",
- "finished_at": "string",
- "mode": "manual",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "requested_by": "edwin",
- "scan_id": "550e8400-e29b-41d4-a716-446655440000",
- "skipped_count": 4,
- "started_at": "string",
- "status": "completed",
- "updated_count": 2
}Read-only effective runtime-immutable configuration (changed only via TOML + restart).
{- "environment": "production",
- "geocoding_provider": "disabled",
- "hardware_accel": "none",
- "log_level": "info",
- "lumen_discovery_enabled": true,
- "repository_scan_enabled": true,
- "repository_scan_interval_seconds": 300,
- "server_port": "8080",
- "storage_root": "/data/storage"
}Return persisted system settings without exposing secret values.
{ }{- "llm": {
- "agent_enabled": true,
- "api_key_configured": true,
- "model_name": "gpt-4.1-mini",
- "provider": "openai"
}, - "ml": {
- "bioclip_enabled": true,
- "face_enabled": true,
- "ocr_enabled": true,
- "semantic_enabled": true
}, - "updated_at": "string",
- "updated_by": 0
}Update persisted system settings. API keys are write-only and never returned.
System settings patch
{ }{- "llm": {
- "agent_enabled": true,
- "api_key_configured": true,
- "model_name": "gpt-4.1-mini",
- "provider": "openai"
}, - "ml": {
- "bioclip_enabled": true,
- "face_enabled": true,
- "ocr_enabled": true,
- "semantic_enabled": true
}, - "updated_at": "string",
- "updated_by": 0
}Validate the persisted LLM configuration by issuing a lightweight test request.
{ }{- "valid": true
}Run first-run bootstrapping: generate and rotate the database credential, then persist the secret. Refused once the system is already initialized.
Optional empty setup payload
{ }{- "database_user": "string",
- "password_length": 0
}Report whether Lumilio has rotated the temporary database credential. The web frontend runs setup as a preflight while uninitialized.
{- "admin_initialized": true,
- "database_initialized": true,
- "initialized": true,
- "next_registration_role": "string",
- "primary_repository_initialized": true,
- "repository_defaults": {
- "default_root": "/data/storage",
- "duplicate_handling": "rename",
- "strategy": "date"
}
}Fetch a species wiki summary and reference image from iNaturalist by scientific name, with optional common name fallback.
| scientific_name | string Example: scientific_name="Rucervus duvaucelii" Scientific name |
| common_name | string Example: common_name="Barasingha" Common name fallback |
| locale | string Example: locale="zh" iNaturalist locale for localized common names and wiki summaries |
{ }{- "common_name": "Barasingha",
- "image_attribution": "(c) Ramesh Shenai Jr., some rights reserved (CC BY), uploaded by Ramesh Shenai Jr.",
- "image_license": "cc-by",
- "provider": "inaturalist",
- "query": "Rucervus duvaucelii",
- "scientific_name": "Rucervus duvaucelii",
- "taxon_id": 75046,
- "wikipedia_summary": "The barasingha, also called swamp deer, is a deer species distributed in the Indian subcontinent.",
}Get top N camera+lens combinations
| limit | integer Default: 20 Number of results to return |
| repository_id | string Optional repository UUID filter |
{- "data": [
- {
- "camera_model": "string",
- "count": 0,
- "lens_model": "string"
}
], - "total": 0
}Get daily shooting activity heatmap data for a calendar year or custom date range.
| year | integer Calendar year (e.g. 2024) |
| start_date | string Start date in YYYY-MM-DD (must be used with end_date) |
| end_date | string End date in YYYY-MM-DD, inclusive (must be used with start_date) |
| days | integer Deprecated fallback: number of days to look back (used only when year/start_date/end_date are absent) |
| repository_id | string Optional repository UUID filter |
{- "data": [
- {
- "count": 0,
- "date": "string"
}
]
}Get shooting time distribution by hour or month
| type | string Default: "hourly" Enum: "hourly" "monthly" Distribution type: hourly or monthly |
| repository_id | string Optional repository UUID filter |
{- "data": [
- {
- "count": 0,
- "label": "string",
- "value": 0
}
], - "type": "string"
}List users with ownership statistics for administrator management views.
| limit | integer Default: 20 Maximum number of results |
| offset | integer Default: 0 Number of results to skip |
{ }{- "limit": 0,
- "offset": 0,
- "total": 0,
- "users": [
- {
- "album_count": 0,
- "asset_count": 0,
- "avatar_asset_id": "string",
- "created_at": "string",
- "display_name": "string",
- "is_active": true,
- "last_login": "string",
- "permissions": [
- "string"
], - "role": "string",
- "updated_at": "string",
- "user_id": 0,
- "username": "string"
}
]
}Update user identity, role, status, and avatar fields as an administrator.
| id required | integer User ID |
User update payload
{ }{- "avatar_asset_id": "string",
- "created_at": "string",
- "display_name": "string",
- "is_active": true,
- "last_login": "string",
- "permissions": [
- "string"
], - "role": "string",
- "updated_at": "string",
- "user_id": 0,
- "username": "string"
}Generate a temporary password and clear passkeys, TOTP, recovery codes, and refresh tokens for a user.
| id required | integer User ID |
{ }{- "cleared_passkeys": true,
- "cleared_totp": true,
- "temporary_password": "string"
}Verify the current password, set a new password, and revoke all refresh tokens for the current user.
Password change payload
{ }{- "message": "Operation completed successfully"
}Update the current user's profile fields such as display name and avatar photo.
Profile update payload
{ }{- "avatar_asset_id": "string",
- "created_at": "string",
- "display_name": "string",
- "is_active": true,
- "last_login": "string",
- "permissions": [
- "string"
], - "role": "string",
- "updated_at": "string",
- "user_id": 0,
- "username": "string"
}