Immich
v3.0.0-rc.2/apiImmich API
Authentication
bearerhttpScheme: Bearer (JWT)
cookieapiKeyAPI Key: immich_access_token in cookie
api_keyapiKeyAPI Key: x-api-key in header
Activities
An activity is a like or a comment made by a user on an asset or album.
List all activities
Returns a list of activities for the selected asset or album. The activities are returned in sorted order, with the oldest activities appearing first.
Parameters
albumIdstring<uuid>requiredqueryAlbum ID
assetIdstring<uuid>queryAsset ID (if activity is for an asset)
levelReactionLevelalbumassetquerytypeReactionTypecommentlikequeryuserIdstring<uuid>queryFilter by user ID
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/activities'const response = await fetch('/api/activities', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/activities')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/activities", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"comment": "string",
"createdAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "comment",
"user": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}
}
]Create an activity
Create a like or a comment for an album, or an asset in an album.
Body
Activity create
albumIdstring<uuid>requiredAlbum ID
assetIdstring<uuid>Asset ID (if activity is for an asset)
commentstringComment text (required if type is comment)
typeReactionTypecommentlikerequiredReaction type
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/activities' \
-H 'Content-Type: application/json' \
-d '{
"albumId": "550e8400-e29b-41d4-a716-446655440000",
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"comment": "string",
"type": "comment"
}'const response = await fetch('/api/activities', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"albumId": "550e8400-e29b-41d4-a716-446655440000",
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"comment": "string",
"type": "comment"
}),
});
const data = await response.json();import requests
payload = {
"albumId": "550e8400-e29b-41d4-a716-446655440000",
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"comment": "string",
"type": "comment"
}
response = requests.post('/api/activities', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"albumId": "550e8400-e29b-41d4-a716-446655440000",
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"comment": "string",
"type": "comment"
}`)
req, _ := http.NewRequest("POST", "/api/activities", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albumId": "550e8400-e29b-41d4-a716-446655440000",
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"comment": "string",
"type": "comment"
}{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"comment": "string",
"createdAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "comment",
"user": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}
}Retrieve activity statistics
Returns the number of likes and comments for a given album or asset in an album.
Parameters
albumIdstring<uuid>requiredqueryAlbum ID
assetIdstring<uuid>queryAsset ID (if activity is for an asset)
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/activities/statistics'const response = await fetch('/api/activities/statistics', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/activities/statistics')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/activities/statistics", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"comments": 0,
"likes": 0
}Delete an activity
Removes a like or comment from a given album or asset in an album.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/activities/{id}'const response = await fetch('/api/activities/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/activities/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/activities/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Albums
An album is a collection of assets that can be shared with other users or via shared links.
List all albums
Retrieve a list of albums available to the authenticated user.
Parameters
assetIdstring<uuid>queryFilter albums containing this asset ID (ignores other parameters)
idstring<uuid>queryAlbum ID
isOwnedbooleanqueryFilter by ownership: true = only owned, false = only shared-with-me, undefined = no filter
isSharedbooleanqueryFilter by shared status: true = only shared, false = not shared, undefined = no filter
namestringqueryAlbum name (exact match)
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/albums'const response = await fetch('/api/albums', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/albums')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/albums", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"albumName": "string",
"albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
"albumUsers": [
{
"role": "editor",
"user": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}
}
],
"assetCount": 0,
"contributorCounts": [
{
"assetCount": 0,
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
],
"createdAt": "2024-01-15T09:30:00Z",
"description": "string",
"endDate": "2024-01-15T09:30:00Z",
"hasSharedLink": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isActivityEnabled": true,
"lastModifiedAssetTimestamp": "2024-01-15T09:30:00Z",
"order": "asc",
"shared": true,
"startDate": "2024-01-15T09:30:00Z",
"updatedAt": "2024-01-15T09:30:00Z"
}
]Create an album
Create a new album. The album can also be created with initial users and assets.
Body
albumNamestringrequiredAlbum name
albumUsersArray<AlbumUserCreateDto>Album users
assetIdsArray<string>Initial asset IDs
descriptionstringAlbum description
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/albums' \
-H 'Content-Type: application/json' \
-d '{
"albumName": "string",
"albumUsers": [
{
"role": "editor",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
],
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"description": "string"
}'const response = await fetch('/api/albums', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"albumName": "string",
"albumUsers": [
{
"role": "editor",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
],
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"description": "string"
}),
});
const data = await response.json();import requests
payload = {
"albumName": "string",
"albumUsers": [
{
"role": "editor",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
],
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"description": "string"
}
response = requests.post('/api/albums', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"albumName": "string",
"albumUsers": [
{
"role": "editor",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
],
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"description": "string"
}`)
req, _ := http.NewRequest("POST", "/api/albums", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albumName": "string",
"albumUsers": [
{
"role": "editor",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
],
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"description": "string"
}{
"albumName": "string",
"albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
"albumUsers": [
{
"role": "editor",
"user": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}
}
],
"assetCount": 0,
"contributorCounts": [
{
"assetCount": 0,
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
],
"createdAt": "2024-01-15T09:30:00Z",
"description": "string",
"endDate": "2024-01-15T09:30:00Z",
"hasSharedLink": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isActivityEnabled": true,
"lastModifiedAssetTimestamp": "2024-01-15T09:30:00Z",
"order": "asc",
"shared": true,
"startDate": "2024-01-15T09:30:00Z",
"updatedAt": "2024-01-15T09:30:00Z"
}Add assets to albums
Send a list of asset IDs and album IDs to add each asset to each album.
Body
albumIdsArray<string>requiredAlbum IDs
assetIdsArray<string>requiredAsset IDs
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/albums/assets' \
-H 'Content-Type: application/json' \
-d '{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}'const response = await fetch('/api/albums/assets', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}),
});
const data = await response.json();import requests
payload = {
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
response = requests.put('/api/albums/assets', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}`)
req, _ := http.NewRequest("PUT", "/api/albums/assets", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}{
"error": "duplicate",
"success": true
}Retrieve album statistics
Returns statistics about the albums available to the authenticated user.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/albums/statistics'const response = await fetch('/api/albums/statistics', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/albums/statistics')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/albums/statistics", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"notShared": 0,
"owned": 0,
"shared": 0
}Retrieve an album
Retrieve information about a specific album by its ID.
Parameters
idstring<uuid>requiredpathkeystringqueryslugstringqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/albums/{id}'const response = await fetch('/api/albums/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/albums/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/albums/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albumName": "string",
"albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
"albumUsers": [
{
"role": "editor",
"user": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}
}
],
"assetCount": 0,
"contributorCounts": [
{
"assetCount": 0,
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
],
"createdAt": "2024-01-15T09:30:00Z",
"description": "string",
"endDate": "2024-01-15T09:30:00Z",
"hasSharedLink": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isActivityEnabled": true,
"lastModifiedAssetTimestamp": "2024-01-15T09:30:00Z",
"order": "asc",
"shared": true,
"startDate": "2024-01-15T09:30:00Z",
"updatedAt": "2024-01-15T09:30:00Z"
}Delete an album
Delete a specific album by its ID. Note the album is initially trashed and then immediately scheduled for deletion, but relies on a background job to complete the process.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/albums/{id}'const response = await fetch('/api/albums/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/albums/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/albums/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Update an album
Update the information of a specific album by its ID. This endpoint can be used to update the album name, description, sort order, etc. However, it is not used to add or remove assets or users from the album.
Body
albumNamestringAlbum name
albumThumbnailAssetIdstring<uuid>Album thumbnail asset ID
descriptionstringAlbum description
isActivityEnabledbooleanEnable activity feed
orderAssetOrderascdescAsset sort order
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PATCH '/api/albums/{id}' \
-H 'Content-Type: application/json' \
-d '{
"albumName": "string",
"albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
"description": "string",
"isActivityEnabled": true,
"order": "asc"
}'const response = await fetch('/api/albums/{id}', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"albumName": "string",
"albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
"description": "string",
"isActivityEnabled": true,
"order": "asc"
}),
});
const data = await response.json();import requests
payload = {
"albumName": "string",
"albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
"description": "string",
"isActivityEnabled": True,
"order": "asc"
}
response = requests.patch('/api/albums/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"albumName": "string",
"albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
"description": "string",
"isActivityEnabled": true,
"order": "asc"
}`)
req, _ := http.NewRequest("PATCH", "/api/albums/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albumName": "string",
"albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
"description": "string",
"isActivityEnabled": true,
"order": "asc"
}{
"albumName": "string",
"albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
"albumUsers": [
{
"role": "editor",
"user": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}
}
],
"assetCount": 0,
"contributorCounts": [
{
"assetCount": 0,
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
],
"createdAt": "2024-01-15T09:30:00Z",
"description": "string",
"endDate": "2024-01-15T09:30:00Z",
"hasSharedLink": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isActivityEnabled": true,
"lastModifiedAssetTimestamp": "2024-01-15T09:30:00Z",
"order": "asc",
"shared": true,
"startDate": "2024-01-15T09:30:00Z",
"updatedAt": "2024-01-15T09:30:00Z"
}Add assets to an album
Add multiple assets to a specific album by its ID.
Body
idsArray<string>requiredIDs to process
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/albums/{id}/assets' \
-H 'Content-Type: application/json' \
-d '{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}'const response = await fetch('/api/albums/{id}/assets', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}),
});
const data = await response.json();import requests
payload = {
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
response = requests.put('/api/albums/{id}/assets', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}`)
req, _ := http.NewRequest("PUT", "/api/albums/{id}/assets", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}[
{
"error": "duplicate",
"errorMessage": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"success": true
}
]Remove assets from an album
Remove multiple assets from a specific album by its ID.
Body
idsArray<string>requiredIDs to process
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/albums/{id}/assets' \
-H 'Content-Type: application/json' \
-d '{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}'const response = await fetch('/api/albums/{id}/assets', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}),
});
const data = await response.json();import requests
payload = {
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
response = requests.delete('/api/albums/{id}/assets', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}`)
req, _ := http.NewRequest("DELETE", "/api/albums/{id}/assets", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}[
{
"error": "duplicate",
"errorMessage": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"success": true
}
]Retrieve album map markers
Retrieve map marker information for a specific album by its ID.
Parameters
idstring<uuid>requiredpathkeystringqueryslugstringqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/albums/{id}/map-markers'const response = await fetch('/api/albums/{id}/map-markers', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/albums/{id}/map-markers')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/albums/{id}/map-markers", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"city": "string",
"country": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"lat": 0,
"lon": 0,
"state": "string"
}
]Update user role
Change the role for a specific user in a specific album.
Body
roleAlbumUserRoleeditorownerviewerrequiredAlbum user role
Parameters
idstring<uuid>requiredpathuserIdstringrequiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/albums/{id}/user/{userId}' \
-H 'Content-Type: application/json' \
-d '{
"role": "editor"
}'const response = await fetch('/api/albums/{id}/user/{userId}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"role": "editor"
}),
});
const data = await response.json();import requests
payload = {
"role": "editor"
}
response = requests.put('/api/albums/{id}/user/{userId}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"role": "editor"
}`)
req, _ := http.NewRequest("PUT", "/api/albums/{id}/user/{userId}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"role": "editor"
}Remove user from album
Remove a user from an album. Use an ID of "me" to leave a shared album.
Parameters
idstring<uuid>requiredpathuserIdstringrequiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/albums/{id}/user/{userId}'const response = await fetch('/api/albums/{id}/user/{userId}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/albums/{id}/user/{userId}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/albums/{id}/user/{userId}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Share album with users
Share an album with multiple users. Each user can be given a specific role in the album.
Body
albumUsersArray<AlbumUserAddDto>requiredAlbum users to add
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/albums/{id}/users' \
-H 'Content-Type: application/json' \
-d '{
"albumUsers": [
{
"role": "editor",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
]
}'const response = await fetch('/api/albums/{id}/users', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"albumUsers": [
{
"role": "editor",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
]
}),
});
const data = await response.json();import requests
payload = {
"albumUsers": [
{
"role": "editor",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
]
}
response = requests.put('/api/albums/{id}/users', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"albumUsers": [
{
"role": "editor",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
]
}`)
req, _ := http.NewRequest("PUT", "/api/albums/{id}/users", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albumUsers": [
{
"role": "editor",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
]
}{
"albumName": "string",
"albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
"albumUsers": [
{
"role": "editor",
"user": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}
}
],
"assetCount": 0,
"contributorCounts": [
{
"assetCount": 0,
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
],
"createdAt": "2024-01-15T09:30:00Z",
"description": "string",
"endDate": "2024-01-15T09:30:00Z",
"hasSharedLink": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isActivityEnabled": true,
"lastModifiedAssetTimestamp": "2024-01-15T09:30:00Z",
"order": "asc",
"shared": true,
"startDate": "2024-01-15T09:30:00Z",
"updatedAt": "2024-01-15T09:30:00Z"
}API keys
An api key can be used to programmatically access the Immich API.
List all API keys
Retrieve all API keys of the current user.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/api-keys'const response = await fetch('/api/api-keys', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/api-keys')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/api-keys", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"createdAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"permissions": [
"all"
],
"updatedAt": "2024-01-01T00:00:00.000Z"
}
]Create an API key
Creates a new API key. It will be limited to the permissions specified.
Body
namestringAPI key name
permissionsArray<Permission>allactivity.createactivity.readactivity.updateactivity.deleteactivity.statisticsapiKey.createapiKey.readapiKey.updateapiKey.deleteasset.readasset.updateasset.deleteasset.statisticsasset.shareasset.viewasset.downloadasset.uploadasset.copyasset.deriveasset.edit.getasset.edit.createasset.edit.deletealbum.createalbum.readalbum.updatealbum.deletealbum.statisticsalbum.sharealbum.downloadalbumAsset.createalbumAsset.deletealbumUser.createalbumUser.updatealbumUser.deleteauth.changePasswordauthDevice.deletearchive.readbackup.listbackup.downloadbackup.uploadbackup.deleteduplicate.readduplicate.deleteface.createface.readface.updateface.deletefolder.readjob.createjob.readlibrary.createlibrary.readlibrary.updatelibrary.deletelibrary.statisticstimeline.readtimeline.downloadmaintenancemap.readmap.searchmemory.creatememory.readmemory.updatememory.deletememory.statisticsmemoryAsset.creatememoryAsset.deletenotification.createnotification.readnotification.updatenotification.deletepartner.createpartner.readpartner.updatepartner.deleteperson.createperson.readperson.updateperson.deleteperson.statisticsperson.mergeperson.reassignpinCode.createpinCode.updatepinCode.deleteplugin.createplugin.readplugin.updateplugin.deleteserver.aboutserver.apkLinksserver.storageserver.statisticsserver.versionCheckserverLicense.readserverLicense.updateserverLicense.deletesession.createsession.readsession.updatesession.deletesession.locksharedLink.createsharedLink.readsharedLink.updatesharedLink.deletestack.createstack.readstack.updatestack.deletesync.streamsyncCheckpoint.readsyncCheckpoint.updatesyncCheckpoint.deletesystemConfig.readsystemConfig.updatesystemMetadata.readsystemMetadata.updatetag.createtag.readtag.updatetag.deletetag.assetuser.readuser.updateuserLicense.createuserLicense.readuserLicense.updateuserLicense.deleteuserOnboarding.readuserOnboarding.updateuserOnboarding.deleteuserPreference.readuserPreference.updateuserProfileImage.createuserProfileImage.readuserProfileImage.updateuserProfileImage.deletequeue.readqueue.updatequeueJob.createqueueJob.readqueueJob.updatequeueJob.deleteworkflow.createworkflow.readworkflow.updateworkflow.deleteadminUser.createadminUser.readadminUser.updateadminUser.deleteadminSession.readadminAuth.unlinkAllrequiredList of permissions
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/api-keys' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"permissions": [
"all"
]
}'const response = await fetch('/api/api-keys', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"permissions": [
"all"
]
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"permissions": [
"all"
]
}
response = requests.post('/api/api-keys', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"name": "string",
"permissions": [
"all"
]
}`)
req, _ := http.NewRequest("POST", "/api/api-keys", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"name": "string",
"permissions": [
"all"
]
}{
"apiKey": {
"createdAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"permissions": [
"all"
],
"updatedAt": "2024-01-01T00:00:00.000Z"
},
"secret": "string"
}Retrieve the current API key
Retrieve the API key that is used to access this endpoint.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/api-keys/me'const response = await fetch('/api/api-keys/me', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/api-keys/me')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/api-keys/me", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"createdAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"permissions": [
"all"
],
"updatedAt": "2024-01-01T00:00:00.000Z"
}Retrieve an API key
Retrieve an API key by its ID. The current user must own this API key.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/api-keys/{id}'const response = await fetch('/api/api-keys/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/api-keys/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/api-keys/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"createdAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"permissions": [
"all"
],
"updatedAt": "2024-01-01T00:00:00.000Z"
}Update an API key
deprecatedUpdates the name and permissions of an API key by its ID. The current user must own this API key.
Body
namestringAPI key name
permissionsArray<Permission>allactivity.createactivity.readactivity.updateactivity.deleteactivity.statisticsapiKey.createapiKey.readapiKey.updateapiKey.deleteasset.readasset.updateasset.deleteasset.statisticsasset.shareasset.viewasset.downloadasset.uploadasset.copyasset.deriveasset.edit.getasset.edit.createasset.edit.deletealbum.createalbum.readalbum.updatealbum.deletealbum.statisticsalbum.sharealbum.downloadalbumAsset.createalbumAsset.deletealbumUser.createalbumUser.updatealbumUser.deleteauth.changePasswordauthDevice.deletearchive.readbackup.listbackup.downloadbackup.uploadbackup.deleteduplicate.readduplicate.deleteface.createface.readface.updateface.deletefolder.readjob.createjob.readlibrary.createlibrary.readlibrary.updatelibrary.deletelibrary.statisticstimeline.readtimeline.downloadmaintenancemap.readmap.searchmemory.creatememory.readmemory.updatememory.deletememory.statisticsmemoryAsset.creatememoryAsset.deletenotification.createnotification.readnotification.updatenotification.deletepartner.createpartner.readpartner.updatepartner.deleteperson.createperson.readperson.updateperson.deleteperson.statisticsperson.mergeperson.reassignpinCode.createpinCode.updatepinCode.deleteplugin.createplugin.readplugin.updateplugin.deleteserver.aboutserver.apkLinksserver.storageserver.statisticsserver.versionCheckserverLicense.readserverLicense.updateserverLicense.deletesession.createsession.readsession.updatesession.deletesession.locksharedLink.createsharedLink.readsharedLink.updatesharedLink.deletestack.createstack.readstack.updatestack.deletesync.streamsyncCheckpoint.readsyncCheckpoint.updatesyncCheckpoint.deletesystemConfig.readsystemConfig.updatesystemMetadata.readsystemMetadata.updatetag.createtag.readtag.updatetag.deletetag.assetuser.readuser.updateuserLicense.createuserLicense.readuserLicense.updateuserLicense.deleteuserOnboarding.readuserOnboarding.updateuserOnboarding.deleteuserPreference.readuserPreference.updateuserProfileImage.createuserProfileImage.readuserProfileImage.updateuserProfileImage.deletequeue.readqueue.updatequeueJob.createqueueJob.readqueueJob.updatequeueJob.deleteworkflow.createworkflow.readworkflow.updateworkflow.deleteadminUser.createadminUser.readadminUser.updateadminUser.deleteadminSession.readadminAuth.unlinkAllList of permissions
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/api-keys/{id}' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"permissions": [
"all"
]
}'const response = await fetch('/api/api-keys/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"permissions": [
"all"
]
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"permissions": [
"all"
]
}
response = requests.put('/api/api-keys/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"name": "string",
"permissions": [
"all"
]
}`)
req, _ := http.NewRequest("PUT", "/api/api-keys/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"name": "string",
"permissions": [
"all"
]
}{
"createdAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"permissions": [
"all"
],
"updatedAt": "2024-01-01T00:00:00.000Z"
}Delete an API key
Deletes an API key identified by its ID. The current user must own this API key.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/api-keys/{id}'const response = await fetch('/api/api-keys/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/api-keys/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/api-keys/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Assets
An asset is an image or video that has been uploaded to Immich.
Upload asset
Uploads a new asset to the server.
Body
Asset Upload Information
assetDatastring<binary>requiredAsset file data
durationinteger[0, 9007199254740991]Duration in milliseconds (for videos)
fileCreatedAtstring<date-time>requiredFile creation date
fileModifiedAtstring<date-time>requiredFile modification date
filenamestringFilename
isFavoritebooleanMark as favorite
livePhotoVideoIdstring<uuid>Live photo video ID
metadataArray<AssetMetadataUpsertItemDto>Asset metadata items
sidecarDatastring<binary>Sidecar file data
visibilityAssetVisibilityarchivetimelinehiddenlockedAsset visibility
Parameters
keystringqueryslugstringqueryx-immich-checksumstringheadersha1 checksum that can be used for duplicate detection before the file is uploaded
Response
Asset is a duplicate
Asset uploaded successfully
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/assets' \
-H 'Content-Type: multipart/form-data' \
-d '{
"assetData": "<binary>",
"duration": 0,
"fileCreatedAt": "2024-01-01T00:00:00.000Z",
"fileModifiedAt": "2024-01-01T00:00:00.000Z",
"filename": "string",
"isFavorite": true,
"livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
"metadata": [
{
"key": "string",
"value": {}
}
],
"sidecarData": "<binary>",
"visibility": "archive"
}'const response = await fetch('/api/assets', {
method: 'POST',
headers: {
'Content-Type': 'multipart/form-data',
},
body: JSON.stringify({
"assetData": "<binary>",
"duration": 0,
"fileCreatedAt": "2024-01-01T00:00:00.000Z",
"fileModifiedAt": "2024-01-01T00:00:00.000Z",
"filename": "string",
"isFavorite": true,
"livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
"metadata": [
{
"key": "string",
"value": {}
}
],
"sidecarData": "<binary>",
"visibility": "archive"
}),
});
const data = await response.json();import requests
payload = {
"assetData": "<binary>",
"duration": 0,
"fileCreatedAt": "2024-01-01T00:00:00.000Z",
"fileModifiedAt": "2024-01-01T00:00:00.000Z",
"filename": "string",
"isFavorite": True,
"livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
"metadata": [
{
"key": "string",
"value": {}
}
],
"sidecarData": "<binary>",
"visibility": "archive"
}
response = requests.post('/api/assets', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"assetData": "<binary>",
"duration": 0,
"fileCreatedAt": "2024-01-01T00:00:00.000Z",
"fileModifiedAt": "2024-01-01T00:00:00.000Z",
"filename": "string",
"isFavorite": true,
"livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
"metadata": [
{
"key": "string",
"value": {}
}
],
"sidecarData": "<binary>",
"visibility": "archive"
}`)
req, _ := http.NewRequest("POST", "/api/assets", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"assetData": "<binary>",
"duration": 0,
"fileCreatedAt": "2024-01-01T00:00:00.000Z",
"fileModifiedAt": "2024-01-01T00:00:00.000Z",
"filename": "string",
"isFavorite": true,
"livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
"metadata": [
{
"key": "string",
"value": {}
}
],
"sidecarData": "<binary>",
"visibility": "archive"
}{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "created"
}{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "created"
}Update assets
deprecatedUpdates multiple assets at the same time.
Body
dateTimeOriginalstringOriginal date and time
dateTimeRelativeinteger[-9007199254740991, 9007199254740991]Relative time offset in minutes
descriptionstringAsset description
duplicateIdstring | nullDuplicate ID
idsArray<string>requiredAsset IDs to update
isFavoritebooleanMark as favorite
latitudenumber[-90, 90]Latitude coordinate
longitudenumber[-180, 180]Longitude coordinate
ratinginteger | null[-1, 5]Rating in range [1-5] (starred), -1 (rejected), or null (unrated)
timeZonestringTime zone (IANA timezone)
visibilityAssetVisibilityarchivetimelinehiddenlockedAsset visibility
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/assets' \
-H 'Content-Type: application/json' \
-d '{
"dateTimeOriginal": "string",
"dateTimeRelative": -9007199254740991,
"description": "string",
"duplicateId": "string",
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"isFavorite": true,
"latitude": -90,
"longitude": -180,
"rating": -1,
"timeZone": "string",
"visibility": "archive"
}'const response = await fetch('/api/assets', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"dateTimeOriginal": "string",
"dateTimeRelative": -9007199254740991,
"description": "string",
"duplicateId": "string",
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"isFavorite": true,
"latitude": -90,
"longitude": -180,
"rating": -1,
"timeZone": "string",
"visibility": "archive"
}),
});
const data = await response.json();import requests
payload = {
"dateTimeOriginal": "string",
"dateTimeRelative": -9007199254740991,
"description": "string",
"duplicateId": "string",
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"isFavorite": True,
"latitude": -90,
"longitude": -180,
"rating": -1,
"timeZone": "string",
"visibility": "archive"
}
response = requests.put('/api/assets', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"dateTimeOriginal": "string",
"dateTimeRelative": -9007199254740991,
"description": "string",
"duplicateId": "string",
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"isFavorite": true,
"latitude": -90,
"longitude": -180,
"rating": -1,
"timeZone": "string",
"visibility": "archive"
}`)
req, _ := http.NewRequest("PUT", "/api/assets", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"dateTimeOriginal": "string",
"dateTimeRelative": -9007199254740991,
"description": "string",
"duplicateId": "string",
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"isFavorite": true,
"latitude": -90,
"longitude": -180,
"rating": -1,
"timeZone": "string",
"visibility": "archive"
}Delete assets
Deletes multiple assets at the same time.
Body
forcebooleanForce delete even if in use
idsArray<string>requiredIDs to process
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/assets' \
-H 'Content-Type: application/json' \
-d '{
"force": true,
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}'const response = await fetch('/api/assets', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"force": true,
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}),
});
const data = await response.json();import requests
payload = {
"force": True,
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
response = requests.delete('/api/assets', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"force": true,
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}`)
req, _ := http.NewRequest("DELETE", "/api/assets", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"force": true,
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}Check bulk upload
Determine which assets have already been uploaded to the server based on their SHA1 checksums.
Body
assetsArray<AssetBulkUploadCheckItem>requiredAssets to check
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/assets/bulk-upload-check' \
-H 'Content-Type: application/json' \
-d '{
"assets": [
{
"checksum": "string",
"id": "string"
}
]
}'const response = await fetch('/api/assets/bulk-upload-check', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"assets": [
{
"checksum": "string",
"id": "string"
}
]
}),
});
const data = await response.json();import requests
payload = {
"assets": [
{
"checksum": "string",
"id": "string"
}
]
}
response = requests.post('/api/assets/bulk-upload-check', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"assets": [
{
"checksum": "string",
"id": "string"
}
]
}`)
req, _ := http.NewRequest("POST", "/api/assets/bulk-upload-check", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"assets": [
{
"checksum": "string",
"id": "string"
}
]
}{
"results": [
{
"action": "accept",
"assetId": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isTrashed": true,
"reason": "duplicate"
}
]
}Copy asset
Copy asset information like albums, tags, etc. from one asset to another.
Body
albumsbooleantrueCopy album associations
favoritebooleantrueCopy favorite status
sharedLinksbooleantrueCopy shared links
sidecarbooleantrueCopy sidecar file
sourceIdstring<uuid>requiredSource asset ID
stackbooleantrueCopy stack association
targetIdstring<uuid>requiredTarget asset ID
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/assets/copy' \
-H 'Content-Type: application/json' \
-d '{
"albums": true,
"favorite": true,
"sharedLinks": true,
"sidecar": true,
"sourceId": "550e8400-e29b-41d4-a716-446655440000",
"stack": true,
"targetId": "550e8400-e29b-41d4-a716-446655440000"
}'const response = await fetch('/api/assets/copy', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"albums": true,
"favorite": true,
"sharedLinks": true,
"sidecar": true,
"sourceId": "550e8400-e29b-41d4-a716-446655440000",
"stack": true,
"targetId": "550e8400-e29b-41d4-a716-446655440000"
}),
});
const data = await response.json();import requests
payload = {
"albums": True,
"favorite": True,
"sharedLinks": True,
"sidecar": True,
"sourceId": "550e8400-e29b-41d4-a716-446655440000",
"stack": True,
"targetId": "550e8400-e29b-41d4-a716-446655440000"
}
response = requests.put('/api/assets/copy', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"albums": true,
"favorite": true,
"sharedLinks": true,
"sidecar": true,
"sourceId": "550e8400-e29b-41d4-a716-446655440000",
"stack": true,
"targetId": "550e8400-e29b-41d4-a716-446655440000"
}`)
req, _ := http.NewRequest("PUT", "/api/assets/copy", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albums": true,
"favorite": true,
"sharedLinks": true,
"sidecar": true,
"sourceId": "550e8400-e29b-41d4-a716-446655440000",
"stack": true,
"targetId": "550e8400-e29b-41d4-a716-446655440000"
}Run an asset job
Run a specific job on a set of assets.
Body
assetIdsArray<string>requiredAsset IDs
nameAssetJobNamerefresh-facesrefresh-metadataregenerate-thumbnailtranscode-videorequiredJob name
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/assets/jobs' \
-H 'Content-Type: application/json' \
-d '{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"name": "refresh-faces"
}'const response = await fetch('/api/assets/jobs', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"name": "refresh-faces"
}),
});
const data = await response.json();import requests
payload = {
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"name": "refresh-faces"
}
response = requests.post('/api/assets/jobs', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"name": "refresh-faces"
}`)
req, _ := http.NewRequest("POST", "/api/assets/jobs", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"name": "refresh-faces"
}Upsert asset metadata
Upsert metadata key-value pairs for multiple assets.
Body
itemsArray<AssetMetadataBulkUpsertItemDto>requiredMetadata items to upsert
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/assets/metadata' \
-H 'Content-Type: application/json' \
-d '{
"items": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string",
"value": {}
}
]
}'const response = await fetch('/api/assets/metadata', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"items": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string",
"value": {}
}
]
}),
});
const data = await response.json();import requests
payload = {
"items": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string",
"value": {}
}
]
}
response = requests.put('/api/assets/metadata', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"items": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string",
"value": {}
}
]
}`)
req, _ := http.NewRequest("PUT", "/api/assets/metadata", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"items": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string",
"value": {}
}
]
}[
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string",
"updatedAt": "2024-01-01T00:00:00.000Z",
"value": {}
}
]Delete asset metadata
Delete metadata key-value pairs for multiple assets.
Body
itemsArray<AssetMetadataBulkDeleteItemDto>requiredMetadata items to delete
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/assets/metadata' \
-H 'Content-Type: application/json' \
-d '{
"items": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string"
}
]
}'const response = await fetch('/api/assets/metadata', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"items": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string"
}
]
}),
});
const data = await response.json();import requests
payload = {
"items": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string"
}
]
}
response = requests.delete('/api/assets/metadata', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"items": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string"
}
]
}`)
req, _ := http.NewRequest("DELETE", "/api/assets/metadata", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"items": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string"
}
]
}Get asset statistics
Retrieve various statistics about the assets owned by the authenticated user.
Parameters
isFavoritebooleanqueryFilter by favorite status
isTrashedbooleanqueryFilter by trash status
visibilityAssetVisibilityarchivetimelinehiddenlockedqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/assets/statistics'const response = await fetch('/api/assets/statistics', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/assets/statistics')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/assets/statistics", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"images": -9007199254740991,
"total": -9007199254740991,
"videos": -9007199254740991
}Retrieve an asset
Retrieve detailed information about a specific asset.
Parameters
idstring<uuid>requiredpathkeystringqueryslugstringqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/assets/{id}'const response = await fetch('/api/assets/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/assets/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/assets/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}Update an asset
deprecatedUpdate information of a specific asset.
Body
dateTimeOriginalstringOriginal date and time
descriptionstringAsset description
isFavoritebooleanMark as favorite
latitudenumber[-90, 90]Latitude coordinate
livePhotoVideoIdstring<uuid> | nullLive photo video ID
longitudenumber[-180, 180]Longitude coordinate
ratinginteger | null[-1, 5]Rating in range [1-5] (starred), -1 (rejected), or null (unrated)
visibilityAssetVisibilityarchivetimelinehiddenlockedAsset visibility
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/assets/{id}' \
-H 'Content-Type: application/json' \
-d '{
"dateTimeOriginal": "string",
"description": "string",
"isFavorite": true,
"latitude": -90,
"livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
"longitude": -180,
"rating": -1,
"visibility": "archive"
}'const response = await fetch('/api/assets/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"dateTimeOriginal": "string",
"description": "string",
"isFavorite": true,
"latitude": -90,
"livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
"longitude": -180,
"rating": -1,
"visibility": "archive"
}),
});
const data = await response.json();import requests
payload = {
"dateTimeOriginal": "string",
"description": "string",
"isFavorite": True,
"latitude": -90,
"livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
"longitude": -180,
"rating": -1,
"visibility": "archive"
}
response = requests.put('/api/assets/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"dateTimeOriginal": "string",
"description": "string",
"isFavorite": true,
"latitude": -90,
"livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
"longitude": -180,
"rating": -1,
"visibility": "archive"
}`)
req, _ := http.NewRequest("PUT", "/api/assets/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"dateTimeOriginal": "string",
"description": "string",
"isFavorite": true,
"latitude": -90,
"livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
"longitude": -180,
"rating": -1,
"visibility": "archive"
}{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}Retrieve edits for an existing asset
Retrieve a series of edit actions (crop, rotate, mirror) associated with the specified asset.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/assets/{id}/edits'const response = await fetch('/api/assets/{id}/edits', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/assets/{id}/edits')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/assets/{id}/edits", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"edits": [
{
"action": "crop",
"id": "550e8400-e29b-41d4-a716-446655440000",
"parameters": {
"height": 1,
"width": 1,
"x": 0,
"y": 0
}
}
]
}Apply edits to an existing asset
Apply a series of edit actions (crop, rotate, mirror) to the specified asset.
Body
editsArray<AssetEditActionItemDto>requiredList of edit actions to apply (crop, rotate, or mirror)
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/assets/{id}/edits' \
-H 'Content-Type: application/json' \
-d '{
"edits": [
{
"action": "crop",
"parameters": {
"height": 1,
"width": 1,
"x": 0,
"y": 0
}
}
]
}'const response = await fetch('/api/assets/{id}/edits', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"edits": [
{
"action": "crop",
"parameters": {
"height": 1,
"width": 1,
"x": 0,
"y": 0
}
}
]
}),
});
const data = await response.json();import requests
payload = {
"edits": [
{
"action": "crop",
"parameters": {
"height": 1,
"width": 1,
"x": 0,
"y": 0
}
}
]
}
response = requests.put('/api/assets/{id}/edits', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"edits": [
{
"action": "crop",
"parameters": {
"height": 1,
"width": 1,
"x": 0,
"y": 0
}
}
]
}`)
req, _ := http.NewRequest("PUT", "/api/assets/{id}/edits", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"edits": [
{
"action": "crop",
"parameters": {
"height": 1,
"width": 1,
"x": 0,
"y": 0
}
}
]
}{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"edits": [
{
"action": "crop",
"id": "550e8400-e29b-41d4-a716-446655440000",
"parameters": {
"height": 1,
"width": 1,
"x": 0,
"y": 0
}
}
]
}Remove edits from an existing asset
Removes all edit actions (crop, rotate, mirror) associated with the specified asset.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/assets/{id}/edits'const response = await fetch('/api/assets/{id}/edits', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/assets/{id}/edits')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/assets/{id}/edits", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Get asset metadata
Retrieve all metadata key-value pairs associated with the specified asset.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/assets/{id}/metadata'const response = await fetch('/api/assets/{id}/metadata', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/assets/{id}/metadata')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/assets/{id}/metadata", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"key": "string",
"updatedAt": "2024-01-01T00:00:00.000Z",
"value": {}
}
]Update asset metadata
Update or add metadata key-value pairs for the specified asset.
Body
itemsArray<AssetMetadataUpsertItemDto>requiredMetadata items to upsert
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/assets/{id}/metadata' \
-H 'Content-Type: application/json' \
-d '{
"items": [
{
"key": "string",
"value": {}
}
]
}'const response = await fetch('/api/assets/{id}/metadata', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"items": [
{
"key": "string",
"value": {}
}
]
}),
});
const data = await response.json();import requests
payload = {
"items": [
{
"key": "string",
"value": {}
}
]
}
response = requests.put('/api/assets/{id}/metadata', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"items": [
{
"key": "string",
"value": {}
}
]
}`)
req, _ := http.NewRequest("PUT", "/api/assets/{id}/metadata", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"items": [
{
"key": "string",
"value": {}
}
]
}[
{
"key": "string",
"updatedAt": "2024-01-01T00:00:00.000Z",
"value": {}
}
]Retrieve asset metadata by key
Retrieve the value of a specific metadata key associated with the specified asset.
Parameters
idstring<uuid>requiredpathAsset ID
keystringrequiredpathMetadata key
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/assets/{id}/metadata/{key}'const response = await fetch('/api/assets/{id}/metadata/{key}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/assets/{id}/metadata/{key}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/assets/{id}/metadata/{key}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"key": "string",
"updatedAt": "2024-01-01T00:00:00.000Z",
"value": {}
}Delete asset metadata by key
Delete a specific metadata key-value pair associated with the specified asset.
Parameters
idstring<uuid>requiredpathAsset ID
keystringrequiredpathMetadata key
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/assets/{id}/metadata/{key}'const response = await fetch('/api/assets/{id}/metadata/{key}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/assets/{id}/metadata/{key}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/assets/{id}/metadata/{key}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Retrieve asset OCR data
Retrieve all OCR (Optical Character Recognition) data associated with the specified asset.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/assets/{id}/ocr'const response = await fetch('/api/assets/{id}/ocr', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/assets/{id}/ocr')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/assets/{id}/ocr", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"boxScore": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"text": "string",
"textScore": 0,
"x1": 0,
"x2": 0,
"x3": 0,
"x4": 0,
"y1": 0,
"y2": 0,
"y3": 0,
"y4": 0
}
]Download original asset
Downloads the original file of the specified asset.
Parameters
editedbooleanfalsequeryReturn edited asset if available
idstring<uuid>requiredpathkeystringqueryslugstringqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/assets/{id}/original'const response = await fetch('/api/assets/{id}/original', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/assets/{id}/original')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/assets/{id}/original", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}"<binary>"View asset thumbnail
Retrieve the thumbnail image for the specified asset. Viewing the fullsize thumbnail might redirect to downloadAsset, which requires a different permission.
Parameters
editedbooleanfalsequeryReturn edited asset if available
idstring<uuid>requiredpathkeystringquerysizeAssetMediaSizeoriginalfullsizepreviewthumbnailqueryslugstringqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/assets/{id}/thumbnail'const response = await fetch('/api/assets/{id}/thumbnail', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/assets/{id}/thumbnail')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/assets/{id}/thumbnail", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}"<binary>"Play asset video
Streams the video file for the specified asset. This endpoint also supports byte range requests.
Parameters
idstring<uuid>requiredpathkeystringqueryslugstringqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/assets/{id}/video/playback'const response = await fetch('/api/assets/{id}/video/playback', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/assets/{id}/video/playback')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/assets/{id}/video/playback", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}"<binary>"Get HLS main playlist
Returns an HLS main playlist with all available variants for the asset.
Parameters
idstring<uuid>requiredpathkeystringqueryslugstringqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/assets/{id}/video/stream/main.m3u8'const response = await fetch('/api/assets/{id}/video/stream/main.m3u8', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/assets/{id}/video/stream/main.m3u8')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/assets/{id}/video/stream/main.m3u8", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}"string"End HLS streaming session
Releases server resources for the streaming session.
Parameters
idstring<uuid>requiredpathkeystringquerysessionIdstring<uuid>requiredpathslugstringqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/assets/{id}/video/stream/{sessionId}'const response = await fetch('/api/assets/{id}/video/stream/{sessionId}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/assets/{id}/video/stream/{sessionId}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/assets/{id}/video/stream/{sessionId}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Get HLS media playlist
Returns an HLS media playlist for one variant of the streaming session.
Parameters
idstring<uuid>requiredpathkeystringquerysessionIdstring<uuid>requiredpathslugstringqueryvariantIndexinteger[0, 9007199254740991]requiredpathx-immich-hls-posnumber>= 0headerResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/assets/{id}/video/stream/{sessionId}/{variantIndex}/playlist.m3u8'const response = await fetch('/api/assets/{id}/video/stream/{sessionId}/{variantIndex}/playlist.m3u8', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/assets/{id}/video/stream/{sessionId}/{variantIndex}/playlist.m3u8')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/assets/{id}/video/stream/{sessionId}/{variantIndex}/playlist.m3u8", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}"string"Get HLS segment or init file
Streams an HLS init segment (init.mp4) or media segment (seg_N.m4s).
Parameters
filenamestringrequiredpathidstring<uuid>requiredpathkeystringquerysessionIdstring<uuid>requiredpathslugstringqueryvariantIndexinteger[0, 9007199254740991]requiredpathx-immich-hls-msninteger[0, 9007199254740991]headerResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/assets/{id}/video/stream/{sessionId}/{variantIndex}/{filename}'const response = await fetch('/api/assets/{id}/video/stream/{sessionId}/{variantIndex}/{filename}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/assets/{id}/video/stream/{sessionId}/{variantIndex}/{filename}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/assets/{id}/video/stream/{sessionId}/{variantIndex}/{filename}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}"<binary>"Authentication
Endpoints related to user authentication, including OAuth.
Register admin
Create the first admin user in the system.
Body
emailstring<email>requiredUser email
namestringrequiredUser name
passwordstringrequiredUser password
Response
curl -X POST '/api/auth/admin-sign-up' \
-H 'Content-Type: application/json' \
-d '{
"email": "testuser@email.com",
"name": "Admin",
"password": "password"
}'const response = await fetch('/api/auth/admin-sign-up', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "testuser@email.com",
"name": "Admin",
"password": "password"
}),
});
const data = await response.json();import requests
payload = {
"email": "testuser@email.com",
"name": "Admin",
"password": "password"
}
response = requests.post('/api/auth/admin-sign-up', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"email": "testuser@email.com",
"name": "Admin",
"password": "password"
}`)
req, _ := http.NewRequest("POST", "/api/auth/admin-sign-up", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"email": "testuser@email.com",
"name": "Admin",
"password": "password"
}{
"avatarColor": "primary",
"createdAt": "2024-01-01T00:00:00.000Z",
"deletedAt": "2024-01-01T00:00:00.000Z",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isAdmin": true,
"license": {
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
},
"name": "string",
"oauthId": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string",
"quotaSizeInBytes": 0,
"quotaUsageInBytes": 0,
"shouldChangePassword": true,
"status": "active",
"storageLabel": "string",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Change password
Change the password of the current user.
Body
invalidateSessionsbooleanfalseInvalidate all other sessions
newPasswordstringrequiredNew password (min 8 characters)
passwordstringrequiredCurrent password
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/auth/change-password' \
-H 'Content-Type: application/json' \
-d '{
"invalidateSessions": false,
"newPassword": "password",
"password": "password"
}'const response = await fetch('/api/auth/change-password', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"invalidateSessions": false,
"newPassword": "password",
"password": "password"
}),
});
const data = await response.json();import requests
payload = {
"invalidateSessions": False,
"newPassword": "password",
"password": "password"
}
response = requests.post('/api/auth/change-password', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"invalidateSessions": false,
"newPassword": "password",
"password": "password"
}`)
req, _ := http.NewRequest("POST", "/api/auth/change-password", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"invalidateSessions": false,
"newPassword": "password",
"password": "password"
}{
"avatarColor": "primary",
"createdAt": "2024-01-01T00:00:00.000Z",
"deletedAt": "2024-01-01T00:00:00.000Z",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isAdmin": true,
"license": {
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
},
"name": "string",
"oauthId": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string",
"quotaSizeInBytes": 0,
"quotaUsageInBytes": 0,
"shouldChangePassword": true,
"status": "active",
"storageLabel": "string",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Login
Login with username and password and receive a session token.
Body
emailstring<email>requiredUser email
passwordstringrequiredUser password
Response
curl -X POST '/api/auth/login' \
-H 'Content-Type: application/json' \
-d '{
"email": "testuser@email.com",
"password": "password"
}'const response = await fetch('/api/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "testuser@email.com",
"password": "password"
}),
});
const data = await response.json();import requests
payload = {
"email": "testuser@email.com",
"password": "password"
}
response = requests.post('/api/auth/login', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"email": "testuser@email.com",
"password": "password"
}`)
req, _ := http.NewRequest("POST", "/api/auth/login", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"email": "testuser@email.com",
"password": "password"
}{
"accessToken": "string",
"isAdmin": true,
"isOnboarded": true,
"name": "string",
"profileImagePath": "string",
"shouldChangePassword": true,
"userEmail": "user@example.com",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}Logout
Logout the current user and invalidate the session token.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/auth/logout'const response = await fetch('/api/auth/logout', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('/api/auth/logout')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "/api/auth/logout", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"redirectUri": "string",
"successful": true
}Setup pin code
Setup a new pin code for the current user.
Body
pinCodestringrequiredPIN code (4-6 digits)
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/auth/pin-code' \
-H 'Content-Type: application/json' \
-d '{
"pinCode": "123456"
}'const response = await fetch('/api/auth/pin-code', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"pinCode": "123456"
}),
});
const data = await response.json();import requests
payload = {
"pinCode": "123456"
}
response = requests.post('/api/auth/pin-code', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"pinCode": "123456"
}`)
req, _ := http.NewRequest("POST", "/api/auth/pin-code", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"pinCode": "123456"
}Change pin code
Change the pin code for the current user.
Body
newPinCodestringrequiredNew PIN code (4-6 digits)
passwordstringUser password (required if PIN code is not provided)
pinCodestringNew PIN code (4-6 digits)
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/auth/pin-code' \
-H 'Content-Type: application/json' \
-d '{
"newPinCode": "string",
"password": "password",
"pinCode": "123456"
}'const response = await fetch('/api/auth/pin-code', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"newPinCode": "string",
"password": "password",
"pinCode": "123456"
}),
});
const data = await response.json();import requests
payload = {
"newPinCode": "string",
"password": "password",
"pinCode": "123456"
}
response = requests.put('/api/auth/pin-code', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"newPinCode": "string",
"password": "password",
"pinCode": "123456"
}`)
req, _ := http.NewRequest("PUT", "/api/auth/pin-code", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"newPinCode": "string",
"password": "password",
"pinCode": "123456"
}Reset pin code
Reset the pin code for the current user by providing the account password
Body
passwordstringUser password (required if PIN code is not provided)
pinCodestringNew PIN code (4-6 digits)
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/auth/pin-code' \
-H 'Content-Type: application/json' \
-d '{
"password": "password",
"pinCode": "123456"
}'const response = await fetch('/api/auth/pin-code', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"password": "password",
"pinCode": "123456"
}),
});
const data = await response.json();import requests
payload = {
"password": "password",
"pinCode": "123456"
}
response = requests.delete('/api/auth/pin-code', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"password": "password",
"pinCode": "123456"
}`)
req, _ := http.NewRequest("DELETE", "/api/auth/pin-code", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"password": "password",
"pinCode": "123456"
}Lock auth session
Remove elevated access to locked assets from the current session.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/auth/session/lock'const response = await fetch('/api/auth/session/lock', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('/api/auth/session/lock')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "/api/auth/session/lock", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Unlock auth session
Temporarily grant the session elevated access to locked assets by providing the correct PIN code.
Body
passwordstringUser password (required if PIN code is not provided)
pinCodestringNew PIN code (4-6 digits)
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/auth/session/unlock' \
-H 'Content-Type: application/json' \
-d '{
"password": "password",
"pinCode": "123456"
}'const response = await fetch('/api/auth/session/unlock', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"password": "password",
"pinCode": "123456"
}),
});
const data = await response.json();import requests
payload = {
"password": "password",
"pinCode": "123456"
}
response = requests.post('/api/auth/session/unlock', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"password": "password",
"pinCode": "123456"
}`)
req, _ := http.NewRequest("POST", "/api/auth/session/unlock", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"password": "password",
"pinCode": "123456"
}Retrieve auth status
Get information about the current session, including whether the user has a password, and if the session can access locked assets.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/auth/status'const response = await fetch('/api/auth/status', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/auth/status')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/auth/status", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"expiresAt": "string",
"isElevated": true,
"password": true,
"pinCode": true,
"pinExpiresAt": "string"
}Validate access token
Validate the current authorization method is still valid.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/auth/validateToken'const response = await fetch('/api/auth/validateToken', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('/api/auth/validateToken')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "/api/auth/validateToken", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"authStatus": true
}Backchannel OAuth logout
Logout the OAuth account and invalidate the session specified by the sid claim or all sessions if the sid claim is not present.
Body
logout_tokenstringrequiredOAuth logout token
Response
curl -X POST '/api/oauth/backchannel-logout' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d '{
"logout_token": "string"
}'const response = await fetch('/api/oauth/backchannel-logout', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: JSON.stringify({
"logout_token": "string"
}),
});
const data = await response.json();import requests
payload = {
"logout_token": "string"
}
response = requests.post('/api/oauth/backchannel-logout', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"logout_token": "string"
}`)
req, _ := http.NewRequest("POST", "/api/oauth/backchannel-logout", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"logout_token": "string"
}Finish OAuth
Complete the OAuth authorization process by exchanging the authorization code for a session token.
Body
codeVerifierstringOAuth code verifier (PKCE)
statestringOAuth state parameter
urlstringrequiredOAuth callback URL
Response
curl -X POST '/api/oauth/callback' \
-H 'Content-Type: application/json' \
-d '{
"codeVerifier": "string",
"state": "string",
"url": "string"
}'const response = await fetch('/api/oauth/callback', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"codeVerifier": "string",
"state": "string",
"url": "string"
}),
});
const data = await response.json();import requests
payload = {
"codeVerifier": "string",
"state": "string",
"url": "string"
}
response = requests.post('/api/oauth/callback', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"codeVerifier": "string",
"state": "string",
"url": "string"
}`)
req, _ := http.NewRequest("POST", "/api/oauth/callback", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"codeVerifier": "string",
"state": "string",
"url": "string"
}{
"accessToken": "string",
"isAdmin": true,
"isOnboarded": true,
"name": "string",
"profileImagePath": "string",
"shouldChangePassword": true,
"userEmail": "user@example.com",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}Link OAuth account
Link an OAuth account to the authenticated user.
Body
codeVerifierstringOAuth code verifier (PKCE)
statestringOAuth state parameter
urlstringrequiredOAuth callback URL
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/oauth/link' \
-H 'Content-Type: application/json' \
-d '{
"codeVerifier": "string",
"state": "string",
"url": "string"
}'const response = await fetch('/api/oauth/link', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"codeVerifier": "string",
"state": "string",
"url": "string"
}),
});
const data = await response.json();import requests
payload = {
"codeVerifier": "string",
"state": "string",
"url": "string"
}
response = requests.post('/api/oauth/link', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"codeVerifier": "string",
"state": "string",
"url": "string"
}`)
req, _ := http.NewRequest("POST", "/api/oauth/link", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"codeVerifier": "string",
"state": "string",
"url": "string"
}{
"avatarColor": "primary",
"createdAt": "2024-01-01T00:00:00.000Z",
"deletedAt": "2024-01-01T00:00:00.000Z",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isAdmin": true,
"license": {
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
},
"name": "string",
"oauthId": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string",
"quotaSizeInBytes": 0,
"quotaUsageInBytes": 0,
"shouldChangePassword": true,
"status": "active",
"storageLabel": "string",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Redirect OAuth to mobile
Requests to this URL are automatically forwarded to the mobile app, and is used in some cases for OAuth redirecting.
Response
curl -X GET '/api/oauth/mobile-redirect'const response = await fetch('/api/oauth/mobile-redirect', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/oauth/mobile-redirect')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/oauth/mobile-redirect", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Unlink OAuth account
Unlink the OAuth account from the authenticated user.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/oauth/unlink'const response = await fetch('/api/oauth/unlink', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('/api/oauth/unlink')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "/api/oauth/unlink", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"avatarColor": "primary",
"createdAt": "2024-01-01T00:00:00.000Z",
"deletedAt": "2024-01-01T00:00:00.000Z",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isAdmin": true,
"license": {
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
},
"name": "string",
"oauthId": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string",
"quotaSizeInBytes": 0,
"quotaUsageInBytes": 0,
"shouldChangePassword": true,
"status": "active",
"storageLabel": "string",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Authentication (admin)
Administrative endpoints related to authentication.
Unlink all OAuth accounts
Unlinks all OAuth accounts associated with user accounts in the system.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/admin/auth/unlink-all'const response = await fetch('/api/admin/auth/unlink-all', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('/api/admin/auth/unlink-all')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "/api/admin/auth/unlink-all", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Database Backups (admin)
Manage backups of the Immich database.
List database backups
Get the list of the successful and failed backups
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/admin/database-backups'const response = await fetch('/api/admin/database-backups', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/admin/database-backups')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/admin/database-backups", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"backups": [
{
"filename": "string",
"filesize": -9007199254740991,
"timezone": "string"
}
]
}Delete database backup
Delete a backup by its filename
Body
backupsArray<string>requiredBackup filenames to delete
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/admin/database-backups' \
-H 'Content-Type: application/json' \
-d '{
"backups": [
"string"
]
}'const response = await fetch('/api/admin/database-backups', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"backups": [
"string"
]
}),
});
const data = await response.json();import requests
payload = {
"backups": [
"string"
]
}
response = requests.delete('/api/admin/database-backups', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"backups": [
"string"
]
}`)
req, _ := http.NewRequest("DELETE", "/api/admin/database-backups", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"backups": [
"string"
]
}Start database backup restore flow
Put Immich into maintenance mode to restore a backup (Immich must not be configured)
Response
curl -X POST '/api/admin/database-backups/start-restore'const response = await fetch('/api/admin/database-backups/start-restore', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('/api/admin/database-backups/start-restore')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "/api/admin/database-backups/start-restore", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Upload database backup
Uploads .sql/.sql.gz file to restore backup from
Body
Backup Upload
filestring<binary>Database backup file
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/admin/database-backups/upload' \
-H 'Content-Type: multipart/form-data' \
-d '{
"file": "<binary>"
}'const response = await fetch('/api/admin/database-backups/upload', {
method: 'POST',
headers: {
'Content-Type': 'multipart/form-data',
},
body: JSON.stringify({
"file": "<binary>"
}),
});
const data = await response.json();import requests
payload = {
"file": "<binary>"
}
response = requests.post('/api/admin/database-backups/upload', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"file": "<binary>"
}`)
req, _ := http.NewRequest("POST", "/api/admin/database-backups/upload", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"file": "<binary>"
}Download database backup
Downloads the database backup file
Parameters
filenamestringrequiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/admin/database-backups/{filename}'const response = await fetch('/api/admin/database-backups/{filename}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/admin/database-backups/{filename}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/admin/database-backups/{filename}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}"<binary>"Deprecated
Deprecated endpoints that are planned for removal in the next major release.
Update a user
deprecatedUpdate an existing user.
Body
avatarColorUserAvatarColor | nullemailstring<email>User email
isAdminbooleanGrant admin privileges
namestringUser name
passwordstringUser password
pinCodestring | nullPIN code
quotaSizeInBytesinteger | null[0, 9007199254740991]Storage quota in bytes
shouldChangePasswordbooleanRequire password change on next login
storageLabelstring | nullStorage label
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/admin/users/{id}' \
-H 'Content-Type: application/json' \
-d '{
"email": "user@example.com",
"isAdmin": true,
"name": "string",
"password": "string",
"pinCode": "123456",
"quotaSizeInBytes": 0,
"shouldChangePassword": true,
"storageLabel": "string"
}'const response = await fetch('/api/admin/users/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "user@example.com",
"isAdmin": true,
"name": "string",
"password": "string",
"pinCode": "123456",
"quotaSizeInBytes": 0,
"shouldChangePassword": true,
"storageLabel": "string"
}),
});
const data = await response.json();import requests
payload = {
"email": "user@example.com",
"isAdmin": True,
"name": "string",
"password": "string",
"pinCode": "123456",
"quotaSizeInBytes": 0,
"shouldChangePassword": True,
"storageLabel": "string"
}
response = requests.put('/api/admin/users/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"email": "user@example.com",
"isAdmin": true,
"name": "string",
"password": "string",
"pinCode": "123456",
"quotaSizeInBytes": 0,
"shouldChangePassword": true,
"storageLabel": "string"
}`)
req, _ := http.NewRequest("PUT", "/api/admin/users/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"email": "user@example.com",
"isAdmin": true,
"name": "string",
"password": "string",
"pinCode": "123456",
"quotaSizeInBytes": 0,
"shouldChangePassword": true,
"storageLabel": "string"
}{
"avatarColor": "primary",
"createdAt": "2024-01-01T00:00:00.000Z",
"deletedAt": "2024-01-01T00:00:00.000Z",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isAdmin": true,
"license": {
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
},
"name": "string",
"oauthId": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string",
"quotaSizeInBytes": 0,
"quotaUsageInBytes": 0,
"shouldChangePassword": true,
"status": "active",
"storageLabel": "string",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Update user preferences
deprecatedUpdate the preferences of a specific user.
Body
albumsAlbumsUpdateAlbum preferences
avatarAvatarUpdatecastCastUpdatedownloadDownloadUpdateemailNotificationsEmailNotificationsUpdatefoldersFoldersUpdatememoriesMemoriesUpdatepeoplePeopleUpdatepurchasePurchaseUpdateratingsRatingsUpdatesharedLinksSharedLinksUpdatetagsTagsUpdateParameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/admin/users/{id}/preferences' \
-H 'Content-Type: application/json' \
-d '{
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": 1,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}'const response = await fetch('/api/admin/users/{id}/preferences', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": 1,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}),
});
const data = await response.json();import requests
payload = {
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": True
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": True
},
"emailNotifications": {
"albumInvite": True,
"albumUpdate": True,
"enabled": True
},
"folders": {
"enabled": True,
"sidebarWeb": True
},
"memories": {
"duration": 1,
"enabled": True
},
"people": {
"enabled": True,
"minimumFaces": 1,
"sidebarWeb": True
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": True
},
"ratings": {
"enabled": True
},
"sharedLinks": {
"enabled": True,
"sidebarWeb": True
},
"tags": {
"enabled": True,
"sidebarWeb": True
}
}
response = requests.put('/api/admin/users/{id}/preferences', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": 1,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}`)
req, _ := http.NewRequest("PUT", "/api/admin/users/{id}/preferences", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": 1,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}{
"albums": {
"defaultAssetOrder": "asc"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": -9007199254740991,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": -9007199254740991,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}Update an API key
deprecatedUpdates the name and permissions of an API key by its ID. The current user must own this API key.
Body
namestringAPI key name
permissionsArray<Permission>allactivity.createactivity.readactivity.updateactivity.deleteactivity.statisticsapiKey.createapiKey.readapiKey.updateapiKey.deleteasset.readasset.updateasset.deleteasset.statisticsasset.shareasset.viewasset.downloadasset.uploadasset.copyasset.deriveasset.edit.getasset.edit.createasset.edit.deletealbum.createalbum.readalbum.updatealbum.deletealbum.statisticsalbum.sharealbum.downloadalbumAsset.createalbumAsset.deletealbumUser.createalbumUser.updatealbumUser.deleteauth.changePasswordauthDevice.deletearchive.readbackup.listbackup.downloadbackup.uploadbackup.deleteduplicate.readduplicate.deleteface.createface.readface.updateface.deletefolder.readjob.createjob.readlibrary.createlibrary.readlibrary.updatelibrary.deletelibrary.statisticstimeline.readtimeline.downloadmaintenancemap.readmap.searchmemory.creatememory.readmemory.updatememory.deletememory.statisticsmemoryAsset.creatememoryAsset.deletenotification.createnotification.readnotification.updatenotification.deletepartner.createpartner.readpartner.updatepartner.deleteperson.createperson.readperson.updateperson.deleteperson.statisticsperson.mergeperson.reassignpinCode.createpinCode.updatepinCode.deleteplugin.createplugin.readplugin.updateplugin.deleteserver.aboutserver.apkLinksserver.storageserver.statisticsserver.versionCheckserverLicense.readserverLicense.updateserverLicense.deletesession.createsession.readsession.updatesession.deletesession.locksharedLink.createsharedLink.readsharedLink.updatesharedLink.deletestack.createstack.readstack.updatestack.deletesync.streamsyncCheckpoint.readsyncCheckpoint.updatesyncCheckpoint.deletesystemConfig.readsystemConfig.updatesystemMetadata.readsystemMetadata.updatetag.createtag.readtag.updatetag.deletetag.assetuser.readuser.updateuserLicense.createuserLicense.readuserLicense.updateuserLicense.deleteuserOnboarding.readuserOnboarding.updateuserOnboarding.deleteuserPreference.readuserPreference.updateuserProfileImage.createuserProfileImage.readuserProfileImage.updateuserProfileImage.deletequeue.readqueue.updatequeueJob.createqueueJob.readqueueJob.updatequeueJob.deleteworkflow.createworkflow.readworkflow.updateworkflow.deleteadminUser.createadminUser.readadminUser.updateadminUser.deleteadminSession.readadminAuth.unlinkAllList of permissions
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/api-keys/{id}' \
-H 'Content-Type: application/json' \
-d '{
"name": "string",
"permissions": [
"all"
]
}'const response = await fetch('/api/api-keys/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"permissions": [
"all"
]
}),
});
const data = await response.json();import requests
payload = {
"name": "string",
"permissions": [
"all"
]
}
response = requests.put('/api/api-keys/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"name": "string",
"permissions": [
"all"
]
}`)
req, _ := http.NewRequest("PUT", "/api/api-keys/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"name": "string",
"permissions": [
"all"
]
}{
"createdAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"permissions": [
"all"
],
"updatedAt": "2024-01-01T00:00:00.000Z"
}Update assets
deprecatedUpdates multiple assets at the same time.
Body
dateTimeOriginalstringOriginal date and time
dateTimeRelativeinteger[-9007199254740991, 9007199254740991]Relative time offset in minutes
descriptionstringAsset description
duplicateIdstring | nullDuplicate ID
idsArray<string>requiredAsset IDs to update
isFavoritebooleanMark as favorite
latitudenumber[-90, 90]Latitude coordinate
longitudenumber[-180, 180]Longitude coordinate
ratinginteger | null[-1, 5]Rating in range [1-5] (starred), -1 (rejected), or null (unrated)
timeZonestringTime zone (IANA timezone)
visibilityAssetVisibilityarchivetimelinehiddenlockedAsset visibility
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/assets' \
-H 'Content-Type: application/json' \
-d '{
"dateTimeOriginal": "string",
"dateTimeRelative": -9007199254740991,
"description": "string",
"duplicateId": "string",
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"isFavorite": true,
"latitude": -90,
"longitude": -180,
"rating": -1,
"timeZone": "string",
"visibility": "archive"
}'const response = await fetch('/api/assets', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"dateTimeOriginal": "string",
"dateTimeRelative": -9007199254740991,
"description": "string",
"duplicateId": "string",
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"isFavorite": true,
"latitude": -90,
"longitude": -180,
"rating": -1,
"timeZone": "string",
"visibility": "archive"
}),
});
const data = await response.json();import requests
payload = {
"dateTimeOriginal": "string",
"dateTimeRelative": -9007199254740991,
"description": "string",
"duplicateId": "string",
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"isFavorite": True,
"latitude": -90,
"longitude": -180,
"rating": -1,
"timeZone": "string",
"visibility": "archive"
}
response = requests.put('/api/assets', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"dateTimeOriginal": "string",
"dateTimeRelative": -9007199254740991,
"description": "string",
"duplicateId": "string",
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"isFavorite": true,
"latitude": -90,
"longitude": -180,
"rating": -1,
"timeZone": "string",
"visibility": "archive"
}`)
req, _ := http.NewRequest("PUT", "/api/assets", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"dateTimeOriginal": "string",
"dateTimeRelative": -9007199254740991,
"description": "string",
"duplicateId": "string",
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"isFavorite": true,
"latitude": -90,
"longitude": -180,
"rating": -1,
"timeZone": "string",
"visibility": "archive"
}Update an asset
deprecatedUpdate information of a specific asset.
Body
dateTimeOriginalstringOriginal date and time
descriptionstringAsset description
isFavoritebooleanMark as favorite
latitudenumber[-90, 90]Latitude coordinate
livePhotoVideoIdstring<uuid> | nullLive photo video ID
longitudenumber[-180, 180]Longitude coordinate
ratinginteger | null[-1, 5]Rating in range [1-5] (starred), -1 (rejected), or null (unrated)
visibilityAssetVisibilityarchivetimelinehiddenlockedAsset visibility
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/assets/{id}' \
-H 'Content-Type: application/json' \
-d '{
"dateTimeOriginal": "string",
"description": "string",
"isFavorite": true,
"latitude": -90,
"livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
"longitude": -180,
"rating": -1,
"visibility": "archive"
}'const response = await fetch('/api/assets/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"dateTimeOriginal": "string",
"description": "string",
"isFavorite": true,
"latitude": -90,
"livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
"longitude": -180,
"rating": -1,
"visibility": "archive"
}),
});
const data = await response.json();import requests
payload = {
"dateTimeOriginal": "string",
"description": "string",
"isFavorite": True,
"latitude": -90,
"livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
"longitude": -180,
"rating": -1,
"visibility": "archive"
}
response = requests.put('/api/assets/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"dateTimeOriginal": "string",
"description": "string",
"isFavorite": true,
"latitude": -90,
"livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
"longitude": -180,
"rating": -1,
"visibility": "archive"
}`)
req, _ := http.NewRequest("PUT", "/api/assets/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"dateTimeOriginal": "string",
"description": "string",
"isFavorite": true,
"latitude": -90,
"livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
"longitude": -180,
"rating": -1,
"visibility": "archive"
}{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}Retrieve queue counts and status
deprecatedRetrieve the counts of the current queue, as well as the current status.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/jobs'const response = await fetch('/api/jobs', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/jobs')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/jobs", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"backgroundTask": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"backupDatabase": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"duplicateDetection": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"editor": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"faceDetection": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"facialRecognition": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"integrityCheck": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"library": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"metadataExtraction": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"migration": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"notifications": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"ocr": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"search": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"sidecar": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"smartSearch": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"storageTemplateMigration": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"thumbnailGeneration": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"videoConversion": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"workflow": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
}
}Run jobs
deprecatedQueue all assets for a specific job type. Defaults to only queueing assets that have not yet been processed, but the force command can be used to re-process all assets.
Body
commandQueueCommandstartpauseresumeemptyclear-failedrequiredQueue command to execute
forcebooleanForce the command execution (if applicable)
Parameters
nameQueueNamethumbnailGenerationmetadataExtractionvideoConversionfaceDetectionfacialRecognitionsmartSearchduplicateDetectionbackgroundTaskstorageTemplateMigrationmigrationsearchsidecarlibrarynotificationsbackupDatabaseocrworkflowintegrityCheckeditorrequiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/jobs/{name}' \
-H 'Content-Type: application/json' \
-d '{
"command": "start",
"force": true
}'const response = await fetch('/api/jobs/{name}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"command": "start",
"force": true
}),
});
const data = await response.json();import requests
payload = {
"command": "start",
"force": True
}
response = requests.put('/api/jobs/{name}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"command": "start",
"force": true
}`)
req, _ := http.NewRequest("PUT", "/api/jobs/{name}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"command": "start",
"force": true
}{
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
}Update a library
deprecatedUpdate an existing external library.
Body
exclusionPatternsArray<string>Exclusion patterns (max 128)
importPathsArray<string>Import paths (max 128)
namestringLibrary name
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/libraries/{id}' \
-H 'Content-Type: application/json' \
-d '{
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
],
"name": "string"
}'const response = await fetch('/api/libraries/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
],
"name": "string"
}),
});
const data = await response.json();import requests
payload = {
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
],
"name": "string"
}
response = requests.put('/api/libraries/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
],
"name": "string"
}`)
req, _ := http.NewRequest("PUT", "/api/libraries/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
],
"name": "string"
}{
"assetCount": -9007199254740991,
"createdAt": "2024-01-01T00:00:00.000Z",
"exclusionPatterns": [
"string"
],
"id": "550e8400-e29b-41d4-a716-446655440000",
"importPaths": [
"string"
],
"name": "string",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"refreshedAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Update a memory
deprecatedUpdate an existing memory by its ID.
Body
isSavedbooleanIs memory saved
memoryAtstring<date-time>Memory date
seenAtstring<date-time>Date when memory was seen
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/memories/{id}' \
-H 'Content-Type: application/json' \
-d '{
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"seenAt": "2024-01-01T00:00:00.000Z"
}'const response = await fetch('/api/memories/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"seenAt": "2024-01-01T00:00:00.000Z"
}),
});
const data = await response.json();import requests
payload = {
"isSaved": True,
"memoryAt": "2024-01-01T00:00:00.000Z",
"seenAt": "2024-01-01T00:00:00.000Z"
}
response = requests.put('/api/memories/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"seenAt": "2024-01-01T00:00:00.000Z"
}`)
req, _ := http.NewRequest("PUT", "/api/memories/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"seenAt": "2024-01-01T00:00:00.000Z"
}{
"assets": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"createdAt": "2024-01-01T00:00:00.000Z",
"data": {
"year": 1000
},
"deletedAt": "2024-01-01T00:00:00.000Z",
"hideAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"seenAt": "2024-01-01T00:00:00.000Z",
"showAt": "2024-01-01T00:00:00.000Z",
"type": "on_this_day",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Create a partner
deprecatedCreate a new partner to share assets with.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/partners/{id}'const response = await fetch('/api/partners/{id}', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('/api/partners/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "/api/partners/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"inTimeline": true,
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}Update person
deprecatedUpdate an individual person.
Body
birthDatestring<date> | nullPerson date of birth
colorstring | nullPerson color (hex)
featureFaceAssetIdstring<uuid>Asset ID used for feature face thumbnail
isFavoritebooleanMark as favorite
isHiddenbooleanPerson visibility (hidden)
namestringPerson name
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/people/{id}' \
-H 'Content-Type: application/json' \
-d '{
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string"
}'const response = await fetch('/api/people/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string"
}),
});
const data = await response.json();import requests
payload = {
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": True,
"isHidden": True,
"name": "string"
}
response = requests.put('/api/people/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string"
}`)
req, _ := http.NewRequest("PUT", "/api/people/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string"
}{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}Update a session
deprecatedUpdate a specific session identified by id.
Body
isPendingSyncResetbooleanReset pending sync state
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/sessions/{id}' \
-H 'Content-Type: application/json' \
-d '{
"isPendingSyncReset": true
}'const response = await fetch('/api/sessions/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"isPendingSyncReset": true
}),
});
const data = await response.json();import requests
payload = {
"isPendingSyncReset": True
}
response = requests.put('/api/sessions/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"isPendingSyncReset": true
}`)
req, _ := http.NewRequest("PUT", "/api/sessions/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"isPendingSyncReset": true
}{
"appVersion": "string",
"createdAt": "string",
"current": true,
"deviceOS": "string",
"deviceType": "string",
"expiresAt": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isPendingSyncReset": true,
"updatedAt": "string"
}Update a stack
deprecatedUpdate an existing stack by its ID.
Body
primaryAssetIdstring<uuid>Primary asset ID
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/stacks/{id}' \
-H 'Content-Type: application/json' \
-d '{
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}'const response = await fetch('/api/stacks/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}),
});
const data = await response.json();import requests
payload = {
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}
response = requests.put('/api/stacks/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}`)
req, _ := http.NewRequest("PUT", "/api/stacks/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}{
"assets": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}Update current user
deprecatedUpdate the current user making the API request.
Body
avatarColorUserAvatarColor | nullemailstring<email>User email
namestringUser name
passwordstringdeprecatedUser password (deprecated, use change password endpoint)
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/users/me' \
-H 'Content-Type: application/json' \
-d '{
"email": "user@example.com",
"name": "string",
"password": "string"
}'const response = await fetch('/api/users/me', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "user@example.com",
"name": "string",
"password": "string"
}),
});
const data = await response.json();import requests
payload = {
"email": "user@example.com",
"name": "string",
"password": "string"
}
response = requests.put('/api/users/me', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"email": "user@example.com",
"name": "string",
"password": "string"
}`)
req, _ := http.NewRequest("PUT", "/api/users/me", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"email": "user@example.com",
"name": "string",
"password": "string"
}{
"avatarColor": "primary",
"createdAt": "2024-01-01T00:00:00.000Z",
"deletedAt": "2024-01-01T00:00:00.000Z",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isAdmin": true,
"license": {
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
},
"name": "string",
"oauthId": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string",
"quotaSizeInBytes": 0,
"quotaUsageInBytes": 0,
"shouldChangePassword": true,
"status": "active",
"storageLabel": "string",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Update my preferences
deprecatedUpdate the preferences of the current user.
Body
albumsAlbumsUpdateAlbum preferences
avatarAvatarUpdatecastCastUpdatedownloadDownloadUpdateemailNotificationsEmailNotificationsUpdatefoldersFoldersUpdatememoriesMemoriesUpdatepeoplePeopleUpdatepurchasePurchaseUpdateratingsRatingsUpdatesharedLinksSharedLinksUpdatetagsTagsUpdateResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/users/me/preferences' \
-H 'Content-Type: application/json' \
-d '{
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": 1,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}'const response = await fetch('/api/users/me/preferences', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": 1,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}),
});
const data = await response.json();import requests
payload = {
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": True
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": True
},
"emailNotifications": {
"albumInvite": True,
"albumUpdate": True,
"enabled": True
},
"folders": {
"enabled": True,
"sidebarWeb": True
},
"memories": {
"duration": 1,
"enabled": True
},
"people": {
"enabled": True,
"minimumFaces": 1,
"sidebarWeb": True
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": True
},
"ratings": {
"enabled": True
},
"sharedLinks": {
"enabled": True,
"sidebarWeb": True
},
"tags": {
"enabled": True,
"sidebarWeb": True
}
}
response = requests.put('/api/users/me/preferences', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": 1,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}`)
req, _ := http.NewRequest("PUT", "/api/users/me/preferences", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": 1,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}{
"albums": {
"defaultAssetOrder": "asc"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": -9007199254740991,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": -9007199254740991,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}Update a workflow
deprecatedUpdate the information of a specific workflow by its ID. This endpoint can be used to update the workflow name, description, trigger type, filters and actions order, etc.
Body
descriptionstring | nullWorkflow description
enabledbooleanWorkflow enabled
namestring | nullWorkflow name
stepsArray<WorkflowStepDto>triggerWorkflowTriggerAssetCreateAssetMetadataExtractionPlugin trigger type
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/workflows/{id}' \
-H 'Content-Type: application/json' \
-d '{
"description": "string",
"enabled": true,
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate"
}'const response = await fetch('/api/workflows/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"description": "string",
"enabled": true,
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate"
}),
});
const data = await response.json();import requests
payload = {
"description": "string",
"enabled": True,
"name": "string",
"steps": [
{
"config": {},
"enabled": True,
"method": "string"
}
],
"trigger": "AssetCreate"
}
response = requests.put('/api/workflows/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"description": "string",
"enabled": true,
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate"
}`)
req, _ := http.NewRequest("PUT", "/api/workflows/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"description": "string",
"enabled": true,
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate"
}{
"createdAt": "string",
"description": "string",
"enabled": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate",
"updatedAt": "string"
}Download
Endpoints for downloading assets or collections of assets.
Download asset archive
Download a ZIP archive containing the specified assets. The assets must have been previously requested via the "getDownloadInfo" endpoint.
Body
assetIdsArray<string>requiredAsset IDs
editedbooleanDownload edited asset if available
Parameters
keystringqueryslugstringqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/download/archive' \
-H 'Content-Type: application/json' \
-d '{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"edited": true
}'const response = await fetch('/api/download/archive', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"edited": true
}),
});
const data = await response.json();import requests
payload = {
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"edited": True
}
response = requests.post('/api/download/archive', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"edited": true
}`)
req, _ := http.NewRequest("POST", "/api/download/archive", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"edited": true
}"<binary>"Retrieve download information
Retrieve information about how to request a download for the specified assets or album. The response includes groups of assets that can be downloaded together.
Body
albumIdstring<uuid>Album ID to download
archiveSizeinteger[1, 9007199254740991]Archive size limit in bytes
assetIdsArray<string>Asset IDs to download
userIdstring<uuid>User ID to download assets from
Parameters
keystringqueryslugstringqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/download/info' \
-H 'Content-Type: application/json' \
-d '{
"albumId": "550e8400-e29b-41d4-a716-446655440000",
"archiveSize": 1,
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"userId": "550e8400-e29b-41d4-a716-446655440000"
}'const response = await fetch('/api/download/info', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"albumId": "550e8400-e29b-41d4-a716-446655440000",
"archiveSize": 1,
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"userId": "550e8400-e29b-41d4-a716-446655440000"
}),
});
const data = await response.json();import requests
payload = {
"albumId": "550e8400-e29b-41d4-a716-446655440000",
"archiveSize": 1,
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
response = requests.post('/api/download/info', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"albumId": "550e8400-e29b-41d4-a716-446655440000",
"archiveSize": 1,
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"userId": "550e8400-e29b-41d4-a716-446655440000"
}`)
req, _ := http.NewRequest("POST", "/api/download/info", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albumId": "550e8400-e29b-41d4-a716-446655440000",
"archiveSize": 1,
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"userId": "550e8400-e29b-41d4-a716-446655440000"
}{
"archives": [
{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"size": -9007199254740991
}
],
"totalSize": -9007199254740991
}Duplicates
Endpoints for managing and identifying duplicate assets.
Retrieve duplicates
Retrieve a list of duplicate assets available to the authenticated user.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/duplicates'const response = await fetch('/api/duplicates', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/duplicates')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/duplicates", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"assets": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"suggestedKeepAssetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
]Delete duplicates
Delete multiple duplicate assets specified by their IDs.
Body
idsArray<string>requiredIDs to process
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/duplicates' \
-H 'Content-Type: application/json' \
-d '{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}'const response = await fetch('/api/duplicates', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}),
});
const data = await response.json();import requests
payload = {
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
response = requests.delete('/api/duplicates', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}`)
req, _ := http.NewRequest("DELETE", "/api/duplicates", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}Resolve duplicate groups
Resolve duplicate groups by synchronizing metadata across assets and deleting/trashing duplicates.
Body
groupsArray<DuplicateResolveGroupDto>requiredList of duplicate groups to resolve
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/duplicates/resolve' \
-H 'Content-Type: application/json' \
-d '{
"groups": [
{
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"keepAssetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"trashAssetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
]
}'const response = await fetch('/api/duplicates/resolve', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"groups": [
{
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"keepAssetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"trashAssetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
]
}),
});
const data = await response.json();import requests
payload = {
"groups": [
{
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"keepAssetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"trashAssetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
]
}
response = requests.post('/api/duplicates/resolve', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"groups": [
{
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"keepAssetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"trashAssetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
]
}`)
req, _ := http.NewRequest("POST", "/api/duplicates/resolve", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"groups": [
{
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"keepAssetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"trashAssetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
]
}[
{
"error": "duplicate",
"errorMessage": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"success": true
}
]Dismiss a duplicate group
Dismiss a duplicate group by its ID, unlinking all assets in the group without deleting them.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/duplicates/{id}'const response = await fetch('/api/duplicates/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/duplicates/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/duplicates/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Faces
A face is a detected human face within an asset, which can be associated with a person. Faces are normally detected via machine learning, but can also be created via manually.
Retrieve faces for asset
Retrieve all faces belonging to an asset.
Parameters
idstring<uuid>requiredqueryFace ID
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/faces'const response = await fetch('/api/faces', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/faces')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/faces", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"boundingBoxX1": -9007199254740991,
"boundingBoxX2": -9007199254740991,
"boundingBoxY1": -9007199254740991,
"boundingBoxY2": -9007199254740991,
"id": "550e8400-e29b-41d4-a716-446655440000",
"imageHeight": 0,
"imageWidth": 0,
"person": {
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
},
"sourceType": "machine-learning"
}
]Create a face
Create a new face that has not been discovered by facial recognition. The content of the bounding box is considered a face.
Body
assetIdstring<uuid>requiredAsset ID
heightinteger[-9007199254740991, 9007199254740991]requiredFace bounding box height
imageHeightinteger[-9007199254740991, 9007199254740991]requiredImage height in pixels
imageWidthinteger[-9007199254740991, 9007199254740991]requiredImage width in pixels
personIdstring<uuid>requiredPerson ID
widthinteger[-9007199254740991, 9007199254740991]requiredFace bounding box width
xinteger[-9007199254740991, 9007199254740991]requiredFace bounding box X coordinate
yinteger[-9007199254740991, 9007199254740991]requiredFace bounding box Y coordinate
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/faces' \
-H 'Content-Type: application/json' \
-d '{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"height": -9007199254740991,
"imageHeight": -9007199254740991,
"imageWidth": -9007199254740991,
"personId": "550e8400-e29b-41d4-a716-446655440000",
"width": -9007199254740991,
"x": -9007199254740991,
"y": -9007199254740991
}'const response = await fetch('/api/faces', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"height": -9007199254740991,
"imageHeight": -9007199254740991,
"imageWidth": -9007199254740991,
"personId": "550e8400-e29b-41d4-a716-446655440000",
"width": -9007199254740991,
"x": -9007199254740991,
"y": -9007199254740991
}),
});
const data = await response.json();import requests
payload = {
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"height": -9007199254740991,
"imageHeight": -9007199254740991,
"imageWidth": -9007199254740991,
"personId": "550e8400-e29b-41d4-a716-446655440000",
"width": -9007199254740991,
"x": -9007199254740991,
"y": -9007199254740991
}
response = requests.post('/api/faces', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"height": -9007199254740991,
"imageHeight": -9007199254740991,
"imageWidth": -9007199254740991,
"personId": "550e8400-e29b-41d4-a716-446655440000",
"width": -9007199254740991,
"x": -9007199254740991,
"y": -9007199254740991
}`)
req, _ := http.NewRequest("POST", "/api/faces", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"height": -9007199254740991,
"imageHeight": -9007199254740991,
"imageWidth": -9007199254740991,
"personId": "550e8400-e29b-41d4-a716-446655440000",
"width": -9007199254740991,
"x": -9007199254740991,
"y": -9007199254740991
}Re-assign a face to another person
Re-assign the face provided in the body to the person identified by the id in the path parameter.
Body
idstring<uuid>requiredFace ID
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/faces/{id}' \
-H 'Content-Type: application/json' \
-d '{
"id": "550e8400-e29b-41d4-a716-446655440000"
}'const response = await fetch('/api/faces/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"id": "550e8400-e29b-41d4-a716-446655440000"
}),
});
const data = await response.json();import requests
payload = {
"id": "550e8400-e29b-41d4-a716-446655440000"
}
response = requests.put('/api/faces/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"id": "550e8400-e29b-41d4-a716-446655440000"
}`)
req, _ := http.NewRequest("PUT", "/api/faces/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"id": "550e8400-e29b-41d4-a716-446655440000"
}{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}Delete a face
Delete a face identified by the id. Optionally can be force deleted.
Body
forcebooleanrequiredForce delete even if person has other faces
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/faces/{id}' \
-H 'Content-Type: application/json' \
-d '{
"force": true
}'const response = await fetch('/api/faces/{id}', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"force": true
}),
});
const data = await response.json();import requests
payload = {
"force": True
}
response = requests.delete('/api/faces/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"force": true
}`)
req, _ := http.NewRequest("DELETE", "/api/faces/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"force": true
}Integrity (admin)
Endpoints for viewing and managing integrity reports.
Jobs
Queues and background jobs are used for processing tasks asynchronously. Queues can be paused and resumed as needed.
Retrieve queue counts and status
deprecatedRetrieve the counts of the current queue, as well as the current status.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/jobs'const response = await fetch('/api/jobs', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/jobs')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/jobs", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"backgroundTask": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"backupDatabase": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"duplicateDetection": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"editor": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"faceDetection": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"facialRecognition": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"integrityCheck": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"library": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"metadataExtraction": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"migration": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"notifications": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"ocr": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"search": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"sidecar": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"smartSearch": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"storageTemplateMigration": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"thumbnailGeneration": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"videoConversion": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"workflow": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
}
}Create a manual job
Run a specific job. Most jobs are queued automatically, but this endpoint allows for manual creation of a handful of jobs, including various cleanup tasks, as well as creating a new database backup.
Body
nameManualJobNameperson-cleanuptag-cleanupuser-cleanupmemory-cleanupmemory-createbackup-databaseintegrity-missing-filesintegrity-untracked-filesintegrity-checksum-mismatchintegrity-missing-files-refreshintegrity-untracked-files-refreshintegrity-checksum-mismatch-refreshintegrity-missing-files-delete-allintegrity-untracked-files-delete-allintegrity-checksum-mismatch-delete-allrequiredManual job name
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/jobs' \
-H 'Content-Type: application/json' \
-d '{
"name": "person-cleanup"
}'const response = await fetch('/api/jobs', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "person-cleanup"
}),
});
const data = await response.json();import requests
payload = {
"name": "person-cleanup"
}
response = requests.post('/api/jobs', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"name": "person-cleanup"
}`)
req, _ := http.NewRequest("POST", "/api/jobs", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"name": "person-cleanup"
}Run jobs
deprecatedQueue all assets for a specific job type. Defaults to only queueing assets that have not yet been processed, but the force command can be used to re-process all assets.
Body
commandQueueCommandstartpauseresumeemptyclear-failedrequiredQueue command to execute
forcebooleanForce the command execution (if applicable)
Parameters
nameQueueNamethumbnailGenerationmetadataExtractionvideoConversionfaceDetectionfacialRecognitionsmartSearchduplicateDetectionbackgroundTaskstorageTemplateMigrationmigrationsearchsidecarlibrarynotificationsbackupDatabaseocrworkflowintegrityCheckeditorrequiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/jobs/{name}' \
-H 'Content-Type: application/json' \
-d '{
"command": "start",
"force": true
}'const response = await fetch('/api/jobs/{name}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"command": "start",
"force": true
}),
});
const data = await response.json();import requests
payload = {
"command": "start",
"force": True
}
response = requests.put('/api/jobs/{name}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"command": "start",
"force": true
}`)
req, _ := http.NewRequest("PUT", "/api/jobs/{name}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"command": "start",
"force": true
}{
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
}Libraries
An external library is made up of input file paths or expressions that are scanned for asset files. Discovered files are automatically imported. Assets much be unique within a library, but can be duplicated across libraries. Each user has a default upload library, and can have one or more external libraries.
Retrieve libraries
Retrieve a list of external libraries.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/libraries'const response = await fetch('/api/libraries', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/libraries')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/libraries", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"assetCount": -9007199254740991,
"createdAt": "2024-01-01T00:00:00.000Z",
"exclusionPatterns": [
"string"
],
"id": "550e8400-e29b-41d4-a716-446655440000",
"importPaths": [
"string"
],
"name": "string",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"refreshedAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
}
]Create a library
Create a new external library.
Body
exclusionPatternsArray<string>Exclusion patterns (max 128)
importPathsArray<string>Import paths (max 128)
namestringLibrary name
ownerIdstring<uuid>requiredOwner user ID
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/libraries' \
-H 'Content-Type: application/json' \
-d '{
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
],
"name": "string",
"ownerId": "550e8400-e29b-41d4-a716-446655440000"
}'const response = await fetch('/api/libraries', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
],
"name": "string",
"ownerId": "550e8400-e29b-41d4-a716-446655440000"
}),
});
const data = await response.json();import requests
payload = {
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
],
"name": "string",
"ownerId": "550e8400-e29b-41d4-a716-446655440000"
}
response = requests.post('/api/libraries', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
],
"name": "string",
"ownerId": "550e8400-e29b-41d4-a716-446655440000"
}`)
req, _ := http.NewRequest("POST", "/api/libraries", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
],
"name": "string",
"ownerId": "550e8400-e29b-41d4-a716-446655440000"
}{
"assetCount": -9007199254740991,
"createdAt": "2024-01-01T00:00:00.000Z",
"exclusionPatterns": [
"string"
],
"id": "550e8400-e29b-41d4-a716-446655440000",
"importPaths": [
"string"
],
"name": "string",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"refreshedAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Retrieve a library
Retrieve an external library by its ID.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/libraries/{id}'const response = await fetch('/api/libraries/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/libraries/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/libraries/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"assetCount": -9007199254740991,
"createdAt": "2024-01-01T00:00:00.000Z",
"exclusionPatterns": [
"string"
],
"id": "550e8400-e29b-41d4-a716-446655440000",
"importPaths": [
"string"
],
"name": "string",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"refreshedAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Update a library
deprecatedUpdate an existing external library.
Body
exclusionPatternsArray<string>Exclusion patterns (max 128)
importPathsArray<string>Import paths (max 128)
namestringLibrary name
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/libraries/{id}' \
-H 'Content-Type: application/json' \
-d '{
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
],
"name": "string"
}'const response = await fetch('/api/libraries/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
],
"name": "string"
}),
});
const data = await response.json();import requests
payload = {
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
],
"name": "string"
}
response = requests.put('/api/libraries/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
],
"name": "string"
}`)
req, _ := http.NewRequest("PUT", "/api/libraries/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
],
"name": "string"
}{
"assetCount": -9007199254740991,
"createdAt": "2024-01-01T00:00:00.000Z",
"exclusionPatterns": [
"string"
],
"id": "550e8400-e29b-41d4-a716-446655440000",
"importPaths": [
"string"
],
"name": "string",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"refreshedAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Delete a library
Delete an external library by its ID.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/libraries/{id}'const response = await fetch('/api/libraries/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/libraries/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/libraries/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Scan a library
Queue a scan for the external library to find and import new assets.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/libraries/{id}/scan'const response = await fetch('/api/libraries/{id}/scan', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('/api/libraries/{id}/scan')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "/api/libraries/{id}/scan", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Retrieve library statistics
Retrieve statistics for a specific external library, including number of videos, images, and storage usage.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/libraries/{id}/statistics'const response = await fetch('/api/libraries/{id}/statistics', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/libraries/{id}/statistics')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/libraries/{id}/statistics", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"photos": -9007199254740991,
"total": -9007199254740991,
"usage": -9007199254740991,
"videos": -9007199254740991
}Validate library settings
Validate the settings of an external library.
Body
exclusionPatternsArray<string>Exclusion patterns (max 128)
importPathsArray<string>Import paths to validate (max 128)
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/libraries/{id}/validate' \
-H 'Content-Type: application/json' \
-d '{
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
]
}'const response = await fetch('/api/libraries/{id}/validate', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
]
}),
});
const data = await response.json();import requests
payload = {
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
]
}
response = requests.post('/api/libraries/{id}/validate', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
]
}`)
req, _ := http.NewRequest("POST", "/api/libraries/{id}/validate", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
]
}{
"importPaths": [
{
"importPath": "string",
"isValid": true,
"message": "string"
}
]
}Maintenance (admin)
Maintenance mode allows you to put Immich in a read-only state to perform various operations.
Get integrity report by type
Get all flagged items by integrity report type
Parameters
cursorstringqueryCursor for pagination
limitinteger(0, 9007199254740991]500queryNumber of items per page
typeIntegrityReportuntracked_filemissing_filechecksum_mismatchrequiredqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/admin/integrity/report'const response = await fetch('/api/admin/integrity/report', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/admin/integrity/report')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/admin/integrity/report", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"path": "string",
"type": "untracked_file"
}
],
"nextCursor": "string"
}Delete integrity report item
Delete a given report item and perform corresponding deletion (e.g. trash asset, delete file)
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/admin/integrity/report/{id}'const response = await fetch('/api/admin/integrity/report/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/admin/integrity/report/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/admin/integrity/report/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Download flagged file
Download the untracked/broken file if one exists
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/admin/integrity/report/{id}/file'const response = await fetch('/api/admin/integrity/report/{id}/file', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/admin/integrity/report/{id}/file')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/admin/integrity/report/{id}/file", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}"<binary>"Export integrity report by type as CSV
Get all integrity report entries for a given type as a CSV
Parameters
typeIntegrityReportuntracked_filemissing_filechecksum_mismatchrequiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/admin/integrity/report/{type}/csv'const response = await fetch('/api/admin/integrity/report/{type}/csv', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/admin/integrity/report/{type}/csv')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/admin/integrity/report/{type}/csv", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}"<binary>"Get integrity report summary
Get a count of the items flagged in each integrity report
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/admin/integrity/summary'const response = await fetch('/api/admin/integrity/summary', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/admin/integrity/summary')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/admin/integrity/summary", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"checksum_mismatch": 0,
"missing_file": 0,
"untracked_file": 0
}Set maintenance mode
Put Immich into or take it out of maintenance mode
Body
actionMaintenanceActionstartendselect_database_restorerestore_databaserequiredMaintenance action
restoreBackupFilenamestringRestore backup filename
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/admin/maintenance' \
-H 'Content-Type: application/json' \
-d '{
"action": "start",
"restoreBackupFilename": "string"
}'const response = await fetch('/api/admin/maintenance', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"action": "start",
"restoreBackupFilename": "string"
}),
});
const data = await response.json();import requests
payload = {
"action": "start",
"restoreBackupFilename": "string"
}
response = requests.post('/api/admin/maintenance', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"action": "start",
"restoreBackupFilename": "string"
}`)
req, _ := http.NewRequest("POST", "/api/admin/maintenance", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"action": "start",
"restoreBackupFilename": "string"
}Detect existing install
Collect integrity checks and other heuristics about local data.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/admin/maintenance/detect-install'const response = await fetch('/api/admin/maintenance/detect-install', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/admin/maintenance/detect-install')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/admin/maintenance/detect-install", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"storage": [
{
"files": -9007199254740991,
"folder": "encoded-video",
"readable": true,
"writable": true
}
]
}Log into maintenance mode
Login with maintenance token or cookie to receive current information and perform further actions.
Body
tokenstringMaintenance token
Response
curl -X POST '/api/admin/maintenance/login' \
-H 'Content-Type: application/json' \
-d '{
"token": "string"
}'const response = await fetch('/api/admin/maintenance/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"token": "string"
}),
});
const data = await response.json();import requests
payload = {
"token": "string"
}
response = requests.post('/api/admin/maintenance/login', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"token": "string"
}`)
req, _ := http.NewRequest("POST", "/api/admin/maintenance/login", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"token": "string"
}{
"username": "string"
}Get maintenance mode status
Fetch information about the currently running maintenance action.
Response
curl -X GET '/api/admin/maintenance/status'const response = await fetch('/api/admin/maintenance/status', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/admin/maintenance/status')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/admin/maintenance/status", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"action": "start",
"active": true,
"error": "string",
"progress": -9007199254740991,
"task": "string"
}Map
Map endpoints include supplemental functionality related to geolocation, such as reverse geocoding and retrieving map markers for assets with geolocation data.
Retrieve map markers
Retrieve a list of latitude and longitude coordinates for every asset with location data.
Parameters
fileCreatedAfterstring<date-time>queryFilter assets created after this date
fileCreatedBeforestring<date-time>queryFilter assets created before this date
isArchivedbooleanqueryFilter by archived status
isFavoritebooleanqueryFilter by favorite status
withPartnersbooleanqueryInclude partner assets
withSharedAlbumsbooleanqueryInclude shared album assets
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/map/markers'const response = await fetch('/api/map/markers', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/map/markers')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/map/markers", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"city": "string",
"country": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"lat": 0,
"lon": 0,
"state": "string"
}
]Reverse geocode coordinates
Retrieve location information (e.g., city, country) for given latitude and longitude coordinates.
Parameters
latnumber<double>requiredqueryLatitude (-90 to 90)
lonnumber<double>requiredqueryLongitude (-180 to 180)
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/map/reverse-geocode'const response = await fetch('/api/map/reverse-geocode', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/map/reverse-geocode')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/map/reverse-geocode", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"city": "string",
"country": "string",
"state": "string"
}
]Memories
A memory is a specialized collection of assets with dedicated viewing implementations in the web and mobile clients. A memory includes fields related to visibility and are automatically generated per user via a background job.
Retrieve memories
Retrieve a list of memories. Memories are sorted descending by creation date by default, although they can also be sorted in ascending order, or randomly.
Parameters
forstring<date-time>queryFilter by date
isSavedbooleanqueryFilter by saved status
isTrashedbooleanqueryInclude trashed memories
orderMemorySearchOrderascdescrandomquerysizeinteger[1, 9007199254740991]queryNumber of memories to return
typeMemoryTypeon_this_dayqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/memories'const response = await fetch('/api/memories', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/memories')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/memories", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"assets": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"createdAt": "2024-01-01T00:00:00.000Z",
"data": {
"year": 1000
},
"deletedAt": "2024-01-01T00:00:00.000Z",
"hideAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"seenAt": "2024-01-01T00:00:00.000Z",
"showAt": "2024-01-01T00:00:00.000Z",
"type": "on_this_day",
"updatedAt": "2024-01-01T00:00:00.000Z"
}
]Create a memory
Create a new memory by providing a name, description, and a list of asset IDs to include in the memory.
Body
assetIdsArray<string>Asset IDs to associate with memory
dataOnThisDayDtorequiredhideAtstring<date-time>Date when memory should be hidden
isSavedbooleanIs memory saved
memoryAtstring<date-time>requiredMemory date
seenAtstring<date-time>Date when memory was seen
showAtstring<date-time>Date when memory should be shown
typeMemoryTypeon_this_dayrequiredMemory type
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/memories' \
-H 'Content-Type: application/json' \
-d '{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"data": {
"year": 1000
},
"hideAt": "2024-01-01T00:00:00.000Z",
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"seenAt": "2024-01-01T00:00:00.000Z",
"showAt": "2024-01-01T00:00:00.000Z",
"type": "on_this_day"
}'const response = await fetch('/api/memories', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"data": {
"year": 1000
},
"hideAt": "2024-01-01T00:00:00.000Z",
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"seenAt": "2024-01-01T00:00:00.000Z",
"showAt": "2024-01-01T00:00:00.000Z",
"type": "on_this_day"
}),
});
const data = await response.json();import requests
payload = {
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"data": {
"year": 1000
},
"hideAt": "2024-01-01T00:00:00.000Z",
"isSaved": True,
"memoryAt": "2024-01-01T00:00:00.000Z",
"seenAt": "2024-01-01T00:00:00.000Z",
"showAt": "2024-01-01T00:00:00.000Z",
"type": "on_this_day"
}
response = requests.post('/api/memories', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"data": {
"year": 1000
},
"hideAt": "2024-01-01T00:00:00.000Z",
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"seenAt": "2024-01-01T00:00:00.000Z",
"showAt": "2024-01-01T00:00:00.000Z",
"type": "on_this_day"
}`)
req, _ := http.NewRequest("POST", "/api/memories", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"data": {
"year": 1000
},
"hideAt": "2024-01-01T00:00:00.000Z",
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"seenAt": "2024-01-01T00:00:00.000Z",
"showAt": "2024-01-01T00:00:00.000Z",
"type": "on_this_day"
}{
"assets": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"createdAt": "2024-01-01T00:00:00.000Z",
"data": {
"year": 1000
},
"deletedAt": "2024-01-01T00:00:00.000Z",
"hideAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"seenAt": "2024-01-01T00:00:00.000Z",
"showAt": "2024-01-01T00:00:00.000Z",
"type": "on_this_day",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Retrieve memories statistics
Retrieve statistics about memories, such as total count and other relevant metrics.
Parameters
forstring<date-time>queryFilter by date
isSavedbooleanqueryFilter by saved status
isTrashedbooleanqueryInclude trashed memories
orderMemorySearchOrderascdescrandomquerysizeinteger[1, 9007199254740991]queryNumber of memories to return
typeMemoryTypeon_this_dayqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/memories/statistics'const response = await fetch('/api/memories/statistics', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/memories/statistics')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/memories/statistics", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"total": -9007199254740991
}Retrieve a memory
Retrieve a specific memory by its ID.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/memories/{id}'const response = await fetch('/api/memories/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/memories/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/memories/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"assets": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"createdAt": "2024-01-01T00:00:00.000Z",
"data": {
"year": 1000
},
"deletedAt": "2024-01-01T00:00:00.000Z",
"hideAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"seenAt": "2024-01-01T00:00:00.000Z",
"showAt": "2024-01-01T00:00:00.000Z",
"type": "on_this_day",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Update a memory
deprecatedUpdate an existing memory by its ID.
Body
isSavedbooleanIs memory saved
memoryAtstring<date-time>Memory date
seenAtstring<date-time>Date when memory was seen
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/memories/{id}' \
-H 'Content-Type: application/json' \
-d '{
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"seenAt": "2024-01-01T00:00:00.000Z"
}'const response = await fetch('/api/memories/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"seenAt": "2024-01-01T00:00:00.000Z"
}),
});
const data = await response.json();import requests
payload = {
"isSaved": True,
"memoryAt": "2024-01-01T00:00:00.000Z",
"seenAt": "2024-01-01T00:00:00.000Z"
}
response = requests.put('/api/memories/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"seenAt": "2024-01-01T00:00:00.000Z"
}`)
req, _ := http.NewRequest("PUT", "/api/memories/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"seenAt": "2024-01-01T00:00:00.000Z"
}{
"assets": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"createdAt": "2024-01-01T00:00:00.000Z",
"data": {
"year": 1000
},
"deletedAt": "2024-01-01T00:00:00.000Z",
"hideAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"seenAt": "2024-01-01T00:00:00.000Z",
"showAt": "2024-01-01T00:00:00.000Z",
"type": "on_this_day",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Delete a memory
Delete a specific memory by its ID.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/memories/{id}'const response = await fetch('/api/memories/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/memories/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/memories/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Add assets to a memory
Add a list of asset IDs to a specific memory.
Body
idsArray<string>requiredIDs to process
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/memories/{id}/assets' \
-H 'Content-Type: application/json' \
-d '{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}'const response = await fetch('/api/memories/{id}/assets', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}),
});
const data = await response.json();import requests
payload = {
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
response = requests.put('/api/memories/{id}/assets', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}`)
req, _ := http.NewRequest("PUT", "/api/memories/{id}/assets", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}[
{
"error": "duplicate",
"errorMessage": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"success": true
}
]Remove assets from a memory
Remove a list of asset IDs from a specific memory.
Body
idsArray<string>requiredIDs to process
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/memories/{id}/assets' \
-H 'Content-Type: application/json' \
-d '{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}'const response = await fetch('/api/memories/{id}/assets', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}),
});
const data = await response.json();import requests
payload = {
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
response = requests.delete('/api/memories/{id}/assets', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}`)
req, _ := http.NewRequest("DELETE", "/api/memories/{id}/assets", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}[
{
"error": "duplicate",
"errorMessage": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"success": true
}
]Notifications
A notification is a specialized message sent to users to inform them of important events. Currently, these notifications are only shown in the Immich web application.
Retrieve notifications
Retrieve a list of notifications.
Parameters
idstring<uuid>queryFilter by notification ID
levelNotificationLevelsuccesserrorwarninginfoquerytypeNotificationTypeJobFailedBackupFailedSystemMessageAlbumInviteAlbumUpdateCustomqueryunreadbooleanqueryFilter by unread status
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/notifications'const response = await fetch('/api/notifications', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/notifications')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/notifications", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"createdAt": "2024-01-01T00:00:00.000Z",
"data": {},
"description": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"level": "success",
"readAt": "2024-01-01T00:00:00.000Z",
"title": "string",
"type": "JobFailed"
}
]Update notifications
Update a list of notifications. Allows to bulk-set the read status of notifications.
Body
idsArray<string>requiredNotification IDs to update
readAtstring<date-time> | nullDate when notifications were read
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/notifications' \
-H 'Content-Type: application/json' \
-d '{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"readAt": "2024-01-01T00:00:00.000Z"
}'const response = await fetch('/api/notifications', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"readAt": "2024-01-01T00:00:00.000Z"
}),
});
const data = await response.json();import requests
payload = {
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"readAt": "2024-01-01T00:00:00.000Z"
}
response = requests.put('/api/notifications', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"readAt": "2024-01-01T00:00:00.000Z"
}`)
req, _ := http.NewRequest("PUT", "/api/notifications", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"readAt": "2024-01-01T00:00:00.000Z"
}Delete notifications
Delete a list of notifications at once.
Body
idsArray<string>requiredNotification IDs to delete
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/notifications' \
-H 'Content-Type: application/json' \
-d '{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}'const response = await fetch('/api/notifications', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}),
});
const data = await response.json();import requests
payload = {
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
response = requests.delete('/api/notifications', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}`)
req, _ := http.NewRequest("DELETE", "/api/notifications", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}Get a notification
Retrieve a specific notification identified by id.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/notifications/{id}'const response = await fetch('/api/notifications/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/notifications/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/notifications/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"createdAt": "2024-01-01T00:00:00.000Z",
"data": {},
"description": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"level": "success",
"readAt": "2024-01-01T00:00:00.000Z",
"title": "string",
"type": "JobFailed"
}Update a notification
Update a specific notification to set its read status.
Body
readAtstring<date-time> | nullDate when notification was read
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/notifications/{id}' \
-H 'Content-Type: application/json' \
-d '{
"readAt": "2024-01-01T00:00:00.000Z"
}'const response = await fetch('/api/notifications/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"readAt": "2024-01-01T00:00:00.000Z"
}),
});
const data = await response.json();import requests
payload = {
"readAt": "2024-01-01T00:00:00.000Z"
}
response = requests.put('/api/notifications/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"readAt": "2024-01-01T00:00:00.000Z"
}`)
req, _ := http.NewRequest("PUT", "/api/notifications/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"readAt": "2024-01-01T00:00:00.000Z"
}{
"createdAt": "2024-01-01T00:00:00.000Z",
"data": {},
"description": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"level": "success",
"readAt": "2024-01-01T00:00:00.000Z",
"title": "string",
"type": "JobFailed"
}Delete a notification
Delete a specific notification.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/notifications/{id}'const response = await fetch('/api/notifications/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/notifications/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/notifications/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Notifications (admin)
Notification administrative endpoints.
Create a notification
Create a new notification for a specific user.
Body
dataobjectAdditional notification data
descriptionstring | nullNotification description
levelNotificationLevelsuccesserrorwarninginfoNotification level
readAtstring<date-time> | nullDate when notification was read
titlestringrequiredNotification title
typeNotificationTypeJobFailedBackupFailedSystemMessageAlbumInviteAlbumUpdateCustomNotification type
userIdstring<uuid>requiredUser ID to send notification to
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/admin/notifications' \
-H 'Content-Type: application/json' \
-d '{
"data": {},
"description": "string",
"level": "success",
"readAt": "2024-01-01T00:00:00.000Z",
"title": "string",
"type": "JobFailed",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}'const response = await fetch('/api/admin/notifications', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"data": {},
"description": "string",
"level": "success",
"readAt": "2024-01-01T00:00:00.000Z",
"title": "string",
"type": "JobFailed",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}),
});
const data = await response.json();import requests
payload = {
"data": {},
"description": "string",
"level": "success",
"readAt": "2024-01-01T00:00:00.000Z",
"title": "string",
"type": "JobFailed",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
response = requests.post('/api/admin/notifications', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"data": {},
"description": "string",
"level": "success",
"readAt": "2024-01-01T00:00:00.000Z",
"title": "string",
"type": "JobFailed",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}`)
req, _ := http.NewRequest("POST", "/api/admin/notifications", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"data": {},
"description": "string",
"level": "success",
"readAt": "2024-01-01T00:00:00.000Z",
"title": "string",
"type": "JobFailed",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}{
"createdAt": "2024-01-01T00:00:00.000Z",
"data": {},
"description": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"level": "success",
"readAt": "2024-01-01T00:00:00.000Z",
"title": "string",
"type": "JobFailed"
}Render email template
Retrieve a preview of the provided email template.
Body
templatestringrequiredTemplate name
Parameters
namestringrequiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/admin/notifications/templates/{name}' \
-H 'Content-Type: application/json' \
-d '{
"template": "string"
}'const response = await fetch('/api/admin/notifications/templates/{name}', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"template": "string"
}),
});
const data = await response.json();import requests
payload = {
"template": "string"
}
response = requests.post('/api/admin/notifications/templates/{name}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"template": "string"
}`)
req, _ := http.NewRequest("POST", "/api/admin/notifications/templates/{name}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"template": "string"
}{
"html": "string",
"name": "string"
}Send test email
Send a test email using the provided SMTP configuration.
Body
enabledbooleanrequiredWhether SMTP email notifications are enabled
fromstringrequiredEmail address to send from
replyTostringrequiredEmail address for replies
transportSystemConfigSmtpTransportDtorequiredResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/admin/notifications/test-email' \
-H 'Content-Type: application/json' \
-d '{
"enabled": true,
"from": "string",
"replyTo": "string",
"transport": {
"host": "string",
"ignoreCert": true,
"password": "string",
"port": 0,
"secure": true,
"username": "string"
}
}'const response = await fetch('/api/admin/notifications/test-email', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"enabled": true,
"from": "string",
"replyTo": "string",
"transport": {
"host": "string",
"ignoreCert": true,
"password": "string",
"port": 0,
"secure": true,
"username": "string"
}
}),
});
const data = await response.json();import requests
payload = {
"enabled": True,
"from": "string",
"replyTo": "string",
"transport": {
"host": "string",
"ignoreCert": True,
"password": "string",
"port": 0,
"secure": True,
"username": "string"
}
}
response = requests.post('/api/admin/notifications/test-email', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"enabled": true,
"from": "string",
"replyTo": "string",
"transport": {
"host": "string",
"ignoreCert": true,
"password": "string",
"port": 0,
"secure": true,
"username": "string"
}
}`)
req, _ := http.NewRequest("POST", "/api/admin/notifications/test-email", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"enabled": true,
"from": "string",
"replyTo": "string",
"transport": {
"host": "string",
"ignoreCert": true,
"password": "string",
"port": 0,
"secure": true,
"username": "string"
}
}{
"messageId": "string"
}Partners
A partner is a link with another user that allows sharing of assets between two users.
Retrieve partners
Retrieve a list of partners with whom assets are shared.
Parameters
directionPartnerDirectionshared-byshared-withrequiredqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/partners'const response = await fetch('/api/partners', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/partners')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/partners", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"inTimeline": true,
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}
]Create a partner
Create a new partner to share assets with.
Body
sharedWithIdstring<uuid>requiredUser ID to share with
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/partners' \
-H 'Content-Type: application/json' \
-d '{
"sharedWithId": "550e8400-e29b-41d4-a716-446655440000"
}'const response = await fetch('/api/partners', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"sharedWithId": "550e8400-e29b-41d4-a716-446655440000"
}),
});
const data = await response.json();import requests
payload = {
"sharedWithId": "550e8400-e29b-41d4-a716-446655440000"
}
response = requests.post('/api/partners', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"sharedWithId": "550e8400-e29b-41d4-a716-446655440000"
}`)
req, _ := http.NewRequest("POST", "/api/partners", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"sharedWithId": "550e8400-e29b-41d4-a716-446655440000"
}{
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"inTimeline": true,
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}Create a partner
deprecatedCreate a new partner to share assets with.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/partners/{id}'const response = await fetch('/api/partners/{id}', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('/api/partners/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "/api/partners/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"inTimeline": true,
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}Update a partner
Specify whether a partner's assets should appear in the user's timeline.
Body
inTimelinebooleanrequiredShow partner assets in timeline
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/partners/{id}' \
-H 'Content-Type: application/json' \
-d '{
"inTimeline": true
}'const response = await fetch('/api/partners/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"inTimeline": true
}),
});
const data = await response.json();import requests
payload = {
"inTimeline": True
}
response = requests.put('/api/partners/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"inTimeline": true
}`)
req, _ := http.NewRequest("PUT", "/api/partners/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"inTimeline": true
}{
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"inTimeline": true,
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}Remove a partner
Stop sharing assets with a partner.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/partners/{id}'const response = await fetch('/api/partners/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/partners/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/partners/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}People
A person is a collection of faces, which can be favorited and named. A person can also be merged into another person. People are automatically created via the face recognition job.
Get all people
Retrieve a list of all people.
Parameters
closestAssetIdstring<uuid>queryClosest asset ID for similarity search
closestPersonIdstring<uuid>queryClosest person ID for similarity search
pageinteger[1, 9007199254740991]1queryPage number for pagination
sizeinteger[1, 1000]500queryNumber of items per page
withHiddenbooleanqueryInclude hidden people
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/people'const response = await fetch('/api/people', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/people')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/people", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"hasNextPage": true,
"hidden": 0,
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"total": 0
}Create a person
Create a new person that can have multiple faces assigned to them.
Body
birthDatestring<date> | nullPerson date of birth
colorstring | nullPerson color (hex)
isFavoritebooleanMark as favorite
isHiddenbooleanPerson visibility (hidden)
namestringPerson name
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/people' \
-H 'Content-Type: application/json' \
-d '{
"birthDate": "2024-01-15",
"color": "string",
"isFavorite": true,
"isHidden": true,
"name": "string"
}'const response = await fetch('/api/people', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"birthDate": "2024-01-15",
"color": "string",
"isFavorite": true,
"isHidden": true,
"name": "string"
}),
});
const data = await response.json();import requests
payload = {
"birthDate": "2024-01-15",
"color": "string",
"isFavorite": True,
"isHidden": True,
"name": "string"
}
response = requests.post('/api/people', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"birthDate": "2024-01-15",
"color": "string",
"isFavorite": true,
"isHidden": true,
"name": "string"
}`)
req, _ := http.NewRequest("POST", "/api/people", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"birthDate": "2024-01-15",
"color": "string",
"isFavorite": true,
"isHidden": true,
"name": "string"
}{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}Update people
Bulk update multiple people at once.
Body
peopleArray<PeopleUpdateItem>requiredPeople to update
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/people' \
-H 'Content-Type: application/json' \
-d '{
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string"
}
]
}'const response = await fetch('/api/people', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string"
}
]
}),
});
const data = await response.json();import requests
payload = {
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": True,
"isHidden": True,
"name": "string"
}
]
}
response = requests.put('/api/people', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string"
}
]
}`)
req, _ := http.NewRequest("PUT", "/api/people", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string"
}
]
}[
{
"error": "duplicate",
"errorMessage": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"success": true
}
]Delete people
Bulk delete a list of people at once.
Body
idsArray<string>requiredIDs to process
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/people' \
-H 'Content-Type: application/json' \
-d '{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}'const response = await fetch('/api/people', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}),
});
const data = await response.json();import requests
payload = {
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
response = requests.delete('/api/people', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}`)
req, _ := http.NewRequest("DELETE", "/api/people", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}Get a person
Retrieve a person by id.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/people/{id}'const response = await fetch('/api/people/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/people/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/people/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}Update person
deprecatedUpdate an individual person.
Body
birthDatestring<date> | nullPerson date of birth
colorstring | nullPerson color (hex)
featureFaceAssetIdstring<uuid>Asset ID used for feature face thumbnail
isFavoritebooleanMark as favorite
isHiddenbooleanPerson visibility (hidden)
namestringPerson name
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/people/{id}' \
-H 'Content-Type: application/json' \
-d '{
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string"
}'const response = await fetch('/api/people/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string"
}),
});
const data = await response.json();import requests
payload = {
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": True,
"isHidden": True,
"name": "string"
}
response = requests.put('/api/people/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string"
}`)
req, _ := http.NewRequest("PUT", "/api/people/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string"
}{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}Delete person
Delete an individual person.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/people/{id}'const response = await fetch('/api/people/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/people/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/people/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Merge people
Merge a list of people into the person specified in the path parameter.
Body
idsArray<string>requiredPerson IDs to merge
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/people/{id}/merge' \
-H 'Content-Type: application/json' \
-d '{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}'const response = await fetch('/api/people/{id}/merge', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}),
});
const data = await response.json();import requests
payload = {
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
response = requests.post('/api/people/{id}/merge', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}`)
req, _ := http.NewRequest("POST", "/api/people/{id}/merge", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}[
{
"error": "duplicate",
"errorMessage": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"success": true
}
]Reassign faces
Bulk reassign a list of faces to a different person.
Body
dataArray<AssetFaceUpdateItem>requiredFace update items
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/people/{id}/reassign' \
-H 'Content-Type: application/json' \
-d '{
"data": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"personId": "550e8400-e29b-41d4-a716-446655440000"
}
]
}'const response = await fetch('/api/people/{id}/reassign', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"data": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"personId": "550e8400-e29b-41d4-a716-446655440000"
}
]
}),
});
const data = await response.json();import requests
payload = {
"data": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"personId": "550e8400-e29b-41d4-a716-446655440000"
}
]
}
response = requests.put('/api/people/{id}/reassign', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"data": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"personId": "550e8400-e29b-41d4-a716-446655440000"
}
]
}`)
req, _ := http.NewRequest("PUT", "/api/people/{id}/reassign", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"data": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"personId": "550e8400-e29b-41d4-a716-446655440000"
}
]
}[
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
]Get person statistics
Retrieve statistics about a specific person.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/people/{id}/statistics'const response = await fetch('/api/people/{id}/statistics', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/people/{id}/statistics')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/people/{id}/statistics", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"assets": -9007199254740991
}Get person thumbnail
Retrieve the thumbnail file for a person.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/people/{id}/thumbnail'const response = await fetch('/api/people/{id}/thumbnail', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/people/{id}/thumbnail')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/people/{id}/thumbnail", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}"<binary>"Plugins
A plugin is an installed module that makes filters and actions available for the workflow feature.
List all plugins
Retrieve a list of plugins available to the authenticated user.
Parameters
descriptionstringqueryenabledbooleanqueryWhether the plugin is enabled
idstring<uuid>queryPlugin ID
namestringquerytitlestringqueryversionstringqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/plugins'const response = await fetch('/api/plugins', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/plugins')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/plugins", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"author": "string",
"createdAt": "string",
"description": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"methods": [
{
"description": "string",
"hostFunctions": true,
"key": "string",
"name": "string",
"schema": {},
"title": "string",
"types": [
"AssetV1"
],
"uiHints": [
"string"
]
}
],
"name": "string",
"title": "string",
"updatedAt": "string",
"version": "string"
}
]Retrieve plugin methods
Retrieve a list of plugin methods
Parameters
descriptionstringqueryenabledbooleanqueryWhether the plugin method is enabled
idstring<uuid>queryPlugin method ID
namestringquerypluginNamestringqueryPlugin name
pluginVersionstringqueryPlugin version
titlestringquerytriggerWorkflowTriggerAssetCreateAssetMetadataExtractionqueryWorkflow trigger
typeWorkflowTypeAssetV1queryWorkflow types
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/plugins/methods'const response = await fetch('/api/plugins/methods', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/plugins/methods')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/plugins/methods", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"description": "string",
"hostFunctions": true,
"key": "string",
"name": "string",
"schema": {},
"title": "string",
"types": [
"AssetV1"
],
"uiHints": [
"string"
]
}
]Retrieve workflow templates
Retrieve workflow templates provided by installed plugins
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/plugins/templates'const response = await fetch('/api/plugins/templates', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/plugins/templates')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/plugins/templates", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"description": "string",
"key": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"title": "string",
"trigger": "AssetCreate",
"uiHints": [
"string"
]
}
]Retrieve a plugin
Retrieve information about a specific plugin by its ID.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/plugins/{id}'const response = await fetch('/api/plugins/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/plugins/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/plugins/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"author": "string",
"createdAt": "string",
"description": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"methods": [
{
"description": "string",
"hostFunctions": true,
"key": "string",
"name": "string",
"schema": {},
"title": "string",
"types": [
"AssetV1"
],
"uiHints": [
"string"
]
}
],
"name": "string",
"title": "string",
"updatedAt": "string",
"version": "string"
}Queues
Queues and background jobs are used for processing tasks asynchronously. Queues can be paused and resumed as needed.
List all queues
Retrieves a list of queues.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/queues'const response = await fetch('/api/queues', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/queues')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/queues", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"isPaused": true,
"name": "thumbnailGeneration",
"statistics": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
}
}
]Retrieve a queue
Retrieves a specific queue by its name.
Parameters
nameQueueNamethumbnailGenerationmetadataExtractionvideoConversionfaceDetectionfacialRecognitionsmartSearchduplicateDetectionbackgroundTaskstorageTemplateMigrationmigrationsearchsidecarlibrarynotificationsbackupDatabaseocrworkflowintegrityCheckeditorrequiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/queues/{name}'const response = await fetch('/api/queues/{name}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/queues/{name}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/queues/{name}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"isPaused": true,
"name": "thumbnailGeneration",
"statistics": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
}
}Update a queue
Change the paused status of a specific queue.
Body
isPausedbooleanWhether to pause the queue
Parameters
nameQueueNamethumbnailGenerationmetadataExtractionvideoConversionfaceDetectionfacialRecognitionsmartSearchduplicateDetectionbackgroundTaskstorageTemplateMigrationmigrationsearchsidecarlibrarynotificationsbackupDatabaseocrworkflowintegrityCheckeditorrequiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/queues/{name}' \
-H 'Content-Type: application/json' \
-d '{
"isPaused": true
}'const response = await fetch('/api/queues/{name}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"isPaused": true
}),
});
const data = await response.json();import requests
payload = {
"isPaused": True
}
response = requests.put('/api/queues/{name}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"isPaused": true
}`)
req, _ := http.NewRequest("PUT", "/api/queues/{name}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"isPaused": true
}{
"isPaused": true,
"name": "thumbnailGeneration",
"statistics": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
}
}Retrieve queue jobs
Retrieves a list of queue jobs from the specified queue.
Parameters
nameQueueNamethumbnailGenerationmetadataExtractionvideoConversionfaceDetectionfacialRecognitionsmartSearchduplicateDetectionbackgroundTaskstorageTemplateMigrationmigrationsearchsidecarlibrarynotificationsbackupDatabaseocrworkflowintegrityCheckeditorrequiredpathstatusArray<QueueJobStatus>activefailedcompleteddelayedwaitingpausedqueryFilter jobs by status
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/queues/{name}/jobs'const response = await fetch('/api/queues/{name}/jobs', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/queues/{name}/jobs')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/queues/{name}/jobs", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"data": {},
"id": "string",
"name": "AssetDelete",
"timestamp": -9007199254740991
}
]Empty a queue
Removes all jobs from the specified queue.
Body
failedbooleanIf true, will also remove failed jobs from the queue.
Parameters
nameQueueNamethumbnailGenerationmetadataExtractionvideoConversionfaceDetectionfacialRecognitionsmartSearchduplicateDetectionbackgroundTaskstorageTemplateMigrationmigrationsearchsidecarlibrarynotificationsbackupDatabaseocrworkflowintegrityCheckeditorrequiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/queues/{name}/jobs' \
-H 'Content-Type: application/json' \
-d '{
"failed": true
}'const response = await fetch('/api/queues/{name}/jobs', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"failed": true
}),
});
const data = await response.json();import requests
payload = {
"failed": True
}
response = requests.delete('/api/queues/{name}/jobs', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"failed": true
}`)
req, _ := http.NewRequest("DELETE", "/api/queues/{name}/jobs", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"failed": true
}Search
Endpoints related to searching assets via text, smart search, optical character recognition (OCR), and other filters like person, album, and other metadata. Search endpoints usually support pagination and sorting.
Retrieve assets by city
Retrieve a list of assets with each asset belonging to a different city. This endpoint is used on the places pages to show a single thumbnail for each city the user has assets in.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/search/cities'const response = await fetch('/api/search/cities', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/search/cities')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/search/cities", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
]Retrieve explore data
Retrieve data for the explore section, such as popular people and places.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/search/explore'const response = await fetch('/api/search/explore', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/search/explore')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/search/explore", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"fieldName": "string",
"items": [
{
"data": {
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
},
"value": "string"
}
]
}
]Search large assets
Search for assets that are considered large based on specified criteria.
Parameters
albumIdsArray<string>queryFilter by album IDs
citystring | nullqueryFilter by city name
countrystring | nullqueryFilter by country name
createdAfterstring<date-time>queryFilter by creation date (after)
createdBeforestring<date-time>queryFilter by creation date (before)
isEncodedbooleanqueryFilter by encoded status
isFavoritebooleanqueryFilter by favorite status
isMotionbooleanqueryFilter by motion photo status
isNotInAlbumbooleanqueryFilter assets not in any album
isOfflinebooleanqueryFilter by offline status
lensModelstring | nullqueryFilter by lens model
libraryIdstring<uuid> | nullqueryLibrary ID to filter by
makestring | nullqueryFilter by camera make
minFileSizeinteger[0, 9007199254740991]queryMinimum file size in bytes
modelstring | nullqueryFilter by camera model
ocrstringqueryFilter by OCR text content
personIdsArray<string>queryFilter by person IDs
ratinginteger | null[1, 5]queryFilter by rating [1-5], or null for unrated
sizeinteger[1, 1000]queryNumber of results to return
statestring | nullqueryFilter by state/province name
tagIdsArray<string> | nullqueryFilter by tag IDs
takenAfterstring<date-time>queryFilter by taken date (after)
takenBeforestring<date-time>queryFilter by taken date (before)
trashedAfterstring<date-time>queryFilter by trash date (after)
trashedBeforestring<date-time>queryFilter by trash date (before)
typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERqueryupdatedAfterstring<date-time>queryFilter by update date (after)
updatedBeforestring<date-time>queryFilter by update date (before)
visibilityAssetVisibilityarchivetimelinehiddenlockedquerywithDeletedbooleanqueryInclude deleted assets
withExifbooleanqueryInclude EXIF data in response
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/search/large-assets'const response = await fetch('/api/search/large-assets', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('/api/search/large-assets')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "/api/search/large-assets", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
]Search assets by metadata
Search for assets based on various metadata criteria.
Body
albumIdsArray<string>Filter by album IDs
checksumstringFilter by file checksum
citystring | nullFilter by city name
countrystring | nullFilter by country name
createdAfterstring<date-time>Filter by creation date (after)
createdBeforestring<date-time>Filter by creation date (before)
descriptionstringFilter by description text
encodedVideoPathstringFilter by encoded video file path
idstring<uuid>Filter by asset ID
isEncodedbooleanFilter by encoded status
isFavoritebooleanFilter by favorite status
isMotionbooleanFilter by motion photo status
isNotInAlbumbooleanFilter assets not in any album
isOfflinebooleanFilter by offline status
lensModelstring | nullFilter by lens model
libraryIdstring<uuid> | nullLibrary ID to filter by
makestring | nullFilter by camera make
modelstring | nullFilter by camera model
ocrstringFilter by OCR text content
orderAssetOrderascdescdescAsset sort order
originalFileNamestringFilter by original file name
originalPathstringFilter by original file path
pageinteger[1, 9007199254740991]Page number
personIdsArray<string>Filter by person IDs
previewPathstringFilter by preview file path
ratinginteger | null[1, 5]Filter by rating [1-5], or null for unrated
sizeinteger[1, 1000]Number of results to return
statestring | nullFilter by state/province name
tagIdsArray<string> | nullFilter by tag IDs
takenAfterstring<date-time>Filter by taken date (after)
takenBeforestring<date-time>Filter by taken date (before)
thumbnailPathstringFilter by thumbnail file path
trashedAfterstring<date-time>Filter by trash date (after)
trashedBeforestring<date-time>Filter by trash date (before)
typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERAsset type
updatedAfterstring<date-time>Filter by update date (after)
updatedBeforestring<date-time>Filter by update date (before)
visibilityAssetVisibilityarchivetimelinehiddenlockedAsset visibility
withDeletedbooleanInclude deleted assets
withExifbooleanInclude EXIF data in response
withPeoplebooleanInclude people data in response
withStackedbooleanInclude stacked assets
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/search/metadata' \
-H 'Content-Type: application/json' \
-d '{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"checksum": "string",
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"description": "string",
"encodedVideoPath": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"order": "desc",
"originalFileName": "string",
"originalPath": "string",
"page": 1,
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"previewPath": "string",
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"thumbnailPath": "string",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": true,
"withExif": true,
"withPeople": true,
"withStacked": true
}'const response = await fetch('/api/search/metadata', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"checksum": "string",
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"description": "string",
"encodedVideoPath": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"order": "desc",
"originalFileName": "string",
"originalPath": "string",
"page": 1,
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"previewPath": "string",
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"thumbnailPath": "string",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": true,
"withExif": true,
"withPeople": true,
"withStacked": true
}),
});
const data = await response.json();import requests
payload = {
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"checksum": "string",
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"description": "string",
"encodedVideoPath": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isEncoded": True,
"isFavorite": True,
"isMotion": True,
"isNotInAlbum": True,
"isOffline": True,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"order": "desc",
"originalFileName": "string",
"originalPath": "string",
"page": 1,
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"previewPath": "string",
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"thumbnailPath": "string",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": True,
"withExif": True,
"withPeople": True,
"withStacked": True
}
response = requests.post('/api/search/metadata', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"checksum": "string",
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"description": "string",
"encodedVideoPath": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"order": "desc",
"originalFileName": "string",
"originalPath": "string",
"page": 1,
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"previewPath": "string",
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"thumbnailPath": "string",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": true,
"withExif": true,
"withPeople": true,
"withStacked": true
}`)
req, _ := http.NewRequest("POST", "/api/search/metadata", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"checksum": "string",
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"description": "string",
"encodedVideoPath": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"order": "desc",
"originalFileName": "string",
"originalPath": "string",
"page": 1,
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"previewPath": "string",
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"thumbnailPath": "string",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": true,
"withExif": true,
"withPeople": true,
"withStacked": true
}{
"albums": {
"count": 0,
"facets": [
{
"counts": [
{
"count": 0,
"value": "string"
}
],
"fieldName": "string"
}
],
"items": [
{
"albumName": "string",
"albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
"albumUsers": [
{
"role": "editor",
"user": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}
}
],
"assetCount": 0,
"contributorCounts": [
{
"assetCount": 0,
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
],
"createdAt": "2024-01-15T09:30:00Z",
"description": "string",
"endDate": "2024-01-15T09:30:00Z",
"hasSharedLink": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isActivityEnabled": true,
"lastModifiedAssetTimestamp": "2024-01-15T09:30:00Z",
"order": "asc",
"shared": true,
"startDate": "2024-01-15T09:30:00Z",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"total": 0
},
"assets": {
"count": 0,
"facets": [
{
"counts": [
{
"count": 0,
"value": "string"
}
],
"fieldName": "string"
}
],
"items": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"nextPage": "string",
"total": 0
}
}Search people
Search for people by name.
Parameters
namestringrequiredqueryPerson name to search for
withHiddenbooleanqueryInclude hidden people
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/search/person'const response = await fetch('/api/search/person', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/search/person')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/search/person", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
]Search places
Search for places by name.
Parameters
namestringrequiredqueryPlace name to search for
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/search/places'const response = await fetch('/api/search/places', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/search/places')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/search/places", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"admin1name": "string",
"admin2name": "string",
"latitude": 0,
"longitude": 0,
"name": "string"
}
]Search random assets
Retrieve a random selection of assets based on the provided criteria.
Body
albumIdsArray<string>Filter by album IDs
citystring | nullFilter by city name
countrystring | nullFilter by country name
createdAfterstring<date-time>Filter by creation date (after)
createdBeforestring<date-time>Filter by creation date (before)
isEncodedbooleanFilter by encoded status
isFavoritebooleanFilter by favorite status
isMotionbooleanFilter by motion photo status
isNotInAlbumbooleanFilter assets not in any album
isOfflinebooleanFilter by offline status
lensModelstring | nullFilter by lens model
libraryIdstring<uuid> | nullLibrary ID to filter by
makestring | nullFilter by camera make
modelstring | nullFilter by camera model
ocrstringFilter by OCR text content
personIdsArray<string>Filter by person IDs
ratinginteger | null[1, 5]Filter by rating [1-5], or null for unrated
sizeinteger[1, 1000]Number of results to return
statestring | nullFilter by state/province name
tagIdsArray<string> | nullFilter by tag IDs
takenAfterstring<date-time>Filter by taken date (after)
takenBeforestring<date-time>Filter by taken date (before)
trashedAfterstring<date-time>Filter by trash date (after)
trashedBeforestring<date-time>Filter by trash date (before)
typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERAsset type
updatedAfterstring<date-time>Filter by update date (after)
updatedBeforestring<date-time>Filter by update date (before)
visibilityAssetVisibilityarchivetimelinehiddenlockedAsset visibility
withDeletedbooleanInclude deleted assets
withExifbooleanInclude EXIF data in response
withPeoplebooleanInclude people data in response
withStackedbooleanInclude stacked assets
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/search/random' \
-H 'Content-Type: application/json' \
-d '{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": true,
"withExif": true,
"withPeople": true,
"withStacked": true
}'const response = await fetch('/api/search/random', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": true,
"withExif": true,
"withPeople": true,
"withStacked": true
}),
});
const data = await response.json();import requests
payload = {
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"isEncoded": True,
"isFavorite": True,
"isMotion": True,
"isNotInAlbum": True,
"isOffline": True,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": True,
"withExif": True,
"withPeople": True,
"withStacked": True
}
response = requests.post('/api/search/random', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": true,
"withExif": true,
"withPeople": true,
"withStacked": true
}`)
req, _ := http.NewRequest("POST", "/api/search/random", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": true,
"withExif": true,
"withPeople": true,
"withStacked": true
}[
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
]Smart asset search
Perform a smart search for assets by using machine learning vectors to determine relevance.
Body
albumIdsArray<string>Filter by album IDs
citystring | nullFilter by city name
countrystring | nullFilter by country name
createdAfterstring<date-time>Filter by creation date (after)
createdBeforestring<date-time>Filter by creation date (before)
isEncodedbooleanFilter by encoded status
isFavoritebooleanFilter by favorite status
isMotionbooleanFilter by motion photo status
isNotInAlbumbooleanFilter assets not in any album
isOfflinebooleanFilter by offline status
languagestringSearch language code
lensModelstring | nullFilter by lens model
libraryIdstring<uuid> | nullLibrary ID to filter by
makestring | nullFilter by camera make
modelstring | nullFilter by camera model
ocrstringFilter by OCR text content
pageinteger[1, 9007199254740991]Page number
personIdsArray<string>Filter by person IDs
querystringNatural language search query
queryAssetIdstring<uuid>Asset ID to use as search reference
ratinginteger | null[1, 5]Filter by rating [1-5], or null for unrated
sizeinteger[1, 1000]Number of results to return
statestring | nullFilter by state/province name
tagIdsArray<string> | nullFilter by tag IDs
takenAfterstring<date-time>Filter by taken date (after)
takenBeforestring<date-time>Filter by taken date (before)
trashedAfterstring<date-time>Filter by trash date (after)
trashedBeforestring<date-time>Filter by trash date (before)
typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERAsset type
updatedAfterstring<date-time>Filter by update date (after)
updatedBeforestring<date-time>Filter by update date (before)
visibilityAssetVisibilityarchivetimelinehiddenlockedAsset visibility
withDeletedbooleanInclude deleted assets
withExifbooleanInclude EXIF data in response
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/search/smart' \
-H 'Content-Type: application/json' \
-d '{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"language": "string",
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"page": 1,
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"query": "string",
"queryAssetId": "550e8400-e29b-41d4-a716-446655440000",
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": true,
"withExif": true
}'const response = await fetch('/api/search/smart', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"language": "string",
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"page": 1,
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"query": "string",
"queryAssetId": "550e8400-e29b-41d4-a716-446655440000",
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": true,
"withExif": true
}),
});
const data = await response.json();import requests
payload = {
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"isEncoded": True,
"isFavorite": True,
"isMotion": True,
"isNotInAlbum": True,
"isOffline": True,
"language": "string",
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"page": 1,
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"query": "string",
"queryAssetId": "550e8400-e29b-41d4-a716-446655440000",
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": True,
"withExif": True
}
response = requests.post('/api/search/smart', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"language": "string",
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"page": 1,
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"query": "string",
"queryAssetId": "550e8400-e29b-41d4-a716-446655440000",
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": true,
"withExif": true
}`)
req, _ := http.NewRequest("POST", "/api/search/smart", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"language": "string",
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"page": 1,
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"query": "string",
"queryAssetId": "550e8400-e29b-41d4-a716-446655440000",
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": true,
"withExif": true
}{
"albums": {
"count": 0,
"facets": [
{
"counts": [
{
"count": 0,
"value": "string"
}
],
"fieldName": "string"
}
],
"items": [
{
"albumName": "string",
"albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
"albumUsers": [
{
"role": "editor",
"user": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}
}
],
"assetCount": 0,
"contributorCounts": [
{
"assetCount": 0,
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
],
"createdAt": "2024-01-15T09:30:00Z",
"description": "string",
"endDate": "2024-01-15T09:30:00Z",
"hasSharedLink": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isActivityEnabled": true,
"lastModifiedAssetTimestamp": "2024-01-15T09:30:00Z",
"order": "asc",
"shared": true,
"startDate": "2024-01-15T09:30:00Z",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"total": 0
},
"assets": {
"count": 0,
"facets": [
{
"counts": [
{
"count": 0,
"value": "string"
}
],
"fieldName": "string"
}
],
"items": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"nextPage": "string",
"total": 0
}
}Search asset statistics
Retrieve statistical data about assets based on search criteria, such as the total matching count.
Body
albumIdsArray<string>Filter by album IDs
citystring | nullFilter by city name
countrystring | nullFilter by country name
createdAfterstring<date-time>Filter by creation date (after)
createdBeforestring<date-time>Filter by creation date (before)
descriptionstringFilter by description text
isEncodedbooleanFilter by encoded status
isFavoritebooleanFilter by favorite status
isMotionbooleanFilter by motion photo status
isNotInAlbumbooleanFilter assets not in any album
isOfflinebooleanFilter by offline status
lensModelstring | nullFilter by lens model
libraryIdstring<uuid> | nullLibrary ID to filter by
makestring | nullFilter by camera make
modelstring | nullFilter by camera model
ocrstringFilter by OCR text content
personIdsArray<string>Filter by person IDs
ratinginteger | null[1, 5]Filter by rating [1-5], or null for unrated
statestring | nullFilter by state/province name
tagIdsArray<string> | nullFilter by tag IDs
takenAfterstring<date-time>Filter by taken date (after)
takenBeforestring<date-time>Filter by taken date (before)
trashedAfterstring<date-time>Filter by trash date (after)
trashedBeforestring<date-time>Filter by trash date (before)
typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERAsset type
updatedAfterstring<date-time>Filter by update date (after)
updatedBeforestring<date-time>Filter by update date (before)
visibilityAssetVisibilityarchivetimelinehiddenlockedAsset visibility
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/search/statistics' \
-H 'Content-Type: application/json' \
-d '{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"description": "string",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"rating": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive"
}'const response = await fetch('/api/search/statistics', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"description": "string",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"rating": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive"
}),
});
const data = await response.json();import requests
payload = {
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"description": "string",
"isEncoded": True,
"isFavorite": True,
"isMotion": True,
"isNotInAlbum": True,
"isOffline": True,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"rating": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive"
}
response = requests.post('/api/search/statistics', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"description": "string",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"rating": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive"
}`)
req, _ := http.NewRequest("POST", "/api/search/statistics", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"description": "string",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"rating": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive"
}{
"total": -9007199254740991
}Retrieve search suggestions
Retrieve search suggestions based on partial input. This endpoint is used for typeahead search features.
Parameters
countrystringqueryFilter by country
includeNullbooleanqueryInclude null values in suggestions
lensModelstringqueryFilter by lens model
makestringqueryFilter by camera make
modelstringqueryFilter by camera model
statestringqueryFilter by state/province
typeSearchSuggestionTypecountrystatecitycamera-makecamera-modelcamera-lens-modelrequiredqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/search/suggestions'const response = await fetch('/api/search/suggestions', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/search/suggestions')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/search/suggestions", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
"string"
]Server
Information about the current server deployment, including version and build information, available features, supported media types, and more.
Get server information
Retrieve a list of information about the server.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/server/about'const response = await fetch('/api/server/about', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/server/about')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/server/about", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"build": "string",
"buildImage": "string",
"buildImageUrl": "string",
"buildUrl": "string",
"exiftool": "string",
"ffmpeg": "string",
"imagemagick": "string",
"libvips": "string",
"licensed": true,
"nodejs": "string",
"repository": "string",
"repositoryUrl": "string",
"sourceCommit": "string",
"sourceRef": "string",
"sourceUrl": "string",
"thirdPartyBugFeatureUrl": "string",
"thirdPartyDocumentationUrl": "string",
"thirdPartySourceUrl": "string",
"thirdPartySupportUrl": "string",
"version": "string",
"versionUrl": "string"
}Get APK links
Retrieve links to the APKs for the current server version.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/server/apk-links'const response = await fetch('/api/server/apk-links', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/server/apk-links')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/server/apk-links", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"arm64v8a": "string",
"armeabiv7a": "string",
"universal": "string",
"x86_64": "string"
}Get config
Retrieve the current server configuration.
Response
curl -X GET '/api/server/config'const response = await fetch('/api/server/config', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/server/config')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/server/config", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"externalDomain": "string",
"isInitialized": true,
"isOnboarded": true,
"loginPageMessage": "string",
"maintenanceMode": true,
"mapDarkStyleUrl": "string",
"mapLightStyleUrl": "string",
"minFaces": -9007199254740991,
"oauthButtonText": "string",
"publicUsers": true,
"trashDays": -9007199254740991,
"userDeleteDelay": -9007199254740991
}Get features
Retrieve available features supported by this server.
Response
curl -X GET '/api/server/features'const response = await fetch('/api/server/features', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/server/features')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/server/features", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"configFile": true,
"duplicateDetection": true,
"email": true,
"facialRecognition": true,
"importFaces": true,
"map": true,
"oauth": true,
"oauthAutoLaunch": true,
"ocr": true,
"passwordLogin": true,
"realtimeTranscoding": true,
"reverseGeocoding": true,
"search": true,
"sidecar": true,
"smartSearch": true,
"trash": true
}Get product key
Retrieve information about whether the server currently has a product key registered.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/server/license'const response = await fetch('/api/server/license', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/server/license')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/server/license", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
}Set server product key
Validate and set the server product key if successful.
Body
activationKeystringrequiredActivation key
licenseKeystringrequiredLicense key (format: /^IM(SV|CL)(-[\dA-Za-z]{4}){8}$/)
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/server/license' \
-H 'Content-Type: application/json' \
-d '{
"activationKey": "string",
"licenseKey": "string"
}'const response = await fetch('/api/server/license', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"activationKey": "string",
"licenseKey": "string"
}),
});
const data = await response.json();import requests
payload = {
"activationKey": "string",
"licenseKey": "string"
}
response = requests.put('/api/server/license', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"activationKey": "string",
"licenseKey": "string"
}`)
req, _ := http.NewRequest("PUT", "/api/server/license", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"activationKey": "string",
"licenseKey": "string"
}{
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
}Delete server product key
Delete the currently set server product key.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/server/license'const response = await fetch('/api/server/license', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/server/license')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/server/license", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Get supported media types
Retrieve all media types supported by the server.
Response
curl -X GET '/api/server/media-types'const response = await fetch('/api/server/media-types', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/server/media-types')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/server/media-types", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"image": [
"string"
],
"sidecar": [
"string"
],
"video": [
"string"
]
}Ping
Pong
Response
curl -X GET '/api/server/ping'const response = await fetch('/api/server/ping', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/server/ping')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/server/ping", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"res": "pong"
}Get statistics
Retrieve statistics about the entire Immich instance such as asset counts.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/server/statistics'const response = await fetch('/api/server/statistics', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/server/statistics')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/server/statistics", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"photos": -9007199254740991,
"usage": -9007199254740991,
"usageByUser": [
{
"photos": -9007199254740991,
"quotaSizeInBytes": -9007199254740991,
"usage": -9007199254740991,
"usagePhotos": -9007199254740991,
"usageVideos": -9007199254740991,
"userId": "550e8400-e29b-41d4-a716-446655440000",
"userName": "string",
"videos": -9007199254740991
}
],
"usagePhotos": -9007199254740991,
"usageVideos": -9007199254740991,
"videos": -9007199254740991
}Get storage
Retrieve the current storage utilization information of the server.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/server/storage'const response = await fetch('/api/server/storage', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/server/storage')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/server/storage", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"diskAvailable": "string",
"diskAvailableRaw": -9007199254740991,
"diskSize": "string",
"diskSizeRaw": -9007199254740991,
"diskUsagePercentage": 0,
"diskUse": "string",
"diskUseRaw": -9007199254740991
}Get server version
Retrieve the current server version in semantic versioning (semver) format.
Response
curl -X GET '/api/server/version'const response = await fetch('/api/server/version', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/server/version')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/server/version", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"major": 0,
"minor": 0,
"patch": 0,
"prerelease": 0
}Get version check status
Retrieve information about the last time the version check ran.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/server/version-check'const response = await fetch('/api/server/version-check', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/server/version-check')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/server/version-check", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"checkedAt": "string",
"releaseVersion": "string"
}Get version history
Retrieve a list of past versions the server has been on.
Response
curl -X GET '/api/server/version-history'const response = await fetch('/api/server/version-history', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/server/version-history')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/server/version-history", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"createdAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"version": "string"
}
]Sessions
A session represents an authenticated login session for a user. Sessions also appear in the web application as "Authorized devices".
Retrieve sessions
Retrieve a list of sessions for the user.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/sessions'const response = await fetch('/api/sessions', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/sessions')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/sessions", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"appVersion": "string",
"createdAt": "string",
"current": true,
"deviceOS": "string",
"deviceType": "string",
"expiresAt": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isPendingSyncReset": true,
"updatedAt": "string"
}
]Create a session
Create a session as a child to the current session. This endpoint is used for casting.
Body
deviceOSstringDevice OS
deviceTypestringDevice type
durationinteger[1, 9007199254740991]Session duration in seconds
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/sessions' \
-H 'Content-Type: application/json' \
-d '{
"deviceOS": "string",
"deviceType": "string",
"duration": 1
}'const response = await fetch('/api/sessions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"deviceOS": "string",
"deviceType": "string",
"duration": 1
}),
});
const data = await response.json();import requests
payload = {
"deviceOS": "string",
"deviceType": "string",
"duration": 1
}
response = requests.post('/api/sessions', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"deviceOS": "string",
"deviceType": "string",
"duration": 1
}`)
req, _ := http.NewRequest("POST", "/api/sessions", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"deviceOS": "string",
"deviceType": "string",
"duration": 1
}{
"appVersion": "string",
"createdAt": "string",
"current": true,
"deviceOS": "string",
"deviceType": "string",
"expiresAt": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isPendingSyncReset": true,
"token": "string",
"updatedAt": "string"
}Delete all sessions
Delete all sessions for the user. This will not delete the current session.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/sessions'const response = await fetch('/api/sessions', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/sessions')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/sessions", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Update a session
deprecatedUpdate a specific session identified by id.
Body
isPendingSyncResetbooleanReset pending sync state
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/sessions/{id}' \
-H 'Content-Type: application/json' \
-d '{
"isPendingSyncReset": true
}'const response = await fetch('/api/sessions/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"isPendingSyncReset": true
}),
});
const data = await response.json();import requests
payload = {
"isPendingSyncReset": True
}
response = requests.put('/api/sessions/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"isPendingSyncReset": true
}`)
req, _ := http.NewRequest("PUT", "/api/sessions/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"isPendingSyncReset": true
}{
"appVersion": "string",
"createdAt": "string",
"current": true,
"deviceOS": "string",
"deviceType": "string",
"expiresAt": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isPendingSyncReset": true,
"updatedAt": "string"
}Delete a session
Delete a specific session by id.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/sessions/{id}'const response = await fetch('/api/sessions/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/sessions/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/sessions/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Lock a session
Lock a specific session by id.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/sessions/{id}/lock'const response = await fetch('/api/sessions/{id}/lock', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('/api/sessions/{id}/lock')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "/api/sessions/{id}/lock", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Stacks
A stack is a group of related assets. One asset is the "primary" asset, and the rest are "child" assets. On the main timeline, stack parents are included by default, while child assets are hidden.
Retrieve stacks
Retrieve a list of stacks.
Parameters
primaryAssetIdstring<uuid>queryFilter by primary asset ID
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/stacks'const response = await fetch('/api/stacks', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/stacks')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/stacks", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"assets": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}
]Create a stack
Create a new stack by providing a name and a list of asset IDs to include in the stack. If any of the provided asset IDs are primary assets of an existing stack, the existing stack will be merged into the newly created stack.
Body
assetIdsArray<string>requiredAsset IDs (first becomes primary, min 2)
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/stacks' \
-H 'Content-Type: application/json' \
-d '{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}'const response = await fetch('/api/stacks', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}),
});
const data = await response.json();import requests
payload = {
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
response = requests.post('/api/stacks', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}`)
req, _ := http.NewRequest("POST", "/api/stacks", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}{
"assets": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}Delete stacks
Delete multiple stacks by providing a list of stack IDs.
Body
idsArray<string>requiredIDs to process
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/stacks' \
-H 'Content-Type: application/json' \
-d '{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}'const response = await fetch('/api/stacks', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}),
});
const data = await response.json();import requests
payload = {
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
response = requests.delete('/api/stacks', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}`)
req, _ := http.NewRequest("DELETE", "/api/stacks", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}Retrieve a stack
Retrieve a specific stack by its ID.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/stacks/{id}'const response = await fetch('/api/stacks/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/stacks/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/stacks/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"assets": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}Update a stack
deprecatedUpdate an existing stack by its ID.
Body
primaryAssetIdstring<uuid>Primary asset ID
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/stacks/{id}' \
-H 'Content-Type: application/json' \
-d '{
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}'const response = await fetch('/api/stacks/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}),
});
const data = await response.json();import requests
payload = {
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}
response = requests.put('/api/stacks/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}`)
req, _ := http.NewRequest("PUT", "/api/stacks/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}{
"assets": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}Delete a stack
Delete a specific stack by its ID.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/stacks/{id}'const response = await fetch('/api/stacks/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/stacks/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/stacks/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Remove an asset from a stack
Remove a specific asset from a stack by providing the stack ID and asset ID.
Parameters
assetIdstring<uuid>requiredpathidstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/stacks/{id}/assets/{assetId}'const response = await fetch('/api/stacks/{id}/assets/{assetId}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/stacks/{id}/assets/{assetId}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/stacks/{id}/assets/{assetId}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Sync
A collection of endpoints for the new mobile synchronization implementation.
Retrieve acknowledgements
Retrieve the synchronization acknowledgments for the current session.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/sync/ack'const response = await fetch('/api/sync/ack', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/sync/ack')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/sync/ack", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"ack": "string",
"type": "AuthUserV1"
}
]Acknowledge changes
Send a list of synchronization acknowledgements to confirm that the latest changes have been received.
Body
acksArray<string>requiredAcknowledgment IDs (max 1000)
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/sync/ack' \
-H 'Content-Type: application/json' \
-d '{
"acks": [
"string"
]
}'const response = await fetch('/api/sync/ack', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"acks": [
"string"
]
}),
});
const data = await response.json();import requests
payload = {
"acks": [
"string"
]
}
response = requests.post('/api/sync/ack', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"acks": [
"string"
]
}`)
req, _ := http.NewRequest("POST", "/api/sync/ack", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"acks": [
"string"
]
}Delete acknowledgements
Delete specific synchronization acknowledgments.
Body
typesArray<SyncEntityType>AuthUserV1UserV1UserDeleteV1AssetV1AssetV2AssetDeleteV1AssetExifV1AssetEditV1AssetEditDeleteV1AssetMetadataV1AssetMetadataDeleteV1AssetOcrV1AssetOcrDeleteV1PartnerV1PartnerDeleteV1PartnerAssetV1PartnerAssetV2PartnerAssetBackfillV1PartnerAssetBackfillV2PartnerAssetDeleteV1PartnerAssetExifV1PartnerAssetExifBackfillV1PartnerStackBackfillV1PartnerStackDeleteV1PartnerStackV1AlbumV1AlbumV2AlbumDeleteV1AlbumUserV1AlbumUserBackfillV1AlbumUserDeleteV1AlbumAssetCreateV1AlbumAssetCreateV2AlbumAssetUpdateV1AlbumAssetUpdateV2AlbumAssetBackfillV1AlbumAssetBackfillV2AlbumAssetExifCreateV1AlbumAssetExifUpdateV1AlbumAssetExifBackfillV1AlbumToAssetV1AlbumToAssetDeleteV1AlbumToAssetBackfillV1MemoryV1MemoryDeleteV1MemoryToAssetV1MemoryToAssetDeleteV1StackV1StackDeleteV1PersonV1PersonDeleteV1AssetFaceV1AssetFaceV2AssetFaceDeleteV1UserMetadataV1UserMetadataDeleteV1SyncAckV1SyncResetV1SyncCompleteV1Sync entity types to delete acks for
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/sync/ack' \
-H 'Content-Type: application/json' \
-d '{
"types": [
"AuthUserV1"
]
}'const response = await fetch('/api/sync/ack', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"types": [
"AuthUserV1"
]
}),
});
const data = await response.json();import requests
payload = {
"types": [
"AuthUserV1"
]
}
response = requests.delete('/api/sync/ack', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"types": [
"AuthUserV1"
]
}`)
req, _ := http.NewRequest("DELETE", "/api/sync/ack", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"types": [
"AuthUserV1"
]
}Stream sync changes
Retrieve a JSON lines streamed response of changes for synchronization. This endpoint is used by the mobile app to efficiently stay up to date with changes.
Body
resetbooleanReset sync state
typesArray<SyncRequestType>AlbumsV1AlbumsV2AlbumUsersV1AlbumToAssetsV1AlbumAssetsV1AlbumAssetsV2AlbumAssetExifsV1AssetsV1AssetsV2AssetExifsV1AssetEditsV1AssetMetadataV1AssetOcrV1AuthUsersV1MemoriesV1MemoryToAssetsV1PartnersV1PartnerAssetsV1PartnerAssetsV2PartnerAssetExifsV1PartnerStacksV1StacksV1UsersV1PeopleV1AssetFacesV1AssetFacesV2UserMetadataV1requiredSync request types
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/sync/stream' \
-H 'Content-Type: application/json' \
-d '{
"reset": true,
"types": [
"AlbumsV1"
]
}'const response = await fetch('/api/sync/stream', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"reset": true,
"types": [
"AlbumsV1"
]
}),
});
const data = await response.json();import requests
payload = {
"reset": True,
"types": [
"AlbumsV1"
]
}
response = requests.post('/api/sync/stream', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"reset": true,
"types": [
"AlbumsV1"
]
}`)
req, _ := http.NewRequest("POST", "/api/sync/stream", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"reset": true,
"types": [
"AlbumsV1"
]
}System config
Endpoints to view, modify, and validate the system configuration settings.
Get system configuration
Retrieve the current system configuration.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/system-config'const response = await fetch('/api/system-config', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/system-config')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/system-config", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"backup": {
"database": {
"cronExpression": "string",
"enabled": true,
"keepLastAmount": 1
}
},
"ffmpeg": {
"accel": "nvenc",
"accelDecode": true,
"acceptedAudioCodecs": [
"mp3"
],
"acceptedContainers": [
"mov"
],
"acceptedVideoCodecs": [
"h264"
],
"bframes": -1,
"cqMode": "auto",
"crf": 0,
"gopSize": 0,
"maxBitrate": "string",
"preferredHwDevice": "string",
"preset": "string",
"realtime": {
"enabled": true
},
"refs": 0,
"targetAudioCodec": "mp3",
"targetResolution": "string",
"targetVideoCodec": "h264",
"temporalAQ": true,
"threads": 0,
"tonemap": "hable",
"transcode": "all",
"twoPass": true
},
"image": {
"colorspace": "srgb",
"extractEmbedded": true,
"fullsize": {
"enabled": true,
"format": "jpeg",
"progressive": true,
"quality": 1
},
"preview": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
},
"thumbnail": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
}
},
"integrityChecks": {
"checksumFiles": {
"cronExpression": "string",
"enabled": true,
"percentageLimit": 0,
"timeLimit": 0
},
"missingFiles": {
"cronExpression": "string",
"enabled": true
},
"untrackedFiles": {
"cronExpression": "string",
"enabled": true
}
},
"job": {
"backgroundTask": {
"concurrency": 1
},
"editor": {
"concurrency": 1
},
"faceDetection": {
"concurrency": 1
},
"integrityCheck": {
"concurrency": 1
},
"library": {
"concurrency": 1
},
"metadataExtraction": {
"concurrency": 1
},
"migration": {
"concurrency": 1
},
"notifications": {
"concurrency": 1
},
"ocr": {
"concurrency": 1
},
"search": {
"concurrency": 1
},
"sidecar": {
"concurrency": 1
},
"smartSearch": {
"concurrency": 1
},
"thumbnailGeneration": {
"concurrency": 1
},
"videoConversion": {
"concurrency": 1
},
"workflow": {
"concurrency": 1
}
},
"library": {
"scan": {
"cronExpression": "string",
"enabled": true
},
"watch": {
"enabled": true
}
},
"logging": {
"enabled": true,
"level": "verbose"
},
"machineLearning": {
"availabilityChecks": {
"enabled": true,
"interval": -9007199254740991,
"timeout": -9007199254740991
},
"clip": {
"enabled": true,
"modelName": "string"
},
"duplicateDetection": {
"enabled": true,
"maxDistance": 0.001
},
"enabled": true,
"facialRecognition": {
"enabled": true,
"maxDistance": 0.1,
"minFaces": 1,
"minScore": 0.1,
"modelName": "string"
},
"ocr": {
"enabled": true,
"maxResolution": 1,
"minDetectionScore": 0.1,
"minRecognitionScore": 0.1,
"modelName": "string"
},
"urls": [
"string"
]
},
"map": {
"darkStyle": "https://example.com",
"enabled": true,
"lightStyle": "https://example.com"
},
"metadata": {
"faces": {
"import": true
}
},
"newVersionCheck": {
"channel": "stable",
"enabled": true
},
"nightlyTasks": {
"clusterNewFaces": true,
"databaseCleanup": true,
"generateMemories": true,
"missingThumbnails": true,
"startTime": "string",
"syncQuotaUsage": true
},
"notifications": {
"smtp": {
"enabled": true,
"from": "string",
"replyTo": "string",
"transport": {
"host": "string",
"ignoreCert": true,
"password": "string",
"port": 0,
"secure": true,
"username": "string"
}
}
},
"oauth": {
"allowInsecureRequests": true,
"autoLaunch": true,
"autoRegister": true,
"buttonText": "string",
"clientId": "string",
"clientSecret": "string",
"defaultStorageQuota": 0,
"enabled": true,
"endSessionEndpoint": "string",
"issuerUrl": "string",
"mobileOverrideEnabled": true,
"mobileRedirectUri": "string",
"profileSigningAlgorithm": "string",
"prompt": "string",
"roleClaim": "string",
"scope": "string",
"signingAlgorithm": "string",
"storageLabelClaim": "string",
"storageQuotaClaim": "string",
"timeout": 1,
"tokenEndpointAuthMethod": "client_secret_post"
},
"passwordLogin": {
"enabled": true
},
"reverseGeocoding": {
"enabled": true
},
"server": {
"externalDomain": "string",
"loginPageMessage": "string",
"publicUsers": true
},
"storageTemplate": {
"enabled": true,
"hashVerificationEnabled": true,
"template": "string"
},
"templates": {
"email": {
"albumInviteTemplate": "string",
"albumUpdateTemplate": "string",
"welcomeTemplate": "string"
}
},
"theme": {
"customCss": "string"
},
"trash": {
"days": 0,
"enabled": true
},
"user": {
"deleteDelay": 1
}
}Update system configuration
Update the system configuration with a new system configuration.
Body
System configuration
backupSystemConfigBackupsDtorequiredffmpegSystemConfigFFmpegDtorequiredimageSystemConfigImageDtorequiredintegrityChecksSystemConfigIntegrityChecksrequiredIntegrity checks config
jobSystemConfigJobDtorequiredlibrarySystemConfigLibraryDtorequiredloggingSystemConfigLoggingDtorequiredmachineLearningSystemConfigMachineLearningDtorequiredmapSystemConfigMapDtorequiredmetadataSystemConfigMetadataDtorequirednewVersionCheckSystemConfigNewVersionCheckDtorequirednightlyTasksSystemConfigNightlyTasksDtorequirednotificationsSystemConfigNotificationsDtorequiredoauthSystemConfigOAuthDtorequiredpasswordLoginSystemConfigPasswordLoginDtorequiredreverseGeocodingSystemConfigReverseGeocodingDtorequiredserverSystemConfigServerDtorequiredstorageTemplateSystemConfigStorageTemplateDtorequiredtemplatesSystemConfigTemplatesDtorequiredthemeSystemConfigThemeDtorequiredtrashSystemConfigTrashDtorequireduserSystemConfigUserDtorequiredResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/system-config' \
-H 'Content-Type: application/json' \
-d '{
"backup": {
"database": {
"cronExpression": "string",
"enabled": true,
"keepLastAmount": 1
}
},
"ffmpeg": {
"accel": "nvenc",
"accelDecode": true,
"acceptedAudioCodecs": [
"mp3"
],
"acceptedContainers": [
"mov"
],
"acceptedVideoCodecs": [
"h264"
],
"bframes": -1,
"cqMode": "auto",
"crf": 0,
"gopSize": 0,
"maxBitrate": "string",
"preferredHwDevice": "string",
"preset": "string",
"realtime": {
"enabled": true
},
"refs": 0,
"targetAudioCodec": "mp3",
"targetResolution": "string",
"targetVideoCodec": "h264",
"temporalAQ": true,
"threads": 0,
"tonemap": "hable",
"transcode": "all",
"twoPass": true
},
"image": {
"colorspace": "srgb",
"extractEmbedded": true,
"fullsize": {
"enabled": true,
"format": "jpeg",
"progressive": true,
"quality": 1
},
"preview": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
},
"thumbnail": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
}
},
"integrityChecks": {
"checksumFiles": {
"cronExpression": "string",
"enabled": true,
"percentageLimit": 0,
"timeLimit": 0
},
"missingFiles": {
"cronExpression": "string",
"enabled": true
},
"untrackedFiles": {
"cronExpression": "string",
"enabled": true
}
},
"job": {
"backgroundTask": {
"concurrency": 1
},
"editor": {
"concurrency": 1
},
"faceDetection": {
"concurrency": 1
},
"integrityCheck": {
"concurrency": 1
},
"library": {
"concurrency": 1
},
"metadataExtraction": {
"concurrency": 1
},
"migration": {
"concurrency": 1
},
"notifications": {
"concurrency": 1
},
"ocr": {
"concurrency": 1
},
"search": {
"concurrency": 1
},
"sidecar": {
"concurrency": 1
},
"smartSearch": {
"concurrency": 1
},
"thumbnailGeneration": {
"concurrency": 1
},
"videoConversion": {
"concurrency": 1
},
"workflow": {
"concurrency": 1
}
},
"library": {
"scan": {
"cronExpression": "string",
"enabled": true
},
"watch": {
"enabled": true
}
},
"logging": {
"enabled": true,
"level": "verbose"
},
"machineLearning": {
"availabilityChecks": {
"enabled": true,
"interval": -9007199254740991,
"timeout": -9007199254740991
},
"clip": {
"enabled": true,
"modelName": "string"
},
"duplicateDetection": {
"enabled": true,
"maxDistance": 0.001
},
"enabled": true,
"facialRecognition": {
"enabled": true,
"maxDistance": 0.1,
"minFaces": 1,
"minScore": 0.1,
"modelName": "string"
},
"ocr": {
"enabled": true,
"maxResolution": 1,
"minDetectionScore": 0.1,
"minRecognitionScore": 0.1,
"modelName": "string"
},
"urls": [
"string"
]
},
"map": {
"darkStyle": "https://example.com",
"enabled": true,
"lightStyle": "https://example.com"
},
"metadata": {
"faces": {
"import": true
}
},
"newVersionCheck": {
"channel": "stable",
"enabled": true
},
"nightlyTasks": {
"clusterNewFaces": true,
"databaseCleanup": true,
"generateMemories": true,
"missingThumbnails": true,
"startTime": "string",
"syncQuotaUsage": true
},
"notifications": {
"smtp": {
"enabled": true,
"from": "string",
"replyTo": "string",
"transport": {
"host": "string",
"ignoreCert": true,
"password": "string",
"port": 0,
"secure": true,
"username": "string"
}
}
},
"oauth": {
"allowInsecureRequests": true,
"autoLaunch": true,
"autoRegister": true,
"buttonText": "string",
"clientId": "string",
"clientSecret": "string",
"defaultStorageQuota": 0,
"enabled": true,
"endSessionEndpoint": "string",
"issuerUrl": "string",
"mobileOverrideEnabled": true,
"mobileRedirectUri": "string",
"profileSigningAlgorithm": "string",
"prompt": "string",
"roleClaim": "string",
"scope": "string",
"signingAlgorithm": "string",
"storageLabelClaim": "string",
"storageQuotaClaim": "string",
"timeout": 1,
"tokenEndpointAuthMethod": "client_secret_post"
},
"passwordLogin": {
"enabled": true
},
"reverseGeocoding": {
"enabled": true
},
"server": {
"externalDomain": "string",
"loginPageMessage": "string",
"publicUsers": true
},
"storageTemplate": {
"enabled": true,
"hashVerificationEnabled": true,
"template": "string"
},
"templates": {
"email": {
"albumInviteTemplate": "string",
"albumUpdateTemplate": "string",
"welcomeTemplate": "string"
}
},
"theme": {
"customCss": "string"
},
"trash": {
"days": 0,
"enabled": true
},
"user": {
"deleteDelay": 1
}
}'const response = await fetch('/api/system-config', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"backup": {
"database": {
"cronExpression": "string",
"enabled": true,
"keepLastAmount": 1
}
},
"ffmpeg": {
"accel": "nvenc",
"accelDecode": true,
"acceptedAudioCodecs": [
"mp3"
],
"acceptedContainers": [
"mov"
],
"acceptedVideoCodecs": [
"h264"
],
"bframes": -1,
"cqMode": "auto",
"crf": 0,
"gopSize": 0,
"maxBitrate": "string",
"preferredHwDevice": "string",
"preset": "string",
"realtime": {
"enabled": true
},
"refs": 0,
"targetAudioCodec": "mp3",
"targetResolution": "string",
"targetVideoCodec": "h264",
"temporalAQ": true,
"threads": 0,
"tonemap": "hable",
"transcode": "all",
"twoPass": true
},
"image": {
"colorspace": "srgb",
"extractEmbedded": true,
"fullsize": {
"enabled": true,
"format": "jpeg",
"progressive": true,
"quality": 1
},
"preview": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
},
"thumbnail": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
}
},
"integrityChecks": {
"checksumFiles": {
"cronExpression": "string",
"enabled": true,
"percentageLimit": 0,
"timeLimit": 0
},
"missingFiles": {
"cronExpression": "string",
"enabled": true
},
"untrackedFiles": {
"cronExpression": "string",
"enabled": true
}
},
"job": {
"backgroundTask": {
"concurrency": 1
},
"editor": {
"concurrency": 1
},
"faceDetection": {
"concurrency": 1
},
"integrityCheck": {
"concurrency": 1
},
"library": {
"concurrency": 1
},
"metadataExtraction": {
"concurrency": 1
},
"migration": {
"concurrency": 1
},
"notifications": {
"concurrency": 1
},
"ocr": {
"concurrency": 1
},
"search": {
"concurrency": 1
},
"sidecar": {
"concurrency": 1
},
"smartSearch": {
"concurrency": 1
},
"thumbnailGeneration": {
"concurrency": 1
},
"videoConversion": {
"concurrency": 1
},
"workflow": {
"concurrency": 1
}
},
"library": {
"scan": {
"cronExpression": "string",
"enabled": true
},
"watch": {
"enabled": true
}
},
"logging": {
"enabled": true,
"level": "verbose"
},
"machineLearning": {
"availabilityChecks": {
"enabled": true,
"interval": -9007199254740991,
"timeout": -9007199254740991
},
"clip": {
"enabled": true,
"modelName": "string"
},
"duplicateDetection": {
"enabled": true,
"maxDistance": 0.001
},
"enabled": true,
"facialRecognition": {
"enabled": true,
"maxDistance": 0.1,
"minFaces": 1,
"minScore": 0.1,
"modelName": "string"
},
"ocr": {
"enabled": true,
"maxResolution": 1,
"minDetectionScore": 0.1,
"minRecognitionScore": 0.1,
"modelName": "string"
},
"urls": [
"string"
]
},
"map": {
"darkStyle": "https://example.com",
"enabled": true,
"lightStyle": "https://example.com"
},
"metadata": {
"faces": {
"import": true
}
},
"newVersionCheck": {
"channel": "stable",
"enabled": true
},
"nightlyTasks": {
"clusterNewFaces": true,
"databaseCleanup": true,
"generateMemories": true,
"missingThumbnails": true,
"startTime": "string",
"syncQuotaUsage": true
},
"notifications": {
"smtp": {
"enabled": true,
"from": "string",
"replyTo": "string",
"transport": {
"host": "string",
"ignoreCert": true,
"password": "string",
"port": 0,
"secure": true,
"username": "string"
}
}
},
"oauth": {
"allowInsecureRequests": true,
"autoLaunch": true,
"autoRegister": true,
"buttonText": "string",
"clientId": "string",
"clientSecret": "string",
"defaultStorageQuota": 0,
"enabled": true,
"endSessionEndpoint": "string",
"issuerUrl": "string",
"mobileOverrideEnabled": true,
"mobileRedirectUri": "string",
"profileSigningAlgorithm": "string",
"prompt": "string",
"roleClaim": "string",
"scope": "string",
"signingAlgorithm": "string",
"storageLabelClaim": "string",
"storageQuotaClaim": "string",
"timeout": 1,
"tokenEndpointAuthMethod": "client_secret_post"
},
"passwordLogin": {
"enabled": true
},
"reverseGeocoding": {
"enabled": true
},
"server": {
"externalDomain": "string",
"loginPageMessage": "string",
"publicUsers": true
},
"storageTemplate": {
"enabled": true,
"hashVerificationEnabled": true,
"template": "string"
},
"templates": {
"email": {
"albumInviteTemplate": "string",
"albumUpdateTemplate": "string",
"welcomeTemplate": "string"
}
},
"theme": {
"customCss": "string"
},
"trash": {
"days": 0,
"enabled": true
},
"user": {
"deleteDelay": 1
}
}),
});
const data = await response.json();import requests
payload = {
"backup": {
"database": {
"cronExpression": "string",
"enabled": True,
"keepLastAmount": 1
}
},
"ffmpeg": {
"accel": "nvenc",
"accelDecode": True,
"acceptedAudioCodecs": [
"mp3"
],
"acceptedContainers": [
"mov"
],
"acceptedVideoCodecs": [
"h264"
],
"bframes": -1,
"cqMode": "auto",
"crf": 0,
"gopSize": 0,
"maxBitrate": "string",
"preferredHwDevice": "string",
"preset": "string",
"realtime": {
"enabled": True
},
"refs": 0,
"targetAudioCodec": "mp3",
"targetResolution": "string",
"targetVideoCodec": "h264",
"temporalAQ": True,
"threads": 0,
"tonemap": "hable",
"transcode": "all",
"twoPass": True
},
"image": {
"colorspace": "srgb",
"extractEmbedded": True,
"fullsize": {
"enabled": True,
"format": "jpeg",
"progressive": True,
"quality": 1
},
"preview": {
"format": "jpeg",
"progressive": True,
"quality": 1,
"size": 1
},
"thumbnail": {
"format": "jpeg",
"progressive": True,
"quality": 1,
"size": 1
}
},
"integrityChecks": {
"checksumFiles": {
"cronExpression": "string",
"enabled": True,
"percentageLimit": 0,
"timeLimit": 0
},
"missingFiles": {
"cronExpression": "string",
"enabled": True
},
"untrackedFiles": {
"cronExpression": "string",
"enabled": True
}
},
"job": {
"backgroundTask": {
"concurrency": 1
},
"editor": {
"concurrency": 1
},
"faceDetection": {
"concurrency": 1
},
"integrityCheck": {
"concurrency": 1
},
"library": {
"concurrency": 1
},
"metadataExtraction": {
"concurrency": 1
},
"migration": {
"concurrency": 1
},
"notifications": {
"concurrency": 1
},
"ocr": {
"concurrency": 1
},
"search": {
"concurrency": 1
},
"sidecar": {
"concurrency": 1
},
"smartSearch": {
"concurrency": 1
},
"thumbnailGeneration": {
"concurrency": 1
},
"videoConversion": {
"concurrency": 1
},
"workflow": {
"concurrency": 1
}
},
"library": {
"scan": {
"cronExpression": "string",
"enabled": True
},
"watch": {
"enabled": True
}
},
"logging": {
"enabled": True,
"level": "verbose"
},
"machineLearning": {
"availabilityChecks": {
"enabled": True,
"interval": -9007199254740991,
"timeout": -9007199254740991
},
"clip": {
"enabled": True,
"modelName": "string"
},
"duplicateDetection": {
"enabled": True,
"maxDistance": 0.001
},
"enabled": True,
"facialRecognition": {
"enabled": True,
"maxDistance": 0.1,
"minFaces": 1,
"minScore": 0.1,
"modelName": "string"
},
"ocr": {
"enabled": True,
"maxResolution": 1,
"minDetectionScore": 0.1,
"minRecognitionScore": 0.1,
"modelName": "string"
},
"urls": [
"string"
]
},
"map": {
"darkStyle": "https://example.com",
"enabled": True,
"lightStyle": "https://example.com"
},
"metadata": {
"faces": {
"import": True
}
},
"newVersionCheck": {
"channel": "stable",
"enabled": True
},
"nightlyTasks": {
"clusterNewFaces": True,
"databaseCleanup": True,
"generateMemories": True,
"missingThumbnails": True,
"startTime": "string",
"syncQuotaUsage": True
},
"notifications": {
"smtp": {
"enabled": True,
"from": "string",
"replyTo": "string",
"transport": {
"host": "string",
"ignoreCert": True,
"password": "string",
"port": 0,
"secure": True,
"username": "string"
}
}
},
"oauth": {
"allowInsecureRequests": True,
"autoLaunch": True,
"autoRegister": True,
"buttonText": "string",
"clientId": "string",
"clientSecret": "string",
"defaultStorageQuota": 0,
"enabled": True,
"endSessionEndpoint": "string",
"issuerUrl": "string",
"mobileOverrideEnabled": True,
"mobileRedirectUri": "string",
"profileSigningAlgorithm": "string",
"prompt": "string",
"roleClaim": "string",
"scope": "string",
"signingAlgorithm": "string",
"storageLabelClaim": "string",
"storageQuotaClaim": "string",
"timeout": 1,
"tokenEndpointAuthMethod": "client_secret_post"
},
"passwordLogin": {
"enabled": True
},
"reverseGeocoding": {
"enabled": True
},
"server": {
"externalDomain": "string",
"loginPageMessage": "string",
"publicUsers": True
},
"storageTemplate": {
"enabled": True,
"hashVerificationEnabled": True,
"template": "string"
},
"templates": {
"email": {
"albumInviteTemplate": "string",
"albumUpdateTemplate": "string",
"welcomeTemplate": "string"
}
},
"theme": {
"customCss": "string"
},
"trash": {
"days": 0,
"enabled": True
},
"user": {
"deleteDelay": 1
}
}
response = requests.put('/api/system-config', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"backup": {
"database": {
"cronExpression": "string",
"enabled": true,
"keepLastAmount": 1
}
},
"ffmpeg": {
"accel": "nvenc",
"accelDecode": true,
"acceptedAudioCodecs": [
"mp3"
],
"acceptedContainers": [
"mov"
],
"acceptedVideoCodecs": [
"h264"
],
"bframes": -1,
"cqMode": "auto",
"crf": 0,
"gopSize": 0,
"maxBitrate": "string",
"preferredHwDevice": "string",
"preset": "string",
"realtime": {
"enabled": true
},
"refs": 0,
"targetAudioCodec": "mp3",
"targetResolution": "string",
"targetVideoCodec": "h264",
"temporalAQ": true,
"threads": 0,
"tonemap": "hable",
"transcode": "all",
"twoPass": true
},
"image": {
"colorspace": "srgb",
"extractEmbedded": true,
"fullsize": {
"enabled": true,
"format": "jpeg",
"progressive": true,
"quality": 1
},
"preview": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
},
"thumbnail": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
}
},
"integrityChecks": {
"checksumFiles": {
"cronExpression": "string",
"enabled": true,
"percentageLimit": 0,
"timeLimit": 0
},
"missingFiles": {
"cronExpression": "string",
"enabled": true
},
"untrackedFiles": {
"cronExpression": "string",
"enabled": true
}
},
"job": {
"backgroundTask": {
"concurrency": 1
},
"editor": {
"concurrency": 1
},
"faceDetection": {
"concurrency": 1
},
"integrityCheck": {
"concurrency": 1
},
"library": {
"concurrency": 1
},
"metadataExtraction": {
"concurrency": 1
},
"migration": {
"concurrency": 1
},
"notifications": {
"concurrency": 1
},
"ocr": {
"concurrency": 1
},
"search": {
"concurrency": 1
},
"sidecar": {
"concurrency": 1
},
"smartSearch": {
"concurrency": 1
},
"thumbnailGeneration": {
"concurrency": 1
},
"videoConversion": {
"concurrency": 1
},
"workflow": {
"concurrency": 1
}
},
"library": {
"scan": {
"cronExpression": "string",
"enabled": true
},
"watch": {
"enabled": true
}
},
"logging": {
"enabled": true,
"level": "verbose"
},
"machineLearning": {
"availabilityChecks": {
"enabled": true,
"interval": -9007199254740991,
"timeout": -9007199254740991
},
"clip": {
"enabled": true,
"modelName": "string"
},
"duplicateDetection": {
"enabled": true,
"maxDistance": 0.001
},
"enabled": true,
"facialRecognition": {
"enabled": true,
"maxDistance": 0.1,
"minFaces": 1,
"minScore": 0.1,
"modelName": "string"
},
"ocr": {
"enabled": true,
"maxResolution": 1,
"minDetectionScore": 0.1,
"minRecognitionScore": 0.1,
"modelName": "string"
},
"urls": [
"string"
]
},
"map": {
"darkStyle": "https://example.com",
"enabled": true,
"lightStyle": "https://example.com"
},
"metadata": {
"faces": {
"import": true
}
},
"newVersionCheck": {
"channel": "stable",
"enabled": true
},
"nightlyTasks": {
"clusterNewFaces": true,
"databaseCleanup": true,
"generateMemories": true,
"missingThumbnails": true,
"startTime": "string",
"syncQuotaUsage": true
},
"notifications": {
"smtp": {
"enabled": true,
"from": "string",
"replyTo": "string",
"transport": {
"host": "string",
"ignoreCert": true,
"password": "string",
"port": 0,
"secure": true,
"username": "string"
}
}
},
"oauth": {
"allowInsecureRequests": true,
"autoLaunch": true,
"autoRegister": true,
"buttonText": "string",
"clientId": "string",
"clientSecret": "string",
"defaultStorageQuota": 0,
"enabled": true,
"endSessionEndpoint": "string",
"issuerUrl": "string",
"mobileOverrideEnabled": true,
"mobileRedirectUri": "string",
"profileSigningAlgorithm": "string",
"prompt": "string",
"roleClaim": "string",
"scope": "string",
"signingAlgorithm": "string",
"storageLabelClaim": "string",
"storageQuotaClaim": "string",
"timeout": 1,
"tokenEndpointAuthMethod": "client_secret_post"
},
"passwordLogin": {
"enabled": true
},
"reverseGeocoding": {
"enabled": true
},
"server": {
"externalDomain": "string",
"loginPageMessage": "string",
"publicUsers": true
},
"storageTemplate": {
"enabled": true,
"hashVerificationEnabled": true,
"template": "string"
},
"templates": {
"email": {
"albumInviteTemplate": "string",
"albumUpdateTemplate": "string",
"welcomeTemplate": "string"
}
},
"theme": {
"customCss": "string"
},
"trash": {
"days": 0,
"enabled": true
},
"user": {
"deleteDelay": 1
}
}`)
req, _ := http.NewRequest("PUT", "/api/system-config", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"backup": {
"database": {
"cronExpression": "string",
"enabled": true,
"keepLastAmount": 1
}
},
"ffmpeg": {
"accel": "nvenc",
"accelDecode": true,
"acceptedAudioCodecs": [
"mp3"
],
"acceptedContainers": [
"mov"
],
"acceptedVideoCodecs": [
"h264"
],
"bframes": -1,
"cqMode": "auto",
"crf": 0,
"gopSize": 0,
"maxBitrate": "string",
"preferredHwDevice": "string",
"preset": "string",
"realtime": {
"enabled": true
},
"refs": 0,
"targetAudioCodec": "mp3",
"targetResolution": "string",
"targetVideoCodec": "h264",
"temporalAQ": true,
"threads": 0,
"tonemap": "hable",
"transcode": "all",
"twoPass": true
},
"image": {
"colorspace": "srgb",
"extractEmbedded": true,
"fullsize": {
"enabled": true,
"format": "jpeg",
"progressive": true,
"quality": 1
},
"preview": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
},
"thumbnail": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
}
},
"integrityChecks": {
"checksumFiles": {
"cronExpression": "string",
"enabled": true,
"percentageLimit": 0,
"timeLimit": 0
},
"missingFiles": {
"cronExpression": "string",
"enabled": true
},
"untrackedFiles": {
"cronExpression": "string",
"enabled": true
}
},
"job": {
"backgroundTask": {
"concurrency": 1
},
"editor": {
"concurrency": 1
},
"faceDetection": {
"concurrency": 1
},
"integrityCheck": {
"concurrency": 1
},
"library": {
"concurrency": 1
},
"metadataExtraction": {
"concurrency": 1
},
"migration": {
"concurrency": 1
},
"notifications": {
"concurrency": 1
},
"ocr": {
"concurrency": 1
},
"search": {
"concurrency": 1
},
"sidecar": {
"concurrency": 1
},
"smartSearch": {
"concurrency": 1
},
"thumbnailGeneration": {
"concurrency": 1
},
"videoConversion": {
"concurrency": 1
},
"workflow": {
"concurrency": 1
}
},
"library": {
"scan": {
"cronExpression": "string",
"enabled": true
},
"watch": {
"enabled": true
}
},
"logging": {
"enabled": true,
"level": "verbose"
},
"machineLearning": {
"availabilityChecks": {
"enabled": true,
"interval": -9007199254740991,
"timeout": -9007199254740991
},
"clip": {
"enabled": true,
"modelName": "string"
},
"duplicateDetection": {
"enabled": true,
"maxDistance": 0.001
},
"enabled": true,
"facialRecognition": {
"enabled": true,
"maxDistance": 0.1,
"minFaces": 1,
"minScore": 0.1,
"modelName": "string"
},
"ocr": {
"enabled": true,
"maxResolution": 1,
"minDetectionScore": 0.1,
"minRecognitionScore": 0.1,
"modelName": "string"
},
"urls": [
"string"
]
},
"map": {
"darkStyle": "https://example.com",
"enabled": true,
"lightStyle": "https://example.com"
},
"metadata": {
"faces": {
"import": true
}
},
"newVersionCheck": {
"channel": "stable",
"enabled": true
},
"nightlyTasks": {
"clusterNewFaces": true,
"databaseCleanup": true,
"generateMemories": true,
"missingThumbnails": true,
"startTime": "string",
"syncQuotaUsage": true
},
"notifications": {
"smtp": {
"enabled": true,
"from": "string",
"replyTo": "string",
"transport": {
"host": "string",
"ignoreCert": true,
"password": "string",
"port": 0,
"secure": true,
"username": "string"
}
}
},
"oauth": {
"allowInsecureRequests": true,
"autoLaunch": true,
"autoRegister": true,
"buttonText": "string",
"clientId": "string",
"clientSecret": "string",
"defaultStorageQuota": 0,
"enabled": true,
"endSessionEndpoint": "string",
"issuerUrl": "string",
"mobileOverrideEnabled": true,
"mobileRedirectUri": "string",
"profileSigningAlgorithm": "string",
"prompt": "string",
"roleClaim": "string",
"scope": "string",
"signingAlgorithm": "string",
"storageLabelClaim": "string",
"storageQuotaClaim": "string",
"timeout": 1,
"tokenEndpointAuthMethod": "client_secret_post"
},
"passwordLogin": {
"enabled": true
},
"reverseGeocoding": {
"enabled": true
},
"server": {
"externalDomain": "string",
"loginPageMessage": "string",
"publicUsers": true
},
"storageTemplate": {
"enabled": true,
"hashVerificationEnabled": true,
"template": "string"
},
"templates": {
"email": {
"albumInviteTemplate": "string",
"albumUpdateTemplate": "string",
"welcomeTemplate": "string"
}
},
"theme": {
"customCss": "string"
},
"trash": {
"days": 0,
"enabled": true
},
"user": {
"deleteDelay": 1
}
}{
"backup": {
"database": {
"cronExpression": "string",
"enabled": true,
"keepLastAmount": 1
}
},
"ffmpeg": {
"accel": "nvenc",
"accelDecode": true,
"acceptedAudioCodecs": [
"mp3"
],
"acceptedContainers": [
"mov"
],
"acceptedVideoCodecs": [
"h264"
],
"bframes": -1,
"cqMode": "auto",
"crf": 0,
"gopSize": 0,
"maxBitrate": "string",
"preferredHwDevice": "string",
"preset": "string",
"realtime": {
"enabled": true
},
"refs": 0,
"targetAudioCodec": "mp3",
"targetResolution": "string",
"targetVideoCodec": "h264",
"temporalAQ": true,
"threads": 0,
"tonemap": "hable",
"transcode": "all",
"twoPass": true
},
"image": {
"colorspace": "srgb",
"extractEmbedded": true,
"fullsize": {
"enabled": true,
"format": "jpeg",
"progressive": true,
"quality": 1
},
"preview": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
},
"thumbnail": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
}
},
"integrityChecks": {
"checksumFiles": {
"cronExpression": "string",
"enabled": true,
"percentageLimit": 0,
"timeLimit": 0
},
"missingFiles": {
"cronExpression": "string",
"enabled": true
},
"untrackedFiles": {
"cronExpression": "string",
"enabled": true
}
},
"job": {
"backgroundTask": {
"concurrency": 1
},
"editor": {
"concurrency": 1
},
"faceDetection": {
"concurrency": 1
},
"integrityCheck": {
"concurrency": 1
},
"library": {
"concurrency": 1
},
"metadataExtraction": {
"concurrency": 1
},
"migration": {
"concurrency": 1
},
"notifications": {
"concurrency": 1
},
"ocr": {
"concurrency": 1
},
"search": {
"concurrency": 1
},
"sidecar": {
"concurrency": 1
},
"smartSearch": {
"concurrency": 1
},
"thumbnailGeneration": {
"concurrency": 1
},
"videoConversion": {
"concurrency": 1
},
"workflow": {
"concurrency": 1
}
},
"library": {
"scan": {
"cronExpression": "string",
"enabled": true
},
"watch": {
"enabled": true
}
},
"logging": {
"enabled": true,
"level": "verbose"
},
"machineLearning": {
"availabilityChecks": {
"enabled": true,
"interval": -9007199254740991,
"timeout": -9007199254740991
},
"clip": {
"enabled": true,
"modelName": "string"
},
"duplicateDetection": {
"enabled": true,
"maxDistance": 0.001
},
"enabled": true,
"facialRecognition": {
"enabled": true,
"maxDistance": 0.1,
"minFaces": 1,
"minScore": 0.1,
"modelName": "string"
},
"ocr": {
"enabled": true,
"maxResolution": 1,
"minDetectionScore": 0.1,
"minRecognitionScore": 0.1,
"modelName": "string"
},
"urls": [
"string"
]
},
"map": {
"darkStyle": "https://example.com",
"enabled": true,
"lightStyle": "https://example.com"
},
"metadata": {
"faces": {
"import": true
}
},
"newVersionCheck": {
"channel": "stable",
"enabled": true
},
"nightlyTasks": {
"clusterNewFaces": true,
"databaseCleanup": true,
"generateMemories": true,
"missingThumbnails": true,
"startTime": "string",
"syncQuotaUsage": true
},
"notifications": {
"smtp": {
"enabled": true,
"from": "string",
"replyTo": "string",
"transport": {
"host": "string",
"ignoreCert": true,
"password": "string",
"port": 0,
"secure": true,
"username": "string"
}
}
},
"oauth": {
"allowInsecureRequests": true,
"autoLaunch": true,
"autoRegister": true,
"buttonText": "string",
"clientId": "string",
"clientSecret": "string",
"defaultStorageQuota": 0,
"enabled": true,
"endSessionEndpoint": "string",
"issuerUrl": "string",
"mobileOverrideEnabled": true,
"mobileRedirectUri": "string",
"profileSigningAlgorithm": "string",
"prompt": "string",
"roleClaim": "string",
"scope": "string",
"signingAlgorithm": "string",
"storageLabelClaim": "string",
"storageQuotaClaim": "string",
"timeout": 1,
"tokenEndpointAuthMethod": "client_secret_post"
},
"passwordLogin": {
"enabled": true
},
"reverseGeocoding": {
"enabled": true
},
"server": {
"externalDomain": "string",
"loginPageMessage": "string",
"publicUsers": true
},
"storageTemplate": {
"enabled": true,
"hashVerificationEnabled": true,
"template": "string"
},
"templates": {
"email": {
"albumInviteTemplate": "string",
"albumUpdateTemplate": "string",
"welcomeTemplate": "string"
}
},
"theme": {
"customCss": "string"
},
"trash": {
"days": 0,
"enabled": true
},
"user": {
"deleteDelay": 1
}
}Get system configuration defaults
Retrieve the default values for the system configuration.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/system-config/defaults'const response = await fetch('/api/system-config/defaults', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/system-config/defaults')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/system-config/defaults", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"backup": {
"database": {
"cronExpression": "string",
"enabled": true,
"keepLastAmount": 1
}
},
"ffmpeg": {
"accel": "nvenc",
"accelDecode": true,
"acceptedAudioCodecs": [
"mp3"
],
"acceptedContainers": [
"mov"
],
"acceptedVideoCodecs": [
"h264"
],
"bframes": -1,
"cqMode": "auto",
"crf": 0,
"gopSize": 0,
"maxBitrate": "string",
"preferredHwDevice": "string",
"preset": "string",
"realtime": {
"enabled": true
},
"refs": 0,
"targetAudioCodec": "mp3",
"targetResolution": "string",
"targetVideoCodec": "h264",
"temporalAQ": true,
"threads": 0,
"tonemap": "hable",
"transcode": "all",
"twoPass": true
},
"image": {
"colorspace": "srgb",
"extractEmbedded": true,
"fullsize": {
"enabled": true,
"format": "jpeg",
"progressive": true,
"quality": 1
},
"preview": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
},
"thumbnail": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
}
},
"integrityChecks": {
"checksumFiles": {
"cronExpression": "string",
"enabled": true,
"percentageLimit": 0,
"timeLimit": 0
},
"missingFiles": {
"cronExpression": "string",
"enabled": true
},
"untrackedFiles": {
"cronExpression": "string",
"enabled": true
}
},
"job": {
"backgroundTask": {
"concurrency": 1
},
"editor": {
"concurrency": 1
},
"faceDetection": {
"concurrency": 1
},
"integrityCheck": {
"concurrency": 1
},
"library": {
"concurrency": 1
},
"metadataExtraction": {
"concurrency": 1
},
"migration": {
"concurrency": 1
},
"notifications": {
"concurrency": 1
},
"ocr": {
"concurrency": 1
},
"search": {
"concurrency": 1
},
"sidecar": {
"concurrency": 1
},
"smartSearch": {
"concurrency": 1
},
"thumbnailGeneration": {
"concurrency": 1
},
"videoConversion": {
"concurrency": 1
},
"workflow": {
"concurrency": 1
}
},
"library": {
"scan": {
"cronExpression": "string",
"enabled": true
},
"watch": {
"enabled": true
}
},
"logging": {
"enabled": true,
"level": "verbose"
},
"machineLearning": {
"availabilityChecks": {
"enabled": true,
"interval": -9007199254740991,
"timeout": -9007199254740991
},
"clip": {
"enabled": true,
"modelName": "string"
},
"duplicateDetection": {
"enabled": true,
"maxDistance": 0.001
},
"enabled": true,
"facialRecognition": {
"enabled": true,
"maxDistance": 0.1,
"minFaces": 1,
"minScore": 0.1,
"modelName": "string"
},
"ocr": {
"enabled": true,
"maxResolution": 1,
"minDetectionScore": 0.1,
"minRecognitionScore": 0.1,
"modelName": "string"
},
"urls": [
"string"
]
},
"map": {
"darkStyle": "https://example.com",
"enabled": true,
"lightStyle": "https://example.com"
},
"metadata": {
"faces": {
"import": true
}
},
"newVersionCheck": {
"channel": "stable",
"enabled": true
},
"nightlyTasks": {
"clusterNewFaces": true,
"databaseCleanup": true,
"generateMemories": true,
"missingThumbnails": true,
"startTime": "string",
"syncQuotaUsage": true
},
"notifications": {
"smtp": {
"enabled": true,
"from": "string",
"replyTo": "string",
"transport": {
"host": "string",
"ignoreCert": true,
"password": "string",
"port": 0,
"secure": true,
"username": "string"
}
}
},
"oauth": {
"allowInsecureRequests": true,
"autoLaunch": true,
"autoRegister": true,
"buttonText": "string",
"clientId": "string",
"clientSecret": "string",
"defaultStorageQuota": 0,
"enabled": true,
"endSessionEndpoint": "string",
"issuerUrl": "string",
"mobileOverrideEnabled": true,
"mobileRedirectUri": "string",
"profileSigningAlgorithm": "string",
"prompt": "string",
"roleClaim": "string",
"scope": "string",
"signingAlgorithm": "string",
"storageLabelClaim": "string",
"storageQuotaClaim": "string",
"timeout": 1,
"tokenEndpointAuthMethod": "client_secret_post"
},
"passwordLogin": {
"enabled": true
},
"reverseGeocoding": {
"enabled": true
},
"server": {
"externalDomain": "string",
"loginPageMessage": "string",
"publicUsers": true
},
"storageTemplate": {
"enabled": true,
"hashVerificationEnabled": true,
"template": "string"
},
"templates": {
"email": {
"albumInviteTemplate": "string",
"albumUpdateTemplate": "string",
"welcomeTemplate": "string"
}
},
"theme": {
"customCss": "string"
},
"trash": {
"days": 0,
"enabled": true
},
"user": {
"deleteDelay": 1
}
}Get storage template options
Retrieve exemplary storage template options.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/system-config/storage-template-options'const response = await fetch('/api/system-config/storage-template-options', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/system-config/storage-template-options')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/system-config/storage-template-options", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"dayOptions": [
"string"
],
"hourOptions": [
"string"
],
"minuteOptions": [
"string"
],
"monthOptions": [
"string"
],
"presetOptions": [
"string"
],
"secondOptions": [
"string"
],
"weekOptions": [
"string"
],
"yearOptions": [
"string"
]
}System metadata
Endpoints to view, modify, and validate the system metadata, which includes information about things like admin onboarding status.
Retrieve admin onboarding
Retrieve the current admin onboarding status.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/system-metadata/admin-onboarding'const response = await fetch('/api/system-metadata/admin-onboarding', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/system-metadata/admin-onboarding')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/system-metadata/admin-onboarding", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"isOnboarded": true
}Update admin onboarding
Update the admin onboarding status.
Body
isOnboardedbooleanrequiredIs admin onboarded
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/system-metadata/admin-onboarding' \
-H 'Content-Type: application/json' \
-d '{
"isOnboarded": true
}'const response = await fetch('/api/system-metadata/admin-onboarding', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"isOnboarded": true
}),
});
const data = await response.json();import requests
payload = {
"isOnboarded": True
}
response = requests.post('/api/system-metadata/admin-onboarding', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"isOnboarded": true
}`)
req, _ := http.NewRequest("POST", "/api/system-metadata/admin-onboarding", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"isOnboarded": true
}Retrieve reverse geocoding state
Retrieve the current state of the reverse geocoding import.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/system-metadata/reverse-geocoding-state'const response = await fetch('/api/system-metadata/reverse-geocoding-state', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/system-metadata/reverse-geocoding-state')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/system-metadata/reverse-geocoding-state", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"lastImportFileName": "string",
"lastUpdate": "string"
}Retrieve version check state
Retrieve the current state of the version check process.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/system-metadata/version-check-state'const response = await fetch('/api/system-metadata/version-check-state', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/system-metadata/version-check-state')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/system-metadata/version-check-state", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"checkedAt": "string",
"releaseVersion": "string"
}Timeline
Specialized endpoints related to the timeline implementation used in the web application. External applications or tools should not use or rely on these endpoints, as they are subject to change without notice.
Get time bucket
Retrieve a string of all asset ids in a given time bucket.
Parameters
albumIdstring<uuid>queryFilter assets belonging to a specific album
bboxstringqueryBounding box coordinates as west,south,east,north (WGS84)
isFavoritebooleanqueryFilter by favorite status (true for favorites only, false for non-favorites only)
isTrashedbooleanqueryFilter by trash status (true for trashed assets only, false for non-trashed only)
keystringqueryorderAssetOrderascdescquerySort order for assets within time buckets (ASC for oldest first, DESC for newest first)
orderByAssetOrderBytakenAtcreatedAtqueryDate to group and order assets by (takenAt for date taken, createdAt for date added to Immich)
personIdstring<uuid>queryFilter assets containing a specific person (face recognition)
slugstringquerytagIdstring<uuid>queryFilter assets with a specific tag
timeBucketstringrequiredqueryTime bucket identifier in YYYY-MM-DD format
userIdstring<uuid>queryFilter assets by specific user ID
visibilityAssetVisibilityarchivetimelinehiddenlockedqueryFilter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)
withCoordinatesbooleanqueryInclude location data in the response
withPartnersbooleanqueryInclude assets shared by partners
withStackedbooleanqueryInclude stacked assets in the response. When true, only primary assets from stacks are returned.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/timeline/bucket'const response = await fetch('/api/timeline/bucket', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/timeline/bucket')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/timeline/bucket", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"city": [
"string"
],
"country": [
"string"
],
"createdAt": [
"string"
],
"duration": [
0
],
"fileCreatedAt": [
"string"
],
"id": [
"string"
],
"isFavorite": [
true
],
"isImage": [
true
],
"isTrashed": [
true
],
"latitude": [
0
],
"livePhotoVideoId": [
"string"
],
"localOffsetHours": [
0
],
"longitude": [
0
],
"ownerId": [
"string"
],
"projectionType": [
"string"
],
"ratio": [
0
],
"stack": [
[
"string"
]
],
"thumbhash": [
"string"
],
"visibility": [
"archive"
]
}Get time buckets
Retrieve a list of all minimal time buckets.
Parameters
albumIdstring<uuid>queryFilter assets belonging to a specific album
bboxstringqueryBounding box coordinates as west,south,east,north (WGS84)
isFavoritebooleanqueryFilter by favorite status (true for favorites only, false for non-favorites only)
isTrashedbooleanqueryFilter by trash status (true for trashed assets only, false for non-trashed only)
keystringqueryorderAssetOrderascdescquerySort order for assets within time buckets (ASC for oldest first, DESC for newest first)
orderByAssetOrderBytakenAtcreatedAtqueryDate to group and order assets by (takenAt for date taken, createdAt for date added to Immich)
personIdstring<uuid>queryFilter assets containing a specific person (face recognition)
slugstringquerytagIdstring<uuid>queryFilter assets with a specific tag
userIdstring<uuid>queryFilter assets by specific user ID
visibilityAssetVisibilityarchivetimelinehiddenlockedqueryFilter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)
withCoordinatesbooleanqueryInclude location data in the response
withPartnersbooleanqueryInclude assets shared by partners
withStackedbooleanqueryInclude stacked assets in the response. When true, only primary assets from stacks are returned.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/timeline/buckets'const response = await fetch('/api/timeline/buckets', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/timeline/buckets')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/timeline/buckets", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"count": 42,
"timeBucket": "2024-01-01"
}
]Trash
Endpoints for managing the trash can, which includes assets that have been discarded. Items in the trash are automatically deleted after a configured amount of time.
Empty trash
Permanently delete all items in the trash.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/trash/empty'const response = await fetch('/api/trash/empty', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('/api/trash/empty')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "/api/trash/empty", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"count": -9007199254740991
}Restore trash
Restore all items in the trash.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/trash/restore'const response = await fetch('/api/trash/restore', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('/api/trash/restore')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "/api/trash/restore", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"count": -9007199254740991
}Restore assets
Restore specific assets from the trash.
Body
idsArray<string>requiredIDs to process
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/trash/restore/assets' \
-H 'Content-Type: application/json' \
-d '{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}'const response = await fetch('/api/trash/restore/assets', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}),
});
const data = await response.json();import requests
payload = {
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
response = requests.post('/api/trash/restore/assets', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}`)
req, _ := http.NewRequest("POST", "/api/trash/restore/assets", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}{
"count": -9007199254740991
}Users (admin)
Administrative endpoints for managing users, including creating, updating, deleting, and restoring users. Also includes endpoints for resetting passwords and PIN codes.
Search users
Search for users.
Parameters
idstring<uuid>queryUser ID filter
withDeletedbooleanqueryInclude deleted users
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/admin/users'const response = await fetch('/api/admin/users', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/admin/users')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/admin/users", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"avatarColor": "primary",
"createdAt": "2024-01-01T00:00:00.000Z",
"deletedAt": "2024-01-01T00:00:00.000Z",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isAdmin": true,
"license": {
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
},
"name": "string",
"oauthId": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string",
"quotaSizeInBytes": 0,
"quotaUsageInBytes": 0,
"shouldChangePassword": true,
"status": "active",
"storageLabel": "string",
"updatedAt": "2024-01-01T00:00:00.000Z"
}
]Create a user
Create a new user.
Body
avatarColorUserAvatarColor | nullemailstring<email>requiredUser email
isAdminbooleanGrant admin privileges
namestringrequiredUser name
notifybooleanSend notification email
passwordstringrequiredUser password
pinCodestring | nullPIN code
quotaSizeInBytesinteger | null[0, 9007199254740991]Storage quota in bytes
shouldChangePasswordbooleanRequire password change on next login
storageLabelstring | nullStorage label
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/admin/users' \
-H 'Content-Type: application/json' \
-d '{
"email": "user@example.com",
"isAdmin": true,
"name": "string",
"notify": true,
"password": "string",
"pinCode": "123456",
"quotaSizeInBytes": 0,
"shouldChangePassword": true,
"storageLabel": "string"
}'const response = await fetch('/api/admin/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "user@example.com",
"isAdmin": true,
"name": "string",
"notify": true,
"password": "string",
"pinCode": "123456",
"quotaSizeInBytes": 0,
"shouldChangePassword": true,
"storageLabel": "string"
}),
});
const data = await response.json();import requests
payload = {
"email": "user@example.com",
"isAdmin": True,
"name": "string",
"notify": True,
"password": "string",
"pinCode": "123456",
"quotaSizeInBytes": 0,
"shouldChangePassword": True,
"storageLabel": "string"
}
response = requests.post('/api/admin/users', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"email": "user@example.com",
"isAdmin": true,
"name": "string",
"notify": true,
"password": "string",
"pinCode": "123456",
"quotaSizeInBytes": 0,
"shouldChangePassword": true,
"storageLabel": "string"
}`)
req, _ := http.NewRequest("POST", "/api/admin/users", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"email": "user@example.com",
"isAdmin": true,
"name": "string",
"notify": true,
"password": "string",
"pinCode": "123456",
"quotaSizeInBytes": 0,
"shouldChangePassword": true,
"storageLabel": "string"
}{
"avatarColor": "primary",
"createdAt": "2024-01-01T00:00:00.000Z",
"deletedAt": "2024-01-01T00:00:00.000Z",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isAdmin": true,
"license": {
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
},
"name": "string",
"oauthId": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string",
"quotaSizeInBytes": 0,
"quotaUsageInBytes": 0,
"shouldChangePassword": true,
"status": "active",
"storageLabel": "string",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Retrieve a user
Retrieve a specific user by their ID.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/admin/users/{id}'const response = await fetch('/api/admin/users/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/admin/users/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/admin/users/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"avatarColor": "primary",
"createdAt": "2024-01-01T00:00:00.000Z",
"deletedAt": "2024-01-01T00:00:00.000Z",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isAdmin": true,
"license": {
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
},
"name": "string",
"oauthId": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string",
"quotaSizeInBytes": 0,
"quotaUsageInBytes": 0,
"shouldChangePassword": true,
"status": "active",
"storageLabel": "string",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Update a user
deprecatedUpdate an existing user.
Body
avatarColorUserAvatarColor | nullemailstring<email>User email
isAdminbooleanGrant admin privileges
namestringUser name
passwordstringUser password
pinCodestring | nullPIN code
quotaSizeInBytesinteger | null[0, 9007199254740991]Storage quota in bytes
shouldChangePasswordbooleanRequire password change on next login
storageLabelstring | nullStorage label
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/admin/users/{id}' \
-H 'Content-Type: application/json' \
-d '{
"email": "user@example.com",
"isAdmin": true,
"name": "string",
"password": "string",
"pinCode": "123456",
"quotaSizeInBytes": 0,
"shouldChangePassword": true,
"storageLabel": "string"
}'const response = await fetch('/api/admin/users/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "user@example.com",
"isAdmin": true,
"name": "string",
"password": "string",
"pinCode": "123456",
"quotaSizeInBytes": 0,
"shouldChangePassword": true,
"storageLabel": "string"
}),
});
const data = await response.json();import requests
payload = {
"email": "user@example.com",
"isAdmin": True,
"name": "string",
"password": "string",
"pinCode": "123456",
"quotaSizeInBytes": 0,
"shouldChangePassword": True,
"storageLabel": "string"
}
response = requests.put('/api/admin/users/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"email": "user@example.com",
"isAdmin": true,
"name": "string",
"password": "string",
"pinCode": "123456",
"quotaSizeInBytes": 0,
"shouldChangePassword": true,
"storageLabel": "string"
}`)
req, _ := http.NewRequest("PUT", "/api/admin/users/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"email": "user@example.com",
"isAdmin": true,
"name": "string",
"password": "string",
"pinCode": "123456",
"quotaSizeInBytes": 0,
"shouldChangePassword": true,
"storageLabel": "string"
}{
"avatarColor": "primary",
"createdAt": "2024-01-01T00:00:00.000Z",
"deletedAt": "2024-01-01T00:00:00.000Z",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isAdmin": true,
"license": {
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
},
"name": "string",
"oauthId": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string",
"quotaSizeInBytes": 0,
"quotaUsageInBytes": 0,
"shouldChangePassword": true,
"status": "active",
"storageLabel": "string",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Delete a user
Delete a user.
Body
forcebooleanForce delete even if user has assets
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/admin/users/{id}' \
-H 'Content-Type: application/json' \
-d '{
"force": true
}'const response = await fetch('/api/admin/users/{id}', {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"force": true
}),
});
const data = await response.json();import requests
payload = {
"force": True
}
response = requests.delete('/api/admin/users/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"force": true
}`)
req, _ := http.NewRequest("DELETE", "/api/admin/users/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"force": true
}{
"avatarColor": "primary",
"createdAt": "2024-01-01T00:00:00.000Z",
"deletedAt": "2024-01-01T00:00:00.000Z",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isAdmin": true,
"license": {
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
},
"name": "string",
"oauthId": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string",
"quotaSizeInBytes": 0,
"quotaUsageInBytes": 0,
"shouldChangePassword": true,
"status": "active",
"storageLabel": "string",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Retrieve calendar heatmap activity
Retrieve activity counts for a specified period, in a calendar heatmap format.
Parameters
fromstring<date>queryStart date in UTC
idstring<uuid>requiredpathtostring<date>queryEnd date in UTC
typeCalendarHeatmapTypeUploadTakenUploadqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/admin/users/{id}/calendar-heatmap'const response = await fetch('/api/admin/users/{id}/calendar-heatmap', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/admin/users/{id}/calendar-heatmap')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/admin/users/{id}/calendar-heatmap", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"from": "2024-01-01",
"series": [
{
"count": 0,
"date": "2024-01-01"
}
],
"to": "2024-12-31",
"totalCount": 0
}Retrieve user preferences
Retrieve the preferences of a specific user.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/admin/users/{id}/preferences'const response = await fetch('/api/admin/users/{id}/preferences', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/admin/users/{id}/preferences')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/admin/users/{id}/preferences", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albums": {
"defaultAssetOrder": "asc"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": -9007199254740991,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": -9007199254740991,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}Update user preferences
deprecatedUpdate the preferences of a specific user.
Body
albumsAlbumsUpdateAlbum preferences
avatarAvatarUpdatecastCastUpdatedownloadDownloadUpdateemailNotificationsEmailNotificationsUpdatefoldersFoldersUpdatememoriesMemoriesUpdatepeoplePeopleUpdatepurchasePurchaseUpdateratingsRatingsUpdatesharedLinksSharedLinksUpdatetagsTagsUpdateParameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/admin/users/{id}/preferences' \
-H 'Content-Type: application/json' \
-d '{
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": 1,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}'const response = await fetch('/api/admin/users/{id}/preferences', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": 1,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}),
});
const data = await response.json();import requests
payload = {
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": True
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": True
},
"emailNotifications": {
"albumInvite": True,
"albumUpdate": True,
"enabled": True
},
"folders": {
"enabled": True,
"sidebarWeb": True
},
"memories": {
"duration": 1,
"enabled": True
},
"people": {
"enabled": True,
"minimumFaces": 1,
"sidebarWeb": True
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": True
},
"ratings": {
"enabled": True
},
"sharedLinks": {
"enabled": True,
"sidebarWeb": True
},
"tags": {
"enabled": True,
"sidebarWeb": True
}
}
response = requests.put('/api/admin/users/{id}/preferences', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": 1,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}`)
req, _ := http.NewRequest("PUT", "/api/admin/users/{id}/preferences", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": 1,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}{
"albums": {
"defaultAssetOrder": "asc"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": -9007199254740991,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": -9007199254740991,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}Restore a deleted user
Restore a previously deleted user.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/admin/users/{id}/restore'const response = await fetch('/api/admin/users/{id}/restore', {
method: 'POST',
});
const data = await response.json();import requests
response = requests.post('/api/admin/users/{id}/restore')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST", "/api/admin/users/{id}/restore", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"avatarColor": "primary",
"createdAt": "2024-01-01T00:00:00.000Z",
"deletedAt": "2024-01-01T00:00:00.000Z",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isAdmin": true,
"license": {
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
},
"name": "string",
"oauthId": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string",
"quotaSizeInBytes": 0,
"quotaUsageInBytes": 0,
"shouldChangePassword": true,
"status": "active",
"storageLabel": "string",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Retrieve user sessions
Retrieve all sessions for a specific user.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/admin/users/{id}/sessions'const response = await fetch('/api/admin/users/{id}/sessions', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/admin/users/{id}/sessions')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/admin/users/{id}/sessions", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"appVersion": "string",
"createdAt": "string",
"current": true,
"deviceOS": "string",
"deviceType": "string",
"expiresAt": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isPendingSyncReset": true,
"updatedAt": "string"
}
]Retrieve user statistics
Retrieve asset statistics for a specific user.
Parameters
idstring<uuid>requiredpathisFavoritebooleanqueryFilter by favorite status
isTrashedbooleanqueryFilter by trash status
visibilityAssetVisibilityarchivetimelinehiddenlockedqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/admin/users/{id}/statistics'const response = await fetch('/api/admin/users/{id}/statistics', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/admin/users/{id}/statistics')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/admin/users/{id}/statistics", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"images": -9007199254740991,
"total": -9007199254740991,
"videos": -9007199254740991
}Users
Endpoints for viewing and updating the current users, including product key information, profile picture data, onboarding progress, and more.
Get all users
Retrieve a list of all users on the server.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/users'const response = await fetch('/api/users', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/users')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/users", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}
]Get current user
Retrieve information about the user making the API request.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/users/me'const response = await fetch('/api/users/me', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/users/me')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/users/me", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"avatarColor": "primary",
"createdAt": "2024-01-01T00:00:00.000Z",
"deletedAt": "2024-01-01T00:00:00.000Z",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isAdmin": true,
"license": {
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
},
"name": "string",
"oauthId": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string",
"quotaSizeInBytes": 0,
"quotaUsageInBytes": 0,
"shouldChangePassword": true,
"status": "active",
"storageLabel": "string",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Update current user
deprecatedUpdate the current user making the API request.
Body
avatarColorUserAvatarColor | nullemailstring<email>User email
namestringUser name
passwordstringdeprecatedUser password (deprecated, use change password endpoint)
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/users/me' \
-H 'Content-Type: application/json' \
-d '{
"email": "user@example.com",
"name": "string",
"password": "string"
}'const response = await fetch('/api/users/me', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "user@example.com",
"name": "string",
"password": "string"
}),
});
const data = await response.json();import requests
payload = {
"email": "user@example.com",
"name": "string",
"password": "string"
}
response = requests.put('/api/users/me', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"email": "user@example.com",
"name": "string",
"password": "string"
}`)
req, _ := http.NewRequest("PUT", "/api/users/me", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"email": "user@example.com",
"name": "string",
"password": "string"
}{
"avatarColor": "primary",
"createdAt": "2024-01-01T00:00:00.000Z",
"deletedAt": "2024-01-01T00:00:00.000Z",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isAdmin": true,
"license": {
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
},
"name": "string",
"oauthId": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string",
"quotaSizeInBytes": 0,
"quotaUsageInBytes": 0,
"shouldChangePassword": true,
"status": "active",
"storageLabel": "string",
"updatedAt": "2024-01-01T00:00:00.000Z"
}Retrieve calendar heatmap activity
Retrieve activity counts for a specified period, in a calendar heatmap format.
Parameters
fromstring<date>queryStart date in UTC
tostring<date>queryEnd date in UTC
typeCalendarHeatmapTypeUploadTakenUploadqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/users/me/calendar-heatmap'const response = await fetch('/api/users/me/calendar-heatmap', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/users/me/calendar-heatmap')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/users/me/calendar-heatmap", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"from": "2024-01-01",
"series": [
{
"count": 0,
"date": "2024-01-01"
}
],
"to": "2024-12-31",
"totalCount": 0
}Retrieve user product key
Retrieve information about whether the current user has a registered product key.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/users/me/license'const response = await fetch('/api/users/me/license', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/users/me/license')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/users/me/license", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
}Set user product key
Register a product key for the current user.
Body
activationKeystringrequiredActivation key
licenseKeystringrequiredLicense key (format: /^IM(SV|CL)(-[\dA-Za-z]{4}){8}$/)
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/users/me/license' \
-H 'Content-Type: application/json' \
-d '{
"activationKey": "string",
"licenseKey": "string"
}'const response = await fetch('/api/users/me/license', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"activationKey": "string",
"licenseKey": "string"
}),
});
const data = await response.json();import requests
payload = {
"activationKey": "string",
"licenseKey": "string"
}
response = requests.put('/api/users/me/license', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"activationKey": "string",
"licenseKey": "string"
}`)
req, _ := http.NewRequest("PUT", "/api/users/me/license", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"activationKey": "string",
"licenseKey": "string"
}{
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
}Delete user product key
Delete the registered product key for the current user.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/users/me/license'const response = await fetch('/api/users/me/license', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/users/me/license')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/users/me/license", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Retrieve user onboarding
Retrieve the onboarding status of the current user.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/users/me/onboarding'const response = await fetch('/api/users/me/onboarding', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/users/me/onboarding')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/users/me/onboarding", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"isOnboarded": true
}Update user onboarding
Update the onboarding status of the current user.
Body
isOnboardedbooleanrequiredIs user onboarded
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/users/me/onboarding' \
-H 'Content-Type: application/json' \
-d '{
"isOnboarded": true
}'const response = await fetch('/api/users/me/onboarding', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"isOnboarded": true
}),
});
const data = await response.json();import requests
payload = {
"isOnboarded": True
}
response = requests.put('/api/users/me/onboarding', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"isOnboarded": true
}`)
req, _ := http.NewRequest("PUT", "/api/users/me/onboarding", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"isOnboarded": true
}{
"isOnboarded": true
}Delete user onboarding
Delete the onboarding status of the current user.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/users/me/onboarding'const response = await fetch('/api/users/me/onboarding', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/users/me/onboarding')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/users/me/onboarding", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Get my preferences
Retrieve the preferences for the current user.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/users/me/preferences'const response = await fetch('/api/users/me/preferences', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/users/me/preferences')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/users/me/preferences", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albums": {
"defaultAssetOrder": "asc"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": -9007199254740991,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": -9007199254740991,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}Update my preferences
deprecatedUpdate the preferences of the current user.
Body
albumsAlbumsUpdateAlbum preferences
avatarAvatarUpdatecastCastUpdatedownloadDownloadUpdateemailNotificationsEmailNotificationsUpdatefoldersFoldersUpdatememoriesMemoriesUpdatepeoplePeopleUpdatepurchasePurchaseUpdateratingsRatingsUpdatesharedLinksSharedLinksUpdatetagsTagsUpdateResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/users/me/preferences' \
-H 'Content-Type: application/json' \
-d '{
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": 1,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}'const response = await fetch('/api/users/me/preferences', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": 1,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}),
});
const data = await response.json();import requests
payload = {
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": True
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": True
},
"emailNotifications": {
"albumInvite": True,
"albumUpdate": True,
"enabled": True
},
"folders": {
"enabled": True,
"sidebarWeb": True
},
"memories": {
"duration": 1,
"enabled": True
},
"people": {
"enabled": True,
"minimumFaces": 1,
"sidebarWeb": True
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": True
},
"ratings": {
"enabled": True
},
"sharedLinks": {
"enabled": True,
"sidebarWeb": True
},
"tags": {
"enabled": True,
"sidebarWeb": True
}
}
response = requests.put('/api/users/me/preferences', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": 1,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}`)
req, _ := http.NewRequest("PUT", "/api/users/me/preferences", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": 1,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}{
"albums": {
"defaultAssetOrder": "asc"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": -9007199254740991,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": -9007199254740991,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}Create user profile image
Upload and set a new profile image for the current user.
Body
A new avatar for the user
filestring<binary>requiredProfile image file
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/users/profile-image' \
-H 'Content-Type: multipart/form-data' \
-d '{
"file": "<binary>"
}'const response = await fetch('/api/users/profile-image', {
method: 'POST',
headers: {
'Content-Type': 'multipart/form-data',
},
body: JSON.stringify({
"file": "<binary>"
}),
});
const data = await response.json();import requests
payload = {
"file": "<binary>"
}
response = requests.post('/api/users/profile-image', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"file": "<binary>"
}`)
req, _ := http.NewRequest("POST", "/api/users/profile-image", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"file": "<binary>"
}{
"profileChangedAt": "2024-01-01T00:00:00.000Z",
"profileImagePath": "string",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}Delete user profile image
Delete the profile image of the current user.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/users/profile-image'const response = await fetch('/api/users/profile-image', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/users/profile-image')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/users/profile-image", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Retrieve a user
Retrieve a specific user by their ID.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/users/{id}'const response = await fetch('/api/users/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/users/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/users/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}Retrieve user profile image
Retrieve the profile image file for a user.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/users/{id}/profile-image'const response = await fetch('/api/users/{id}/profile-image', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/users/{id}/profile-image')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/users/{id}/profile-image", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}"<binary>"Views
Endpoints for specialized views, such as the folder view.
Retrieve assets by original path
Retrieve assets that are children of a specific folder.
Parameters
pathstringrequiredqueryResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/view/folder'const response = await fetch('/api/view/folder', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/view/folder')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/view/folder", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
]Retrieve unique paths
Retrieve a list of unique folder paths from asset original paths.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/view/folder/unique-paths'const response = await fetch('/api/view/folder/unique-paths', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/view/folder/unique-paths')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/view/folder/unique-paths", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
"string"
]Workflows
A workflow is a set of actions that run whenever a triggering event occurs. Workflows also can include filters to further limit execution.
List all workflows
Retrieve a list of workflows available to the authenticated user.
Parameters
descriptionstringqueryWorkflow description
enabledbooleanqueryWorkflow enabled
idstring<uuid>queryWorkflow ID
namestringqueryWorkflow name
triggerWorkflowTriggerAssetCreateAssetMetadataExtractionqueryWorkflow trigger type
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/workflows'const response = await fetch('/api/workflows', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/workflows')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/workflows", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"createdAt": "string",
"description": "string",
"enabled": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate",
"updatedAt": "string"
}
]Create a workflow
Create a new workflow, the workflow can also be created with empty filters and actions.
Body
descriptionstring | nullWorkflow description
enabledbooleanWorkflow enabled
namestring | nullWorkflow name
stepsArray<WorkflowStepDto>triggerWorkflowTriggerAssetCreateAssetMetadataExtractionrequiredPlugin trigger type
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X POST '/api/workflows' \
-H 'Content-Type: application/json' \
-d '{
"description": "string",
"enabled": true,
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate"
}'const response = await fetch('/api/workflows', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"description": "string",
"enabled": true,
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate"
}),
});
const data = await response.json();import requests
payload = {
"description": "string",
"enabled": True,
"name": "string",
"steps": [
{
"config": {},
"enabled": True,
"method": "string"
}
],
"trigger": "AssetCreate"
}
response = requests.post('/api/workflows', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"description": "string",
"enabled": true,
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate"
}`)
req, _ := http.NewRequest("POST", "/api/workflows", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"description": "string",
"enabled": true,
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate"
}{
"createdAt": "string",
"description": "string",
"enabled": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate",
"updatedAt": "string"
}List all workflow triggers
Retrieve a list of all available workflow triggers.
Response
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/workflows/triggers'const response = await fetch('/api/workflows/triggers', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/workflows/triggers')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/workflows/triggers", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}[
{
"trigger": "AssetCreate",
"types": [
"AssetV1"
]
}
]Retrieve a workflow
Retrieve information about a specific workflow by its ID.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X GET '/api/workflows/{id}'const response = await fetch('/api/workflows/{id}', {
method: 'GET',
});
const data = await response.json();import requests
response = requests.get('/api/workflows/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "/api/workflows/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"createdAt": "string",
"description": "string",
"enabled": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate",
"updatedAt": "string"
}Update a workflow
deprecatedUpdate the information of a specific workflow by its ID. This endpoint can be used to update the workflow name, description, trigger type, filters and actions order, etc.
Body
descriptionstring | nullWorkflow description
enabledbooleanWorkflow enabled
namestring | nullWorkflow name
stepsArray<WorkflowStepDto>triggerWorkflowTriggerAssetCreateAssetMetadataExtractionPlugin trigger type
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X PUT '/api/workflows/{id}' \
-H 'Content-Type: application/json' \
-d '{
"description": "string",
"enabled": true,
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate"
}'const response = await fetch('/api/workflows/{id}', {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
"description": "string",
"enabled": true,
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate"
}),
});
const data = await response.json();import requests
payload = {
"description": "string",
"enabled": True,
"name": "string",
"steps": [
{
"config": {},
"enabled": True,
"method": "string"
}
],
"trigger": "AssetCreate"
}
response = requests.put('/api/workflows/{id}', json=payload)
data = response.json()package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
body := strings.NewReader(`{
"description": "string",
"enabled": true,
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate"
}`)
req, _ := http.NewRequest("PUT", "/api/workflows/{id}", body)
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}{
"description": "string",
"enabled": true,
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate"
}{
"createdAt": "string",
"description": "string",
"enabled": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate",
"updatedAt": "string"
}Delete a workflow
Delete a workflow by its ID.
Parameters
idstring<uuid>requiredpathResponse
Authorization
bearerhttp (Bearer) in headercookieapiKey in cookieapi_keyapiKey in headercurl -X DELETE '/api/workflows/{id}'const response = await fetch('/api/workflows/{id}', {
method: 'DELETE',
});
const data = await response.json();import requests
response = requests.delete('/api/workflows/{id}')
data = response.json()package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("DELETE", "/api/workflows/{id}", nil)
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
data, _ := io.ReadAll(resp.Body)
fmt.Println(string(data))
}Models
ActivityCreateDto
objectActivity create
albumIdstring<uuid>requiredAlbum ID
assetIdstring<uuid>Asset ID (if activity is for an asset)
commentstringComment text (required if type is comment)
typeReactionTypecommentlikerequiredReaction type
{
"albumId": "550e8400-e29b-41d4-a716-446655440000",
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"comment": "string",
"type": "comment"
}ActivityResponseDto
objectassetIdstring<uuid> | nullrequiredAsset ID (if activity is for an asset)
commentstring | nullComment text (for comment activities)
createdAtstring<date-time>requiredCreation date
idstring<uuid>requiredActivity ID
typeReactionTypecommentlikerequiredReaction type
userUserResponseDtorequired{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"comment": "string",
"createdAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "comment",
"user": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}
}ActivityStatisticsResponseDto
objectcommentsinteger[0, 9007199254740991]requiredNumber of comments
likesinteger[0, 9007199254740991]requiredNumber of likes
{
"comments": 0,
"likes": 0
}AddUsersDto
objectalbumUsersArray<AlbumUserAddDto>requiredAlbum users to add
{
"albumUsers": [
{
"role": "editor",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
]
}AdminOnboardingUpdateDto
objectisOnboardedbooleanrequiredIs admin onboarded
{
"isOnboarded": true
}AlbumResponseDto
objectalbumNamestringrequiredAlbum name
albumThumbnailAssetIdstring<uuid> | nullrequiredThumbnail asset ID
albumUsersArray<AlbumUserResponseDto>requiredFirst entry is always the album owner. Second entry is the auth user, if it differs from the owner. The rest are ordered alphabetically.
assetCountinteger[0, 9007199254740991]requiredNumber of assets
contributorCountsArray<ContributorCountResponseDto>createdAtstring<date-time>requiredCreation date
descriptionstringrequiredAlbum description
endDatestring<date-time>End date (latest asset)
hasSharedLinkbooleanrequiredHas shared link
idstring<uuid>requiredAlbum ID
isActivityEnabledbooleanrequiredActivity feed enabled
lastModifiedAssetTimestampstring<date-time>Last modified asset timestamp
orderAssetOrderascdescAsset sort order
sharedbooleanrequiredIs shared album
startDatestring<date-time>Start date (earliest asset)
updatedAtstring<date-time>requiredLast update date
{
"albumName": "string",
"albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
"albumUsers": [
{
"role": "editor",
"user": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}
}
],
"assetCount": 0,
"contributorCounts": [
{
"assetCount": 0,
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
],
"createdAt": "2024-01-15T09:30:00Z",
"description": "string",
"endDate": "2024-01-15T09:30:00Z",
"hasSharedLink": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isActivityEnabled": true,
"lastModifiedAssetTimestamp": "2024-01-15T09:30:00Z",
"order": "asc",
"shared": true,
"startDate": "2024-01-15T09:30:00Z",
"updatedAt": "2024-01-15T09:30:00Z"
}AlbumStatisticsResponseDto
objectnotSharedinteger[0, 9007199254740991]requiredNumber of non-shared albums
ownedinteger[0, 9007199254740991]requiredNumber of owned albums
sharedinteger[0, 9007199254740991]requiredNumber of shared albums
{
"notShared": 0,
"owned": 0,
"shared": 0
}AlbumUserAddDto
objectroleAlbumUserRoleeditorownerviewereditorAlbum user role
userIdstring<uuid>requiredUser ID
{
"role": "editor",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}AlbumUserCreateDto
objectroleAlbumUserRoleeditorownerviewerrequiredAlbum user role
userIdstring<uuid>requiredUser ID
{
"role": "editor",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}AlbumUserResponseDto
objectroleAlbumUserRoleeditorownerviewerrequiredAlbum user role
userUserResponseDtorequired{
"role": "editor",
"user": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}
}AlbumsAddAssetsDto
objectalbumIdsArray<string>requiredAlbum IDs
assetIdsArray<string>requiredAsset IDs
{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}AlbumsAddAssetsResponseDto
objecterrorBulkIdErrorReasonduplicateno_permissionnot_foundunknownvalidationError reason
successbooleanrequiredOperation success
{
"error": "duplicate",
"success": true
}AlbumsResponse
objectdefaultAssetOrderAssetOrderascdescrequiredAsset sort order
{
"defaultAssetOrder": "asc"
}AlbumsUpdate
objectAlbum preferences
defaultAssetOrderAssetOrderascdescAsset sort order
{
"defaultAssetOrder": "asc"
}ApiKeyCreateDto
objectnamestringAPI key name
permissionsArray<Permission>allactivity.createactivity.readactivity.updateactivity.deleteactivity.statisticsapiKey.createapiKey.readapiKey.updateapiKey.deleteasset.readasset.updateasset.deleteasset.statisticsasset.shareasset.viewasset.downloadasset.uploadasset.copyasset.deriveasset.edit.getasset.edit.createasset.edit.deletealbum.createalbum.readalbum.updatealbum.deletealbum.statisticsalbum.sharealbum.downloadalbumAsset.createalbumAsset.deletealbumUser.createalbumUser.updatealbumUser.deleteauth.changePasswordauthDevice.deletearchive.readbackup.listbackup.downloadbackup.uploadbackup.deleteduplicate.readduplicate.deleteface.createface.readface.updateface.deletefolder.readjob.createjob.readlibrary.createlibrary.readlibrary.updatelibrary.deletelibrary.statisticstimeline.readtimeline.downloadmaintenancemap.readmap.searchmemory.creatememory.readmemory.updatememory.deletememory.statisticsmemoryAsset.creatememoryAsset.deletenotification.createnotification.readnotification.updatenotification.deletepartner.createpartner.readpartner.updatepartner.deleteperson.createperson.readperson.updateperson.deleteperson.statisticsperson.mergeperson.reassignpinCode.createpinCode.updatepinCode.deleteplugin.createplugin.readplugin.updateplugin.deleteserver.aboutserver.apkLinksserver.storageserver.statisticsserver.versionCheckserverLicense.readserverLicense.updateserverLicense.deletesession.createsession.readsession.updatesession.deletesession.locksharedLink.createsharedLink.readsharedLink.updatesharedLink.deletestack.createstack.readstack.updatestack.deletesync.streamsyncCheckpoint.readsyncCheckpoint.updatesyncCheckpoint.deletesystemConfig.readsystemConfig.updatesystemMetadata.readsystemMetadata.updatetag.createtag.readtag.updatetag.deletetag.assetuser.readuser.updateuserLicense.createuserLicense.readuserLicense.updateuserLicense.deleteuserOnboarding.readuserOnboarding.updateuserOnboarding.deleteuserPreference.readuserPreference.updateuserProfileImage.createuserProfileImage.readuserProfileImage.updateuserProfileImage.deletequeue.readqueue.updatequeueJob.createqueueJob.readqueueJob.updatequeueJob.deleteworkflow.createworkflow.readworkflow.updateworkflow.deleteadminUser.createadminUser.readadminUser.updateadminUser.deleteadminSession.readadminAuth.unlinkAllrequiredList of permissions
{
"name": "string",
"permissions": [
"all"
]
}ApiKeyCreateResponseDto
objectapiKeyApiKeyResponseDtorequiredsecretstringrequiredAPI key secret (only shown once)
{
"apiKey": {
"createdAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"permissions": [
"all"
],
"updatedAt": "2024-01-01T00:00:00.000Z"
},
"secret": "string"
}ApiKeyResponseDto
objectcreatedAtstring<date-time>requiredCreation date
idstring<uuid>requiredAPI key ID
namestringrequiredAPI key name
permissionsArray<Permission>allactivity.createactivity.readactivity.updateactivity.deleteactivity.statisticsapiKey.createapiKey.readapiKey.updateapiKey.deleteasset.readasset.updateasset.deleteasset.statisticsasset.shareasset.viewasset.downloadasset.uploadasset.copyasset.deriveasset.edit.getasset.edit.createasset.edit.deletealbum.createalbum.readalbum.updatealbum.deletealbum.statisticsalbum.sharealbum.downloadalbumAsset.createalbumAsset.deletealbumUser.createalbumUser.updatealbumUser.deleteauth.changePasswordauthDevice.deletearchive.readbackup.listbackup.downloadbackup.uploadbackup.deleteduplicate.readduplicate.deleteface.createface.readface.updateface.deletefolder.readjob.createjob.readlibrary.createlibrary.readlibrary.updatelibrary.deletelibrary.statisticstimeline.readtimeline.downloadmaintenancemap.readmap.searchmemory.creatememory.readmemory.updatememory.deletememory.statisticsmemoryAsset.creatememoryAsset.deletenotification.createnotification.readnotification.updatenotification.deletepartner.createpartner.readpartner.updatepartner.deleteperson.createperson.readperson.updateperson.deleteperson.statisticsperson.mergeperson.reassignpinCode.createpinCode.updatepinCode.deleteplugin.createplugin.readplugin.updateplugin.deleteserver.aboutserver.apkLinksserver.storageserver.statisticsserver.versionCheckserverLicense.readserverLicense.updateserverLicense.deletesession.createsession.readsession.updatesession.deletesession.locksharedLink.createsharedLink.readsharedLink.updatesharedLink.deletestack.createstack.readstack.updatestack.deletesync.streamsyncCheckpoint.readsyncCheckpoint.updatesyncCheckpoint.deletesystemConfig.readsystemConfig.updatesystemMetadata.readsystemMetadata.updatetag.createtag.readtag.updatetag.deletetag.assetuser.readuser.updateuserLicense.createuserLicense.readuserLicense.updateuserLicense.deleteuserOnboarding.readuserOnboarding.updateuserOnboarding.deleteuserPreference.readuserPreference.updateuserProfileImage.createuserProfileImage.readuserProfileImage.updateuserProfileImage.deletequeue.readqueue.updatequeueJob.createqueueJob.readqueueJob.updatequeueJob.deleteworkflow.createworkflow.readworkflow.updateworkflow.deleteadminUser.createadminUser.readadminUser.updateadminUser.deleteadminSession.readadminAuth.unlinkAllrequiredList of permissions
updatedAtstring<date-time>requiredLast update date
{
"createdAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"permissions": [
"all"
],
"updatedAt": "2024-01-01T00:00:00.000Z"
}ApiKeyUpdateDto
objectnamestringAPI key name
permissionsArray<Permission>allactivity.createactivity.readactivity.updateactivity.deleteactivity.statisticsapiKey.createapiKey.readapiKey.updateapiKey.deleteasset.readasset.updateasset.deleteasset.statisticsasset.shareasset.viewasset.downloadasset.uploadasset.copyasset.deriveasset.edit.getasset.edit.createasset.edit.deletealbum.createalbum.readalbum.updatealbum.deletealbum.statisticsalbum.sharealbum.downloadalbumAsset.createalbumAsset.deletealbumUser.createalbumUser.updatealbumUser.deleteauth.changePasswordauthDevice.deletearchive.readbackup.listbackup.downloadbackup.uploadbackup.deleteduplicate.readduplicate.deleteface.createface.readface.updateface.deletefolder.readjob.createjob.readlibrary.createlibrary.readlibrary.updatelibrary.deletelibrary.statisticstimeline.readtimeline.downloadmaintenancemap.readmap.searchmemory.creatememory.readmemory.updatememory.deletememory.statisticsmemoryAsset.creatememoryAsset.deletenotification.createnotification.readnotification.updatenotification.deletepartner.createpartner.readpartner.updatepartner.deleteperson.createperson.readperson.updateperson.deleteperson.statisticsperson.mergeperson.reassignpinCode.createpinCode.updatepinCode.deleteplugin.createplugin.readplugin.updateplugin.deleteserver.aboutserver.apkLinksserver.storageserver.statisticsserver.versionCheckserverLicense.readserverLicense.updateserverLicense.deletesession.createsession.readsession.updatesession.deletesession.locksharedLink.createsharedLink.readsharedLink.updatesharedLink.deletestack.createstack.readstack.updatestack.deletesync.streamsyncCheckpoint.readsyncCheckpoint.updatesyncCheckpoint.deletesystemConfig.readsystemConfig.updatesystemMetadata.readsystemMetadata.updatetag.createtag.readtag.updatetag.deletetag.assetuser.readuser.updateuserLicense.createuserLicense.readuserLicense.updateuserLicense.deleteuserOnboarding.readuserOnboarding.updateuserOnboarding.deleteuserPreference.readuserPreference.updateuserProfileImage.createuserProfileImage.readuserProfileImage.updateuserProfileImage.deletequeue.readqueue.updatequeueJob.createqueueJob.readqueueJob.updatequeueJob.deleteworkflow.createworkflow.readworkflow.updateworkflow.deleteadminUser.createadminUser.readadminUser.updateadminUser.deleteadminSession.readadminAuth.unlinkAllList of permissions
{
"name": "string",
"permissions": [
"all"
]
}AssetBulkDeleteDto
objectforcebooleanForce delete even if in use
idsArray<string>requiredIDs to process
{
"force": true,
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}AssetBulkUpdateDto
objectdateTimeOriginalstringOriginal date and time
dateTimeRelativeinteger[-9007199254740991, 9007199254740991]Relative time offset in minutes
descriptionstringAsset description
duplicateIdstring | nullDuplicate ID
idsArray<string>requiredAsset IDs to update
isFavoritebooleanMark as favorite
latitudenumber[-90, 90]Latitude coordinate
longitudenumber[-180, 180]Longitude coordinate
ratinginteger | null[-1, 5]Rating in range [1-5] (starred), -1 (rejected), or null (unrated)
timeZonestringTime zone (IANA timezone)
visibilityAssetVisibilityarchivetimelinehiddenlockedAsset visibility
{
"dateTimeOriginal": "string",
"dateTimeRelative": -9007199254740991,
"description": "string",
"duplicateId": "string",
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"isFavorite": true,
"latitude": -90,
"longitude": -180,
"rating": -1,
"timeZone": "string",
"visibility": "archive"
}AssetBulkUploadCheckDto
objectassetsArray<AssetBulkUploadCheckItem>requiredAssets to check
{
"assets": [
{
"checksum": "string",
"id": "string"
}
]
}AssetBulkUploadCheckItem
objectchecksumstringrequiredBase64 or hex encoded SHA1 hash
idstringrequiredClient-side identifier echoed in the response to match results to inputs (e.g. filename)
{
"checksum": "string",
"id": "string"
}AssetBulkUploadCheckResponseDto
objectresultsArray<AssetBulkUploadCheckResult>requiredUpload check results
{
"results": [
{
"action": "accept",
"assetId": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isTrashed": true,
"reason": "duplicate"
}
]
}AssetBulkUploadCheckResult
objectactionAssetUploadActionacceptrejectrequiredUpload action
assetIdstringExisting asset ID if duplicate
idstring<uuid>requiredAsset ID
isTrashedbooleanWhether existing asset is trashed
reasonAssetRejectReasonduplicateunsupported-formatRejection reason if rejected
{
"action": "accept",
"assetId": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isTrashed": true,
"reason": "duplicate"
}AssetCopyDto
objectalbumsbooleantrueCopy album associations
favoritebooleantrueCopy favorite status
sharedLinksbooleantrueCopy shared links
sidecarbooleantrueCopy sidecar file
sourceIdstring<uuid>requiredSource asset ID
stackbooleantrueCopy stack association
targetIdstring<uuid>requiredTarget asset ID
{
"albums": true,
"favorite": true,
"sharedLinks": true,
"sidecar": true,
"sourceId": "550e8400-e29b-41d4-a716-446655440000",
"stack": true,
"targetId": "550e8400-e29b-41d4-a716-446655440000"
}AssetEditActionItemDto
objectactionAssetEditActioncroprotatemirrorrequiredType of edit action to perform
parametersCropParameters | RotateParameters | MirrorParametersrequiredList of edit actions to apply (crop, rotate, or mirror)
{
"action": "crop",
"parameters": {
"height": 1,
"width": 1,
"x": 0,
"y": 0
}
}AssetEditActionItemResponseDto
objectactionAssetEditActioncroprotatemirrorrequiredType of edit action to perform
idstring<uuid>requiredAsset edit ID
parametersCropParameters | RotateParameters | MirrorParametersrequiredList of edit actions to apply (crop, rotate, or mirror)
{
"action": "crop",
"id": "550e8400-e29b-41d4-a716-446655440000",
"parameters": {
"height": 1,
"width": 1,
"x": 0,
"y": 0
}
}AssetEditsCreateDto
objecteditsArray<AssetEditActionItemDto>requiredList of edit actions to apply (crop, rotate, or mirror)
{
"edits": [
{
"action": "crop",
"parameters": {
"height": 1,
"width": 1,
"x": 0,
"y": 0
}
}
]
}AssetEditsResponseDto
objectassetIdstring<uuid>requiredAsset ID these edits belong to
editsArray<AssetEditActionItemResponseDto>requiredList of edit actions applied to the asset
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"edits": [
{
"action": "crop",
"id": "550e8400-e29b-41d4-a716-446655440000",
"parameters": {
"height": 1,
"width": 1,
"x": 0,
"y": 0
}
}
]
}AssetFaceCreateDto
objectassetIdstring<uuid>requiredAsset ID
heightinteger[-9007199254740991, 9007199254740991]requiredFace bounding box height
imageHeightinteger[-9007199254740991, 9007199254740991]requiredImage height in pixels
imageWidthinteger[-9007199254740991, 9007199254740991]requiredImage width in pixels
personIdstring<uuid>requiredPerson ID
widthinteger[-9007199254740991, 9007199254740991]requiredFace bounding box width
xinteger[-9007199254740991, 9007199254740991]requiredFace bounding box X coordinate
yinteger[-9007199254740991, 9007199254740991]requiredFace bounding box Y coordinate
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"height": -9007199254740991,
"imageHeight": -9007199254740991,
"imageWidth": -9007199254740991,
"personId": "550e8400-e29b-41d4-a716-446655440000",
"width": -9007199254740991,
"x": -9007199254740991,
"y": -9007199254740991
}AssetFaceDeleteDto
objectforcebooleanrequiredForce delete even if person has other faces
{
"force": true
}AssetFaceResponseDto
objectAsset face with person
boundingBoxX1integer[-9007199254740991, 9007199254740991]requiredBounding box X1 coordinate
boundingBoxX2integer[-9007199254740991, 9007199254740991]requiredBounding box X2 coordinate
boundingBoxY1integer[-9007199254740991, 9007199254740991]requiredBounding box Y1 coordinate
boundingBoxY2integer[-9007199254740991, 9007199254740991]requiredBounding box Y2 coordinate
idstring<uuid>requiredFace ID
imageHeightinteger[0, 9007199254740991]requiredImage height in pixels
imageWidthinteger[0, 9007199254740991]requiredImage width in pixels
personPersonResponseDto | nullrequiredsourceTypeSourceTypemachine-learningexifmanualFace detection source type
{
"boundingBoxX1": -9007199254740991,
"boundingBoxX2": -9007199254740991,
"boundingBoxY1": -9007199254740991,
"boundingBoxY2": -9007199254740991,
"id": "550e8400-e29b-41d4-a716-446655440000",
"imageHeight": 0,
"imageWidth": 0,
"person": {
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
},
"sourceType": "machine-learning"
}AssetFaceUpdateDto
objectdataArray<AssetFaceUpdateItem>requiredFace update items
{
"data": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"personId": "550e8400-e29b-41d4-a716-446655440000"
}
]
}AssetFaceUpdateItem
objectassetIdstring<uuid>requiredAsset ID
personIdstring<uuid>requiredPerson ID
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"personId": "550e8400-e29b-41d4-a716-446655440000"
}AssetIdErrorReason
stringError reason if failed
"duplicate"AssetIdsDto
objectassetIdsArray<string>requiredAsset IDs
{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}AssetIdsResponseDto
objectassetIdstring<uuid>requiredAsset ID
errorAssetIdErrorReasonduplicateno_permissionnot_foundError reason if failed
successbooleanrequiredWhether operation succeeded
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"error": "duplicate",
"success": true
}AssetJobName
stringJob name
"refresh-faces"AssetJobsDto
objectassetIdsArray<string>requiredAsset IDs
nameAssetJobNamerefresh-facesrefresh-metadataregenerate-thumbnailtranscode-videorequiredJob name
{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"name": "refresh-faces"
}AssetMediaCreateDto
objectassetDatastring<binary>requiredAsset file data
durationinteger[0, 9007199254740991]Duration in milliseconds (for videos)
fileCreatedAtstring<date-time>requiredFile creation date
fileModifiedAtstring<date-time>requiredFile modification date
filenamestringFilename
isFavoritebooleanMark as favorite
livePhotoVideoIdstring<uuid>Live photo video ID
metadataArray<AssetMetadataUpsertItemDto>Asset metadata items
sidecarDatastring<binary>Sidecar file data
visibilityAssetVisibilityarchivetimelinehiddenlockedAsset visibility
{
"assetData": "<binary>",
"duration": 0,
"fileCreatedAt": "2024-01-01T00:00:00.000Z",
"fileModifiedAt": "2024-01-01T00:00:00.000Z",
"filename": "string",
"isFavorite": true,
"livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
"metadata": [
{
"key": "string",
"value": {}
}
],
"sidecarData": "<binary>",
"visibility": "archive"
}AssetMediaResponseDto
objectidstring<uuid>requiredAsset media ID
statusAssetMediaStatuscreatedduplicaterequiredUpload status
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "created"
}AssetMediaSize
stringAsset media size
"original"AssetMetadataBulkDeleteDto
objectitemsArray<AssetMetadataBulkDeleteItemDto>requiredMetadata items to delete
{
"items": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string"
}
]
}AssetMetadataBulkDeleteItemDto
objectassetIdstring<uuid>requiredAsset ID
keystringrequiredMetadata key
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string"
}AssetMetadataBulkResponseDto
objectassetIdstring<uuid>requiredAsset ID
keystringrequiredMetadata key
updatedAtstring<date-time>requiredLast update date
valueobjectrequiredMetadata value (object)
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string",
"updatedAt": "2024-01-01T00:00:00.000Z",
"value": {}
}AssetMetadataBulkUpsertDto
objectitemsArray<AssetMetadataBulkUpsertItemDto>requiredMetadata items to upsert
{
"items": [
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string",
"value": {}
}
]
}AssetMetadataBulkUpsertItemDto
objectassetIdstring<uuid>requiredAsset ID
keystringrequiredMetadata key
valueobjectrequiredMetadata value (object)
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string",
"value": {}
}AssetMetadataResponseDto
objectkeystringrequiredMetadata key
updatedAtstring<date-time>requiredLast update date
valueobjectrequiredMetadata value (object)
{
"key": "string",
"updatedAt": "2024-01-01T00:00:00.000Z",
"value": {}
}AssetMetadataUpsertDto
objectitemsArray<AssetMetadataUpsertItemDto>requiredMetadata items to upsert
{
"items": [
{
"key": "string",
"value": {}
}
]
}AssetMetadataUpsertItemDto
objectkeystringrequiredMetadata key
valueobjectrequiredMetadata value (object)
{
"key": "string",
"value": {}
}AssetOcrResponseDto
objectassetIdstring<uuid>requiredboxScorenumber<double>requiredConfidence score for text detection box
idstring<uuid>requiredtextstringrequiredRecognized text
textScorenumber<double>requiredConfidence score for text recognition
x1number<double>requiredNormalized x coordinate of box corner 1 (0-1)
x2number<double>requiredNormalized x coordinate of box corner 2 (0-1)
x3number<double>requiredNormalized x coordinate of box corner 3 (0-1)
x4number<double>requiredNormalized x coordinate of box corner 4 (0-1)
y1number<double>requiredNormalized y coordinate of box corner 1 (0-1)
y2number<double>requiredNormalized y coordinate of box corner 2 (0-1)
y3number<double>requiredNormalized y coordinate of box corner 3 (0-1)
y4number<double>requiredNormalized y coordinate of box corner 4 (0-1)
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"boxScore": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"text": "string",
"textScore": 0,
"x1": 0,
"x2": 0,
"x3": 0,
"x4": 0,
"y1": 0,
"y2": 0,
"y3": 0,
"y4": 0
}AssetRejectReason
stringRejection reason if rejected
"duplicate"AssetResponseDto
objectchecksumstringrequiredBase64 encoded SHA1 hash
createdAtstring<date-time>requiredThe UTC timestamp when the asset was originally uploaded to Immich.
duplicateIdstring<uuid> | nullDuplicate group ID
durationinteger | null[0, 2147483647]requiredVideo/gif duration in milliseconds (null for static images)
exifInfoExifResponseDtoEXIF response
fileCreatedAtstring<date-time>requiredThe actual UTC timestamp when the file was created/captured, preserving timezone information. This is the authoritative timestamp for chronological sorting within timeline groups. Combined with timezone data, this can be used to determine the exact moment the photo was taken.
fileModifiedAtstring<date-time>requiredThe UTC timestamp when the file was last modified on the filesystem. This reflects the last time the physical file was changed, which may be different from when the photo was originally taken.
hasMetadatabooleanrequiredWhether asset has metadata
heightinteger | null[0, 9007199254740991]requiredAsset height
idstring<uuid>requiredAsset ID
isArchivedbooleanrequiredIs archived
isEditedbooleanrequiredIs edited
isFavoritebooleanrequiredIs favorite
isOfflinebooleanrequiredIs offline
isTrashedbooleanrequiredIs trashed
libraryIdstring<uuid> | nullLibrary ID
livePhotoVideoIdstring | nullLive photo video ID
localDateTimestring<date-time>requiredThe local date and time when the photo/video was taken, derived from EXIF metadata. This represents the photographer's local time regardless of timezone, stored as a timezone-agnostic timestamp. Used for timeline grouping by "local" days and months.
originalFileNamestringrequiredOriginal file name
originalMimeTypestringOriginal MIME type
originalPathstringrequiredOriginal file path
ownerUserResponseDtoownerIdstring<uuid>requiredOwner user ID
peopleArray<PersonResponseDto>resizedbooleanIs resized
stackAssetStackResponseDto | nulltagsArray<TagResponseDto>thumbhashstring | nullrequiredThumbhash for thumbnail generation (base64) also used as the c query param for thumbnail cache busting.
typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERrequiredAsset type
updatedAtstring<date-time>requiredThe UTC timestamp when the asset record was last updated in the database. This is automatically maintained by the database and reflects when any field in the asset was last modified.
visibilityAssetVisibilityarchivetimelinehiddenlockedrequiredAsset visibility
widthinteger | null[0, 9007199254740991]requiredAsset width
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}AssetStackResponseDto
objectassetCountinteger[0, 9007199254740991]requiredNumber of assets in stack
idstring<uuid>requiredStack ID
primaryAssetIdstring<uuid>requiredPrimary asset ID
{
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}AssetStatsResponseDto
objectimagesinteger[-9007199254740991, 9007199254740991]requiredNumber of images
totalinteger[-9007199254740991, 9007199254740991]requiredTotal number of assets
videosinteger[-9007199254740991, 9007199254740991]requiredNumber of videos
{
"images": -9007199254740991,
"total": -9007199254740991,
"videos": -9007199254740991
}AuthStatusResponseDto
objectexpiresAtstringSession expiration date
isElevatedbooleanrequiredIs elevated session
passwordbooleanrequiredHas password set
pinCodebooleanrequiredHas PIN code set
pinExpiresAtstringPIN expiration date
{
"expiresAt": "string",
"isElevated": true,
"password": true,
"pinCode": true,
"pinExpiresAt": "string"
}AvatarUpdate
objectcolorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberUser avatar color
{
"color": "primary"
}BulkIdErrorReason
stringError reason
"duplicate"BulkIdResponseDto
objecterrorBulkIdErrorReasonduplicateno_permissionnot_foundunknownvalidationError reason
errorMessagestringidstring<uuid>requiredID
successbooleanrequiredWhether operation succeeded
{
"error": "duplicate",
"errorMessage": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"success": true
}BulkIdsDto
objectidsArray<string>requiredIDs to process
{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}CLIPConfig
objectenabledbooleanrequiredWhether the task is enabled
modelNamestringrequiredName of the model to use
{
"enabled": true,
"modelName": "string"
}CalendarHeatmapResponseDto
objectfromstringrequiredStart date in UTC
seriesArray<object>requiredtostringrequiredEnd date in UTC
totalCountinteger[0, 9007199254740991]requiredTotal activity count over the period
{
"from": "2024-01-01",
"series": [
{
"count": 0,
"date": "2024-01-01"
}
],
"to": "2024-12-31",
"totalCount": 0
}CastResponse
objectgCastEnabledbooleanrequiredWhether Google Cast is enabled
{
"gCastEnabled": true
}ChangePasswordDto
objectinvalidateSessionsbooleanfalseInvalidate all other sessions
newPasswordstringrequiredNew password (min 8 characters)
passwordstringrequiredCurrent password
{
"invalidateSessions": false,
"newPassword": "password",
"password": "password"
}ContributorCountResponseDto
objectassetCountinteger[0, 9007199254740991]requiredNumber of assets contributed
userIdstring<uuid>requiredUser ID
{
"assetCount": 0,
"userId": "550e8400-e29b-41d4-a716-446655440000"
}CreateAlbumDto
objectalbumNamestringrequiredAlbum name
albumUsersArray<AlbumUserCreateDto>Album users
assetIdsArray<string>Initial asset IDs
descriptionstringAlbum description
{
"albumName": "string",
"albumUsers": [
{
"role": "editor",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
],
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"description": "string"
}CreateLibraryDto
objectexclusionPatternsArray<string>Exclusion patterns (max 128)
importPathsArray<string>Import paths (max 128)
namestringLibrary name
ownerIdstring<uuid>requiredOwner user ID
{
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
],
"name": "string",
"ownerId": "550e8400-e29b-41d4-a716-446655440000"
}CreateProfileImageDto
objectfilestring<binary>requiredProfile image file
{
"file": "<binary>"
}CreateProfileImageResponseDto
objectprofileChangedAtstring<date-time>requiredProfile image change date
profileImagePathstringrequiredProfile image file path
userIdstring<uuid>requiredUser ID
{
"profileChangedAt": "2024-01-01T00:00:00.000Z",
"profileImagePath": "string",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}CropParameters
objectheightinteger[1, 9007199254740991]requiredHeight of the crop
widthinteger[1, 9007199254740991]requiredWidth of the crop
xinteger[0, 9007199254740991]requiredTop-Left X coordinate of crop
yinteger[0, 9007199254740991]requiredTop-Left Y coordinate of crop
{
"height": 1,
"width": 1,
"x": 0,
"y": 0
}DatabaseBackupConfig
objectcronExpressionstringrequiredCron expression
enabledbooleanrequiredEnabled
keepLastAmountinteger[1, 9007199254740991]requiredKeep last amount
{
"cronExpression": "string",
"enabled": true,
"keepLastAmount": 1
}DatabaseBackupDeleteDto
objectbackupsArray<string>requiredBackup filenames to delete
{
"backups": [
"string"
]
}DatabaseBackupDto
objectfilenamestringrequiredBackup filename
filesizeinteger[-9007199254740991, 9007199254740991]requiredBackup file size
timezonestringrequiredBackup timezone
{
"filename": "string",
"filesize": -9007199254740991,
"timezone": "string"
}DatabaseBackupListResponseDto
objectbackupsArray<DatabaseBackupDto>requiredList of backups
{
"backups": [
{
"filename": "string",
"filesize": -9007199254740991,
"timezone": "string"
}
]
}DownloadArchiveDto
objectassetIdsArray<string>requiredAsset IDs
editedbooleanDownload edited asset if available
{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"edited": true
}DownloadArchiveInfo
objectassetIdsArray<string>requiredAsset IDs in this archive
sizeinteger[-9007199254740991, 9007199254740991]requiredArchive size in bytes
{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"size": -9007199254740991
}DownloadInfoDto
objectalbumIdstring<uuid>Album ID to download
archiveSizeinteger[1, 9007199254740991]Archive size limit in bytes
assetIdsArray<string>Asset IDs to download
userIdstring<uuid>User ID to download assets from
{
"albumId": "550e8400-e29b-41d4-a716-446655440000",
"archiveSize": 1,
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"userId": "550e8400-e29b-41d4-a716-446655440000"
}DownloadResponse
objectarchiveSizeinteger[-9007199254740991, 9007199254740991]requiredMaximum archive size in bytes
includeEmbeddedVideosbooleanrequiredWhether to include embedded videos in downloads
{
"archiveSize": -9007199254740991,
"includeEmbeddedVideos": true
}DownloadResponseDto
objectarchivesArray<DownloadArchiveInfo>requiredArchive information
totalSizeinteger[-9007199254740991, 9007199254740991]requiredTotal size in bytes
{
"archives": [
{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"size": -9007199254740991
}
],
"totalSize": -9007199254740991
}DownloadUpdate
objectarchiveSizeinteger[1, 9007199254740991]Maximum archive size in bytes
includeEmbeddedVideosbooleanWhether to include embedded videos in downloads
{
"archiveSize": 1,
"includeEmbeddedVideos": true
}DuplicateDetectionConfig
objectenabledbooleanrequiredWhether the task is enabled
maxDistancenumber<double>[0.001, 0.1]requiredMaximum distance threshold for duplicate detection
{
"enabled": true,
"maxDistance": 0.001
}DuplicateResolveDto
objectgroupsArray<DuplicateResolveGroupDto>requiredList of duplicate groups to resolve
{
"groups": [
{
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"keepAssetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"trashAssetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
]
}DuplicateResolveGroupDto
objectduplicateIdstring<uuid>requiredkeepAssetIdsArray<string>requiredAsset IDs to keep
trashAssetIdsArray<string>requiredAsset IDs to trash or delete
{
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"keepAssetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"trashAssetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}DuplicateResponseDto
objectassetsArray<AssetResponseDto>requiredDuplicate assets
duplicateIdstring<uuid>requiredDuplicate group ID
suggestedKeepAssetIdsArray<string>requiredSuggested asset IDs to keep based on file size and EXIF data
{
"assets": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"suggestedKeepAssetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}EmailNotificationsResponse
objectalbumInvitebooleanrequiredWhether to receive email notifications for album invites
albumUpdatebooleanrequiredWhether to receive email notifications for album updates
enabledbooleanrequiredWhether email notifications are enabled
{
"albumInvite": true,
"albumUpdate": true,
"enabled": true
}EmailNotificationsUpdate
objectalbumInvitebooleanWhether to receive email notifications for album invites
albumUpdatebooleanWhether to receive email notifications for album updates
enabledbooleanWhether email notifications are enabled
{
"albumInvite": true,
"albumUpdate": true,
"enabled": true
}ExifResponseDto
objectEXIF response
citystring | nullnullCity name
countrystring | nullnullCountry name
dateTimeOriginalstring<date-time> | nullnullOriginal date/time
descriptionstring | nullnullImage description
exifImageHeightinteger | null[0, 9007199254740991]nullImage height in pixels
exifImageWidthinteger | null[0, 9007199254740991]nullImage width in pixels
exposureTimestring | nullnullExposure time
fNumbernumber | nullnullF-number (aperture)
fileSizeInByteinteger | null[0, 9007199254740991]nullFile size in bytes
focalLengthnumber | nullnullFocal length in mm
isointeger | null[-9007199254740991, 9007199254740991]nullISO sensitivity
latitudenumber | nullnullGPS latitude
lensModelstring | nullnullLens model
longitudenumber | nullnullGPS longitude
makestring | nullnullCamera make
modelstring | nullnullCamera model
modifyDatestring<date-time> | nullnullModification date/time
orientationstring | nullnullImage orientation
projectionTypestring | nullnullProjection type
ratinginteger | null[1, 5]nullRating
statestring | nullnullState/province name
timeZonestring | nullnullTime zone
{
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
}FacialRecognitionConfig
objectenabledbooleanrequiredWhether the task is enabled
maxDistancenumber<double>[0.1, 2]requiredMaximum distance threshold for face recognition
minFacesinteger[1, 9007199254740991]requiredMinimum number of faces required for recognition
minScorenumber<double>[0.1, 1]requiredMinimum confidence score for face detection
modelNamestringrequiredName of the model to use
{
"enabled": true,
"maxDistance": 0.1,
"minFaces": 1,
"minScore": 0.1,
"modelName": "string"
}FoldersResponse
objectenabledbooleanrequiredWhether folders are enabled
sidebarWebbooleanrequiredWhether folders appear in web sidebar
{
"enabled": true,
"sidebarWeb": true
}FoldersUpdate
objectenabledbooleanWhether folders are enabled
sidebarWebbooleanWhether folders appear in web sidebar
{
"enabled": true,
"sidebarWeb": true
}IntegrityReport
stringIntegrity report type
"untracked_file"IntegrityReportResponseDto
objectitemsArray<object>requirednextCursorstring{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"path": "string",
"type": "untracked_file"
}
],
"nextCursor": "string"
}IntegrityReportSummaryResponseDto
objectchecksum_mismatchinteger[0, 9007199254740991]requiredmissing_fileinteger[0, 9007199254740991]requireduntracked_fileinteger[0, 9007199254740991]required{
"checksum_mismatch": 0,
"missing_file": 0,
"untracked_file": 0
}JobCreateDto
objectnameManualJobNameperson-cleanuptag-cleanupuser-cleanupmemory-cleanupmemory-createbackup-databaseintegrity-missing-filesintegrity-untracked-filesintegrity-checksum-mismatchintegrity-missing-files-refreshintegrity-untracked-files-refreshintegrity-checksum-mismatch-refreshintegrity-missing-files-delete-allintegrity-untracked-files-delete-allintegrity-checksum-mismatch-delete-allrequiredManual job name
{
"name": "person-cleanup"
}JobName
stringJob name
"AssetDelete"JobSettingsDto
objectconcurrencyinteger[1, 9007199254740991]requiredConcurrency
{
"concurrency": 1
}LibraryResponseDto
objectassetCountinteger[-9007199254740991, 9007199254740991]requiredNumber of assets
createdAtstring<date-time>requiredCreation date
exclusionPatternsArray<string>requiredExclusion patterns
idstring<uuid>requiredLibrary ID
importPathsArray<string>requiredImport paths
namestringrequiredLibrary name
ownerIdstring<uuid>requiredOwner user ID
refreshedAtstring<date-time> | nullrequiredLast refresh date
updatedAtstring<date-time>requiredLast update date
{
"assetCount": -9007199254740991,
"createdAt": "2024-01-01T00:00:00.000Z",
"exclusionPatterns": [
"string"
],
"id": "550e8400-e29b-41d4-a716-446655440000",
"importPaths": [
"string"
],
"name": "string",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"refreshedAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
}LibraryStatsResponseDto
objectphotosinteger[-9007199254740991, 9007199254740991]requiredNumber of photos
totalinteger[-9007199254740991, 9007199254740991]requiredTotal number of assets
usageinteger[-9007199254740991, 9007199254740991]requiredStorage usage in bytes
videosinteger[-9007199254740991, 9007199254740991]requiredNumber of videos
{
"photos": -9007199254740991,
"total": -9007199254740991,
"usage": -9007199254740991,
"videos": -9007199254740991
}LicenseKeyDto
objectactivationKeystringrequiredActivation key
licenseKeystringrequiredLicense key (format: /^IM(SV|CL)(-[\dA-Za-z]{4}){8}$/)
{
"activationKey": "string",
"licenseKey": "string"
}LicenseResponseDto
objectactivatedAtstring<date-time>requiredActivation date
activationKeystringrequiredActivation key
licenseKeystringrequiredLicense key (format: /^IM(SV|CL)(-[\dA-Za-z]{4}){8}$/)
{
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
}LoginCredentialDto
objectemailstring<email>requiredUser email
passwordstringrequiredUser password
{
"email": "testuser@email.com",
"password": "password"
}LoginResponseDto
objectaccessTokenstringrequiredAccess token
isAdminbooleanrequiredIs admin user
isOnboardedbooleanrequiredIs onboarded
namestringrequiredUser name
profileImagePathstringrequiredProfile image path
shouldChangePasswordbooleanrequiredShould change password
userEmailstring<email>requiredUser email
userIdstring<uuid>requiredUser ID
{
"accessToken": "string",
"isAdmin": true,
"isOnboarded": true,
"name": "string",
"profileImagePath": "string",
"shouldChangePassword": true,
"userEmail": "user@example.com",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}LogoutResponseDto
objectredirectUristringrequiredRedirect URI
successfulbooleanrequiredLogout successful
{
"redirectUri": "string",
"successful": true
}MachineLearningAvailabilityChecksDto
objectenabledbooleanrequiredEnabled
intervalinteger[-9007199254740991, 9007199254740991]requiredtimeoutinteger[-9007199254740991, 9007199254740991]required{
"enabled": true,
"interval": -9007199254740991,
"timeout": -9007199254740991
}MaintenanceAction
stringMaintenance action
"start"MaintenanceDetectInstallResponseDto
objectstorageArray<MaintenanceDetectInstallStorageFolderDto>required{
"storage": [
{
"files": -9007199254740991,
"folder": "encoded-video",
"readable": true,
"writable": true
}
]
}MaintenanceDetectInstallStorageFolderDto
objectfilesinteger[-9007199254740991, 9007199254740991]requiredNumber of files in the folder
folderStorageFolderencoded-videolibraryuploadprofilethumbsbackupsrequiredStorage folder
readablebooleanrequiredWhether the folder is readable
writablebooleanrequiredWhether the folder is writable
{
"files": -9007199254740991,
"folder": "encoded-video",
"readable": true,
"writable": true
}MaintenanceStatusResponseDto
objectactionMaintenanceActionstartendselect_database_restorerestore_databaserequiredMaintenance action
activebooleanrequirederrorstringprogressinteger[-9007199254740991, 9007199254740991]taskstring{
"action": "start",
"active": true,
"error": "string",
"progress": -9007199254740991,
"task": "string"
}ManualJobName
stringManual job name
"person-cleanup"MapMarkerResponseDto
objectcitystring | nullrequiredCity name
countrystring | nullrequiredCountry name
idstring<uuid>requiredAsset ID
latnumber<double>requiredLatitude
lonnumber<double>requiredLongitude
statestring | nullrequiredState/Province name
{
"city": "string",
"country": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"lat": 0,
"lon": 0,
"state": "string"
}MapReverseGeocodeResponseDto
objectcitystring | nullrequiredCity name
countrystring | nullrequiredCountry name
statestring | nullrequiredState/Province name
{
"city": "string",
"country": "string",
"state": "string"
}MemoriesResponse
objectdurationinteger[-9007199254740991, 9007199254740991]requiredMemory duration in seconds
enabledbooleanrequiredWhether memories are enabled
{
"duration": -9007199254740991,
"enabled": true
}MemoriesUpdate
objectdurationinteger[1, 9007199254740991]Memory duration in seconds
enabledbooleanWhether memories are enabled
{
"duration": 1,
"enabled": true
}MemoryCreateDto
objectassetIdsArray<string>Asset IDs to associate with memory
dataOnThisDayDtorequiredhideAtstring<date-time>Date when memory should be hidden
isSavedbooleanIs memory saved
memoryAtstring<date-time>requiredMemory date
seenAtstring<date-time>Date when memory was seen
showAtstring<date-time>Date when memory should be shown
typeMemoryTypeon_this_dayrequiredMemory type
{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"data": {
"year": 1000
},
"hideAt": "2024-01-01T00:00:00.000Z",
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"seenAt": "2024-01-01T00:00:00.000Z",
"showAt": "2024-01-01T00:00:00.000Z",
"type": "on_this_day"
}MemoryResponseDto
objectassetsArray<AssetResponseDto>requiredcreatedAtstring<date-time>requiredCreation date
dataOnThisDayDtorequireddeletedAtstring<date-time>Deletion date
hideAtstring<date-time>Date when memory should be hidden
idstring<uuid>requiredMemory ID
isSavedbooleanrequiredIs memory saved
memoryAtstring<date-time>requiredMemory date
ownerIdstring<uuid>requiredOwner user ID
seenAtstring<date-time>Date when memory was seen
showAtstring<date-time>Date when memory should be shown
typeMemoryTypeon_this_dayrequiredMemory type
updatedAtstring<date-time>requiredLast update date
{
"assets": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"createdAt": "2024-01-01T00:00:00.000Z",
"data": {
"year": 1000
},
"deletedAt": "2024-01-01T00:00:00.000Z",
"hideAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"seenAt": "2024-01-01T00:00:00.000Z",
"showAt": "2024-01-01T00:00:00.000Z",
"type": "on_this_day",
"updatedAt": "2024-01-01T00:00:00.000Z"
}MemoryStatisticsResponseDto
objecttotalinteger[-9007199254740991, 9007199254740991]requiredTotal number of memories
{
"total": -9007199254740991
}MemoryUpdateDto
objectisSavedbooleanIs memory saved
memoryAtstring<date-time>Memory date
seenAtstring<date-time>Date when memory was seen
{
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"seenAt": "2024-01-01T00:00:00.000Z"
}MergePersonDto
objectidsArray<string>requiredPerson IDs to merge
{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}MetadataSearchDto
objectalbumIdsArray<string>Filter by album IDs
checksumstringFilter by file checksum
citystring | nullFilter by city name
countrystring | nullFilter by country name
createdAfterstring<date-time>Filter by creation date (after)
createdBeforestring<date-time>Filter by creation date (before)
descriptionstringFilter by description text
encodedVideoPathstringFilter by encoded video file path
idstring<uuid>Filter by asset ID
isEncodedbooleanFilter by encoded status
isFavoritebooleanFilter by favorite status
isMotionbooleanFilter by motion photo status
isNotInAlbumbooleanFilter assets not in any album
isOfflinebooleanFilter by offline status
lensModelstring | nullFilter by lens model
libraryIdstring<uuid> | nullLibrary ID to filter by
makestring | nullFilter by camera make
modelstring | nullFilter by camera model
ocrstringFilter by OCR text content
orderAssetOrderascdescdescAsset sort order
originalFileNamestringFilter by original file name
originalPathstringFilter by original file path
pageinteger[1, 9007199254740991]Page number
personIdsArray<string>Filter by person IDs
previewPathstringFilter by preview file path
ratinginteger | null[1, 5]Filter by rating [1-5], or null for unrated
sizeinteger[1, 1000]Number of results to return
statestring | nullFilter by state/province name
tagIdsArray<string> | nullFilter by tag IDs
takenAfterstring<date-time>Filter by taken date (after)
takenBeforestring<date-time>Filter by taken date (before)
thumbnailPathstringFilter by thumbnail file path
trashedAfterstring<date-time>Filter by trash date (after)
trashedBeforestring<date-time>Filter by trash date (before)
typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERAsset type
updatedAfterstring<date-time>Filter by update date (after)
updatedBeforestring<date-time>Filter by update date (before)
visibilityAssetVisibilityarchivetimelinehiddenlockedAsset visibility
withDeletedbooleanInclude deleted assets
withExifbooleanInclude EXIF data in response
withPeoplebooleanInclude people data in response
withStackedbooleanInclude stacked assets
{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"checksum": "string",
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"description": "string",
"encodedVideoPath": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"order": "desc",
"originalFileName": "string",
"originalPath": "string",
"page": 1,
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"previewPath": "string",
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"thumbnailPath": "string",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": true,
"withExif": true,
"withPeople": true,
"withStacked": true
}MirrorParameters
objectaxisMirrorAxishorizontalverticalrequiredAxis to mirror along
{
"axis": "horizontal"
}NotificationCreateDto
objectdataobjectAdditional notification data
descriptionstring | nullNotification description
levelNotificationLevelsuccesserrorwarninginfoNotification level
readAtstring<date-time> | nullDate when notification was read
titlestringrequiredNotification title
typeNotificationTypeJobFailedBackupFailedSystemMessageAlbumInviteAlbumUpdateCustomNotification type
userIdstring<uuid>requiredUser ID to send notification to
{
"data": {},
"description": "string",
"level": "success",
"readAt": "2024-01-01T00:00:00.000Z",
"title": "string",
"type": "JobFailed",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}NotificationDeleteAllDto
objectidsArray<string>requiredNotification IDs to delete
{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
]
}NotificationDto
objectcreatedAtstring<date-time>requiredCreation date
dataobjectAdditional notification data
descriptionstringNotification description
idstring<uuid>requiredNotification ID
levelNotificationLevelsuccesserrorwarninginforequiredNotification level
readAtstring<date-time>Date when notification was read
titlestringrequiredNotification title
typeNotificationTypeJobFailedBackupFailedSystemMessageAlbumInviteAlbumUpdateCustomrequiredNotification type
{
"createdAt": "2024-01-01T00:00:00.000Z",
"data": {},
"description": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"level": "success",
"readAt": "2024-01-01T00:00:00.000Z",
"title": "string",
"type": "JobFailed"
}NotificationType
stringNotification type
"JobFailed"NotificationUpdateAllDto
objectidsArray<string>requiredNotification IDs to update
readAtstring<date-time> | nullDate when notifications were read
{
"ids": [
"550e8400-e29b-41d4-a716-446655440000"
],
"readAt": "2024-01-01T00:00:00.000Z"
}NotificationUpdateDto
objectreadAtstring<date-time> | nullDate when notification was read
{
"readAt": "2024-01-01T00:00:00.000Z"
}OAuthBackchannelLogoutDto
objectlogout_tokenstringrequiredOAuth logout token
{
"logout_token": "string"
}OAuthCallbackDto
objectcodeVerifierstringOAuth code verifier (PKCE)
statestringOAuth state parameter
urlstringrequiredOAuth callback URL
{
"codeVerifier": "string",
"state": "string",
"url": "string"
}OAuthConfigDto
objectcodeChallengestringOAuth code challenge (PKCE)
redirectUristringrequiredOAuth redirect URI
statestringOAuth state parameter
{
"codeChallenge": "string",
"redirectUri": "string",
"state": "string"
}OAuthTokenEndpointAuthMethod
stringOAuth token endpoint auth method
"client_secret_post"OcrConfig
objectenabledbooleanrequiredWhether the task is enabled
maxResolutioninteger[1, 9007199254740991]requiredMaximum resolution for OCR processing
minDetectionScorenumber<double>[0.1, 1]requiredMinimum confidence score for text detection
minRecognitionScorenumber<double>[0.1, 1]requiredMinimum confidence score for text recognition
modelNamestringrequiredName of the model to use
{
"enabled": true,
"maxResolution": 1,
"minDetectionScore": 0.1,
"minRecognitionScore": 0.1,
"modelName": "string"
}OnThisDayDto
objectyearinteger[1000, 9999]requiredYear for on this day memory
{
"year": 1000
}OnboardingResponseDto
objectisOnboardedbooleanrequiredIs user onboarded
{
"isOnboarded": true
}PartnerCreateDto
objectsharedWithIdstring<uuid>requiredUser ID to share with
{
"sharedWithId": "550e8400-e29b-41d4-a716-446655440000"
}PartnerResponseDto
objectPartner response
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequiredUser avatar color
emailstring<email>requiredUser email
idstring<uuid>requiredUser ID
inTimelinebooleanShow in timeline
namestringrequiredUser name
profileChangedAtstring<date-time>requiredProfile change date
profileImagePathstringrequiredProfile image path
{
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"inTimeline": true,
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}PartnerUpdateDto
objectinTimelinebooleanrequiredShow partner assets in timeline
{
"inTimeline": true
}PeopleResponse
objectenabledbooleanrequiredWhether people are enabled
minimumFacesinteger[1, 9007199254740991]People face threshold
sidebarWebbooleanrequiredWhether people appear in web sidebar
{
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
}PeopleResponseDto
objectPeople response
hasNextPagebooleanWhether there are more pages
hiddeninteger[0, 9007199254740991]requiredNumber of hidden people
peopleArray<PersonResponseDto>requiredtotalinteger[0, 9007199254740991]requiredTotal number of people
{
"hasNextPage": true,
"hidden": 0,
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"total": 0
}PeopleUpdate
objectenabledbooleanWhether people are enabled
minimumFacesinteger[1, 9007199254740991]People face threshold
sidebarWebbooleanWhether people appear in web sidebar
{
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
}PeopleUpdateDto
objectpeopleArray<PeopleUpdateItem>requiredPeople to update
{
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string"
}
]
}PeopleUpdateItem
objectbirthDatestring<date> | nullPerson date of birth
colorstring | nullPerson color (hex)
featureFaceAssetIdstring<uuid>Asset ID used for feature face thumbnail
idstring<uuid>requiredPerson ID
isFavoritebooleanMark as favorite
isHiddenbooleanPerson visibility (hidden)
namestringPerson name
{
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string"
}Permission
stringList of permissions
"all"PersonCreateDto
objectbirthDatestring<date> | nullPerson date of birth
colorstring | nullPerson color (hex)
isFavoritebooleanMark as favorite
isHiddenbooleanPerson visibility (hidden)
namestringPerson name
{
"birthDate": "2024-01-15",
"color": "string",
"isFavorite": true,
"isHidden": true,
"name": "string"
}PersonResponseDto
objectbirthDatestring<date> | nullrequiredPerson date of birth
colorstringPerson color (hex)
idstring<uuid>requiredPerson ID
isFavoritebooleanIs favorite
isHiddenbooleanrequiredIs hidden
namestringrequiredPerson name
thumbnailPathstringrequiredThumbnail path
updatedAtstring<date-time>Last update date
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}PersonStatisticsResponseDto
objectassetsinteger[-9007199254740991, 9007199254740991]requiredNumber of assets
{
"assets": -9007199254740991
}PersonUpdateDto
objectbirthDatestring<date> | nullPerson date of birth
colorstring | nullPerson color (hex)
featureFaceAssetIdstring<uuid>Asset ID used for feature face thumbnail
isFavoritebooleanMark as favorite
isHiddenbooleanPerson visibility (hidden)
namestringPerson name
{
"birthDate": "2024-01-15",
"color": "string",
"featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string"
}PinCodeChangeDto
objectnewPinCodestringrequiredNew PIN code (4-6 digits)
passwordstringUser password (required if PIN code is not provided)
pinCodestringNew PIN code (4-6 digits)
{
"newPinCode": "string",
"password": "password",
"pinCode": "123456"
}PinCodeResetDto
objectpasswordstringUser password (required if PIN code is not provided)
pinCodestringNew PIN code (4-6 digits)
{
"password": "password",
"pinCode": "123456"
}PlacesResponseDto
objectadmin1namestringAdministrative level 1 name (state/province)
admin2namestringAdministrative level 2 name (county/district)
latitudenumberrequiredLatitude coordinate
longitudenumberrequiredLongitude coordinate
namestringrequiredPlace name
{
"admin1name": "string",
"admin2name": "string",
"latitude": 0,
"longitude": 0,
"name": "string"
}PluginMethodResponseDto
objectdescriptionstringrequiredDescription
hostFunctionsbooleanrequiredkeystringrequiredKey
namestringrequiredName
schemaobjecttitlestringrequiredTitle
typesArray<WorkflowType>AssetV1requiredWorkflow types
uiHintsArray<string>requiredUi hints
{
"description": "string",
"hostFunctions": true,
"key": "string",
"name": "string",
"schema": {},
"title": "string",
"types": [
"AssetV1"
],
"uiHints": [
"string"
]
}PluginResponseDto
objectauthorstringrequiredPlugin author
createdAtstringrequiredCreation date
descriptionstringrequiredPlugin description
idstring<uuid>requiredPlugin ID
methodsArray<PluginMethodResponseDto>requiredPlugin methods
namestringrequiredPlugin name
titlestringrequiredPlugin title
updatedAtstringrequiredLast update date
versionstringrequiredPlugin version
{
"author": "string",
"createdAt": "string",
"description": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"methods": [
{
"description": "string",
"hostFunctions": true,
"key": "string",
"name": "string",
"schema": {},
"title": "string",
"types": [
"AssetV1"
],
"uiHints": [
"string"
]
}
],
"name": "string",
"title": "string",
"updatedAt": "string",
"version": "string"
}PluginTemplateResponseDto
objectdescriptionstringrequiredTemplate description
keystringrequiredTemplate key (unique across all templates)
stepsArray<PluginTemplateStepResponseDto>requiredWorkflow steps
titlestringrequiredTemplate title
triggerWorkflowTriggerAssetCreateAssetMetadataExtractionrequiredPlugin trigger type
uiHintsArray<string>requiredUi hints, for example "smart-album"
{
"description": "string",
"key": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"title": "string",
"trigger": "AssetCreate",
"uiHints": [
"string"
]
}PluginTemplateStepResponseDto
objectconfigobject | nullrequiredStep configuration
enabledbooleanWhether the step is enabled
methodstringrequiredStep plugin method
{
"config": {},
"enabled": true,
"method": "string"
}PurchaseResponse
objecthideBuyButtonUntilstringrequiredDate until which to hide buy button
showSupportBadgebooleanrequiredWhether to show support badge
{
"hideBuyButtonUntil": "string",
"showSupportBadge": true
}PurchaseUpdate
objecthideBuyButtonUntilstringDate until which to hide buy button
showSupportBadgebooleanWhether to show support badge
{
"hideBuyButtonUntil": "string",
"showSupportBadge": true
}QueueCommand
stringQueue command to execute
"start"QueueCommandDto
objectcommandQueueCommandstartpauseresumeemptyclear-failedrequiredQueue command to execute
forcebooleanForce the command execution (if applicable)
{
"command": "start",
"force": true
}QueueDeleteDto
objectfailedbooleanIf true, will also remove failed jobs from the queue.
{
"failed": true
}QueueJobResponseDto
objectdataobjectrequiredJob data payload
idstringJob ID
nameJobNameAssetDeleteAssetDeleteCheckAssetDetectFacesQueueAllAssetDetectFacesAssetDetectDuplicatesQueueAllAssetDetectDuplicatesAssetEditThumbnailGenerationAssetEncodeVideoQueueAllAssetEncodeVideoAssetEmptyTrashAssetExtractMetadataQueueAllAssetExtractMetadataAssetFileMigrationAssetGenerateThumbnailsQueueAllAssetGenerateThumbnailsAuditTableCleanupDatabaseBackupFacialRecognitionQueueAllFacialRecognitionFileDeleteFileMigrationQueueAllLibraryDeleteCheckLibraryDeleteLibraryRemoveAssetLibraryScanAssetsQueueAllLibrarySyncAssetsLibrarySyncFilesQueueAllLibrarySyncFilesLibraryScanQueueAllHlsSessionCleanupMemoryCleanupMemoryGenerateNotificationsCleanupNotifyUserSignupNotifyAlbumInviteNotifyAlbumUpdateUserDeleteUserDeleteCheckUserSyncUsagePersonCleanupPersonFileMigrationPersonGenerateThumbnailSessionCleanupSendMailSidecarQueueAllSidecarCheckSidecarWriteSmartSearchQueueAllSmartSearchStorageTemplateMigrationStorageTemplateMigrationSingleTagCleanupVersionCheckOcrQueueAllOcrWorkflowAssetTriggerIntegrityUntrackedFilesQueueAllIntegrityUntrackedFilesIntegrityUntrackedRefreshIntegrityMissingFilesQueueAllIntegrityMissingFilesIntegrityMissingFilesRefreshIntegrityChecksumFilesIntegrityChecksumFilesRefreshIntegrityDeleteReportTypeIntegrityDeleteReportsrequiredJob name
timestampinteger[-9007199254740991, 9007199254740991]requiredJob creation timestamp
{
"data": {},
"id": "string",
"name": "AssetDelete",
"timestamp": -9007199254740991
}QueueJobStatus
stringQueue job status
"active"QueueName
stringQueue name
"thumbnailGeneration"QueueResponseDto
objectisPausedbooleanrequiredWhether the queue is paused
nameQueueNamethumbnailGenerationmetadataExtractionvideoConversionfaceDetectionfacialRecognitionsmartSearchduplicateDetectionbackgroundTaskstorageTemplateMigrationmigrationsearchsidecarlibrarynotificationsbackupDatabaseocrworkflowintegrityCheckeditorrequiredQueue name
statisticsQueueStatisticsDtorequired{
"isPaused": true,
"name": "thumbnailGeneration",
"statistics": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
}
}QueueResponseLegacyDto
objectjobCountsQueueStatisticsDtorequiredqueueStatusQueueStatusLegacyDtorequired{
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
}QueueStatisticsDto
objectactiveinteger[-9007199254740991, 9007199254740991]requiredNumber of active jobs
completedinteger[-9007199254740991, 9007199254740991]requiredNumber of completed jobs
delayedinteger[-9007199254740991, 9007199254740991]requiredNumber of delayed jobs
failedinteger[-9007199254740991, 9007199254740991]requiredNumber of failed jobs
pausedinteger[-9007199254740991, 9007199254740991]requiredNumber of paused jobs
waitinginteger[-9007199254740991, 9007199254740991]requiredNumber of waiting jobs
{
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
}QueueStatusLegacyDto
objectisActivebooleanrequiredWhether the queue is currently active (has running jobs)
isPausedbooleanrequiredWhether the queue is paused
{
"isActive": true,
"isPaused": true
}QueuesResponseLegacyDto
objectbackgroundTaskQueueResponseLegacyDtorequiredbackupDatabaseQueueResponseLegacyDtorequiredduplicateDetectionQueueResponseLegacyDtorequirededitorQueueResponseLegacyDtorequiredfaceDetectionQueueResponseLegacyDtorequiredfacialRecognitionQueueResponseLegacyDtorequiredintegrityCheckQueueResponseLegacyDtorequiredlibraryQueueResponseLegacyDtorequiredmetadataExtractionQueueResponseLegacyDtorequiredmigrationQueueResponseLegacyDtorequirednotificationsQueueResponseLegacyDtorequiredocrQueueResponseLegacyDtorequiredsearchQueueResponseLegacyDtorequiredsidecarQueueResponseLegacyDtorequiredsmartSearchQueueResponseLegacyDtorequiredstorageTemplateMigrationQueueResponseLegacyDtorequiredthumbnailGenerationQueueResponseLegacyDtorequiredvideoConversionQueueResponseLegacyDtorequiredworkflowQueueResponseLegacyDtorequired{
"backgroundTask": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"backupDatabase": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"duplicateDetection": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"editor": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"faceDetection": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"facialRecognition": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"integrityCheck": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"library": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"metadataExtraction": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"migration": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"notifications": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"ocr": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"search": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"sidecar": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"smartSearch": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"storageTemplateMigration": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"thumbnailGeneration": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"videoConversion": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
},
"workflow": {
"jobCounts": {
"active": -9007199254740991,
"completed": -9007199254740991,
"delayed": -9007199254740991,
"failed": -9007199254740991,
"paused": -9007199254740991,
"waiting": -9007199254740991
},
"queueStatus": {
"isActive": true,
"isPaused": true
}
}
}RandomSearchDto
objectalbumIdsArray<string>Filter by album IDs
citystring | nullFilter by city name
countrystring | nullFilter by country name
createdAfterstring<date-time>Filter by creation date (after)
createdBeforestring<date-time>Filter by creation date (before)
isEncodedbooleanFilter by encoded status
isFavoritebooleanFilter by favorite status
isMotionbooleanFilter by motion photo status
isNotInAlbumbooleanFilter assets not in any album
isOfflinebooleanFilter by offline status
lensModelstring | nullFilter by lens model
libraryIdstring<uuid> | nullLibrary ID to filter by
makestring | nullFilter by camera make
modelstring | nullFilter by camera model
ocrstringFilter by OCR text content
personIdsArray<string>Filter by person IDs
ratinginteger | null[1, 5]Filter by rating [1-5], or null for unrated
sizeinteger[1, 1000]Number of results to return
statestring | nullFilter by state/province name
tagIdsArray<string> | nullFilter by tag IDs
takenAfterstring<date-time>Filter by taken date (after)
takenBeforestring<date-time>Filter by taken date (before)
trashedAfterstring<date-time>Filter by trash date (after)
trashedBeforestring<date-time>Filter by trash date (before)
typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERAsset type
updatedAfterstring<date-time>Filter by update date (after)
updatedBeforestring<date-time>Filter by update date (before)
visibilityAssetVisibilityarchivetimelinehiddenlockedAsset visibility
withDeletedbooleanInclude deleted assets
withExifbooleanInclude EXIF data in response
withPeoplebooleanInclude people data in response
withStackedbooleanInclude stacked assets
{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": true,
"withExif": true,
"withPeople": true,
"withStacked": true
}ReleaseEventV1
objectcheckedAtstringrequiredWhen the server last checked for a latest version. As an ISO timestamp
isAvailablebooleanrequiredWhether a new version is available
releaseVersionServerVersionResponseDtorequiredserverVersionServerVersionResponseDtorequiredtypeReleaseType | nullmajorpremajorminorpreminorpatchprepatchprereleaserequiredRelease type
{
"checkedAt": "string",
"isAvailable": true,
"releaseVersion": {
"major": 0,
"minor": 0,
"patch": 0,
"prerelease": 0
},
"serverVersion": {
"major": 0,
"minor": 0,
"patch": 0,
"prerelease": 0
},
"type": "major"
}ReverseGeocodingStateResponseDto
objectlastImportFileNamestring | nullrequiredLast import file name
lastUpdatestring | nullrequiredLast update timestamp
{
"lastImportFileName": "string",
"lastUpdate": "string"
}SearchAlbumResponseDto
objectcountinteger[0, 9007199254740991]requiredNumber of albums in this page
facetsArray<SearchFacetResponseDto>requireditemsArray<AlbumResponseDto>requiredtotalinteger[0, 9007199254740991]requiredTotal number of matching albums
{
"count": 0,
"facets": [
{
"counts": [
{
"count": 0,
"value": "string"
}
],
"fieldName": "string"
}
],
"items": [
{
"albumName": "string",
"albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
"albumUsers": [
{
"role": "editor",
"user": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}
}
],
"assetCount": 0,
"contributorCounts": [
{
"assetCount": 0,
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
],
"createdAt": "2024-01-15T09:30:00Z",
"description": "string",
"endDate": "2024-01-15T09:30:00Z",
"hasSharedLink": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isActivityEnabled": true,
"lastModifiedAssetTimestamp": "2024-01-15T09:30:00Z",
"order": "asc",
"shared": true,
"startDate": "2024-01-15T09:30:00Z",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"total": 0
}SearchAssetResponseDto
objectcountinteger[0, 9007199254740991]requiredNumber of assets in this page
facetsArray<SearchFacetResponseDto>requireditemsArray<AssetResponseDto>requirednextPagestring | nullrequiredNext page token
totalinteger[0, 9007199254740991]requiredTotal number of matching assets
{
"count": 0,
"facets": [
{
"counts": [
{
"count": 0,
"value": "string"
}
],
"fieldName": "string"
}
],
"items": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"nextPage": "string",
"total": 0
}SearchExploreItem
objectdataAssetResponseDtorequiredvaluestringrequiredExplore value
{
"data": {
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
},
"value": "string"
}SearchExploreResponseDto
objectfieldNamestringrequiredExplore field name
itemsArray<SearchExploreItem>required{
"fieldName": "string",
"items": [
{
"data": {
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
},
"value": "string"
}
]
}SearchFacetCountResponseDto
objectcountinteger[0, 9007199254740991]requiredNumber of assets with this facet value
valuestringrequiredFacet value
{
"count": 0,
"value": "string"
}SearchFacetResponseDto
objectcountsArray<SearchFacetCountResponseDto>requiredfieldNamestringrequiredFacet field name
{
"counts": [
{
"count": 0,
"value": "string"
}
],
"fieldName": "string"
}SearchResponseDto
objectalbumsSearchAlbumResponseDtorequiredassetsSearchAssetResponseDtorequired{
"albums": {
"count": 0,
"facets": [
{
"counts": [
{
"count": 0,
"value": "string"
}
],
"fieldName": "string"
}
],
"items": [
{
"albumName": "string",
"albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
"albumUsers": [
{
"role": "editor",
"user": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}
}
],
"assetCount": 0,
"contributorCounts": [
{
"assetCount": 0,
"userId": "550e8400-e29b-41d4-a716-446655440000"
}
],
"createdAt": "2024-01-15T09:30:00Z",
"description": "string",
"endDate": "2024-01-15T09:30:00Z",
"hasSharedLink": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isActivityEnabled": true,
"lastModifiedAssetTimestamp": "2024-01-15T09:30:00Z",
"order": "asc",
"shared": true,
"startDate": "2024-01-15T09:30:00Z",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"total": 0
},
"assets": {
"count": 0,
"facets": [
{
"counts": [
{
"count": 0,
"value": "string"
}
],
"fieldName": "string"
}
],
"items": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"nextPage": "string",
"total": 0
}
}SearchStatisticsResponseDto
objecttotalinteger[-9007199254740991, 9007199254740991]requiredTotal number of matching assets
{
"total": -9007199254740991
}SearchSuggestionType
stringSuggestion type
"country"ServerAboutResponseDto
objectbuildstringBuild identifier
buildImagestringBuild image name
buildImageUrlstringBuild image URL
buildUrlstringBuild URL
exiftoolstringExifTool version
ffmpegstringFFmpeg version
imagemagickstringImageMagick version
libvipsstringlibvips version
licensedbooleanrequiredWhether the server is licensed
nodejsstringNode.js version
repositorystringRepository name
repositoryUrlstringRepository URL
sourceCommitstringSource commit hash
sourceRefstringSource reference (branch/tag)
sourceUrlstringSource URL
thirdPartyBugFeatureUrlstringThird-party bug/feature URL
thirdPartyDocumentationUrlstringThird-party documentation URL
thirdPartySourceUrlstringThird-party source URL
thirdPartySupportUrlstringThird-party support URL
versionstringrequiredServer version
versionUrlstringrequiredURL to version information
{
"build": "string",
"buildImage": "string",
"buildImageUrl": "string",
"buildUrl": "string",
"exiftool": "string",
"ffmpeg": "string",
"imagemagick": "string",
"libvips": "string",
"licensed": true,
"nodejs": "string",
"repository": "string",
"repositoryUrl": "string",
"sourceCommit": "string",
"sourceRef": "string",
"sourceUrl": "string",
"thirdPartyBugFeatureUrl": "string",
"thirdPartyDocumentationUrl": "string",
"thirdPartySourceUrl": "string",
"thirdPartySupportUrl": "string",
"version": "string",
"versionUrl": "string"
}ServerApkLinksDto
objectarm64v8astringrequiredAPK download link for ARM64 v8a architecture
armeabiv7astringrequiredAPK download link for ARM EABI v7a architecture
universalstringrequiredAPK download link for universal architecture
x86_64stringrequiredAPK download link for x86_64 architecture
{
"arm64v8a": "string",
"armeabiv7a": "string",
"universal": "string",
"x86_64": "string"
}ServerConfigDto
objectexternalDomainstringrequiredExternal domain URL
isInitializedbooleanrequiredWhether the server has been initialized
isOnboardedbooleanrequiredWhether the admin has completed onboarding
loginPageMessagestringrequiredLogin page message
maintenanceModebooleanrequiredWhether maintenance mode is active
mapDarkStyleUrlstringrequiredMap dark style URL
mapLightStyleUrlstringrequiredMap light style URL
minFacesinteger[-9007199254740991, 9007199254740991]requiredPeople min faces server default
oauthButtonTextstringrequiredOAuth button text
publicUsersbooleanrequiredWhether public user registration is enabled
trashDaysinteger[-9007199254740991, 9007199254740991]requiredNumber of days before trashed assets are permanently deleted
userDeleteDelayinteger[-9007199254740991, 9007199254740991]requiredDelay in days before deleted users are permanently removed
{
"externalDomain": "string",
"isInitialized": true,
"isOnboarded": true,
"loginPageMessage": "string",
"maintenanceMode": true,
"mapDarkStyleUrl": "string",
"mapLightStyleUrl": "string",
"minFaces": -9007199254740991,
"oauthButtonText": "string",
"publicUsers": true,
"trashDays": -9007199254740991,
"userDeleteDelay": -9007199254740991
}ServerFeaturesDto
objectconfigFilebooleanrequiredWhether config file is available
duplicateDetectionbooleanrequiredWhether duplicate detection is enabled
emailbooleanrequiredWhether email notifications are enabled
facialRecognitionbooleanrequiredWhether facial recognition is enabled
importFacesbooleanrequiredWhether face import is enabled
mapbooleanrequiredWhether map feature is enabled
oauthbooleanrequiredWhether OAuth is enabled
oauthAutoLaunchbooleanrequiredWhether OAuth auto-launch is enabled
ocrbooleanrequiredWhether OCR is enabled
passwordLoginbooleanrequiredWhether password login is enabled
realtimeTranscodingbooleanrequiredWhether real-time transcoding is enabled
reverseGeocodingbooleanrequiredWhether reverse geocoding is enabled
searchbooleanrequiredWhether search is enabled
sidecarbooleanrequiredWhether sidecar files are supported
smartSearchbooleanrequiredWhether smart search is enabled
trashbooleanrequiredWhether trash feature is enabled
{
"configFile": true,
"duplicateDetection": true,
"email": true,
"facialRecognition": true,
"importFaces": true,
"map": true,
"oauth": true,
"oauthAutoLaunch": true,
"ocr": true,
"passwordLogin": true,
"realtimeTranscoding": true,
"reverseGeocoding": true,
"search": true,
"sidecar": true,
"smartSearch": true,
"trash": true
}ServerMediaTypesResponseDto
objectimageArray<string>requiredSupported image MIME types
sidecarArray<string>requiredSupported sidecar MIME types
videoArray<string>requiredSupported video MIME types
{
"image": [
"string"
],
"sidecar": [
"string"
],
"video": [
"string"
]
}ServerStatsResponseDto
objectphotosinteger[-9007199254740991, 9007199254740991]requiredTotal number of photos
usageinteger[-9007199254740991, 9007199254740991]requiredTotal storage usage in bytes
usageByUserArray<UsageByUserDto>requiredArray of usage for each user
usagePhotosinteger[-9007199254740991, 9007199254740991]requiredStorage usage for photos in bytes
usageVideosinteger[-9007199254740991, 9007199254740991]requiredStorage usage for videos in bytes
videosinteger[-9007199254740991, 9007199254740991]requiredTotal number of videos
{
"photos": -9007199254740991,
"usage": -9007199254740991,
"usageByUser": [
{
"photos": -9007199254740991,
"quotaSizeInBytes": -9007199254740991,
"usage": -9007199254740991,
"usagePhotos": -9007199254740991,
"usageVideos": -9007199254740991,
"userId": "550e8400-e29b-41d4-a716-446655440000",
"userName": "string",
"videos": -9007199254740991
}
],
"usagePhotos": -9007199254740991,
"usageVideos": -9007199254740991,
"videos": -9007199254740991
}ServerStorageResponseDto
objectdiskAvailablestringrequiredAvailable disk space (human-readable format)
diskAvailableRawinteger[-9007199254740991, 9007199254740991]requiredAvailable disk space in bytes
diskSizestringrequiredTotal disk size (human-readable format)
diskSizeRawinteger[-9007199254740991, 9007199254740991]requiredTotal disk size in bytes
diskUsagePercentagenumber<double>requiredDisk usage percentage (0-100)
diskUsestringrequiredUsed disk space (human-readable format)
diskUseRawinteger[-9007199254740991, 9007199254740991]requiredUsed disk space in bytes
{
"diskAvailable": "string",
"diskAvailableRaw": -9007199254740991,
"diskSize": "string",
"diskSizeRaw": -9007199254740991,
"diskUsagePercentage": 0,
"diskUse": "string",
"diskUseRaw": -9007199254740991
}ServerVersionHistoryResponseDto
objectcreatedAtstring<date-time>requiredWhen this version was first seen
idstring<uuid>requiredVersion history entry ID
versionstringrequiredVersion string
{
"createdAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"version": "string"
}ServerVersionResponseDto
objectmajorinteger[0, 9007199254740991]requiredMajor version number
minorinteger[0, 9007199254740991]requiredMinor version number
patchinteger[0, 9007199254740991]requiredPatch version number
prereleaseinteger | null[0, 9007199254740991]requiredPre-release version number
{
"major": 0,
"minor": 0,
"patch": 0,
"prerelease": 0
}SessionCreateDto
objectdeviceOSstringDevice OS
deviceTypestringDevice type
durationinteger[1, 9007199254740991]Session duration in seconds
{
"deviceOS": "string",
"deviceType": "string",
"duration": 1
}SessionCreateResponseDto
objectappVersionstring | nullrequiredApp version
createdAtstringrequiredCreation date
currentbooleanrequiredIs current session
deviceOSstringrequiredDevice OS
deviceTypestringrequiredDevice type
expiresAtstringExpiration date
idstring<uuid>requiredSession ID
isPendingSyncResetbooleanrequiredIs pending sync reset
tokenstringrequiredSession token
updatedAtstringrequiredLast update date
{
"appVersion": "string",
"createdAt": "string",
"current": true,
"deviceOS": "string",
"deviceType": "string",
"expiresAt": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isPendingSyncReset": true,
"token": "string",
"updatedAt": "string"
}SessionResponseDto
objectappVersionstring | nullrequiredApp version
createdAtstringrequiredCreation date
currentbooleanrequiredIs current session
deviceOSstringrequiredDevice OS
deviceTypestringrequiredDevice type
expiresAtstringExpiration date
idstring<uuid>requiredSession ID
isPendingSyncResetbooleanrequiredIs pending sync reset
updatedAtstringrequiredLast update date
{
"appVersion": "string",
"createdAt": "string",
"current": true,
"deviceOS": "string",
"deviceType": "string",
"expiresAt": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isPendingSyncReset": true,
"updatedAt": "string"
}SessionUnlockDto
objectpasswordstringUser password (required if PIN code is not provided)
pinCodestringNew PIN code (4-6 digits)
{
"password": "password",
"pinCode": "123456"
}SessionUpdateDto
objectisPendingSyncResetbooleanReset pending sync state
{
"isPendingSyncReset": true
}SetMaintenanceModeDto
objectactionMaintenanceActionstartendselect_database_restorerestore_databaserequiredMaintenance action
restoreBackupFilenamestringRestore backup filename
{
"action": "start",
"restoreBackupFilename": "string"
}SignUpDto
objectemailstring<email>requiredUser email
namestringrequiredUser name
passwordstringrequiredUser password
{
"email": "testuser@email.com",
"name": "Admin",
"password": "password"
}SmartSearchDto
objectalbumIdsArray<string>Filter by album IDs
citystring | nullFilter by city name
countrystring | nullFilter by country name
createdAfterstring<date-time>Filter by creation date (after)
createdBeforestring<date-time>Filter by creation date (before)
isEncodedbooleanFilter by encoded status
isFavoritebooleanFilter by favorite status
isMotionbooleanFilter by motion photo status
isNotInAlbumbooleanFilter assets not in any album
isOfflinebooleanFilter by offline status
languagestringSearch language code
lensModelstring | nullFilter by lens model
libraryIdstring<uuid> | nullLibrary ID to filter by
makestring | nullFilter by camera make
modelstring | nullFilter by camera model
ocrstringFilter by OCR text content
pageinteger[1, 9007199254740991]Page number
personIdsArray<string>Filter by person IDs
querystringNatural language search query
queryAssetIdstring<uuid>Asset ID to use as search reference
ratinginteger | null[1, 5]Filter by rating [1-5], or null for unrated
sizeinteger[1, 1000]Number of results to return
statestring | nullFilter by state/province name
tagIdsArray<string> | nullFilter by tag IDs
takenAfterstring<date-time>Filter by taken date (after)
takenBeforestring<date-time>Filter by taken date (before)
trashedAfterstring<date-time>Filter by trash date (after)
trashedBeforestring<date-time>Filter by trash date (before)
typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERAsset type
updatedAfterstring<date-time>Filter by update date (after)
updatedBeforestring<date-time>Filter by update date (before)
visibilityAssetVisibilityarchivetimelinehiddenlockedAsset visibility
withDeletedbooleanInclude deleted assets
withExifbooleanInclude EXIF data in response
{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"language": "string",
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"page": 1,
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"query": "string",
"queryAssetId": "550e8400-e29b-41d4-a716-446655440000",
"rating": 1,
"size": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive",
"withDeleted": true,
"withExif": true
}SourceType
stringFace detection source type
"machine-learning"StackCreateDto
objectassetIdsArray<string>requiredAsset IDs (first becomes primary, min 2)
{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}StackResponseDto
objectStack response
assetsArray<AssetResponseDto>requiredidstring<uuid>requiredStack ID
primaryAssetIdstring<uuid>requiredPrimary asset ID
{
"assets": [
{
"checksum": "string",
"createdAt": "2024-01-15T09:30:00Z",
"duplicateId": "550e8400-e29b-41d4-a716-446655440000",
"duration": 0,
"exifInfo": {
"city": null,
"country": null,
"dateTimeOriginal": null,
"description": null,
"exifImageHeight": null,
"exifImageWidth": null,
"exposureTime": null,
"fNumber": null,
"fileSizeInByte": null,
"focalLength": null,
"iso": null,
"latitude": null,
"lensModel": null,
"longitude": null,
"make": null,
"model": null,
"modifyDate": null,
"orientation": null,
"projectionType": null,
"rating": null,
"state": null,
"timeZone": null
},
"fileCreatedAt": "2024-01-15T09:30:00Z",
"fileModifiedAt": "2024-01-15T09:30:00Z",
"hasMetadata": true,
"height": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isArchived": true,
"isEdited": true,
"isFavorite": true,
"isOffline": true,
"isTrashed": true,
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-15T09:30:00Z",
"originalFileName": "string",
"originalMimeType": "string",
"originalPath": "string",
"owner": {
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
},
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"people": [
{
"birthDate": "2024-01-15",
"color": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"thumbnailPath": "string",
"updatedAt": "2024-01-15T09:30:00Z"
}
],
"resized": true,
"stack": {
"assetCount": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
},
"tags": [
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}
],
"thumbhash": "string",
"type": "IMAGE",
"updatedAt": "2024-01-15T09:30:00Z",
"visibility": "archive",
"width": 0
}
],
"id": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}StackUpdateDto
objectprimaryAssetIdstring<uuid>Primary asset ID
{
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}StatisticsSearchDto
objectalbumIdsArray<string>Filter by album IDs
citystring | nullFilter by city name
countrystring | nullFilter by country name
createdAfterstring<date-time>Filter by creation date (after)
createdBeforestring<date-time>Filter by creation date (before)
descriptionstringFilter by description text
isEncodedbooleanFilter by encoded status
isFavoritebooleanFilter by favorite status
isMotionbooleanFilter by motion photo status
isNotInAlbumbooleanFilter assets not in any album
isOfflinebooleanFilter by offline status
lensModelstring | nullFilter by lens model
libraryIdstring<uuid> | nullLibrary ID to filter by
makestring | nullFilter by camera make
modelstring | nullFilter by camera model
ocrstringFilter by OCR text content
personIdsArray<string>Filter by person IDs
ratinginteger | null[1, 5]Filter by rating [1-5], or null for unrated
statestring | nullFilter by state/province name
tagIdsArray<string> | nullFilter by tag IDs
takenAfterstring<date-time>Filter by taken date (after)
takenBeforestring<date-time>Filter by taken date (before)
trashedAfterstring<date-time>Filter by trash date (after)
trashedBeforestring<date-time>Filter by trash date (before)
typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERAsset type
updatedAfterstring<date-time>Filter by update date (after)
updatedBeforestring<date-time>Filter by update date (before)
visibilityAssetVisibilityarchivetimelinehiddenlockedAsset visibility
{
"albumIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"city": "string",
"country": "string",
"createdAfter": "2024-01-01T00:00:00.000Z",
"createdBefore": "2024-01-01T00:00:00.000Z",
"description": "string",
"isEncoded": true,
"isFavorite": true,
"isMotion": true,
"isNotInAlbum": true,
"isOffline": true,
"lensModel": "string",
"libraryId": "550e8400-e29b-41d4-a716-446655440000",
"make": "string",
"model": "string",
"ocr": "string",
"personIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"rating": 1,
"state": "string",
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"takenAfter": "2024-01-01T00:00:00.000Z",
"takenBefore": "2024-01-01T00:00:00.000Z",
"trashedAfter": "2024-01-01T00:00:00.000Z",
"trashedBefore": "2024-01-01T00:00:00.000Z",
"type": "IMAGE",
"updatedAfter": "2024-01-01T00:00:00.000Z",
"updatedBefore": "2024-01-01T00:00:00.000Z",
"visibility": "archive"
}StorageFolder
stringStorage folder
"encoded-video"SyncAckDeleteDto
objecttypesArray<SyncEntityType>AuthUserV1UserV1UserDeleteV1AssetV1AssetV2AssetDeleteV1AssetExifV1AssetEditV1AssetEditDeleteV1AssetMetadataV1AssetMetadataDeleteV1AssetOcrV1AssetOcrDeleteV1PartnerV1PartnerDeleteV1PartnerAssetV1PartnerAssetV2PartnerAssetBackfillV1PartnerAssetBackfillV2PartnerAssetDeleteV1PartnerAssetExifV1PartnerAssetExifBackfillV1PartnerStackBackfillV1PartnerStackDeleteV1PartnerStackV1AlbumV1AlbumV2AlbumDeleteV1AlbumUserV1AlbumUserBackfillV1AlbumUserDeleteV1AlbumAssetCreateV1AlbumAssetCreateV2AlbumAssetUpdateV1AlbumAssetUpdateV2AlbumAssetBackfillV1AlbumAssetBackfillV2AlbumAssetExifCreateV1AlbumAssetExifUpdateV1AlbumAssetExifBackfillV1AlbumToAssetV1AlbumToAssetDeleteV1AlbumToAssetBackfillV1MemoryV1MemoryDeleteV1MemoryToAssetV1MemoryToAssetDeleteV1StackV1StackDeleteV1PersonV1PersonDeleteV1AssetFaceV1AssetFaceV2AssetFaceDeleteV1UserMetadataV1UserMetadataDeleteV1SyncAckV1SyncResetV1SyncCompleteV1Sync entity types to delete acks for
{
"types": [
"AuthUserV1"
]
}SyncAckDto
objectackstringrequiredAcknowledgment ID
typeSyncEntityTypeAuthUserV1UserV1UserDeleteV1AssetV1AssetV2AssetDeleteV1AssetExifV1AssetEditV1AssetEditDeleteV1AssetMetadataV1AssetMetadataDeleteV1AssetOcrV1AssetOcrDeleteV1PartnerV1PartnerDeleteV1PartnerAssetV1PartnerAssetV2PartnerAssetBackfillV1PartnerAssetBackfillV2PartnerAssetDeleteV1PartnerAssetExifV1PartnerAssetExifBackfillV1PartnerStackBackfillV1PartnerStackDeleteV1PartnerStackV1AlbumV1AlbumV2AlbumDeleteV1AlbumUserV1AlbumUserBackfillV1AlbumUserDeleteV1AlbumAssetCreateV1AlbumAssetCreateV2AlbumAssetUpdateV1AlbumAssetUpdateV2AlbumAssetBackfillV1AlbumAssetBackfillV2AlbumAssetExifCreateV1AlbumAssetExifUpdateV1AlbumAssetExifBackfillV1AlbumToAssetV1AlbumToAssetDeleteV1AlbumToAssetBackfillV1MemoryV1MemoryDeleteV1MemoryToAssetV1MemoryToAssetDeleteV1StackV1StackDeleteV1PersonV1PersonDeleteV1AssetFaceV1AssetFaceV2AssetFaceDeleteV1UserMetadataV1UserMetadataDeleteV1SyncAckV1SyncResetV1SyncCompleteV1requiredSync entity type
{
"ack": "string",
"type": "AuthUserV1"
}SyncAckSetDto
objectacksArray<string>requiredAcknowledgment IDs (max 1000)
{
"acks": [
"string"
]
}SyncAlbumDeleteV1
objectalbumIdstring<uuid>requiredAlbum ID
{
"albumId": "550e8400-e29b-41d4-a716-446655440000"
}SyncAlbumToAssetDeleteV1
objectalbumIdstring<uuid>requiredAlbum ID
assetIdstring<uuid>requiredAsset ID
{
"albumId": "550e8400-e29b-41d4-a716-446655440000",
"assetId": "550e8400-e29b-41d4-a716-446655440000"
}SyncAlbumToAssetV1
objectalbumIdstring<uuid>requiredAlbum ID
assetIdstring<uuid>requiredAsset ID
{
"albumId": "550e8400-e29b-41d4-a716-446655440000",
"assetId": "550e8400-e29b-41d4-a716-446655440000"
}SyncAlbumUserDeleteV1
objectalbumIdstring<uuid>requiredAlbum ID
userIdstring<uuid>requiredUser ID
{
"albumId": "550e8400-e29b-41d4-a716-446655440000",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}SyncAlbumUserV1
objectalbumIdstring<uuid>requiredAlbum ID
roleAlbumUserRoleeditorownerviewerrequiredAlbum user role
userIdstring<uuid>requiredUser ID
{
"albumId": "550e8400-e29b-41d4-a716-446655440000",
"role": "editor",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}SyncAlbumV1
objectcreatedAtstring<date-time>requiredCreated at
descriptionstringrequiredAlbum description
idstring<uuid>requiredAlbum ID
isActivityEnabledbooleanrequiredIs activity enabled
namestringrequiredAlbum name
orderAssetOrderascdescrequiredAsset sort order
ownerIdstring<uuid>requiredOwner ID
thumbnailAssetIdstring | nullrequiredThumbnail asset ID
updatedAtstring<date-time>requiredUpdated at
{
"createdAt": "2024-01-01T00:00:00.000Z",
"description": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isActivityEnabled": true,
"name": "string",
"order": "asc",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"thumbnailAssetId": "string",
"updatedAt": "2024-01-01T00:00:00.000Z"
}SyncAlbumV2
objectcreatedAtstring<date-time>requiredCreated at
descriptionstringrequiredAlbum description
idstring<uuid>requiredAlbum ID
isActivityEnabledbooleanrequiredIs activity enabled
namestringrequiredAlbum name
orderAssetOrderascdescrequiredAsset sort order
thumbnailAssetIdstring | nullrequiredThumbnail asset ID
updatedAtstring<date-time>requiredUpdated at
{
"createdAt": "2024-01-01T00:00:00.000Z",
"description": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isActivityEnabled": true,
"name": "string",
"order": "asc",
"thumbnailAssetId": "string",
"updatedAt": "2024-01-01T00:00:00.000Z"
}SyncAssetDeleteV1
objectassetIdstring<uuid>requiredAsset ID
{
"assetId": "550e8400-e29b-41d4-a716-446655440000"
}SyncAssetEditDeleteV1
objecteditIdstring<uuid>requiredEdit ID
{
"editId": "550e8400-e29b-41d4-a716-446655440000"
}SyncAssetEditV1
objectactionAssetEditActioncroprotatemirrorrequiredType of edit action to perform
assetIdstring<uuid>requiredAsset ID
idstring<uuid>requiredEdit ID
parametersobjectrequiredEdit parameters
sequenceinteger[-9007199254740991, 9007199254740991]requiredEdit sequence
{
"action": "crop",
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"id": "550e8400-e29b-41d4-a716-446655440000",
"parameters": {},
"sequence": -9007199254740991
}SyncAssetExifV1
objectassetIdstring<uuid>requiredAsset ID
citystring | nullrequiredCity
countrystring | nullrequiredCountry
dateTimeOriginalstring<date-time> | nullrequiredDate time original
descriptionstring | nullrequiredDescription
exifImageHeightinteger | null[-9007199254740991, 9007199254740991]requiredExif image height
exifImageWidthinteger | null[-9007199254740991, 9007199254740991]requiredExif image width
exposureTimestring | nullrequiredExposure time
fNumbernumber<double> | nullrequiredF number
fileSizeInByteinteger | null[-9007199254740991, 9007199254740991]requiredFile size in byte
focalLengthnumber<double> | nullrequiredFocal length
fpsnumber<double> | nullrequiredFPS
isointeger | null[-9007199254740991, 9007199254740991]requiredISO
latitudenumber<double> | nullrequiredLatitude
lensModelstring | nullrequiredLens model
longitudenumber<double> | nullrequiredLongitude
makestring | nullrequiredMake
modelstring | nullrequiredModel
modifyDatestring<date-time> | nullrequiredModify date
orientationstring | nullrequiredOrientation
profileDescriptionstring | nullrequiredProfile description
projectionTypestring | nullrequiredProjection type
ratinginteger | null[-9007199254740991, 9007199254740991]requiredRating
statestring | nullrequiredState
timeZonestring | nullrequiredTime zone
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"city": "string",
"country": "string",
"dateTimeOriginal": "2024-01-01T00:00:00.000Z",
"description": "string",
"exifImageHeight": -9007199254740991,
"exifImageWidth": -9007199254740991,
"exposureTime": "string",
"fNumber": 0,
"fileSizeInByte": -9007199254740991,
"focalLength": 0,
"fps": 0,
"iso": -9007199254740991,
"latitude": 0,
"lensModel": "string",
"longitude": 0,
"make": "string",
"model": "string",
"modifyDate": "2024-01-01T00:00:00.000Z",
"orientation": "string",
"profileDescription": "string",
"projectionType": "string",
"rating": -9007199254740991,
"state": "string",
"timeZone": "string"
}SyncAssetFaceDeleteV1
objectassetFaceIdstring<uuid>requiredAsset face ID
{
"assetFaceId": "550e8400-e29b-41d4-a716-446655440000"
}SyncAssetFaceV1
objectassetIdstring<uuid>requiredAsset ID
boundingBoxX1integer[-9007199254740991, 9007199254740991]requiredBounding box X1
boundingBoxX2integer[-9007199254740991, 9007199254740991]requiredBounding box X2
boundingBoxY1integer[-9007199254740991, 9007199254740991]requiredBounding box Y1
boundingBoxY2integer[-9007199254740991, 9007199254740991]requiredBounding box Y2
idstring<uuid>requiredAsset face ID
imageHeightinteger[-9007199254740991, 9007199254740991]requiredImage height
imageWidthinteger[-9007199254740991, 9007199254740991]requiredImage width
personIdstring | nullrequiredPerson ID
sourceTypestringrequiredSource type
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"boundingBoxX1": -9007199254740991,
"boundingBoxX2": -9007199254740991,
"boundingBoxY1": -9007199254740991,
"boundingBoxY2": -9007199254740991,
"id": "550e8400-e29b-41d4-a716-446655440000",
"imageHeight": -9007199254740991,
"imageWidth": -9007199254740991,
"personId": "string",
"sourceType": "string"
}SyncAssetFaceV2
objectassetIdstring<uuid>requiredAsset ID
boundingBoxX1integer[-9007199254740991, 9007199254740991]requiredBounding box X1
boundingBoxX2integer[-9007199254740991, 9007199254740991]requiredBounding box X2
boundingBoxY1integer[-9007199254740991, 9007199254740991]requiredBounding box Y1
boundingBoxY2integer[-9007199254740991, 9007199254740991]requiredBounding box Y2
deletedAtstring<date-time> | nullrequiredFace deleted at
idstring<uuid>requiredAsset face ID
imageHeightinteger[-9007199254740991, 9007199254740991]requiredImage height
imageWidthinteger[-9007199254740991, 9007199254740991]requiredImage width
isVisiblebooleanrequiredIs the face visible in the asset
personIdstring | nullrequiredPerson ID
sourceTypestringrequiredSource type
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"boundingBoxX1": -9007199254740991,
"boundingBoxX2": -9007199254740991,
"boundingBoxY1": -9007199254740991,
"boundingBoxY2": -9007199254740991,
"deletedAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"imageHeight": -9007199254740991,
"imageWidth": -9007199254740991,
"isVisible": true,
"personId": "string",
"sourceType": "string"
}SyncAssetMetadataDeleteV1
objectassetIdstring<uuid>requiredAsset ID
keystringrequiredKey
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string"
}SyncAssetMetadataV1
objectassetIdstring<uuid>requiredAsset ID
keystringrequiredKey
valueobjectrequiredValue
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"key": "string",
"value": {}
}SyncAssetOcrDeleteV1
objectassetIdstringrequiredOriginal asset ID of the deleted OCR entry
deletedAtstring<date-time>requiredTimestamp when the OCR entry was deleted
idstringrequiredAudit row ID of the deleted OCR entry
{
"assetId": "string",
"deletedAt": "2024-01-01T00:00:00.000Z",
"id": "string"
}SyncAssetOcrV1
objectassetIdstring<uuid>requiredAsset ID
boxScorenumber<double>requiredConfidence score of the bounding box
idstring<uuid>requiredOCR entry ID
isVisiblebooleanrequiredWhether the OCR entry is visible
textstringrequiredRecognized text content
textScorenumber<double>requiredConfidence score of the recognized text
x1number<double>requiredTop-left X coordinate (normalized 0–1)
x2number<double>requiredTop-right X coordinate (normalized 0–1)
x3number<double>requiredBottom-right X coordinate (normalized 0–1)
x4number<double>requiredBottom-left X coordinate (normalized 0–1)
y1number<double>requiredTop-left Y coordinate (normalized 0–1)
y2number<double>requiredTop-right Y coordinate (normalized 0–1)
y3number<double>requiredBottom-right Y coordinate (normalized 0–1)
y4number<double>requiredBottom-left Y coordinate (normalized 0–1)
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"boxScore": 0,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isVisible": true,
"text": "string",
"textScore": 0,
"x1": 0,
"x2": 0,
"x3": 0,
"x4": 0,
"y1": 0,
"y2": 0,
"y3": 0,
"y4": 0
}SyncAssetV1
objectchecksumstringrequiredChecksum
createdAtstring<date-time> | nullrequiredUploaded to Immich at
deletedAtstring<date-time> | nullrequiredDeleted at
durationstring | nullrequiredDuration
fileCreatedAtstring<date-time> | nullrequiredFile created at
fileModifiedAtstring<date-time> | nullrequiredFile modified at
heightinteger | null[-9007199254740991, 9007199254740991]requiredAsset height
idstring<uuid>requiredAsset ID
isEditedbooleanrequiredIs edited
isFavoritebooleanrequiredIs favorite
libraryIdstring | nullrequiredLibrary ID
livePhotoVideoIdstring | nullrequiredLive photo video ID
localDateTimestring<date-time> | nullrequiredLocal date time
originalFileNamestringrequiredOriginal file name
ownerIdstring<uuid>requiredOwner ID
stackIdstring | nullrequiredStack ID
thumbhashstring | nullrequiredThumbhash
typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERrequiredAsset type
visibilityAssetVisibilityarchivetimelinehiddenlockedrequiredAsset visibility
widthinteger | null[-9007199254740991, 9007199254740991]requiredAsset width
{
"checksum": "string",
"createdAt": "2024-01-01T00:00:00.000Z",
"deletedAt": "2024-01-01T00:00:00.000Z",
"duration": "string",
"fileCreatedAt": "2024-01-01T00:00:00.000Z",
"fileModifiedAt": "2024-01-01T00:00:00.000Z",
"height": -9007199254740991,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isEdited": true,
"isFavorite": true,
"libraryId": "string",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-01T00:00:00.000Z",
"originalFileName": "string",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"stackId": "string",
"thumbhash": "string",
"type": "IMAGE",
"visibility": "archive",
"width": -9007199254740991
}SyncAssetV2
objectchecksumstringrequiredChecksum
createdAtstring<date-time> | nullrequiredUploaded to Immich at
deletedAtstring<date-time> | nullrequiredDeleted at
durationinteger | null[0, 2147483647]requiredDuration
fileCreatedAtstring<date-time> | nullrequiredFile created at
fileModifiedAtstring<date-time> | nullrequiredFile modified at
heightinteger | null[-9007199254740991, 9007199254740991]requiredAsset height
idstring<uuid>requiredAsset ID
isEditedbooleanrequiredIs edited
isFavoritebooleanrequiredIs favorite
libraryIdstring | nullrequiredLibrary ID
livePhotoVideoIdstring | nullrequiredLive photo video ID
localDateTimestring<date-time> | nullrequiredLocal date time
originalFileNamestringrequiredOriginal file name
ownerIdstring<uuid>requiredOwner ID
stackIdstring | nullrequiredStack ID
thumbhashstring | nullrequiredThumbhash
typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERrequiredAsset type
visibilityAssetVisibilityarchivetimelinehiddenlockedrequiredAsset visibility
widthinteger | null[-9007199254740991, 9007199254740991]requiredAsset width
{
"checksum": "string",
"createdAt": "2024-01-01T00:00:00.000Z",
"deletedAt": "2024-01-01T00:00:00.000Z",
"duration": 0,
"fileCreatedAt": "2024-01-01T00:00:00.000Z",
"fileModifiedAt": "2024-01-01T00:00:00.000Z",
"height": -9007199254740991,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isEdited": true,
"isFavorite": true,
"libraryId": "string",
"livePhotoVideoId": "string",
"localDateTime": "2024-01-01T00:00:00.000Z",
"originalFileName": "string",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"stackId": "string",
"thumbhash": "string",
"type": "IMAGE",
"visibility": "archive",
"width": -9007199254740991
}SyncAuthUserV1
objectavatarColorUserAvatarColor | nulldeletedAtstring<date-time> | nullrequiredUser deleted at
emailstringrequiredUser email
hasProfileImagebooleanrequiredUser has profile image
idstring<uuid>requiredUser ID
isAdminbooleanrequiredUser is admin
namestringrequiredUser name
oauthIdstringrequiredUser OAuth ID
pinCodestring | nullrequiredUser pin code
profileChangedAtstring<date-time>requiredUser profile changed at
quotaSizeInBytesinteger | null[-9007199254740991, 9007199254740991]requiredQuota size in bytes
quotaUsageInBytesinteger[-9007199254740991, 9007199254740991]requiredQuota usage in bytes
storageLabelstring | nullrequiredUser storage label
{
"deletedAt": "2024-01-01T00:00:00.000Z",
"email": "string",
"hasProfileImage": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"isAdmin": true,
"name": "string",
"oauthId": "string",
"pinCode": "string",
"profileChangedAt": "2024-01-01T00:00:00.000Z",
"quotaSizeInBytes": -9007199254740991,
"quotaUsageInBytes": -9007199254740991,
"storageLabel": "string"
}SyncEntityType
stringSync entity type
"AuthUserV1"SyncMemoryAssetDeleteV1
objectassetIdstring<uuid>requiredAsset ID
memoryIdstring<uuid>requiredMemory ID
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"memoryId": "550e8400-e29b-41d4-a716-446655440000"
}SyncMemoryAssetV1
objectassetIdstring<uuid>requiredAsset ID
memoryIdstring<uuid>requiredMemory ID
{
"assetId": "550e8400-e29b-41d4-a716-446655440000",
"memoryId": "550e8400-e29b-41d4-a716-446655440000"
}SyncMemoryDeleteV1
objectmemoryIdstring<uuid>requiredMemory ID
{
"memoryId": "550e8400-e29b-41d4-a716-446655440000"
}SyncMemoryV1
objectcreatedAtstring<date-time>requiredCreated at
dataobjectrequiredData
deletedAtstring<date-time> | nullrequiredDeleted at
hideAtstring<date-time> | nullrequiredHide at
idstring<uuid>requiredMemory ID
isSavedbooleanrequiredIs saved
memoryAtstring<date-time>requiredMemory at
ownerIdstring<uuid>requiredOwner ID
seenAtstring<date-time> | nullrequiredSeen at
showAtstring<date-time> | nullrequiredShow at
typeMemoryTypeon_this_dayrequiredMemory type
updatedAtstring<date-time>requiredUpdated at
{
"createdAt": "2024-01-01T00:00:00.000Z",
"data": {},
"deletedAt": "2024-01-01T00:00:00.000Z",
"hideAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isSaved": true,
"memoryAt": "2024-01-01T00:00:00.000Z",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"seenAt": "2024-01-01T00:00:00.000Z",
"showAt": "2024-01-01T00:00:00.000Z",
"type": "on_this_day",
"updatedAt": "2024-01-01T00:00:00.000Z"
}SyncPartnerDeleteV1
objectsharedByIdstring<uuid>requiredShared by ID
sharedWithIdstring<uuid>requiredShared with ID
{
"sharedById": "550e8400-e29b-41d4-a716-446655440000",
"sharedWithId": "550e8400-e29b-41d4-a716-446655440000"
}SyncPartnerV1
objectinTimelinebooleanrequiredIn timeline
sharedByIdstring<uuid>requiredShared by ID
sharedWithIdstring<uuid>requiredShared with ID
{
"inTimeline": true,
"sharedById": "550e8400-e29b-41d4-a716-446655440000",
"sharedWithId": "550e8400-e29b-41d4-a716-446655440000"
}SyncPersonDeleteV1
objectpersonIdstring<uuid>requiredPerson ID
{
"personId": "550e8400-e29b-41d4-a716-446655440000"
}SyncPersonV1
objectbirthDatestring<date-time> | nullrequiredBirth date
colorstring | nullrequiredColor
createdAtstring<date-time>requiredCreated at
faceAssetIdstring | nullrequiredFace asset ID
idstring<uuid>requiredPerson ID
isFavoritebooleanrequiredIs favorite
isHiddenbooleanrequiredIs hidden
namestringrequiredPerson name
ownerIdstring<uuid>requiredOwner ID
updatedAtstring<date-time>requiredUpdated at
{
"birthDate": "2024-01-01T00:00:00.000Z",
"color": "string",
"createdAt": "2024-01-01T00:00:00.000Z",
"faceAssetId": "string",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isFavorite": true,
"isHidden": true,
"name": "string",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"updatedAt": "2024-01-01T00:00:00.000Z"
}SyncRequestType
stringSync request type
"AlbumsV1"SyncStackDeleteV1
objectstackIdstring<uuid>requiredStack ID
{
"stackId": "550e8400-e29b-41d4-a716-446655440000"
}SyncStackV1
objectcreatedAtstring<date-time>requiredCreated at
idstring<uuid>requiredStack ID
ownerIdstring<uuid>requiredOwner ID
primaryAssetIdstring<uuid>requiredPrimary asset ID
updatedAtstring<date-time>requiredUpdated at
{
"createdAt": "2024-01-01T00:00:00.000Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"ownerId": "550e8400-e29b-41d4-a716-446655440000",
"primaryAssetId": "550e8400-e29b-41d4-a716-446655440000",
"updatedAt": "2024-01-01T00:00:00.000Z"
}SyncStreamDto
objectresetbooleanReset sync state
typesArray<SyncRequestType>AlbumsV1AlbumsV2AlbumUsersV1AlbumToAssetsV1AlbumAssetsV1AlbumAssetsV2AlbumAssetExifsV1AssetsV1AssetsV2AssetExifsV1AssetEditsV1AssetMetadataV1AssetOcrV1AuthUsersV1MemoriesV1MemoryToAssetsV1PartnersV1PartnerAssetsV1PartnerAssetsV2PartnerAssetExifsV1PartnerStacksV1StacksV1UsersV1PeopleV1AssetFacesV1AssetFacesV2UserMetadataV1requiredSync request types
{
"reset": true,
"types": [
"AlbumsV1"
]
}SyncUserDeleteV1
objectuserIdstring<uuid>requiredUser ID
{
"userId": "550e8400-e29b-41d4-a716-446655440000"
}SyncUserMetadataDeleteV1
objectkeyUserMetadataKeypreferenceslicenseonboardingrequiredUser metadata key
userIdstring<uuid>requiredUser ID
{
"key": "preferences",
"userId": "550e8400-e29b-41d4-a716-446655440000"
}SyncUserMetadataV1
objectkeyUserMetadataKeypreferenceslicenseonboardingrequiredUser metadata key
userIdstring<uuid>requiredUser ID
valueobjectrequiredUser metadata value
{
"key": "preferences",
"userId": "550e8400-e29b-41d4-a716-446655440000",
"value": {}
}SyncUserV1
objectavatarColorUserAvatarColor | nulldeletedAtstring<date-time> | nullrequiredUser deleted at
emailstringrequiredUser email
hasProfileImagebooleanrequiredUser has profile image
idstring<uuid>requiredUser ID
namestringrequiredUser name
profileChangedAtstring<date-time>requiredUser profile changed at
{
"deletedAt": "2024-01-01T00:00:00.000Z",
"email": "string",
"hasProfileImage": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-01T00:00:00.000Z"
}SystemConfigBackupsDto
objectdatabaseDatabaseBackupConfigrequired{
"database": {
"cronExpression": "string",
"enabled": true,
"keepLastAmount": 1
}
}SystemConfigDto
objectSystem configuration
backupSystemConfigBackupsDtorequiredffmpegSystemConfigFFmpegDtorequiredimageSystemConfigImageDtorequiredintegrityChecksSystemConfigIntegrityChecksrequiredIntegrity checks config
jobSystemConfigJobDtorequiredlibrarySystemConfigLibraryDtorequiredloggingSystemConfigLoggingDtorequiredmachineLearningSystemConfigMachineLearningDtorequiredmapSystemConfigMapDtorequiredmetadataSystemConfigMetadataDtorequirednewVersionCheckSystemConfigNewVersionCheckDtorequirednightlyTasksSystemConfigNightlyTasksDtorequirednotificationsSystemConfigNotificationsDtorequiredoauthSystemConfigOAuthDtorequiredpasswordLoginSystemConfigPasswordLoginDtorequiredreverseGeocodingSystemConfigReverseGeocodingDtorequiredserverSystemConfigServerDtorequiredstorageTemplateSystemConfigStorageTemplateDtorequiredtemplatesSystemConfigTemplatesDtorequiredthemeSystemConfigThemeDtorequiredtrashSystemConfigTrashDtorequireduserSystemConfigUserDtorequired{
"backup": {
"database": {
"cronExpression": "string",
"enabled": true,
"keepLastAmount": 1
}
},
"ffmpeg": {
"accel": "nvenc",
"accelDecode": true,
"acceptedAudioCodecs": [
"mp3"
],
"acceptedContainers": [
"mov"
],
"acceptedVideoCodecs": [
"h264"
],
"bframes": -1,
"cqMode": "auto",
"crf": 0,
"gopSize": 0,
"maxBitrate": "string",
"preferredHwDevice": "string",
"preset": "string",
"realtime": {
"enabled": true
},
"refs": 0,
"targetAudioCodec": "mp3",
"targetResolution": "string",
"targetVideoCodec": "h264",
"temporalAQ": true,
"threads": 0,
"tonemap": "hable",
"transcode": "all",
"twoPass": true
},
"image": {
"colorspace": "srgb",
"extractEmbedded": true,
"fullsize": {
"enabled": true,
"format": "jpeg",
"progressive": true,
"quality": 1
},
"preview": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
},
"thumbnail": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
}
},
"integrityChecks": {
"checksumFiles": {
"cronExpression": "string",
"enabled": true,
"percentageLimit": 0,
"timeLimit": 0
},
"missingFiles": {
"cronExpression": "string",
"enabled": true
},
"untrackedFiles": {
"cronExpression": "string",
"enabled": true
}
},
"job": {
"backgroundTask": {
"concurrency": 1
},
"editor": {
"concurrency": 1
},
"faceDetection": {
"concurrency": 1
},
"integrityCheck": {
"concurrency": 1
},
"library": {
"concurrency": 1
},
"metadataExtraction": {
"concurrency": 1
},
"migration": {
"concurrency": 1
},
"notifications": {
"concurrency": 1
},
"ocr": {
"concurrency": 1
},
"search": {
"concurrency": 1
},
"sidecar": {
"concurrency": 1
},
"smartSearch": {
"concurrency": 1
},
"thumbnailGeneration": {
"concurrency": 1
},
"videoConversion": {
"concurrency": 1
},
"workflow": {
"concurrency": 1
}
},
"library": {
"scan": {
"cronExpression": "string",
"enabled": true
},
"watch": {
"enabled": true
}
},
"logging": {
"enabled": true,
"level": "verbose"
},
"machineLearning": {
"availabilityChecks": {
"enabled": true,
"interval": -9007199254740991,
"timeout": -9007199254740991
},
"clip": {
"enabled": true,
"modelName": "string"
},
"duplicateDetection": {
"enabled": true,
"maxDistance": 0.001
},
"enabled": true,
"facialRecognition": {
"enabled": true,
"maxDistance": 0.1,
"minFaces": 1,
"minScore": 0.1,
"modelName": "string"
},
"ocr": {
"enabled": true,
"maxResolution": 1,
"minDetectionScore": 0.1,
"minRecognitionScore": 0.1,
"modelName": "string"
},
"urls": [
"string"
]
},
"map": {
"darkStyle": "https://example.com",
"enabled": true,
"lightStyle": "https://example.com"
},
"metadata": {
"faces": {
"import": true
}
},
"newVersionCheck": {
"channel": "stable",
"enabled": true
},
"nightlyTasks": {
"clusterNewFaces": true,
"databaseCleanup": true,
"generateMemories": true,
"missingThumbnails": true,
"startTime": "string",
"syncQuotaUsage": true
},
"notifications": {
"smtp": {
"enabled": true,
"from": "string",
"replyTo": "string",
"transport": {
"host": "string",
"ignoreCert": true,
"password": "string",
"port": 0,
"secure": true,
"username": "string"
}
}
},
"oauth": {
"allowInsecureRequests": true,
"autoLaunch": true,
"autoRegister": true,
"buttonText": "string",
"clientId": "string",
"clientSecret": "string",
"defaultStorageQuota": 0,
"enabled": true,
"endSessionEndpoint": "string",
"issuerUrl": "string",
"mobileOverrideEnabled": true,
"mobileRedirectUri": "string",
"profileSigningAlgorithm": "string",
"prompt": "string",
"roleClaim": "string",
"scope": "string",
"signingAlgorithm": "string",
"storageLabelClaim": "string",
"storageQuotaClaim": "string",
"timeout": 1,
"tokenEndpointAuthMethod": "client_secret_post"
},
"passwordLogin": {
"enabled": true
},
"reverseGeocoding": {
"enabled": true
},
"server": {
"externalDomain": "string",
"loginPageMessage": "string",
"publicUsers": true
},
"storageTemplate": {
"enabled": true,
"hashVerificationEnabled": true,
"template": "string"
},
"templates": {
"email": {
"albumInviteTemplate": "string",
"albumUpdateTemplate": "string",
"welcomeTemplate": "string"
}
},
"theme": {
"customCss": "string"
},
"trash": {
"days": 0,
"enabled": true
},
"user": {
"deleteDelay": 1
}
}SystemConfigFFmpegDto
objectaccelTranscodeHWAccelnvencqsvvaapirkmppdisabledrequiredTranscode hardware acceleration
accelDecodebooleanrequiredAccelerated decode
acceptedAudioCodecsArray<AudioCodec>mp3aacopuspcm_s16lerequiredAccepted audio codecs
acceptedContainersArray<VideoContainer>movmp4oggwebmrequiredAccepted containers
acceptedVideoCodecsArray<VideoCodec>h264hevcvp9av1requiredAccepted video codecs
bframesinteger[-1, 16]requiredB-frames
cqModeCQModeautocqpicqrequiredCQ mode
crfinteger[0, 51]requiredCRF
gopSizeinteger[0, 9007199254740991]requiredGOP size
maxBitratestringrequiredMax bitrate
preferredHwDevicestringrequiredPreferred hardware device
presetstringrequiredPreset
realtimeSystemConfigFFmpegRealtimeDtorequiredrefsinteger[0, 6]requiredReferences
targetAudioCodecAudioCodecmp3aacopuspcm_s16lerequiredTarget audio codec
targetResolutionstringrequiredTarget resolution
targetVideoCodecVideoCodech264hevcvp9av1requiredTarget video codec
temporalAQbooleanrequiredTemporal AQ
threadsinteger[0, 9007199254740991]requiredThreads
tonemapToneMappinghablemobiusreinharddisabledrequiredTone mapping
transcodeTranscodePolicyalloptimalbitraterequireddisabledrequiredTranscode policy
twoPassbooleanrequiredTwo pass
{
"accel": "nvenc",
"accelDecode": true,
"acceptedAudioCodecs": [
"mp3"
],
"acceptedContainers": [
"mov"
],
"acceptedVideoCodecs": [
"h264"
],
"bframes": -1,
"cqMode": "auto",
"crf": 0,
"gopSize": 0,
"maxBitrate": "string",
"preferredHwDevice": "string",
"preset": "string",
"realtime": {
"enabled": true
},
"refs": 0,
"targetAudioCodec": "mp3",
"targetResolution": "string",
"targetVideoCodec": "h264",
"temporalAQ": true,
"threads": 0,
"tonemap": "hable",
"transcode": "all",
"twoPass": true
}SystemConfigFFmpegRealtimeDto
objectenabledbooleanrequiredEnable real-time HLS transcoding (alpha)
{
"enabled": true
}SystemConfigGeneratedFullsizeImageDto
objectenabledbooleanrequiredEnabled
formatImageFormatjpegwebprequiredImage format
progressivebooleanProgressive
qualityinteger[1, 100]requiredQuality
{
"enabled": true,
"format": "jpeg",
"progressive": true,
"quality": 1
}SystemConfigGeneratedImageDto
objectformatImageFormatjpegwebprequiredImage format
progressivebooleanProgressive
qualityinteger[1, 100]requiredQuality
sizeinteger[1, 9007199254740991]requiredSize
{
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
}SystemConfigImageDto
objectcolorspaceColorspacesrgbp3requiredColorspace
extractEmbeddedbooleanrequiredExtract embedded
fullsizeSystemConfigGeneratedFullsizeImageDtorequiredpreviewSystemConfigGeneratedImageDtorequiredthumbnailSystemConfigGeneratedImageDtorequired{
"colorspace": "srgb",
"extractEmbedded": true,
"fullsize": {
"enabled": true,
"format": "jpeg",
"progressive": true,
"quality": 1
},
"preview": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
},
"thumbnail": {
"format": "jpeg",
"progressive": true,
"quality": 1,
"size": 1
}
}SystemConfigIntegrityChecks
objectIntegrity checks config
checksumFilesSystemConfigIntegrityChecksumJobrequiredIntegrity checksum job config
missingFilesSystemConfigIntegrityJobrequiredIntegrity job config
untrackedFilesSystemConfigIntegrityJobrequiredIntegrity job config
{
"checksumFiles": {
"cronExpression": "string",
"enabled": true,
"percentageLimit": 0,
"timeLimit": 0
},
"missingFiles": {
"cronExpression": "string",
"enabled": true
},
"untrackedFiles": {
"cronExpression": "string",
"enabled": true
}
}SystemConfigIntegrityChecksumJob
objectIntegrity checksum job config
cronExpressionstringrequiredCron expression for when the integrity check should run
enabledbooleanrequiredEnabled
percentageLimitinteger[0, 9007199254740991]requiredPercentage limit of the integrity checksum job
timeLimitinteger[0, 9007199254740991]requiredHow long the integrity checksum job may run for
{
"cronExpression": "string",
"enabled": true,
"percentageLimit": 0,
"timeLimit": 0
}SystemConfigIntegrityJob
objectIntegrity job config
cronExpressionstringrequiredCron expression for when the integrity check should run
enabledbooleanrequiredEnabled
{
"cronExpression": "string",
"enabled": true
}SystemConfigJobDto
objectbackgroundTaskJobSettingsDtorequirededitorJobSettingsDtorequiredfaceDetectionJobSettingsDtorequiredintegrityCheckJobSettingsDtorequiredlibraryJobSettingsDtorequiredmetadataExtractionJobSettingsDtorequiredmigrationJobSettingsDtorequirednotificationsJobSettingsDtorequiredocrJobSettingsDtorequiredsearchJobSettingsDtorequiredsidecarJobSettingsDtorequiredsmartSearchJobSettingsDtorequiredthumbnailGenerationJobSettingsDtorequiredvideoConversionJobSettingsDtorequiredworkflowJobSettingsDtorequired{
"backgroundTask": {
"concurrency": 1
},
"editor": {
"concurrency": 1
},
"faceDetection": {
"concurrency": 1
},
"integrityCheck": {
"concurrency": 1
},
"library": {
"concurrency": 1
},
"metadataExtraction": {
"concurrency": 1
},
"migration": {
"concurrency": 1
},
"notifications": {
"concurrency": 1
},
"ocr": {
"concurrency": 1
},
"search": {
"concurrency": 1
},
"sidecar": {
"concurrency": 1
},
"smartSearch": {
"concurrency": 1
},
"thumbnailGeneration": {
"concurrency": 1
},
"videoConversion": {
"concurrency": 1
},
"workflow": {
"concurrency": 1
}
}SystemConfigLibraryDto
objectscanSystemConfigLibraryScanDtorequiredwatchSystemConfigLibraryWatchDtorequired{
"scan": {
"cronExpression": "string",
"enabled": true
},
"watch": {
"enabled": true
}
}SystemConfigLibraryScanDto
objectcronExpressionstringrequiredCron expression
enabledbooleanrequiredEnabled
{
"cronExpression": "string",
"enabled": true
}SystemConfigLoggingDto
objectenabledbooleanrequiredEnabled
levelLogLevelverbosedebuglogwarnerrorfatalrequiredLog level
{
"enabled": true,
"level": "verbose"
}SystemConfigMachineLearningDto
objectavailabilityChecksMachineLearningAvailabilityChecksDtorequiredclipCLIPConfigrequiredduplicateDetectionDuplicateDetectionConfigrequiredenabledbooleanrequiredEnabled
facialRecognitionFacialRecognitionConfigrequiredocrOcrConfigrequiredurlsArray<string>requiredML service URLs
{
"availabilityChecks": {
"enabled": true,
"interval": -9007199254740991,
"timeout": -9007199254740991
},
"clip": {
"enabled": true,
"modelName": "string"
},
"duplicateDetection": {
"enabled": true,
"maxDistance": 0.001
},
"enabled": true,
"facialRecognition": {
"enabled": true,
"maxDistance": 0.1,
"minFaces": 1,
"minScore": 0.1,
"modelName": "string"
},
"ocr": {
"enabled": true,
"maxResolution": 1,
"minDetectionScore": 0.1,
"minRecognitionScore": 0.1,
"modelName": "string"
},
"urls": [
"string"
]
}SystemConfigMapDto
objectdarkStylestring<uri>requiredDark map style URL
enabledbooleanrequiredEnabled
lightStylestring<uri>requiredLight map style URL
{
"darkStyle": "https://example.com",
"enabled": true,
"lightStyle": "https://example.com"
}SystemConfigMetadataDto
objectfacesSystemConfigFacesDtorequired{
"faces": {
"import": true
}
}SystemConfigNewVersionCheckDto
objectchannelReleaseChannelstablereleaseCandidaterequiredRelease channel
enabledbooleanrequiredEnabled
{
"channel": "stable",
"enabled": true
}SystemConfigNightlyTasksDto
objectclusterNewFacesbooleanrequiredCluster new faces
databaseCleanupbooleanrequiredDatabase cleanup
generateMemoriesbooleanrequiredGenerate memories
missingThumbnailsbooleanrequiredMissing thumbnails
startTimestringrequiredStart time (HH:MM)
syncQuotaUsagebooleanrequiredSync quota usage
{
"clusterNewFaces": true,
"databaseCleanup": true,
"generateMemories": true,
"missingThumbnails": true,
"startTime": "string",
"syncQuotaUsage": true
}SystemConfigNotificationsDto
objectsmtpSystemConfigSmtpDtorequired{
"smtp": {
"enabled": true,
"from": "string",
"replyTo": "string",
"transport": {
"host": "string",
"ignoreCert": true,
"password": "string",
"port": 0,
"secure": true,
"username": "string"
}
}
}SystemConfigOAuthDto
objectallowInsecureRequestsbooleanrequiredAllow insecure requests
autoLaunchbooleanrequiredAuto launch
autoRegisterbooleanrequiredAuto register
buttonTextstringrequiredButton text
clientIdstringrequiredClient ID
clientSecretstringrequiredClient secret
defaultStorageQuotainteger | null[0, 9007199254740991]requiredDefault storage quota
enabledbooleanrequiredEnabled
endSessionEndpointstringrequiredEnd session endpoint
issuerUrlstringrequiredIssuer URL
mobileOverrideEnabledbooleanrequiredMobile override enabled
mobileRedirectUristringrequiredMobile redirect URI (set to empty string to disable)
profileSigningAlgorithmstringrequiredProfile signing algorithm
promptstringrequiredOAuth prompt parameter (e.g. select_account, login, consent)
roleClaimstringrequiredRole claim
scopestringrequiredScope
signingAlgorithmstringrequiredSigning algorithm
storageLabelClaimstringrequiredStorage label claim
storageQuotaClaimstringrequiredStorage quota claim
timeoutinteger[1, 9007199254740991]requiredTimeout
tokenEndpointAuthMethodOAuthTokenEndpointAuthMethodclient_secret_postclient_secret_basicrequiredOAuth token endpoint auth method
{
"allowInsecureRequests": true,
"autoLaunch": true,
"autoRegister": true,
"buttonText": "string",
"clientId": "string",
"clientSecret": "string",
"defaultStorageQuota": 0,
"enabled": true,
"endSessionEndpoint": "string",
"issuerUrl": "string",
"mobileOverrideEnabled": true,
"mobileRedirectUri": "string",
"profileSigningAlgorithm": "string",
"prompt": "string",
"roleClaim": "string",
"scope": "string",
"signingAlgorithm": "string",
"storageLabelClaim": "string",
"storageQuotaClaim": "string",
"timeout": 1,
"tokenEndpointAuthMethod": "client_secret_post"
}SystemConfigServerDto
objectexternalDomainstringrequiredExternal domain
loginPageMessagestringrequiredLogin page message
publicUsersbooleanrequiredPublic users
{
"externalDomain": "string",
"loginPageMessage": "string",
"publicUsers": true
}SystemConfigSmtpDto
objectenabledbooleanrequiredWhether SMTP email notifications are enabled
fromstringrequiredEmail address to send from
replyTostringrequiredEmail address for replies
transportSystemConfigSmtpTransportDtorequired{
"enabled": true,
"from": "string",
"replyTo": "string",
"transport": {
"host": "string",
"ignoreCert": true,
"password": "string",
"port": 0,
"secure": true,
"username": "string"
}
}SystemConfigSmtpTransportDto
objecthoststringrequiredSMTP server hostname
ignoreCertbooleanrequiredWhether to ignore SSL certificate errors
passwordstringrequiredSMTP password
portinteger[0, 65535]requiredSMTP server port
securebooleanrequiredWhether to use secure connection (TLS/SSL)
usernamestringrequiredSMTP username
{
"host": "string",
"ignoreCert": true,
"password": "string",
"port": 0,
"secure": true,
"username": "string"
}SystemConfigStorageTemplateDto
objectenabledbooleanrequiredEnabled
hashVerificationEnabledbooleanrequiredHash verification enabled
templatestringrequiredTemplate
{
"enabled": true,
"hashVerificationEnabled": true,
"template": "string"
}SystemConfigTemplateEmailsDto
objectalbumInviteTemplatestringrequiredAlbum invite template
albumUpdateTemplatestringrequiredAlbum update template
welcomeTemplatestringrequiredWelcome template
{
"albumInviteTemplate": "string",
"albumUpdateTemplate": "string",
"welcomeTemplate": "string"
}SystemConfigTemplateStorageOptionDto
objectdayOptionsArray<string>requiredAvailable day format options for storage template
hourOptionsArray<string>requiredAvailable hour format options for storage template
minuteOptionsArray<string>requiredAvailable minute format options for storage template
monthOptionsArray<string>requiredAvailable month format options for storage template
presetOptionsArray<string>requiredAvailable preset template options
secondOptionsArray<string>requiredAvailable second format options for storage template
weekOptionsArray<string>requiredAvailable week format options for storage template
yearOptionsArray<string>requiredAvailable year format options for storage template
{
"dayOptions": [
"string"
],
"hourOptions": [
"string"
],
"minuteOptions": [
"string"
],
"monthOptions": [
"string"
],
"presetOptions": [
"string"
],
"secondOptions": [
"string"
],
"weekOptions": [
"string"
],
"yearOptions": [
"string"
]
}SystemConfigTemplatesDto
objectemailSystemConfigTemplateEmailsDtorequired{
"email": {
"albumInviteTemplate": "string",
"albumUpdateTemplate": "string",
"welcomeTemplate": "string"
}
}SystemConfigThemeDto
objectcustomCssstringrequiredCustom CSS for theming
{
"customCss": "string"
}SystemConfigTrashDto
objectdaysinteger[0, 9007199254740991]requiredDays
enabledbooleanrequiredEnabled
{
"days": 0,
"enabled": true
}SystemConfigUserDto
objectdeleteDelayinteger[1, 9007199254740991]requiredDelete delay
{
"deleteDelay": 1
}TagBulkAssetsDto
objectassetIdsArray<string>requiredAsset IDs
tagIdsArray<string>requiredTag IDs
{
"assetIds": [
"550e8400-e29b-41d4-a716-446655440000"
],
"tagIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}TagBulkAssetsResponseDto
objectcountinteger[-9007199254740991, 9007199254740991]requiredNumber of assets tagged
{
"count": -9007199254740991
}TagCreateDto
objectcolorstring | nullTag color (hex)
namestringrequiredTag name
parentIdstring<uuid> | nullParent tag ID
{
"color": "string",
"name": "string",
"parentId": "550e8400-e29b-41d4-a716-446655440000"
}TagResponseDto
objectcolorstringTag color (hex)
createdAtstring<date-time>requiredCreation date
idstring<uuid>requiredTag ID
namestringrequiredTag name
parentIdstringParent tag ID
updatedAtstring<date-time>requiredLast update date
valuestringrequiredTag value (full path)
{
"color": "string",
"createdAt": "2024-01-15T09:30:00Z",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"parentId": "string",
"updatedAt": "2024-01-15T09:30:00Z",
"value": "string"
}TemplateResponseDto
objecthtmlstringrequiredTemplate HTML content
namestringrequiredTemplate name
{
"html": "string",
"name": "string"
}TimeBucketAssetResponseDto
objectcityArray<string>Array of city names extracted from EXIF GPS data
countryArray<string>Array of country names extracted from EXIF GPS data
createdAtArray<string>requiredArray of UTC timestamps when each asset was originally uploaded to Immich
durationArray<integer>requiredArray of video/gif durations in milliseconds (null for static images)
fileCreatedAtArray<string>requiredArray of file creation timestamps in UTC
idArray<string>requiredArray of asset IDs in the time bucket
isFavoriteArray<boolean>requiredArray indicating whether each asset is favorited
isImageArray<boolean>requiredArray indicating whether each asset is an image (false for videos)
isTrashedArray<boolean>requiredArray indicating whether each asset is in the trash
latitudeArray<number>Array of latitude coordinates extracted from EXIF GPS data
livePhotoVideoIdArray<string>requiredArray of live photo video asset IDs (null for non-live photos)
localOffsetHoursArray<number>requiredArray of UTC offset hours at the time each photo was taken. Positive values are east of UTC, negative values are west of UTC. Values may be fractional (e.g., 5.5 for +05:30, -9.75 for -09:45). Applying this offset to 'fileCreatedAt' will give you the time the photo was taken from the photographer's perspective.
longitudeArray<number>Array of longitude coordinates extracted from EXIF GPS data
ownerIdArray<string>requiredArray of owner IDs for each asset
projectionTypeArray<string>requiredArray of projection types for 360° content (e.g., "EQUIRECTANGULAR", "CUBEFACE", "CYLINDRICAL")
ratioArray<number>requiredArray of aspect ratios (width/height) for each asset
stackArray<Array<string>>Array of stack information as [stackId, assetCount] tuples (null for non-stacked assets)
thumbhashArray<string>requiredArray of BlurHash strings for generating asset previews (base64 encoded)
visibilityArray<AssetVisibility>archivetimelinehiddenlockedrequiredArray of visibility statuses for each asset (e.g., ARCHIVE, TIMELINE, HIDDEN, LOCKED)
{
"city": [
"string"
],
"country": [
"string"
],
"createdAt": [
"string"
],
"duration": [
0
],
"fileCreatedAt": [
"string"
],
"id": [
"string"
],
"isFavorite": [
true
],
"isImage": [
true
],
"isTrashed": [
true
],
"latitude": [
0
],
"livePhotoVideoId": [
"string"
],
"localOffsetHours": [
0
],
"longitude": [
0
],
"ownerId": [
"string"
],
"projectionType": [
"string"
],
"ratio": [
0
],
"stack": [
[
"string"
]
],
"thumbhash": [
"string"
],
"visibility": [
"archive"
]
}TimeBucketsResponseDto
objectcountinteger[-9007199254740991, 9007199254740991]requiredNumber of assets in this time bucket
timeBucketstringrequiredTime bucket identifier in YYYY-MM-DD format representing the start of the time period
{
"count": 42,
"timeBucket": "2024-01-01"
}TranscodeHWAccel
stringTranscode hardware acceleration
"nvenc"TrashResponseDto
objectcountinteger[-9007199254740991, 9007199254740991]requiredNumber of items in trash
{
"count": -9007199254740991
}UpdateAlbumDto
objectalbumNamestringAlbum name
albumThumbnailAssetIdstring<uuid>Album thumbnail asset ID
descriptionstringAlbum description
isActivityEnabledbooleanEnable activity feed
orderAssetOrderascdescAsset sort order
{
"albumName": "string",
"albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
"description": "string",
"isActivityEnabled": true,
"order": "asc"
}UpdateAlbumUserDto
objectroleAlbumUserRoleeditorownerviewerrequiredAlbum user role
{
"role": "editor"
}UpdateAssetDto
objectdateTimeOriginalstringOriginal date and time
descriptionstringAsset description
isFavoritebooleanMark as favorite
latitudenumber[-90, 90]Latitude coordinate
livePhotoVideoIdstring<uuid> | nullLive photo video ID
longitudenumber[-180, 180]Longitude coordinate
ratinginteger | null[-1, 5]Rating in range [1-5] (starred), -1 (rejected), or null (unrated)
visibilityAssetVisibilityarchivetimelinehiddenlockedAsset visibility
{
"dateTimeOriginal": "string",
"description": "string",
"isFavorite": true,
"latitude": -90,
"livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
"longitude": -180,
"rating": -1,
"visibility": "archive"
}UpdateLibraryDto
objectexclusionPatternsArray<string>Exclusion patterns (max 128)
importPathsArray<string>Import paths (max 128)
namestringLibrary name
{
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
],
"name": "string"
}UsageByUserDto
objectphotosinteger[-9007199254740991, 9007199254740991]requiredNumber of photos
quotaSizeInBytesinteger | null[-9007199254740991, 9007199254740991]requiredUser quota size in bytes (null if unlimited)
usageinteger[-9007199254740991, 9007199254740991]requiredTotal storage usage in bytes
usagePhotosinteger[-9007199254740991, 9007199254740991]requiredStorage usage for photos in bytes
usageVideosinteger[-9007199254740991, 9007199254740991]requiredStorage usage for videos in bytes
userIdstring<uuid>requiredUser ID
userNamestringrequiredUser name
videosinteger[-9007199254740991, 9007199254740991]requiredNumber of videos
{
"photos": -9007199254740991,
"quotaSizeInBytes": -9007199254740991,
"usage": -9007199254740991,
"usagePhotos": -9007199254740991,
"usageVideos": -9007199254740991,
"userId": "550e8400-e29b-41d4-a716-446655440000",
"userName": "string",
"videos": -9007199254740991
}UserAdminCreateDto
objectavatarColorUserAvatarColor | nullemailstring<email>requiredUser email
isAdminbooleanGrant admin privileges
namestringrequiredUser name
notifybooleanSend notification email
passwordstringrequiredUser password
pinCodestring | nullPIN code
quotaSizeInBytesinteger | null[0, 9007199254740991]Storage quota in bytes
shouldChangePasswordbooleanRequire password change on next login
storageLabelstring | nullStorage label
{
"email": "user@example.com",
"isAdmin": true,
"name": "string",
"notify": true,
"password": "string",
"pinCode": "123456",
"quotaSizeInBytes": 0,
"shouldChangePassword": true,
"storageLabel": "string"
}UserAdminResponseDto
objectavatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequiredUser avatar color
createdAtstring<date-time>requiredCreation date
deletedAtstring<date-time> | nullrequiredDeletion date
emailstring<email>requiredUser email
idstring<uuid>requiredUser ID
isAdminbooleanrequiredIs admin user
licenseUserLicense | nullrequirednamestringrequiredUser name
oauthIdstringrequiredOAuth ID
profileChangedAtstring<date-time>requiredProfile change date
profileImagePathstringrequiredProfile image path
quotaSizeInBytesinteger | null[0, 9007199254740991]requiredStorage quota in bytes
quotaUsageInBytesinteger | null[0, 9007199254740991]requiredStorage usage in bytes
shouldChangePasswordbooleanrequiredRequire password change on next login
statusUserStatusactiveremovingdeletedrequiredUser status
storageLabelstring | nullrequiredStorage label
updatedAtstring<date-time>requiredLast update date
{
"avatarColor": "primary",
"createdAt": "2024-01-01T00:00:00.000Z",
"deletedAt": "2024-01-01T00:00:00.000Z",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"isAdmin": true,
"license": {
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
},
"name": "string",
"oauthId": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string",
"quotaSizeInBytes": 0,
"quotaUsageInBytes": 0,
"shouldChangePassword": true,
"status": "active",
"storageLabel": "string",
"updatedAt": "2024-01-01T00:00:00.000Z"
}UserAdminUpdateDto
objectavatarColorUserAvatarColor | nullemailstring<email>User email
isAdminbooleanGrant admin privileges
namestringUser name
passwordstringUser password
pinCodestring | nullPIN code
quotaSizeInBytesinteger | null[0, 9007199254740991]Storage quota in bytes
shouldChangePasswordbooleanRequire password change on next login
storageLabelstring | nullStorage label
{
"email": "user@example.com",
"isAdmin": true,
"name": "string",
"password": "string",
"pinCode": "123456",
"quotaSizeInBytes": 0,
"shouldChangePassword": true,
"storageLabel": "string"
}UserAvatarColor
stringUser avatar color
"primary"UserLicense
objectactivatedAtstring<date-time>requiredActivation date
activationKeystringrequiredActivation key
licenseKeystringrequiredLicense key (format: /^IM(SV|CL)(-[\dA-Za-z]{4}){8}$/)
{
"activatedAt": "2024-01-01T00:00:00.000Z",
"activationKey": "string",
"licenseKey": "string"
}UserMetadataKey
stringUser metadata key
"preferences"UserPreferencesResponseDto
objectalbumsAlbumsResponserequiredcastCastResponserequireddownloadDownloadResponserequiredemailNotificationsEmailNotificationsResponserequiredfoldersFoldersResponserequiredmemoriesMemoriesResponserequiredpeoplePeopleResponserequiredpurchasePurchaseResponserequiredratingsRatingsResponserequiredsharedLinksSharedLinksResponserequiredtagsTagsResponserequired{
"albums": {
"defaultAssetOrder": "asc"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": -9007199254740991,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": -9007199254740991,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}UserPreferencesUpdateDto
objectalbumsAlbumsUpdateAlbum preferences
avatarAvatarUpdatecastCastUpdatedownloadDownloadUpdateemailNotificationsEmailNotificationsUpdatefoldersFoldersUpdatememoriesMemoriesUpdatepeoplePeopleUpdatepurchasePurchaseUpdateratingsRatingsUpdatesharedLinksSharedLinksUpdatetagsTagsUpdate{
"albums": {
"defaultAssetOrder": "asc"
},
"avatar": {
"color": "primary"
},
"cast": {
"gCastEnabled": true
},
"download": {
"archiveSize": 1,
"includeEmbeddedVideos": true
},
"emailNotifications": {
"albumInvite": true,
"albumUpdate": true,
"enabled": true
},
"folders": {
"enabled": true,
"sidebarWeb": true
},
"memories": {
"duration": 1,
"enabled": true
},
"people": {
"enabled": true,
"minimumFaces": 1,
"sidebarWeb": true
},
"purchase": {
"hideBuyButtonUntil": "string",
"showSupportBadge": true
},
"ratings": {
"enabled": true
},
"sharedLinks": {
"enabled": true,
"sidebarWeb": true
},
"tags": {
"enabled": true,
"sidebarWeb": true
}
}UserResponseDto
objectavatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequiredUser avatar color
emailstring<email>requiredUser email
idstring<uuid>requiredUser ID
namestringrequiredUser name
profileChangedAtstring<date-time>requiredProfile change date
profileImagePathstringrequiredProfile image path
{
"avatarColor": "primary",
"email": "user@example.com",
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"profileChangedAt": "2024-01-15T09:30:00Z",
"profileImagePath": "string"
}UserUpdateMeDto
objectavatarColorUserAvatarColor | nullemailstring<email>User email
namestringUser name
passwordstringdeprecatedUser password (deprecated, use change password endpoint)
{
"email": "user@example.com",
"name": "string",
"password": "string"
}ValidateAccessTokenResponseDto
objectauthStatusbooleanrequiredAuthentication status
{
"authStatus": true
}ValidateLibraryDto
objectexclusionPatternsArray<string>Exclusion patterns (max 128)
importPathsArray<string>Import paths to validate (max 128)
{
"exclusionPatterns": [
"string"
],
"importPaths": [
"string"
]
}ValidateLibraryImportPathResponseDto
objectimportPathstringrequiredImport path
isValidbooleanrequiredIs valid
messagestringValidation message
{
"importPath": "string",
"isValid": true,
"message": "string"
}ValidateLibraryResponseDto
objectimportPathsArray<ValidateLibraryImportPathResponseDto>Validation results for import paths
{
"importPaths": [
{
"importPath": "string",
"isValid": true,
"message": "string"
}
]
}VersionCheckStateResponseDto
objectcheckedAtstring | nullrequiredLast check timestamp
releaseVersionstring | nullrequiredRelease version
{
"checkedAt": "string",
"releaseVersion": "string"
}WorkflowCreateDto
objectdescriptionstring | nullWorkflow description
enabledbooleanWorkflow enabled
namestring | nullWorkflow name
stepsArray<WorkflowStepDto>triggerWorkflowTriggerAssetCreateAssetMetadataExtractionrequiredPlugin trigger type
{
"description": "string",
"enabled": true,
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate"
}WorkflowResponseDto
objectcreatedAtstringrequiredCreation date
descriptionstring | nullrequiredWorkflow description
enabledbooleanrequiredWorkflow enabled
idstring<uuid>requiredWorkflow ID
namestring | nullrequiredWorkflow name
stepsArray<WorkflowStepDto>requiredWorkflow steps
triggerWorkflowTriggerAssetCreateAssetMetadataExtractionrequiredPlugin trigger type
updatedAtstringrequiredUpdate date
{
"createdAt": "string",
"description": "string",
"enabled": true,
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate",
"updatedAt": "string"
}WorkflowStepDto
objectconfigobject | nullrequiredStep configuration
enabledbooleanStep is enabled
methodstringrequiredStep plugin method
{
"config": {},
"enabled": true,
"method": "string"
}WorkflowTrigger
stringPlugin trigger type
"AssetCreate"WorkflowTriggerResponseDto
objecttriggerWorkflowTriggerAssetCreateAssetMetadataExtractionrequiredPlugin trigger type
typesArray<WorkflowType>AssetV1requiredWorkflow types
{
"trigger": "AssetCreate",
"types": [
"AssetV1"
]
}WorkflowUpdateDto
objectdescriptionstring | nullWorkflow description
enabledbooleanWorkflow enabled
namestring | nullWorkflow name
stepsArray<WorkflowStepDto>triggerWorkflowTriggerAssetCreateAssetMetadataExtractionPlugin trigger type
{
"description": "string",
"enabled": true,
"name": "string",
"steps": [
{
"config": {},
"enabled": true,
"method": "string"
}
],
"trigger": "AssetCreate"
}