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
}| id required | string Effect ID |
| thread_id required | string Thread that owns the effect |
{- "effect_id": "string",
- "receipt": {
- "album_id": 0,
- "already_committed": true,
- "count": 0,
- "effect_id": "string",
- "message": "string",
- "status": "string",
- "tool_name": "string"
}, - "status": "pending"
}[- {
- "count": 24,
- "created_at": "string",
- "facets": {
- "cameras": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "count": 0,
- "date_range": {
- "from": "string",
- "to": "string"
}, - "focal_lengths": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "histogram": [
- {
- "bucket": "2025-04",
- "count": 12
}
], - "histogram_granularity": "day",
- "lenses": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "liked_count": 0,
- "quality": {
- "p25": 5.1,
- "p50": 5.7,
- "p75": 6.3,
- "p90": 7,
- "scored": 318,
- "unscored": 2
}, - "rating_dist": [
- 0
], - "top_people": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "top_places": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "types": {
- "property1": 0,
- "property2": 0
}
}, - "fallback_reason": "string",
- "hydration_source": "live_replay",
- "last_successful_refresh_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": "cover_card"
}
]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",
- "facets": {
- "cameras": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "count": 0,
- "date_range": {
- "from": "string",
- "to": "string"
}, - "focal_lengths": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "histogram": [
- {
- "bucket": "2025-04",
- "count": 12
}
], - "histogram_granularity": "day",
- "lenses": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "liked_count": 0,
- "quality": {
- "p25": 5.1,
- "p50": 5.7,
- "p75": 6.3,
- "p90": 7,
- "scored": 318,
- "unscored": 2
}, - "rating_dist": [
- 0
], - "top_people": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "top_places": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "types": {
- "property1": 0,
- "property2": 0
}
}, - "fallback_reason": "string",
- "hydration_source": "live_replay",
- "last_successful_refresh_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": "cover_card"
}Get metadata and facet summary for a pinned widget. Frozen pins serve the stored snapshot; live pins replay their plan before facets are computed.
| id required | string Pin ID |
{- "count": 24,
- "created_at": "string",
- "facets": {
- "cameras": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "count": 0,
- "date_range": {
- "from": "string",
- "to": "string"
}, - "focal_lengths": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "histogram": [
- {
- "bucket": "2025-04",
- "count": 12
}
], - "histogram_granularity": "day",
- "lenses": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "liked_count": 0,
- "quality": {
- "p25": 5.1,
- "p50": 5.7,
- "p75": 6.3,
- "p90": 7,
- "scored": 318,
- "unscored": 2
}, - "rating_dist": [
- 0
], - "top_people": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "top_places": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "types": {
- "property1": 0,
- "property2": 0
}
}, - "fallback_reason": "string",
- "hydration_source": "live_replay",
- "last_successful_refresh_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": "cover_card"
}Patch one pinned widget. Send title to rename it, widget to switch which view it renders through; both are optional.
| id required | string Pin ID |
Pin update
{ }{- "message": "Operation completed successfully"
}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": "burst",
- "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
}Query a pinned widget with the same list/filter/sort semantics as the assets gallery. Snapshot-order hydration remains available through GET /agent/pins/{id}/assets.
| id required | string Pin ID |
Query parameters
{ }{- "items": [
- {
- "best_ts_ms": 12500,
- "id": "media:550e8400-e29b-41d4-a716-446655440000",
- "media_item": {
- "composition": {
- "component_count": 2,
- "has_edited": false,
- "has_jpeg": true,
- "has_live_motion": false,
- "has_raw": true
}, - "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "media_kind": "photo",
- "primary_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": "burst",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst",
- "stack_size": 3
}
}, - "stack": {
- "cover": {
- "composition": {
- "component_count": 2,
- "has_edited": false,
- "has_jpeg": true,
- "has_live_motion": false,
- "has_raw": true
}, - "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "media_kind": "photo",
- "primary_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": "burst",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst",
- "stack_size": 3
}
}, - "matched_members": [
- {
- "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "primary_asset_id": "550e8400-e29b-41d4-a716-446655440001"
}
], - "members": [
- {
- "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "primary_asset_id": "550e8400-e29b-41d4-a716-446655440001"
}
], - "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst"
}, - "type": "media_item"
}
], - "limit": 20,
- "offset": 0,
- "stack_mode": "collapsed",
- "total_files": 213,
- "total_media_items": 150,
- "total_visible": 120
}Search a pinned widget with optional top results enhancement and filename fallback, constrained to the pin's asset set.
| id required | string Pin ID |
Search parameters
{ }{- "limit": 20,
- "offset": 0,
- "result_items": [
- {
- "best_ts_ms": 12500,
- "id": "media:550e8400-e29b-41d4-a716-446655440000",
- "media_item": {
- "composition": {
- "component_count": 2,
- "has_edited": false,
- "has_jpeg": true,
- "has_live_motion": false,
- "has_raw": true
}, - "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "media_kind": "photo",
- "primary_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": "burst",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst",
- "stack_size": 3
}
}, - "stack": {
- "cover": {
- "composition": {
- "component_count": 2,
- "has_edited": false,
- "has_jpeg": true,
- "has_live_motion": false,
- "has_raw": true
}, - "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "media_kind": "photo",
- "primary_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": "burst",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst",
- "stack_size": 3
}
}, - "matched_members": [
- {
- "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "primary_asset_id": "550e8400-e29b-41d4-a716-446655440001"
}
], - "members": [
- {
- "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "primary_asset_id": "550e8400-e29b-41d4-a716-446655440001"
}
], - "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst"
}, - "type": "media_item"
}
], - "results_total_media_items": 150,
- "results_total_visible": 120,
- "top_items": [
- {
- "best_ts_ms": 12500,
- "id": "media:550e8400-e29b-41d4-a716-446655440000",
- "media_item": {
- "composition": {
- "component_count": 2,
- "has_edited": false,
- "has_jpeg": true,
- "has_live_motion": false,
- "has_raw": true
}, - "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "media_kind": "photo",
- "primary_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": "burst",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst",
- "stack_size": 3
}
}, - "stack": {
- "cover": {
- "composition": {
- "component_count": 2,
- "has_edited": false,
- "has_jpeg": true,
- "has_live_motion": false,
- "has_raw": true
}, - "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "media_kind": "photo",
- "primary_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": "burst",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst",
- "stack_size": 3
}
}, - "matched_members": [
- {
- "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "primary_asset_id": "550e8400-e29b-41d4-a716-446655440001"
}
], - "members": [
- {
- "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "primary_asset_id": "550e8400-e29b-41d4-a716-446655440001"
}
], - "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst"
}, - "type": "media_item"
}
], - "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
}
]
}
}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"
}, - "focal_lengths": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "histogram": [
- {
- "bucket": "2025-04",
- "count": 12
}
], - "histogram_granularity": "day",
- "lenses": [
- {
- "count": 42,
- "name": "Kyoto"
}
], - "liked_count": 0,
- "quality": {
- "p25": 5.1,
- "p50": 5.7,
- "p75": 6.3,
- "p90": 7,
- "scored": 318,
- "unscored": 2
}, - "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": "burst",
- "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
}Get the agent tools visible in the given quick-action mode. An empty or unknown mode returns the full toolset.
| mode | string Enum: "review" "organize" "analyze" "curate" Quick-action mode |
[- {
- "desc": "string",
- "extra": {
- "property1": null,
- "property2": null
}, - "name": "string"
}
]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": "burst",
- "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.
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, BioCLIP Species Recognition predictions, OCR Text Recognition results, Person Recognition results, 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 Text Recognition results |
| include_faces | boolean Default: false Include Person Recognition results |
{ }{- "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": "burst",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "tags": [
- {
- "confidence": 0,
- "source": "string",
- "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"
}Returns the logical media item and its RAW/JPEG, Live Photo, or edited components
| id required | string Asset ID |
{- "asset_id": "string",
- "media_item": {
- "components": [
- {
- "asset_id": "string",
- "position": 0,
- "relation": "raw_original"
}
], - "media_item_id": "string",
- "media_kind": "photo",
- "primary_asset_id": "string"
}
}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",
- "canvas": {
- "background": {
- "angle": 180,
- "blur": 0.06,
- "brightness": -0.16,
- "color": "#ffffff",
- "from": "#ffffff",
- "kind": "solid",
- "overscan": 1.12,
- "to": "#d4d4d4"
}, - "innerRadius": 0,
- "outerRadius": 0,
- "pad": {
- "bottom": 0.18,
- "left": 0,
- "right": 0,
- "top": 0
}, - "scrim": {
- "edge": "bottom",
- "from": "rgba(0,0,0,0)",
- "height": 0.32,
- "to": "rgba(0,0,0,0.5)"
}, - "vignette": 0
}, - "layers": [
- {
- "align": "center",
- "background": {
- "fill": {
- "angle": 90,
- "color": "#ffffff",
- "from": "#ffffff",
- "fromOpacity": 1,
- "kind": "solid",
- "opacity": 1,
- "to": "#d2a05a",
- "toOpacity": 1
}, - "padding": {
- "bottom": 0.15,
- "left": 0.25,
- "right": 0.25,
- "top": 0.15
}
}, - "brand": "fujifilm",
- "color": "#1a1a1a",
- "fill": {
- "angle": 90,
- "color": "#ffffff",
- "from": "#ffffff",
- "fromOpacity": 1,
- "kind": "solid",
- "opacity": 1,
- "to": "#d2a05a",
- "toOpacity": 1
}, - "font": {
- "family": "Plus Jakarta Sans",
- "italic": false,
- "lineHeight": 1.2,
- "size": 0.06,
- "tracking": 0,
- "weight": 400
}, - "fromTemplate": true,
- "id": "text-lz4k2p-1",
- "opacity": 1,
- "rotation": 0,
- "shadow": {
- "blur": 0.006,
- "color": "#000000",
- "offsetX": 0,
- "offsetY": 0.003,
- "opacity": 0.6
}, - "size": 0.12,
- "strikethrough": false,
- "stroke": {
- "color": "#000000",
- "width": 0.002
}, - "text": "X-T5",
- "textCase": "none",
- "type": "text",
- "underline": false,
- "variant": "wordmark",
- "x": 0.5,
- "y": 0.9
}
], - "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.StudioCanvasDTO) | |
Array of objects (dto.StudioLayerDTO) | |
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",
- "canvas": {
- "background": {
- "angle": 180,
- "blur": 0.06,
- "brightness": -0.16,
- "color": "#ffffff",
- "from": "#ffffff",
- "kind": "solid",
- "overscan": 1.12,
- "to": "#d4d4d4"
}, - "innerRadius": 0,
- "outerRadius": 0,
- "pad": {
- "bottom": 0.18,
- "left": 0,
- "right": 0,
- "top": 0
}, - "scrim": {
- "edge": "bottom",
- "from": "rgba(0,0,0,0)",
- "height": 0.32,
- "to": "rgba(0,0,0,0.5)"
}, - "vignette": 0
}, - "layers": [
- {
- "align": "center",
- "background": {
- "fill": {
- "angle": 90,
- "color": "#ffffff",
- "from": "#ffffff",
- "fromOpacity": 1,
- "kind": "solid",
- "opacity": 1,
- "to": "#d2a05a",
- "toOpacity": 1
}, - "padding": {
- "bottom": 0.15,
- "left": 0.25,
- "right": 0.25,
- "top": 0.15
}
}, - "brand": "fujifilm",
- "color": "#1a1a1a",
- "fill": {
- "angle": 90,
- "color": "#ffffff",
- "from": "#ffffff",
- "fromOpacity": 1,
- "kind": "solid",
- "opacity": 1,
- "to": "#d2a05a",
- "toOpacity": 1
}, - "font": {
- "family": "Plus Jakarta Sans",
- "italic": false,
- "lineHeight": 1.2,
- "size": 0.06,
- "tracking": 0,
- "weight": 400
}, - "fromTemplate": true,
- "id": "text-lz4k2p-1",
- "opacity": 1,
- "rotation": 0,
- "shadow": {
- "blur": 0.006,
- "color": "#000000",
- "offsetX": 0,
- "offsetY": 0.003,
- "opacity": 0.6
}, - "size": 0.12,
- "strikethrough": false,
- "stroke": {
- "color": "#000000",
- "width": 0.002
}, - "text": "X-T5",
- "textCase": "none",
- "type": "text",
- "underline": false,
- "variant": "wordmark",
- "x": 0.5,
- "y": 0.9
}
], - "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",
- "canvas": {
- "background": {
- "angle": 180,
- "blur": 0.06,
- "brightness": -0.16,
- "color": "#ffffff",
- "from": "#ffffff",
- "kind": "solid",
- "overscan": 1.12,
- "to": "#d4d4d4"
}, - "innerRadius": 0,
- "outerRadius": 0,
- "pad": {
- "bottom": 0.18,
- "left": 0,
- "right": 0,
- "top": 0
}, - "scrim": {
- "edge": "bottom",
- "from": "rgba(0,0,0,0)",
- "height": 0.32,
- "to": "rgba(0,0,0,0.5)"
}, - "vignette": 0
}, - "layers": [
- {
- "align": "center",
- "background": {
- "fill": {
- "angle": 90,
- "color": "#ffffff",
- "from": "#ffffff",
- "fromOpacity": 1,
- "kind": "solid",
- "opacity": 1,
- "to": "#d2a05a",
- "toOpacity": 1
}, - "padding": {
- "bottom": 0.15,
- "left": 0.25,
- "right": 0.25,
- "top": 0.15
}
}, - "brand": "fujifilm",
- "color": "#1a1a1a",
- "fill": {
- "angle": 90,
- "color": "#ffffff",
- "from": "#ffffff",
- "fromOpacity": 1,
- "kind": "solid",
- "opacity": 1,
- "to": "#d2a05a",
- "toOpacity": 1
}, - "font": {
- "family": "Plus Jakarta Sans",
- "italic": false,
- "lineHeight": 1.2,
- "size": 0.06,
- "tracking": 0,
- "weight": 400
}, - "fromTemplate": true,
- "id": "text-lz4k2p-1",
- "opacity": 1,
- "rotation": 0,
- "shadow": {
- "blur": 0.006,
- "color": "#000000",
- "offsetX": 0,
- "offsetY": 0.003,
- "opacity": 0.6
}, - "size": 0.12,
- "strikethrough": false,
- "stroke": {
- "color": "#000000",
- "width": 0.002
}, - "text": "X-T5",
- "textCase": "none",
- "type": "text",
- "underline": false,
- "variant": "wordmark",
- "x": 0.5,
- "y": 0.9
}
], - "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": [
- {
- "media_item_id": "550e8400-e29b-41d4-a716-446655440001",
- "position": 0,
- "primary_asset_id": "550e8400-e29b-41d4-a716-446655440002"
}
], - "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst"
}
}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",
- "session_id": "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 backend ingest lifecycle state for upload task IDs owned by the current caller
| task_ids required | string Comma-separated upload task IDs |
{- "jobs": [
- {
- "error": "failed to materialize asset",
- "file_name": "photo.jpg",
- "status": "completed",
- "success": true,
- "task_id": 12345,
- "terminal": true
}
]
}Get detailed progress information for upload sessions
| session_ids | string Comma-separated session IDs (optional) |
{ }{- "sessions": [
- {
- "bytes_done": 0,
- "bytes_total": 0,
- "completed_chunks": [
- 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
}
}Upload metadata
{ }{- "bytes_received": 0,
- "received_chunks": [
- 0
], - "session_id": "string",
- "status": "string",
- "task_id": 0,
- "total_chunks": 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": "burst",
- "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"
}List immediate child folders of a repository-relative path, with recursive asset counts and covers, for the Folders collection view
| repository_id | string Optional repository UUID filter |
| path | string Repository-relative parent folder path (empty for root) |
{- "folders": [
- {
- "asset_count": 128,
- "audio_count": 0,
- "cover_asset_id": "550e8400-e29b-41d4-a716-446655440000",
- "date_end": "string",
- "date_start": "string",
- "depth": 3,
- "display_name": "05",
- "folder_path": "inbox/2026/05",
- "photo_count": 110,
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "repository_name": "Primary Repository",
- "video_count": 18
}
], - "parent_path": "string"
}Get recursive asset counts, date range, and cover for one repository-relative folder path, for the Folder detail header
| repository_id required | string Repository UUID |
| path | string Repository-relative folder path (empty for root) |
{- "asset_count": 128,
- "audio_count": 0,
- "cover_asset_id": "550e8400-e29b-41d4-a716-446655440000",
- "date_end": "string",
- "date_start": "string",
- "depth": 3,
- "display_name": "05",
- "folder_path": "inbox/2026/05",
- "photo_count": 110,
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "repository_name": "Primary Repository",
- "video_count": 18
}Queue a background batch that backfills AI indexing for existing photos.
Reindex request
| limit | integer [ 1 .. 500 ] |
| missing_only | boolean |
| repository_id | string |
| reset_semantic | boolean ResetSemantic wipes all semantic vectors and rebuilds from scratch. Use after switching the embedding model (drop+refill) so no two models' vectors are mixed. Honored only when the semantic task is included. |
| tasks | Array of strings |
{- "limit": 200,
- "missing_only": true,
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "reset_semantic": false,
- "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 the shared repository registry for browse-scope/upload selectors and indexing filters. Paths are only included for admins.
{ }{- "repositories": [
- {
- "activity": "idle",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "is_primary": false,
- "name": "Family Repository",
- "path": "/Volumes/Media/Photos",
- "reachability": "active",
- "role": "regular",
- "root_id": "550e8400-e29b-41d4-a716-446655440000"
}
]
}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
}, - "video_semantic": {
- "indexed_count": 1200,
- "queued_jobs": 12,
- "total_count": 2400
}
}, - "video_total": 120
}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": "burst",
- "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"
}, - "event_id": "550e8400-e29b-41d4-a716-446655440000",
- "filename": {
- "operator": "starts_with",
- "value": "IMG_"
}, - "folder_path": "inbox/2026/05",
- "folder_recursive": true,
- "is_deleted": false,
- "lens": "EF 50mm f/1.8",
- "liked": true,
- "location": {
- "east": -122.3,
- "north": 37.9,
- "south": 37.7,
- "west": -122.5
}, - "media_item": {
- "composition": "jpeg_raw"
}, - "owner_id": 123,
- "person_id": 42,
- "rating": 5,
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack": {
- "kinds": [
- "burst"
], - "membership": "stacked"
}, - "tag_name": "document",
- "tag_names": [
- "string"
], - "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": [
- {
- "best_ts_ms": 12500,
- "id": "media:550e8400-e29b-41d4-a716-446655440000",
- "media_item": {
- "composition": {
- "component_count": 2,
- "has_edited": false,
- "has_jpeg": true,
- "has_live_motion": false,
- "has_raw": true
}, - "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "media_kind": "photo",
- "primary_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": "burst",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst",
- "stack_size": 3
}
}, - "stack": {
- "cover": {
- "composition": {
- "component_count": 2,
- "has_edited": false,
- "has_jpeg": true,
- "has_live_motion": false,
- "has_raw": true
}, - "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "media_kind": "photo",
- "primary_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": "burst",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst",
- "stack_size": 3
}
}, - "matched_members": [
- {
- "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "primary_asset_id": "550e8400-e29b-41d4-a716-446655440001"
}
], - "members": [
- {
- "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "primary_asset_id": "550e8400-e29b-41d4-a716-446655440001"
}
], - "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst"
}, - "type": "media_item"
}
], - "limit": 20,
- "offset": 0,
- "stack_mode": "collapsed",
- "total_files": 213,
- "total_media_items": 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 |
| south | number Viewport south latitude (-90 to 90) |
| north | number Viewport north latitude (-90 to 90) |
| west | number Viewport west longitude (-180 to 180) |
| east | number Viewport east longitude (-180 to 180) |
{ }{- "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
}Given client-computed BLAKE3 fingerprints, reports advisory candidates. Candidates must still be uploaded for server-side full-file verification.
Candidate files
{ }{- "duplicate_count": 3,
- "results": [
- {
- "asset_id": "550e8400-e29b-41d4-a716-446655440000",
- "candidate": true,
- "duplicate": true,
- "file_name": "photo.jpg",
- "hash": "abcd1234567890"
}
]
}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": "burst",
- "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" |
| 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"
}, - "event_id": "550e8400-e29b-41d4-a716-446655440000",
- "filename": {
- "operator": "starts_with",
- "value": "IMG_"
}, - "folder_path": "inbox/2026/05",
- "folder_recursive": true,
- "is_deleted": false,
- "lens": "EF 50mm f/1.8",
- "liked": true,
- "location": {
- "east": -122.3,
- "north": 37.9,
- "south": 37.7,
- "west": -122.5
}, - "media_item": {
- "composition": "jpeg_raw"
}, - "owner_id": 123,
- "person_id": 42,
- "rating": 5,
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack": {
- "kinds": [
- "burst"
], - "membership": "stacked"
}, - "tag_name": "document",
- "tag_names": [
- "string"
], - "tag_source": "zeroshot",
- "type": "PHOTO",
- "types": [
- "PHOTO",
- "VIDEO"
]
}, - "pagination": {
- "limit": 20,
- "offset": 0
}, - "query": "red bird on branch",
- "sort_by": "date_captured",
- "top_results_limit": 200,
- "viewer_timezone": "America/New_York"
}{- "limit": 20,
- "offset": 0,
- "result_items": [
- {
- "best_ts_ms": 12500,
- "id": "media:550e8400-e29b-41d4-a716-446655440000",
- "media_item": {
- "composition": {
- "component_count": 2,
- "has_edited": false,
- "has_jpeg": true,
- "has_live_motion": false,
- "has_raw": true
}, - "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "media_kind": "photo",
- "primary_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": "burst",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst",
- "stack_size": 3
}
}, - "stack": {
- "cover": {
- "composition": {
- "component_count": 2,
- "has_edited": false,
- "has_jpeg": true,
- "has_live_motion": false,
- "has_raw": true
}, - "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "media_kind": "photo",
- "primary_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": "burst",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst",
- "stack_size": 3
}
}, - "matched_members": [
- {
- "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "primary_asset_id": "550e8400-e29b-41d4-a716-446655440001"
}
], - "members": [
- {
- "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "primary_asset_id": "550e8400-e29b-41d4-a716-446655440001"
}
], - "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst"
}, - "type": "media_item"
}
], - "results_total_media_items": 150,
- "results_total_visible": 120,
- "top_items": [
- {
- "best_ts_ms": 12500,
- "id": "media:550e8400-e29b-41d4-a716-446655440000",
- "media_item": {
- "composition": {
- "component_count": 2,
- "has_edited": false,
- "has_jpeg": true,
- "has_live_motion": false,
- "has_raw": true
}, - "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "media_kind": "photo",
- "primary_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": "burst",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst",
- "stack_size": 3
}
}, - "stack": {
- "cover": {
- "composition": {
- "component_count": 2,
- "has_edited": false,
- "has_jpeg": true,
- "has_live_motion": false,
- "has_raw": true
}, - "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "media_kind": "photo",
- "primary_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": "burst",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst",
- "stack_size": 3
}
}, - "matched_members": [
- {
- "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "primary_asset_id": "550e8400-e29b-41d4-a716-446655440001"
}
], - "members": [
- {
- "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "primary_asset_id": "550e8400-e29b-41d4-a716-446655440001"
}
], - "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst"
}, - "type": "media_item"
}
], - "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": [
- {
- "media_item_id": "550e8400-e29b-41d4-a716-446655440001",
- "position": 0,
- "primary_asset_id": "550e8400-e29b-41d4-a716-446655440002"
}
], - "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst"
}List manual and AI/system tags with usage counts and covers, for the Tags collection view
| repository_id | string Optional repository UUID filter |
| source | string Optional tag source filter (e.g. manual, zeroshot) |
| q | string Search query (substring match on tag name) |
| limit | integer Default: 50 Max results |
| offset | integer Default: 0 Result offset |
{- "tags": [
- {
- "asset_count": 37,
- "cover_asset_id": "550e8400-e29b-41d4-a716-446655440000",
- "last_used_at": "string",
- "source": "manual",
- "tag_id": 42,
- "tag_name": "document"
}
]
}Authenticate user with username and password. Returns an MFA challenge instead of session tokens when TOTP is enabled.
Login credentials
{ }{- "bootstrap_admin": true,
- "csrfToken": "string",
- "expiresAt": "string",
- "mfa_methods": [
- "string"
], - "mfa_token": "string",
- "password_change_token": "string",
- "requires_mfa": true,
- "requires_password_change": 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"
}
}Identifier-first capability probe. Always returns password:true for valid usernames; passkey:true only when the active account has at least one passkey. Does not reveal TOTP enrollment. Unknown and inactive usernames match the password-only shape.
Username to probe
{ }{- "passkey": false,
- "password": true
}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,
- "csrfToken": "string",
- "expiresAt": "string",
- "mfa_methods": [
- "string"
], - "mfa_token": "string",
- "password_change_token": "string",
- "requires_mfa": true,
- "requires_password_change": 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,
- "csrfToken": "string",
- "expiresAt": "string",
- "mfa_methods": [
- "string"
], - "mfa_token": "string",
- "password_change_token": "string",
- "requires_mfa": true,
- "requires_password_change": 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"
}
}Replace a temporary reset password using the short-lived token returned by login.
Password change payload
{ }{- "bootstrap_admin": true,
- "csrfToken": "string",
- "expiresAt": "string",
- "mfa_methods": [
- "string"
], - "mfa_token": "string",
- "password_change_token": "string",
- "requires_mfa": true,
- "requires_password_change": 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"
}
}Rotate the HttpOnly refresh cookie and issue a new access token. Requires X-CSRF-Token bound to the current cookie session.
{- "bootstrap_admin": true,
- "csrfToken": "string",
- "expiresAt": "string",
- "mfa_methods": [
- "string"
], - "mfa_token": "string",
- "password_change_token": "string",
- "requires_mfa": true,
- "requires_password_change": 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,
- "csrfToken": "string",
- "expiresAt": "string",
- "mfa_methods": [
- "string"
], - "mfa_token": "string",
- "password_change_token": "string",
- "requires_mfa": true,
- "requires_password_change": 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,
- "availability": "ready",
- "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 Image Semantic Analysis and return catalog 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 the current user's cloud credentials without exposing secrets. Administrators receive all credentials.
{- "credentials": [
- {
- "created_at": "string",
- "display_name": "Personal cloud account",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "masked_identity": "u***r@example.com",
- "owner_id": 123,
- "provider": "icloud",
- "provider_title": "cloudProvider.icloud.title",
- "public_config": {
- "property1": "string",
- "property2": "string"
}, - "status": "connected",
- "updated_at": "string"
}
]
}Authenticate with a cloud provider and save a user-owned, repo-reusable credential. Provider-specific challenges return auth_status=challenge_required.
Cloud credential
{ }{- "auth_status": "connected",
- "challenge": {
- "description": "cloudProvider.icloud.challenge.sms.description",
- "fields": [
- {
- "autocomplete": "username",
- "help_text": "string",
- "label": "cloudProvider.icloud.field.username",
- "name": "username",
- "options": [
- {
- "label": "Global",
- "value": "com"
}
], - "placeholder": "you@example.com",
- "required": true,
- "type": "email"
}
], - "params": {
- "property1": "string",
- "property2": "string"
}, - "title": "cloudProvider.icloud.challenge.sms.title",
- "type": "verification_code"
}, - "credential": {
- "created_at": "string",
- "display_name": "Personal cloud account",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "masked_identity": "u***r@example.com",
- "owner_id": 123,
- "provider": "icloud",
- "provider_title": "cloudProvider.icloud.title",
- "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",
- "masked_identity": "u***r@example.com",
- "owner_id": 123,
- "provider": "icloud",
- "provider_title": "cloudProvider.icloud.title",
- "public_config": {
- "property1": "string",
- "property2": "string"
}, - "status": "connected",
- "updated_at": "string"
}
}Pause a cloud credential so it cannot start new imports. Can be reconnected later.
| id required | string Credential UUID |
{- "message": "Operation completed successfully"
}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": "cloudProvider.icloud.challenge.sms.description",
- "fields": [
- {
- "autocomplete": "username",
- "help_text": "string",
- "label": "cloudProvider.icloud.field.username",
- "name": "username",
- "options": [
- {
- "label": "Global",
- "value": "com"
}
], - "placeholder": "you@example.com",
- "required": true,
- "type": "email"
}
], - "params": {
- "property1": "string",
- "property2": "string"
}, - "title": "cloudProvider.icloud.challenge.sms.title",
- "type": "verification_code"
}, - "credential": {
- "created_at": "string",
- "display_name": "Personal cloud account",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "masked_identity": "u***r@example.com",
- "owner_id": 123,
- "provider": "icloud",
- "provider_title": "cloudProvider.icloud.title",
- "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,
- "owner_id": 123,
- "provider": "icloud",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "skipped_count": 40,
- "started_at": "string",
- "status": "running",
- "total_seen": 120,
- "updated_at": "string"
}| 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,
- "owner_id": 123,
- "provider": "icloud",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "skipped_count": 40,
- "started_at": "string",
- "status": "running",
- "total_seen": 120,
- "updated_at": "string"
}| id required | string Import run 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,
- "owner_id": 123,
- "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": "cloudProvider.icloud.field.username",
- "name": "username",
- "options": [
- {
- "label": "Global",
- "value": "com"
}
], - "placeholder": "you@example.com",
- "required": true,
- "type": "email"
}
], - "description": "cloudProvider.icloud.description",
- "form_fields": [
- {
- "autocomplete": "username",
- "help_text": "string",
- "label": "cloudProvider.icloud.field.username",
- "name": "username",
- "options": [
- {
- "label": "Global",
- "value": "com"
}
], - "placeholder": "you@example.com",
- "required": true,
- "type": "email"
}
], - "id": "icloud",
- "security_note": "string",
- "status": "enabled",
- "title": "cloudProvider.icloud.title"
}
]
}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",
- "masked_identity": "u***r@example.com",
- "owner_id": 123,
- "provider": "icloud",
- "provider_title": "cloudProvider.icloud.title",
- "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,
- "owner_id": 123,
- "provider": "icloud",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "skipped_count": 40,
- "started_at": "string",
- "status": "running",
- "total_seen": 120,
- "updated_at": "string"
}, - "owner_id": 123,
- "provider": "icloud",
- "sources": [
- {
- "credential": {
- "created_at": "string",
- "display_name": "Personal cloud account",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "masked_identity": "u***r@example.com",
- "owner_id": 123,
- "provider": "icloud",
- "provider_title": "cloudProvider.icloud.title",
- "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,
- "owner_id": 123,
- "provider": "icloud",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "skipped_count": 40,
- "started_at": "string",
- "status": "running",
- "total_seen": 120,
- "updated_at": "string"
}, - "owner_id": 0,
- "provider": "string",
- "remote_scope": {
- "property1": "string",
- "property2": "string"
}
}
]
}Start an import run for the repository's configured cloud credential.
| id required | string Repository UUID |
Cloud source selection
{ }{- "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,
- "owner_id": 123,
- "provider": "icloud",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "skipped_count": 40,
- "started_at": "string",
- "status": "running",
- "total_seen": 120,
- "updated_at": "string"
}
}Bind one user-owned credential plus remote scope to an existing repository and start an independent import run.
| id required | string Repository UUID |
Cloud source
{ }{- "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,
- "owner_id": 123,
- "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": "burst",
- "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": "burst",
- "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
}List owner-scoped Events, optionally projecting membership counts and covers to one repository.
| repository_id | string Optional repository UUID filter |
| include_hidden | boolean Default: false Include Events hidden from the default grid |
| limit | integer Page size |
| cursor | string Opaque cursor |
{- "events": [
- {
- "canonical_media_count": 0,
- "cover_asset_id": "string",
- "cover_media_item_id": "string",
- "displayable_count": 0,
- "end_at": 0,
- "event_id": "550e8400-e29b-41d4-a716-446655440000",
- "is_hidden": true,
- "media_count": 0,
- "projected_media_count": 0,
- "redirected_from": "string",
- "start_at": 0,
- "timezone": "string",
- "title_override": "string"
}
], - "next_cursor": "string"
}| id required | string Event UUID |
| repository_id | string Optional repository Browse Scope |
{- "algorithm_version": "string",
- "canonical_media_count": 0,
- "cover_asset_id": "string",
- "cover_media_item_id": "string",
- "displayable_count": 0,
- "end_at": 0,
- "event_id": "550e8400-e29b-41d4-a716-446655440000",
- "is_hidden": true,
- "media_count": 0,
- "pending_rebuild": true,
- "projected_media_count": 0,
- "redirected_from": "string",
- "start_at": 0,
- "timezone": "string",
- "title_override": "string"
}| id required | string Event UUID |
Event changes
{ }{- "event": {
- "canonical_media_count": 0,
- "cover_asset_id": "string",
- "cover_media_item_id": "string",
- "displayable_count": 0,
- "end_at": 0,
- "event_id": "550e8400-e29b-41d4-a716-446655440000",
- "is_hidden": true,
- "media_count": 0,
- "projected_media_count": 0,
- "redirected_from": "string",
- "start_at": 0,
- "timezone": "string",
- "title_override": "string"
}, - "pending_rebuild": true
}| id required | string Event UUID |
| repository_id | string Optional repository Browse Scope |
| limit | integer Page size |
{- "assets": [
- {
- "asset_id": "string",
- "media_item_id": "string",
- "position": 0
}
], - "next_cursor": "string",
- "omitted_members": 0
}| id required | string Event UUID |
Assets to add
{ }{- "event": {
- "canonical_media_count": 0,
- "cover_asset_id": "string",
- "cover_media_item_id": "string",
- "displayable_count": 0,
- "end_at": 0,
- "event_id": "550e8400-e29b-41d4-a716-446655440000",
- "is_hidden": true,
- "media_count": 0,
- "projected_media_count": 0,
- "redirected_from": "string",
- "start_at": 0,
- "timezone": "string",
- "title_override": "string"
}, - "pending_rebuild": true
}| id required | string Event UUID |
| mediaItemId required | string Media item UUID |
{- "event": {
- "canonical_media_count": 0,
- "cover_asset_id": "string",
- "cover_media_item_id": "string",
- "displayable_count": 0,
- "end_at": 0,
- "event_id": "550e8400-e29b-41d4-a716-446655440000",
- "is_hidden": true,
- "media_count": 0,
- "projected_media_count": 0,
- "redirected_from": "string",
- "start_at": 0,
- "timezone": "string",
- "title_override": "string"
}, - "pending_rebuild": true
}{- "complete": true,
- "relations": [
- {
- "confidence": 0,
- "facts": {
- "property1": null,
- "property2": null
}, - "from": {
- "id": "string",
- "kind": "string"
}, - "origin": "string",
- "relation": "string",
- "to": {
- "id": "string",
- "kind": "string"
}
}
], - "source_version": "string"
}| id required | string Event UUID |
Split request
{ }{- "event": {
- "canonical_media_count": 0,
- "cover_asset_id": "string",
- "cover_media_item_id": "string",
- "displayable_count": 0,
- "end_at": 0,
- "event_id": "550e8400-e29b-41d4-a716-446655440000",
- "is_hidden": true,
- "media_count": 0,
- "projected_media_count": 0,
- "redirected_from": "string",
- "start_at": 0,
- "timezone": "string",
- "title_override": "string"
}, - "pending_rebuild": true
}{ }{- "event": {
- "canonical_media_count": 0,
- "cover_asset_id": "string",
- "cover_media_item_id": "string",
- "displayable_count": 0,
- "end_at": 0,
- "event_id": "550e8400-e29b-41d4-a716-446655440000",
- "is_hidden": true,
- "media_count": 0,
- "projected_media_count": 0,
- "redirected_from": "string",
- "start_at": 0,
- "timezone": "string",
- "title_override": "string"
}, - "pending_rebuild": true
}Rebuild state
{ }{- "algorithm_version": "string",
- "initialized": true,
- "last_error_code": "string",
- "last_failure_run_id": "string",
- "last_success_run_id": "string",
- "paused": true,
- "pending": true,
- "pending_ranges": 0,
- "published_revision": 0,
- "queued_run_id": "string",
- "revision": 0,
- "running_run_id": "string",
- "source_revision": 0
}{- "algorithm_version": "string",
- "initialized": true,
- "last_error_code": "string",
- "last_failure_run_id": "string",
- "last_success_run_id": "string",
- "paused": true,
- "pending": true,
- "pending_ranges": 0,
- "published_revision": 0,
- "queued_run_id": "string",
- "revision": 0,
- "running_run_id": "string",
- "source_revision": 0
}[- {
- "actor": "web:user:1",
- "completed_at": "string",
- "created_at": "string",
- "error_code": "expired",
- "error_message": "Native host approval expired",
- "expected_version": 0,
- "expires_at": "string",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "kind": "open_repository",
- "name": "External Archive",
- "purpose": "Open an existing photo repository",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "request_id": "web-host-action-4d4d",
- "result": {
- "conflict": {
- "allowed_resolutions": [
- "add_separate"
], - "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "risk_warnings": [
- "string"
], - "root_id": "550e8400-e29b-41d4-a716-446655440000",
- "type": "repository_identity"
}, - "name": "External Archive",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "root_id": "550e8400-e29b-41d4-a716-446655440000"
}, - "root_id": "550e8400-e29b-41d4-a716-446655440000",
- "status": "pending",
- "updated_at": "string"
}
]Creates a persistent, expiring task. Filesystem paths and approval nonces never enter this HTTP request or response.
| Idempotency-Key | string Stable request identifier |
Native host action
{ }{- "actor": "web:user:1",
- "completed_at": "string",
- "created_at": "string",
- "error_code": "expired",
- "error_message": "Native host approval expired",
- "expected_version": 0,
- "expires_at": "string",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "kind": "open_repository",
- "name": "External Archive",
- "purpose": "Open an existing photo repository",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "request_id": "web-host-action-4d4d",
- "result": {
- "conflict": {
- "allowed_resolutions": [
- "add_separate"
], - "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "risk_warnings": [
- "string"
], - "root_id": "550e8400-e29b-41d4-a716-446655440000",
- "type": "repository_identity"
}, - "name": "External Archive",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "root_id": "550e8400-e29b-41d4-a716-446655440000"
}, - "root_id": "550e8400-e29b-41d4-a716-446655440000",
- "status": "pending",
- "updated_at": "string"
}| id required | string Host action ID |
{- "actor": "web:user:1",
- "completed_at": "string",
- "created_at": "string",
- "error_code": "expired",
- "error_message": "Native host approval expired",
- "expected_version": 0,
- "expires_at": "string",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "kind": "open_repository",
- "name": "External Archive",
- "purpose": "Open an existing photo repository",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "request_id": "web-host-action-4d4d",
- "result": {
- "conflict": {
- "allowed_resolutions": [
- "add_separate"
], - "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "risk_warnings": [
- "string"
], - "root_id": "550e8400-e29b-41d4-a716-446655440000",
- "type": "repository_identity"
}, - "name": "External Archive",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "root_id": "550e8400-e29b-41d4-a716-446655440000"
}, - "root_id": "550e8400-e29b-41d4-a716-446655440000",
- "status": "pending",
- "updated_at": "string"
}| id required | string Host action ID |
{- "actor": "web:user:1",
- "completed_at": "string",
- "created_at": "string",
- "error_code": "expired",
- "error_message": "Native host approval expired",
- "expected_version": 0,
- "expires_at": "string",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "kind": "open_repository",
- "name": "External Archive",
- "purpose": "Open an existing photo repository",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "request_id": "web-host-action-4d4d",
- "result": {
- "conflict": {
- "allowed_resolutions": [
- "add_separate"
], - "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "risk_warnings": [
- "string"
], - "root_id": "550e8400-e29b-41d4-a716-446655440000",
- "type": "repository_identity"
}, - "name": "External Archive",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "root_id": "550e8400-e29b-41d4-a716-446655440000"
}, - "root_id": "550e8400-e29b-41d4-a716-446655440000",
- "status": "pending",
- "updated_at": "string"
}| id required | string Host action ID |
Recovery decision
{ }{- "actor": "web:user:1",
- "completed_at": "string",
- "created_at": "string",
- "error_code": "expired",
- "error_message": "Native host approval expired",
- "expected_version": 0,
- "expires_at": "string",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "kind": "open_repository",
- "name": "External Archive",
- "purpose": "Open an existing photo repository",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "request_id": "web-host-action-4d4d",
- "result": {
- "conflict": {
- "allowed_resolutions": [
- "add_separate"
], - "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "risk_warnings": [
- "string"
], - "root_id": "550e8400-e29b-41d4-a716-446655440000",
- "type": "repository_identity"
}, - "name": "External Archive",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "root_id": "550e8400-e29b-41d4-a716-446655440000"
}, - "root_id": "550e8400-e29b-41d4-a716-446655440000",
- "status": "pending",
- "updated_at": "string"
}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 |
| include_hidden | boolean Default: false Include people hidden from the default grid |
| 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",
- "hidden_at": "string",
- "is_confirmed": true,
- "is_hidden": 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",
- "hidden_at": "string",
- "is_confirmed": true,
- "is_hidden": 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 |
Person update payload
{ }{- "asset_count": 0,
- "cover_face_image_path": "string",
- "created_at": "string",
- "hidden_at": "string",
- "is_confirmed": true,
- "is_hidden": 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": [
- {
- "best_ts_ms": 12500,
- "id": "media:550e8400-e29b-41d4-a716-446655440000",
- "media_item": {
- "composition": {
- "component_count": 2,
- "has_edited": false,
- "has_jpeg": true,
- "has_live_motion": false,
- "has_raw": true
}, - "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "media_kind": "photo",
- "primary_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": "burst",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst",
- "stack_size": 3
}
}, - "stack": {
- "cover": {
- "composition": {
- "component_count": 2,
- "has_edited": false,
- "has_jpeg": true,
- "has_live_motion": false,
- "has_raw": true
}, - "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "media_kind": "photo",
- "primary_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": "burst",
- "stack_size": 3
}, - "status": [
- 0
], - "storage_path": "string",
- "taken_time": "string",
- "type": "string",
- "upload_time": "string",
- "width": 0
}, - "stack": {
- "stack_cover": true,
- "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst",
- "stack_size": 3
}
}, - "matched_members": [
- {
- "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "primary_asset_id": "550e8400-e29b-41d4-a716-446655440001"
}
], - "members": [
- {
- "media_item_id": "550e8400-e29b-41d4-a716-446655440000",
- "primary_asset_id": "550e8400-e29b-41d4-a716-446655440001"
}
], - "stack_id": "550e8400-e29b-41d4-a716-446655440000",
- "stack_kind": "burst"
}, - "type": "media_item"
}
], - "limit": 20,
- "offset": 0,
- "stack_mode": "collapsed",
- "total_files": 213,
- "total_media_items": 150,
- "total_visible": 120
}Set the representative cover face for a person. The face must belong to the person.
| id required | integer Person ID |
Cover payload
{ }{- "person": {
- "asset_count": 0,
- "cover_face_image_path": "string",
- "created_at": "string",
- "hidden_at": "string",
- "is_confirmed": true,
- "is_hidden": true,
- "member_count": 0,
- "name": "string",
- "person_id": 0,
- "representative_asset_id": "string",
- "updated_at": "string"
}
}{- "complete": true,
- "relations": [
- {
- "confidence": 0,
- "facts": {
- "property1": null,
- "property2": null
}, - "from": {
- "id": "string",
- "kind": "string"
}, - "origin": "string",
- "relation": "string",
- "to": {
- "id": "string",
- "kind": "string"
}
}
], - "source_version": "string"
}List the individual face crops assigned to a person for correction workflows.
| id required | integer Person ID |
| repository_id | string Optional repository UUID filter |
| limit | integer Default: 60 Maximum number of results (max 200) |
| offset | integer Default: 0 Number of results to skip |
{- "faces": [
- {
- "asset_id": "string",
- "confidence": 0,
- "face_id": 0,
- "filename": "string",
- "has_crop": true,
- "is_manual": true,
- "is_representative": true,
- "taken_time": "string",
- "upload_time": "string"
}
], - "limit": 0,
- "offset": 0,
- "total": 0
}Reassign a single face from this person to another person as a manual correction.
| id required | integer Source person ID |
| faceId required | integer Face ID |
Move payload
{ }{- "person": {
- "asset_count": 0,
- "cover_face_image_path": "string",
- "created_at": "string",
- "hidden_at": "string",
- "is_confirmed": true,
- "is_hidden": true,
- "member_count": 0,
- "name": "string",
- "person_id": 0,
- "representative_asset_id": "string",
- "updated_at": "string"
}
}Detach a face from this person, leaving the original asset unchanged.
| id required | integer Person ID |
| faceId required | integer Face ID |
{- "person": {
- "asset_count": 0,
- "cover_face_image_path": "string",
- "created_at": "string",
- "hidden_at": "string",
- "is_confirmed": true,
- "is_hidden": true,
- "member_count": 0,
- "name": "string",
- "person_id": 0,
- "representative_asset_id": "string",
- "updated_at": "string"
}
}Merge one or more source people into the target person. Assets remain in the Lumilio catalog and corrections become manual.
| id required | integer Target person ID |
Merge payload
{ }{- "person": {
- "asset_count": 0,
- "cover_face_image_path": "string",
- "created_at": "string",
- "hidden_at": "string",
- "is_confirmed": true,
- "is_hidden": true,
- "member_count": 0,
- "name": "string",
- "person_id": 0,
- "representative_asset_id": "string",
- "updated_at": "string"
}
}| id required | integer Person ID |
| relation required | string Value: "co_occurs_with" Relation type |
{- "complete": true,
- "relations": [
- {
- "confidence": 0,
- "facts": {
- "property1": null,
- "property2": null
}, - "from": {
- "id": "string",
- "kind": "string"
}, - "origin": "string",
- "relation": "string",
- "to": {
- "id": "string",
- "kind": "string"
}
}
], - "source_version": "string"
}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": [
- {
- "activity": "idle",
- "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",
- "reachability": "active",
- "role": "regular",
- "root_id": "550e8400-e29b-41d4-a716-446655440000",
- "storage_strategy": "date"
}
]
}Create a repository in an explicit direct-child storage folder below a registered Storage Location. Empty root_id selects the configured default. Existing .lumiliorepo targets are returned as structured recovery facts and are never opened implicitly.
Repository name
{ }{- "repository": {
- "activity": "idle",
- "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",
- "reachability": "active",
- "role": "regular",
- "root_id": "550e8400-e29b-41d4-a716-446655440000",
- "storage_strategy": "date"
}, - "warnings": [
- "string"
]
}Remove a non-primary repository and its catalog/index/task state after an exact repository-name confirmation. Original media, marker, and private files remain on disk.
| id required | string Repository UUID |
Exact repository-name confirmation
{ }{- "message": "Operation completed successfully"
}Return a single repository.
| id required | string Repository UUID |
{- "activity": "idle",
- "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",
- "reachability": "active",
- "role": "regular",
- "root_id": "550e8400-e29b-41d4-a716-446655440000",
- "storage_strategy": "date"
}Return the catalog, album, queued-work, and private-state impact of removing a non-primary repository registration. Files on disk are always preserved.
| id required | string Repository UUID |
{- "active_task_count": 0,
- "album_count": 12,
- "asset_count": 1240,
- "catalog_media_bytes": 4294967296,
- "cloud_import_count": 2,
- "files_preserved": true,
- "private_state_bytes": 1048576,
- "private_state_found": true,
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "repository_name": "Family Photos"
}Change the display name without changing identity, path, storage strategy, duplicate handling, owner, role, or root.
| id required | string Repository UUID |
New display name
{ }{- "activity": "idle",
- "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",
- "reachability": "active",
- "role": "regular",
- "root_id": "550e8400-e29b-41d4-a716-446655440000",
- "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": [
- {
- "ambiguous_count": 0,
- "authoritative": true,
- "deferred_count": 1,
- "deleted_count": 1,
- "discovered_count": 10,
- "error": "string",
- "finished_at": "string",
- "mode": "manual",
- "moved_count": 1,
- "partial_reason": "string",
- "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 |
{- "ambiguous_count": 0,
- "authoritative": true,
- "deferred_count": 1,
- "deleted_count": 1,
- "discovered_count": 10,
- "error": "string",
- "finished_at": "string",
- "mode": "manual",
- "moved_count": 1,
- "partial_reason": "string",
- "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
}Merges RAW/JPEG and Live Photo components into logical media items, then detects burst presentation stacks
| id required | string Repository ID |
{- "repository_id": "string",
- "stacks_created": 0
}| limit | integer Maximum events (1-200) |
| offset | integer Pagination offset |
{- "events": [
- {
- "action": "string",
- "actor": "string",
- "actor_user_id": 0,
- "confirmation_type": "string",
- "details": { },
- "event_id": "string",
- "failure_stage": "string",
- "host_instance_id": "string",
- "new_path": "string",
- "occurred_at": "string",
- "old_path": "string",
- "operation_id": "string",
- "request_id": "string",
- "result": "string",
- "source": "string",
- "target_id": "string",
- "target_type": "string"
}
]
}{- "generated_at": "string",
- "items": [
- {
- "available_bytes": 0,
- "canonical_path": "string",
- "capacity_known": true,
- "case_behavior_known": true,
- "case_sensitive": true,
- "cloud_sync_provider": "string",
- "device": "string",
- "effective_gid": "string",
- "effective_uid": "string",
- "filesystem": "string",
- "inode": 0,
- "last_coordination": "string",
- "lock_holder": "string",
- "marker_uuid": "string",
- "mount_fingerprint": "string",
- "mount_fingerprint_changed": true,
- "mount_id": "string",
- "mount_source": "string",
- "name": "string",
- "network_filesystem": true,
- "parent_target_id": "string",
- "path": "string",
- "reachability": "string",
- "registered_mount_fingerprint": "string",
- "removable_likely": true,
- "risk_warnings": [
- "string"
], - "target_id": "string",
- "target_type": "string",
- "total_bytes": 0,
- "writable": true
}
]
}{- "audit_events": [
- {
- "action": "string",
- "actor": "string",
- "actor_user_id": 0,
- "confirmation_type": "string",
- "details": { },
- "event_id": "string",
- "failure_stage": "string",
- "host_instance_id": "string",
- "new_path": "string",
- "occurred_at": "string",
- "old_path": "string",
- "operation_id": "string",
- "request_id": "string",
- "result": "string",
- "source": "string",
- "target_id": "string",
- "target_type": "string"
}
], - "diagnostics": [
- {
- "available_bytes": 0,
- "canonical_path": "string",
- "capacity_known": true,
- "case_behavior_known": true,
- "case_sensitive": true,
- "cloud_sync_provider": "string",
- "device": "string",
- "effective_gid": "string",
- "effective_uid": "string",
- "filesystem": "string",
- "inode": 0,
- "last_coordination": "string",
- "lock_holder": "string",
- "marker_uuid": "string",
- "mount_fingerprint": "string",
- "mount_fingerprint_changed": true,
- "mount_id": "string",
- "mount_source": "string",
- "name": "string",
- "network_filesystem": true,
- "parent_target_id": "string",
- "path": "string",
- "reachability": "string",
- "registered_mount_fingerprint": "string",
- "removable_likely": true,
- "risk_warnings": [
- "string"
], - "target_id": "string",
- "target_type": "string",
- "total_bytes": 0,
- "writable": true
}
], - "generated_at": "string",
- "paths_redacted": true
}Returns bounded direct-child facts for standalone and Docker workflows without accepting arbitrary filesystem paths.
{- "candidates": [
- {
- "allowed_resolutions": [
- "update_location",
- "add_separate"
], - "available_bytes": 0,
- "can_create": true,
- "can_open": true,
- "capacity_known": true,
- "classification": "existing_repository",
- "directory_name": "family-archive",
- "filesystem": "string",
- "mount_point": true,
- "name": "Family Archive",
- "repository_id": "550e8400-e29b-41d4-a716-446655440000",
- "risk_warnings": [
- "string"
], - "total_bytes": 0,
- "writable": true
}
]
}Opens a valid .lumiliorepo by portable directory name. Prior repository-private state is isolated before an authoritative initial scan.
| Idempotency-Key | string Stable request identifier |
Repository candidate
{ }{- "activity": "idle",
- "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",
- "reachability": "active",
- "role": "regular",
- "root_id": "550e8400-e29b-41d4-a716-446655440000",
- "storage_strategy": "date"
}Resolves a same-identity direct child using user-facing decisions; no arbitrary filesystem path is accepted.
| Idempotency-Key | string Stable request identifier |
Repository candidate decision
{ }{- "activity": "idle",
- "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",
- "reachability": "active",
- "role": "regular",
- "root_id": "550e8400-e29b-41d4-a716-446655440000",
- "storage_strategy": "date"
}Return registered repository roots with their current reachability. Filesystem paths are admin-only through this route.
{- "roots": [
- {
- "active_operation_count": 0,
- "available_bytes": 500000000000,
- "can_remove": true,
- "capacity_known": true,
- "files_preserved": true,
- "filesystem": "apfs",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "kind": "external",
- "mount_fingerprint": "string",
- "mount_fingerprint_changed": true,
- "name": "External Archive",
- "path": "/Volumes/Photos",
- "registered_mount_fingerprint": "string",
- "removal_blocked_by": "registered_repositories",
- "repository_count": 2,
- "risk_warnings": [
- "string"
], - "status": "active",
- "total_bytes": 1000000000000,
- "writable": true
}
]
}Remove an empty, idle external Storage Location from Lumilio. The directory, .lumilioroot marker, and every disk file are preserved.
| id required | string Storage Location UUID |
{- "message": "Operation completed successfully"
}Return the latest durable phase for an accepted restore operation, including completion or successful rollback after a runtime restart.
| id required | string Restore operation ID |
{- "backup_name": "20260711T020000.000000Z-library.sqlite3",
- "completed_at": "string",
- "error_code": "string",
- "id": "d62cbbf3-f564-458b-86ca-0f6d10fcd8d4",
- "message": "string",
- "requested_at": "string",
- "restore_point": "string",
- "status": "staged",
- "updated_at": "string"
}Return the latest durable restore receipt, if one exists.
{- "backup_name": "20260711T020000.000000Z-library.sqlite3",
- "completed_at": "string",
- "error_code": "string",
- "id": "d62cbbf3-f564-458b-86ca-0f6d10fcd8d4",
- "message": "string",
- "requested_at": "string",
- "restore_point": "string",
- "status": "staged",
- "updated_at": "string"
}List SQLite snapshots (routine backups and restore points), newest first.
{- "backups": [
- {
- "app_version": "1.2.3",
- "created_at": "string",
- "name": "20260711T020000.000000Z-library.sqlite3",
- "restore_point": true,
- "size_bytes": 1048576,
- "sqlite_version": "3.50.4"
}
]
}Validate and stage the named SQLite snapshot. The accepted operation continues across a runtime restart; poll the returned operation ID for completion or rollback.
| name required | string Backup file name |
{- "backup_name": "20260711T020000.000000Z-library.sqlite3",
- "completed_at": "string",
- "error_code": "string",
- "id": "d62cbbf3-f564-458b-86ca-0f6d10fcd8d4",
- "message": "string",
- "requested_at": "string",
- "restore_point": "string",
- "status": "staged",
- "updated_at": "string"
}Read-only effective runtime-immutable configuration (changed only via TOML + restart).
{- "acme_certificate_expires_at": "string",
- "acme_certificate_hostname": "photos.example.com",
- "acme_certificate_status": "active",
- "acme_last_managed_at": "string",
- "environment": "production",
- "geocoding_provider": "disabled",
- "hardware_accel": "none",
- "log_level": "info",
- "lumen_discovery_enabled": true,
- "passkey_enabled": true,
- "repository_scan_enabled": true,
- "repository_scan_interval_seconds": 300,
- "server_listen": "0.0.0.0:6680",
- "storage_root": "/data/storage",
- "tls_mode": "off"
}Return persisted system settings without exposing secret values.
{ }{- "backup": {
- "enabled": true,
- "interval_hours": 24,
- "keep_last": 14
}, - "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,
- "video_long_threshold_seconds": 300,
- "video_max_frames": 8,
- "video_scene_threshold": 0.4,
- "video_semantic_enabled": true
}, - "updated_at": "string",
- "updated_by": 0
}Update persisted system settings. API keys are write-only and never returned.
System settings patch
{ }{- "backup": {
- "enabled": true,
- "interval_hours": 24,
- "keep_last": 14
}, - "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,
- "video_long_threshold_seconds": 300,
- "video_max_frames": 8,
- "video_scene_threshold": 0.4,
- "video_semantic_enabled": true
}, - "updated_at": "string",
- "updated_by": 0
}Validate the supplied provider/model draft without saving it or returning secret material.
LLM settings draft
{ }{- "valid": true
}Report whether the first owner and primary repository have been created.
{- "admin_initialized": true,
- "initialized": true,
- "next_registration_role": "string",
- "primary_repository_initialized": true,
- "repository_defaults": {
- "default_root": "/data/storage",
- "duplicate_handling": "rename",
- "risk_warnings": [
- "string"
], - "strategy": "date"
}, - "runtime_reason": "storage_recovery_required",
- "runtime_state": "active"
}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, require a password change on next login, invalidate existing sessions, and clear passkeys, TOTP, and recovery codes 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"
}