Immich

v3.0.0-rc.2
Base URL
/api

Immich API

Authentication

bearerhttp

Scheme: Bearer (JWT)

cookieapiKey

API Key: immich_access_token in cookie

api_keyapiKey

API 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

GET
/api/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>requiredquery

Album ID

assetIdstring<uuid>query

Asset ID (if activity is for an asset)

levelReactionLevelalbumassetquery
typeReactionTypecommentlikequery
userIdstring<uuid>query

Filter by user ID

Response

200OKArray<ActivityResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
List all activities
curl -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))
}
200
[
  {
    "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

POST
/api/activities

Create a like or a comment for an album, or an asset in an album.

Body

application/json

Activity create

albumIdstring<uuid>required

Album ID

assetIdstring<uuid>

Asset ID (if activity is for an asset)

commentstring

Comment text (required if type is comment)

typeReactionTypecommentlikerequired

Reaction type

Response

201CreatedActivityResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create an activity
curl -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))
}
Request Body
{
  "albumId": "550e8400-e29b-41d4-a716-446655440000",
  "assetId": "550e8400-e29b-41d4-a716-446655440000",
  "comment": "string",
  "type": "comment"
}
201
{
  "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

GET
/api/activities/statistics

Returns the number of likes and comments for a given album or asset in an album.

Parameters

albumIdstring<uuid>requiredquery

Album ID

assetIdstring<uuid>query

Asset ID (if activity is for an asset)

Response

200OKActivityStatisticsResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve activity statistics
curl -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))
}
200
{
  "comments": 0,
  "likes": 0
}

Delete an activity

DELETE
/api/activities/{id}

Removes a like or comment from a given album or asset in an album.

Parameters

idstring<uuid>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete an activity
curl -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

GET
/api/albums

Retrieve a list of albums available to the authenticated user.

Parameters

assetIdstring<uuid>query

Filter albums containing this asset ID (ignores other parameters)

idstring<uuid>query

Album ID

isOwnedbooleanquery

Filter by ownership: true = only owned, false = only shared-with-me, undefined = no filter

isSharedbooleanquery

Filter by shared status: true = only shared, false = not shared, undefined = no filter

namestringquery

Album name (exact match)

Response

200OKArray<AlbumResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
List all albums
curl -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))
}
200
[
  {
    "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

POST
/api/albums

Create a new album. The album can also be created with initial users and assets.

Body

application/json
albumNamestringrequired

Album name

albumUsersArray<AlbumUserCreateDto>

Album users

Show child attributes
roleAlbumUserRoleeditorownerviewerrequired

Album user role

userIdstring<uuid>required

User ID

assetIdsArray<string>

Initial asset IDs

descriptionstring

Album description

Response

201CreatedAlbumResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create an album
curl -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))
}
Request Body
{
  "albumName": "string",
  "albumUsers": [
    {
      "role": "editor",
      "userId": "550e8400-e29b-41d4-a716-446655440000"
    }
  ],
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "description": "string"
}
201
{
  "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

PUT
/api/albums/assets

Send a list of asset IDs and album IDs to add each asset to each album.

Body

application/json
albumIdsArray<string>required

Album IDs

assetIdsArray<string>required

Asset IDs

Response

200OKAlbumsAddAssetsResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Add assets to albums
curl -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))
}
Request Body
{
  "albumIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}
200
{
  "error": "duplicate",
  "success": true
}

Retrieve album statistics

GET
/api/albums/statistics

Returns statistics about the albums available to the authenticated user.

Response

200OKAlbumStatisticsResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve album statistics
curl -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))
}
200
{
  "notShared": 0,
  "owned": 0,
  "shared": 0
}

Retrieve an album

GET
/api/albums/{id}

Retrieve information about a specific album by its ID.

Parameters

idstring<uuid>requiredpath
keystringquery
slugstringquery

Response

200OKAlbumResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve an album
curl -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))
}
200
{
  "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
/api/albums/{id}

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>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete an album
curl -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

PATCH
/api/albums/{id}

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

application/json
albumNamestring

Album name

albumThumbnailAssetIdstring<uuid>

Album thumbnail asset ID

descriptionstring

Album description

isActivityEnabledboolean

Enable activity feed

orderAssetOrderascdesc

Asset sort order

Parameters

idstring<uuid>requiredpath

Response

200OKAlbumResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update an album
curl -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))
}
Request Body
{
  "albumName": "string",
  "albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
  "description": "string",
  "isActivityEnabled": true,
  "order": "asc"
}
200
{
  "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

PUT
/api/albums/{id}/assets

Add multiple assets to a specific album by its ID.

Body

application/json
idsArray<string>required

IDs to process

Parameters

idstring<uuid>requiredpath

Response

200OKArray<BulkIdResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Add assets to an album
curl -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))
}
Request Body
{
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}
200
[
  {
    "error": "duplicate",
    "errorMessage": "string",
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "success": true
  }
]

Remove assets from an album

DELETE
/api/albums/{id}/assets

Remove multiple assets from a specific album by its ID.

Body

application/json
idsArray<string>required

IDs to process

Parameters

idstring<uuid>requiredpath

Response

200OKArray<BulkIdResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Remove assets from an album
curl -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))
}
Request Body
{
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}
200
[
  {
    "error": "duplicate",
    "errorMessage": "string",
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "success": true
  }
]

Retrieve album map markers

GET
/api/albums/{id}/map-markers

Retrieve map marker information for a specific album by its ID.

Parameters

idstring<uuid>requiredpath
keystringquery
slugstringquery

Response

200OKArray<MapMarkerResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve album map markers
curl -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))
}
200
[
  {
    "city": "string",
    "country": "string",
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "lat": 0,
    "lon": 0,
    "state": "string"
  }
]

Update user role

PUT
/api/albums/{id}/user/{userId}

Change the role for a specific user in a specific album.

Body

application/json
roleAlbumUserRoleeditorownerviewerrequired

Album user role

Parameters

idstring<uuid>requiredpath
userIdstringrequiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update user role
curl -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))
}
Request Body
{
  "role": "editor"
}

Remove user from album

DELETE
/api/albums/{id}/user/{userId}

Remove a user from an album. Use an ID of "me" to leave a shared album.

Parameters

idstring<uuid>requiredpath
userIdstringrequiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Remove user from album
curl -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

PUT
/api/albums/{id}/users

Share an album with multiple users. Each user can be given a specific role in the album.

Body

application/json
albumUsersArray<AlbumUserAddDto>required

Album users to add

Show child attributes
roleAlbumUserRoleeditorownerviewereditor

Album user role

userIdstring<uuid>required

User ID

Parameters

idstring<uuid>requiredpath

Response

200OKAlbumResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Share album with users
curl -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))
}
Request Body
{
  "albumUsers": [
    {
      "role": "editor",
      "userId": "550e8400-e29b-41d4-a716-446655440000"
    }
  ]
}
200
{
  "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

GET
/api/api-keys

Retrieve all API keys of the current user.

Response

200OKArray<ApiKeyResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
List all API keys
curl -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))
}
200
[
  {
    "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

POST
/api/api-keys

Creates a new API key. It will be limited to the permissions specified.

Body

application/json
namestring

API 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.unlinkAllrequired

List of permissions

Response

201CreatedApiKeyCreateResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create an API key
curl -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))
}
Request Body
{
  "name": "string",
  "permissions": [
    "all"
  ]
}
201
{
  "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

GET
/api/api-keys/me

Retrieve the API key that is used to access this endpoint.

Response

200OKApiKeyResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve the current API key
curl -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))
}
200
{
  "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

GET
/api/api-keys/{id}

Retrieve an API key by its ID. The current user must own this API key.

Parameters

idstring<uuid>requiredpath

Response

200OKApiKeyResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve an API key
curl -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))
}
200
{
  "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

deprecated
PUT
/api/api-keys/{id}

Updates the name and permissions of an API key by its ID. The current user must own this API key.

Body

application/json
namestring

API 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.unlinkAll

List of permissions

Parameters

idstring<uuid>requiredpath

Response

200OKApiKeyResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update an API key
curl -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))
}
Request Body
{
  "name": "string",
  "permissions": [
    "all"
  ]
}
200
{
  "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

DELETE
/api/api-keys/{id}

Deletes an API key identified by its ID. The current user must own this API key.

Parameters

idstring<uuid>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete an API key
curl -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

POST
/api/assets

Uploads a new asset to the server.

Body

multipart/form-data

Asset Upload Information

assetDatastring<binary>required

Asset file data

durationinteger[0, 9007199254740991]

Duration in milliseconds (for videos)

fileCreatedAtstring<date-time>required

File creation date

fileModifiedAtstring<date-time>required

File modification date

filenamestring

Filename

isFavoriteboolean

Mark as favorite

livePhotoVideoIdstring<uuid>

Live photo video ID

metadataArray<AssetMetadataUpsertItemDto>

Asset metadata items

Show child attributes
keystringrequired

Metadata key

valueobjectrequired

Metadata value (object)

sidecarDatastring<binary>

Sidecar file data

visibilityAssetVisibilityarchivetimelinehiddenlocked

Asset visibility

Parameters

keystringquery
slugstringquery
x-immich-checksumstringheader

sha1 checksum that can be used for duplicate detection before the file is uploaded

Response

200OKAssetMediaResponseDto

Asset is a duplicate

201CreatedAssetMediaResponseDto

Asset uploaded successfully

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Upload asset
curl -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))
}
Request Body
{
  "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

deprecated
PUT
/api/assets

Updates multiple assets at the same time.

Body

application/json
dateTimeOriginalstring

Original date and time

dateTimeRelativeinteger[-9007199254740991, 9007199254740991]

Relative time offset in minutes

descriptionstring

Asset description

duplicateIdstring | null

Duplicate ID

idsArray<string>required

Asset IDs to update

isFavoriteboolean

Mark 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)

timeZonestring

Time zone (IANA timezone)

visibilityAssetVisibilityarchivetimelinehiddenlocked

Asset visibility

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update assets
curl -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))
}
Request Body
{
  "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

DELETE
/api/assets

Deletes multiple assets at the same time.

Body

application/json
forceboolean

Force delete even if in use

idsArray<string>required

IDs to process

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete assets
curl -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))
}
Request Body
{
  "force": true,
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}

Check bulk upload

POST
/api/assets/bulk-upload-check

Determine which assets have already been uploaded to the server based on their SHA1 checksums.

Body

application/json
assetsArray<AssetBulkUploadCheckItem>required

Assets to check

Show child attributes
checksumstringrequired

Base64 or hex encoded SHA1 hash

idstringrequired

Client-side identifier echoed in the response to match results to inputs (e.g. filename)

Response

200OKAssetBulkUploadCheckResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Check bulk upload
curl -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))
}
Request Body
{
  "assets": [
    {
      "checksum": "string",
      "id": "string"
    }
  ]
}
200
{
  "results": [
    {
      "action": "accept",
      "assetId": "string",
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "isTrashed": true,
      "reason": "duplicate"
    }
  ]
}

Copy asset

PUT
/api/assets/copy

Copy asset information like albums, tags, etc. from one asset to another.

Body

application/json
albumsbooleantrue

Copy album associations

favoritebooleantrue

Copy favorite status

sharedLinksbooleantrue

Copy shared links

sidecarbooleantrue

Copy sidecar file

sourceIdstring<uuid>required

Source asset ID

stackbooleantrue

Copy stack association

targetIdstring<uuid>required

Target asset ID

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Copy asset
curl -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))
}
Request Body
{
  "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

POST
/api/assets/jobs

Run a specific job on a set of assets.

Body

application/json
assetIdsArray<string>required

Asset IDs

nameAssetJobNamerefresh-facesrefresh-metadataregenerate-thumbnailtranscode-videorequired

Job name

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Run an asset job
curl -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))
}
Request Body
{
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "name": "refresh-faces"
}

Upsert asset metadata

PUT
/api/assets/metadata

Upsert metadata key-value pairs for multiple assets.

Body

application/json
itemsArray<AssetMetadataBulkUpsertItemDto>required

Metadata items to upsert

Show child attributes
assetIdstring<uuid>required

Asset ID

keystringrequired

Metadata key

valueobjectrequired

Metadata value (object)

Response

200OKArray<AssetMetadataBulkResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Upsert asset metadata
curl -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))
}
Request Body
{
  "items": [
    {
      "assetId": "550e8400-e29b-41d4-a716-446655440000",
      "key": "string",
      "value": {}
    }
  ]
}
200
[
  {
    "assetId": "550e8400-e29b-41d4-a716-446655440000",
    "key": "string",
    "updatedAt": "2024-01-01T00:00:00.000Z",
    "value": {}
  }
]

Delete asset metadata

DELETE
/api/assets/metadata

Delete metadata key-value pairs for multiple assets.

Body

application/json
itemsArray<AssetMetadataBulkDeleteItemDto>required

Metadata items to delete

Show child attributes
assetIdstring<uuid>required

Asset ID

keystringrequired

Metadata key

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete asset metadata
curl -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))
}
Request Body
{
  "items": [
    {
      "assetId": "550e8400-e29b-41d4-a716-446655440000",
      "key": "string"
    }
  ]
}

Get asset statistics

GET
/api/assets/statistics

Retrieve various statistics about the assets owned by the authenticated user.

Parameters

isFavoritebooleanquery

Filter by favorite status

isTrashedbooleanquery

Filter by trash status

visibilityAssetVisibilityarchivetimelinehiddenlockedquery

Response

200OKAssetStatsResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get asset statistics
curl -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))
}
200
{
  "images": -9007199254740991,
  "total": -9007199254740991,
  "videos": -9007199254740991
}

Retrieve an asset

GET
/api/assets/{id}

Retrieve detailed information about a specific asset.

Parameters

idstring<uuid>requiredpath
keystringquery
slugstringquery

Response

200OKAssetResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve an asset
curl -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))
}
200
{
  "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

deprecated
PUT
/api/assets/{id}

Update information of a specific asset.

Body

application/json
dateTimeOriginalstring

Original date and time

descriptionstring

Asset description

isFavoriteboolean

Mark as favorite

latitudenumber[-90, 90]

Latitude coordinate

livePhotoVideoIdstring<uuid> | null

Live photo video ID

longitudenumber[-180, 180]

Longitude coordinate

ratinginteger | null[-1, 5]

Rating in range [1-5] (starred), -1 (rejected), or null (unrated)

visibilityAssetVisibilityarchivetimelinehiddenlocked

Asset visibility

Parameters

idstring<uuid>requiredpath

Response

200OKAssetResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update an asset
curl -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))
}
Request Body
{
  "dateTimeOriginal": "string",
  "description": "string",
  "isFavorite": true,
  "latitude": -90,
  "livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
  "longitude": -180,
  "rating": -1,
  "visibility": "archive"
}
200
{
  "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

GET
/api/assets/{id}/edits

Retrieve a series of edit actions (crop, rotate, mirror) associated with the specified asset.

Parameters

idstring<uuid>requiredpath

Response

200OKAssetEditsResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve edits for an existing asset
curl -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))
}
200
{
  "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

PUT
/api/assets/{id}/edits

Apply a series of edit actions (crop, rotate, mirror) to the specified asset.

Body

application/json
editsArray<AssetEditActionItemDto>required

List of edit actions to apply (crop, rotate, or mirror)

Show child attributes
actionAssetEditActioncroprotatemirrorrequired

Type of edit action to perform

parametersCropParameters | RotateParameters | MirrorParametersrequired

List of edit actions to apply (crop, rotate, or mirror)

Parameters

idstring<uuid>requiredpath

Response

200OKAssetEditsResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Apply edits to an existing asset
curl -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))
}
Request Body
{
  "edits": [
    {
      "action": "crop",
      "parameters": {
        "height": 1,
        "width": 1,
        "x": 0,
        "y": 0
      }
    }
  ]
}
200
{
  "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

DELETE
/api/assets/{id}/edits

Removes all edit actions (crop, rotate, mirror) associated with the specified asset.

Parameters

idstring<uuid>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Remove edits from an existing asset
curl -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

GET
/api/assets/{id}/metadata

Retrieve all metadata key-value pairs associated with the specified asset.

Parameters

idstring<uuid>requiredpath

Response

200OKArray<AssetMetadataResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get asset metadata
curl -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))
}
200
[
  {
    "key": "string",
    "updatedAt": "2024-01-01T00:00:00.000Z",
    "value": {}
  }
]

Update asset metadata

PUT
/api/assets/{id}/metadata

Update or add metadata key-value pairs for the specified asset.

Body

application/json
itemsArray<AssetMetadataUpsertItemDto>required

Metadata items to upsert

Show child attributes
keystringrequired

Metadata key

valueobjectrequired

Metadata value (object)

Parameters

idstring<uuid>requiredpath

Response

200OKArray<AssetMetadataResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update asset metadata
curl -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))
}
Request Body
{
  "items": [
    {
      "key": "string",
      "value": {}
    }
  ]
}
200
[
  {
    "key": "string",
    "updatedAt": "2024-01-01T00:00:00.000Z",
    "value": {}
  }
]

Retrieve asset metadata by key

GET
/api/assets/{id}/metadata/{key}

Retrieve the value of a specific metadata key associated with the specified asset.

Parameters

idstring<uuid>requiredpath

Asset ID

keystringrequiredpath

Metadata key

Response

200OKAssetMetadataResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve asset metadata by key
curl -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))
}
200
{
  "key": "string",
  "updatedAt": "2024-01-01T00:00:00.000Z",
  "value": {}
}

Delete asset metadata by key

DELETE
/api/assets/{id}/metadata/{key}

Delete a specific metadata key-value pair associated with the specified asset.

Parameters

idstring<uuid>requiredpath

Asset ID

keystringrequiredpath

Metadata key

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete asset metadata by key
curl -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

GET
/api/assets/{id}/ocr

Retrieve all OCR (Optical Character Recognition) data associated with the specified asset.

Parameters

idstring<uuid>requiredpath

Response

200OKArray<AssetOcrResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve asset OCR data
curl -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))
}
200
[
  {
    "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

GET
/api/assets/{id}/original

Downloads the original file of the specified asset.

Parameters

editedbooleanfalsequery

Return edited asset if available

idstring<uuid>requiredpath
keystringquery
slugstringquery

Response

200OKstring<binary>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Download original asset
curl -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))
}
200
"<binary>"

View asset thumbnail

GET
/api/assets/{id}/thumbnail

Retrieve the thumbnail image for the specified asset. Viewing the fullsize thumbnail might redirect to downloadAsset, which requires a different permission.

Parameters

editedbooleanfalsequery

Return edited asset if available

idstring<uuid>requiredpath
keystringquery
sizeAssetMediaSizeoriginalfullsizepreviewthumbnailquery
slugstringquery

Response

200OKstring<binary>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
View asset thumbnail
curl -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))
}
200
"<binary>"

Play asset video

GET
/api/assets/{id}/video/playback

Streams the video file for the specified asset. This endpoint also supports byte range requests.

Parameters

idstring<uuid>requiredpath
keystringquery
slugstringquery

Response

200OKstring<binary>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Play asset video
curl -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))
}
200
"<binary>"

Get HLS main playlist

GET
/api/assets/{id}/video/stream/main.m3u8

Returns an HLS main playlist with all available variants for the asset.

Parameters

idstring<uuid>requiredpath
keystringquery
slugstringquery

Response

200OKstring

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get HLS main playlist
curl -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))
}
200
"string"

End HLS streaming session

DELETE
/api/assets/{id}/video/stream/{sessionId}

Releases server resources for the streaming session.

Parameters

idstring<uuid>requiredpath
keystringquery
sessionIdstring<uuid>requiredpath
slugstringquery

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
End HLS streaming session
curl -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

GET
/api/assets/{id}/video/stream/{sessionId}/{variantIndex}/playlist.m3u8

Returns an HLS media playlist for one variant of the streaming session.

Parameters

idstring<uuid>requiredpath
keystringquery
sessionIdstring<uuid>requiredpath
slugstringquery
variantIndexinteger[0, 9007199254740991]requiredpath
x-immich-hls-posnumber>= 0header

Response

200OKstring

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get HLS media playlist
curl -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))
}
200
"string"

Get HLS segment or init file

GET
/api/assets/{id}/video/stream/{sessionId}/{variantIndex}/{filename}

Streams an HLS init segment (init.mp4) or media segment (seg_N.m4s).

Parameters

filenamestringrequiredpath
idstring<uuid>requiredpath
keystringquery
sessionIdstring<uuid>requiredpath
slugstringquery
variantIndexinteger[0, 9007199254740991]requiredpath
x-immich-hls-msninteger[0, 9007199254740991]header

Response

200OKstring<binary>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get HLS segment or init file
curl -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))
}
200
"<binary>"

Authentication

Endpoints related to user authentication, including OAuth.

Register admin

POST
/api/auth/admin-sign-up

Create the first admin user in the system.

Body

application/json
emailstring<email>required

User email

namestringrequired

User name

passwordstringrequired

User password

Response

201CreatedUserAdminResponseDto
Register admin
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))
}
Request Body
{
  "email": "testuser@email.com",
  "name": "Admin",
  "password": "password"
}
201
{
  "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

POST
/api/auth/change-password

Change the password of the current user.

Body

application/json
invalidateSessionsbooleanfalse

Invalidate all other sessions

newPasswordstringrequired

New password (min 8 characters)

passwordstringrequired

Current password

Response

200OKUserAdminResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Change password
curl -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))
}
Request Body
{
  "invalidateSessions": false,
  "newPassword": "password",
  "password": "password"
}
200
{
  "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

POST
/api/auth/login

Login with username and password and receive a session token.

Body

application/json
emailstring<email>required

User email

passwordstringrequired

User password

Response

201CreatedLoginResponseDto
Login
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))
}
Request Body
{
  "email": "testuser@email.com",
  "password": "password"
}
201
{
  "accessToken": "string",
  "isAdmin": true,
  "isOnboarded": true,
  "name": "string",
  "profileImagePath": "string",
  "shouldChangePassword": true,
  "userEmail": "user@example.com",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

Logout

POST
/api/auth/logout

Logout the current user and invalidate the session token.

Response

200OKLogoutResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Logout
curl -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))
}
200
{
  "redirectUri": "string",
  "successful": true
}

Setup pin code

POST
/api/auth/pin-code

Setup a new pin code for the current user.

Body

application/json
pinCodestringrequired

PIN code (4-6 digits)

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Setup pin code
curl -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))
}
Request Body
{
  "pinCode": "123456"
}

Change pin code

PUT
/api/auth/pin-code

Change the pin code for the current user.

Body

application/json
newPinCodestringrequired

New PIN code (4-6 digits)

passwordstring

User password (required if PIN code is not provided)

pinCodestring

New PIN code (4-6 digits)

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Change pin code
curl -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))
}
Request Body
{
  "newPinCode": "string",
  "password": "password",
  "pinCode": "123456"
}

Reset pin code

DELETE
/api/auth/pin-code

Reset the pin code for the current user by providing the account password

Body

application/json
passwordstring

User password (required if PIN code is not provided)

pinCodestring

New PIN code (4-6 digits)

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Reset pin code
curl -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))
}
Request Body
{
  "password": "password",
  "pinCode": "123456"
}

Lock auth session

POST
/api/auth/session/lock

Remove elevated access to locked assets from the current session.

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Lock auth session
curl -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

POST
/api/auth/session/unlock

Temporarily grant the session elevated access to locked assets by providing the correct PIN code.

Body

application/json
passwordstring

User password (required if PIN code is not provided)

pinCodestring

New PIN code (4-6 digits)

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Unlock auth session
curl -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))
}
Request Body
{
  "password": "password",
  "pinCode": "123456"
}

Retrieve auth status

GET
/api/auth/status

Get information about the current session, including whether the user has a password, and if the session can access locked assets.

Response

200OKAuthStatusResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve auth status
curl -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))
}
200
{
  "expiresAt": "string",
  "isElevated": true,
  "password": true,
  "pinCode": true,
  "pinExpiresAt": "string"
}

Validate access token

POST
/api/auth/validateToken

Validate the current authorization method is still valid.

Response

200OKValidateAccessTokenResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Validate access token
curl -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))
}
200
{
  "authStatus": true
}

Start OAuth

POST
/api/oauth/authorize

Initiate the OAuth authorization process.

Body

application/json
codeChallengestring

OAuth code challenge (PKCE)

redirectUristringrequired

OAuth redirect URI

statestring

OAuth state parameter

Response

201CreatedOAuthAuthorizeResponseDto
Start OAuth
curl -X POST '/api/oauth/authorize' \
  -H 'Content-Type: application/json' \
  -d '{
    "codeChallenge": "string",
    "redirectUri": "string",
    "state": "string"
  }'
const response = await fetch('/api/oauth/authorize', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "codeChallenge": "string",
      "redirectUri": "string",
      "state": "string"
    }),
});

const data = await response.json();
import requests

payload = {
  "codeChallenge": "string",
  "redirectUri": "string",
  "state": "string"
}

response = requests.post('/api/oauth/authorize', json=payload)
data = response.json()
package main

import (
  "fmt"
  "io"
  "net/http"
  "strings"
)

func main() {
  body := strings.NewReader(`{
    "codeChallenge": "string",
    "redirectUri": "string",
    "state": "string"
  }`)
  req, _ := http.NewRequest("POST", "/api/oauth/authorize", 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))
}
Request Body
{
  "codeChallenge": "string",
  "redirectUri": "string",
  "state": "string"
}
201
{
  "url": "string"
}

Backchannel OAuth logout

POST
/api/oauth/backchannel-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

application/x-www-form-urlencoded
logout_tokenstringrequired

OAuth logout token

Response

200OK
Backchannel OAuth logout
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))
}
Request Body
{
  "logout_token": "string"
}

Finish OAuth

POST
/api/oauth/callback

Complete the OAuth authorization process by exchanging the authorization code for a session token.

Body

application/json
codeVerifierstring

OAuth code verifier (PKCE)

statestring

OAuth state parameter

urlstringrequired

OAuth callback URL

Response

201CreatedLoginResponseDto
Finish OAuth
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))
}
Request Body
{
  "codeVerifier": "string",
  "state": "string",
  "url": "string"
}
201
{
  "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

POST
/api/oauth/link

Link an OAuth account to the authenticated user.

Body

application/json
codeVerifierstring

OAuth code verifier (PKCE)

statestring

OAuth state parameter

urlstringrequired

OAuth callback URL

Response

200OKUserAdminResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Link OAuth account
curl -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))
}
Request Body
{
  "codeVerifier": "string",
  "state": "string",
  "url": "string"
}
200
{
  "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

GET
/api/oauth/mobile-redirect

Requests to this URL are automatically forwarded to the mobile app, and is used in some cases for OAuth redirecting.

Response

200OK
Redirect OAuth to mobile
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

POST
/api/oauth/unlink

Unlink the OAuth account from the authenticated user.

Response

200OKUserAdminResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Unlink OAuth account
curl -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))
}
200
{
  "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

POST
/api/admin/auth/unlink-all

Unlinks all OAuth accounts associated with user accounts in the system.

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Unlink all OAuth accounts
curl -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
/api/admin/database-backups

Get the list of the successful and failed backups

Response

200OKDatabaseBackupListResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
List database backups
curl -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))
}
200
{
  "backups": [
    {
      "filename": "string",
      "filesize": -9007199254740991,
      "timezone": "string"
    }
  ]
}

Delete database backup

DELETE
/api/admin/database-backups

Delete a backup by its filename

Body

application/json
backupsArray<string>required

Backup filenames to delete

Response

200OK

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete database backup
curl -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))
}
Request Body
{
  "backups": [
    "string"
  ]
}

Start database backup restore flow

POST
/api/admin/database-backups/start-restore

Put Immich into maintenance mode to restore a backup (Immich must not be configured)

Response

201Created
Start database backup restore flow
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

POST
/api/admin/database-backups/upload

Uploads .sql/.sql.gz file to restore backup from

Body

multipart/form-data

Backup Upload

filestring<binary>

Database backup file

Response

201Created

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Upload database backup
curl -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))
}
Request Body
{
  "file": "<binary>"
}

Download database backup

GET
/api/admin/database-backups/{filename}

Downloads the database backup file

Parameters

filenamestringrequiredpath

Response

200OKstring<binary>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Download database backup
curl -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))
}
200
"<binary>"

Deprecated

Deprecated endpoints that are planned for removal in the next major release.

Update a user

deprecated
PUT
/api/admin/users/{id}

Update an existing user.

Body

application/json
avatarColorUserAvatarColor | null
emailstring<email>

User email

isAdminboolean

Grant admin privileges

namestring

User name

passwordstring

User password

pinCodestring | null

PIN code

quotaSizeInBytesinteger | null[0, 9007199254740991]

Storage quota in bytes

shouldChangePasswordboolean

Require password change on next login

storageLabelstring | null

Storage label

Parameters

idstring<uuid>requiredpath

Response

200OKUserAdminResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update a user
curl -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))
}
Request Body
{
  "email": "user@example.com",
  "isAdmin": true,
  "name": "string",
  "password": "string",
  "pinCode": "123456",
  "quotaSizeInBytes": 0,
  "shouldChangePassword": true,
  "storageLabel": "string"
}
200
{
  "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

deprecated
PUT
/api/admin/users/{id}/preferences

Update the preferences of a specific user.

Body

application/json
albumsAlbumsUpdate

Album preferences

Show child attributes
defaultAssetOrderAssetOrderascdesc

Asset sort order

avatarAvatarUpdate
Show child attributes
colorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamber

User avatar color

castCastUpdate
Show child attributes
gCastEnabledboolean

Whether Google Cast is enabled

downloadDownloadUpdate
Show child attributes
archiveSizeinteger[1, 9007199254740991]

Maximum archive size in bytes

includeEmbeddedVideosboolean

Whether to include embedded videos in downloads

emailNotificationsEmailNotificationsUpdate
Show child attributes
albumInviteboolean

Whether to receive email notifications for album invites

albumUpdateboolean

Whether to receive email notifications for album updates

enabledboolean

Whether email notifications are enabled

foldersFoldersUpdate
Show child attributes
enabledboolean

Whether folders are enabled

sidebarWebboolean

Whether folders appear in web sidebar

memoriesMemoriesUpdate
Show child attributes
durationinteger[1, 9007199254740991]

Memory duration in seconds

enabledboolean

Whether memories are enabled

peoplePeopleUpdate
Show child attributes
enabledboolean

Whether people are enabled

minimumFacesinteger[1, 9007199254740991]

People face threshold

sidebarWebboolean

Whether people appear in web sidebar

purchasePurchaseUpdate
Show child attributes
hideBuyButtonUntilstring

Date until which to hide buy button

showSupportBadgeboolean

Whether to show support badge

ratingsRatingsUpdate
Show child attributes
enabledboolean

Whether ratings are enabled

sharedLinksSharedLinksUpdate
Show child attributes
enabledboolean

Whether shared links are enabled

sidebarWebboolean

Whether shared links appear in web sidebar

tagsTagsUpdate
Show child attributes
enabledboolean

Whether tags are enabled

sidebarWebboolean

Whether tags appear in web sidebar

Parameters

idstring<uuid>requiredpath

Response

200OKUserPreferencesResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update user preferences
curl -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))
}
Request Body
{
  "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
  }
}
200
{
  "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

deprecated
PUT
/api/api-keys/{id}

Updates the name and permissions of an API key by its ID. The current user must own this API key.

Body

application/json
namestring

API 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.unlinkAll

List of permissions

Parameters

idstring<uuid>requiredpath

Response

200OKApiKeyResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update an API key
curl -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))
}
Request Body
{
  "name": "string",
  "permissions": [
    "all"
  ]
}
200
{
  "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

deprecated
PUT
/api/assets

Updates multiple assets at the same time.

Body

application/json
dateTimeOriginalstring

Original date and time

dateTimeRelativeinteger[-9007199254740991, 9007199254740991]

Relative time offset in minutes

descriptionstring

Asset description

duplicateIdstring | null

Duplicate ID

idsArray<string>required

Asset IDs to update

isFavoriteboolean

Mark 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)

timeZonestring

Time zone (IANA timezone)

visibilityAssetVisibilityarchivetimelinehiddenlocked

Asset visibility

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update assets
curl -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))
}
Request Body
{
  "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

deprecated
PUT
/api/assets/{id}

Update information of a specific asset.

Body

application/json
dateTimeOriginalstring

Original date and time

descriptionstring

Asset description

isFavoriteboolean

Mark as favorite

latitudenumber[-90, 90]

Latitude coordinate

livePhotoVideoIdstring<uuid> | null

Live photo video ID

longitudenumber[-180, 180]

Longitude coordinate

ratinginteger | null[-1, 5]

Rating in range [1-5] (starred), -1 (rejected), or null (unrated)

visibilityAssetVisibilityarchivetimelinehiddenlocked

Asset visibility

Parameters

idstring<uuid>requiredpath

Response

200OKAssetResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update an asset
curl -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))
}
Request Body
{
  "dateTimeOriginal": "string",
  "description": "string",
  "isFavorite": true,
  "latitude": -90,
  "livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
  "longitude": -180,
  "rating": -1,
  "visibility": "archive"
}
200
{
  "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

deprecated
GET
/api/jobs

Retrieve the counts of the current queue, as well as the current status.

Response

200OKQueuesResponseLegacyDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve queue counts and status
curl -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))
}
200
{
  "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

deprecated
PUT
/api/jobs/{name}

Queue 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

application/json
commandQueueCommandstartpauseresumeemptyclear-failedrequired

Queue command to execute

forceboolean

Force the command execution (if applicable)

Parameters

nameQueueNamethumbnailGenerationmetadataExtractionvideoConversionfaceDetectionfacialRecognitionsmartSearchduplicateDetectionbackgroundTaskstorageTemplateMigrationmigrationsearchsidecarlibrarynotificationsbackupDatabaseocrworkflowintegrityCheckeditorrequiredpath

Response

200OKQueueResponseLegacyDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Run jobs
curl -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))
}
Request Body
{
  "command": "start",
  "force": true
}
200
{
  "jobCounts": {
    "active": -9007199254740991,
    "completed": -9007199254740991,
    "delayed": -9007199254740991,
    "failed": -9007199254740991,
    "paused": -9007199254740991,
    "waiting": -9007199254740991
  },
  "queueStatus": {
    "isActive": true,
    "isPaused": true
  }
}

Update a library

deprecated
PUT
/api/libraries/{id}

Update an existing external library.

Body

application/json
exclusionPatternsArray<string>

Exclusion patterns (max 128)

importPathsArray<string>

Import paths (max 128)

namestring

Library name

Parameters

idstring<uuid>requiredpath

Response

200OKLibraryResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update a library
curl -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))
}
Request Body
{
  "exclusionPatterns": [
    "string"
  ],
  "importPaths": [
    "string"
  ],
  "name": "string"
}
200
{
  "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

deprecated
PUT
/api/memories/{id}

Update an existing memory by its ID.

Body

application/json
isSavedboolean

Is memory saved

memoryAtstring<date-time>

Memory date

seenAtstring<date-time>

Date when memory was seen

Parameters

idstring<uuid>requiredpath

Response

200OKMemoryResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update a memory
curl -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))
}
Request Body
{
  "isSaved": true,
  "memoryAt": "2024-01-01T00:00:00.000Z",
  "seenAt": "2024-01-01T00:00:00.000Z"
}
200
{
  "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

deprecated
POST
/api/partners/{id}

Create a new partner to share assets with.

Parameters

idstring<uuid>requiredpath

Response

201CreatedPartnerResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create a partner
curl -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))
}
201
{
  "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

deprecated
PUT
/api/people/{id}

Update an individual person.

Body

application/json
birthDatestring<date> | null

Person date of birth

colorstring | null

Person color (hex)

featureFaceAssetIdstring<uuid>

Asset ID used for feature face thumbnail

isFavoriteboolean

Mark as favorite

isHiddenboolean

Person visibility (hidden)

namestring

Person name

Parameters

idstring<uuid>requiredpath

Response

200OKPersonResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update person
curl -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))
}
Request Body
{
  "birthDate": "2024-01-15",
  "color": "string",
  "featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
  "isFavorite": true,
  "isHidden": true,
  "name": "string"
}
200
{
  "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

deprecated
PUT
/api/sessions/{id}

Update a specific session identified by id.

Body

application/json
isPendingSyncResetboolean

Reset pending sync state

Parameters

idstring<uuid>requiredpath

Response

200OKSessionResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update a session
curl -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))
}
Request Body
{
  "isPendingSyncReset": true
}
200
{
  "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

deprecated
PUT
/api/stacks/{id}

Update an existing stack by its ID.

Body

application/json
primaryAssetIdstring<uuid>

Primary asset ID

Parameters

idstring<uuid>requiredpath

Response

200OKStackResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update a stack
curl -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))
}
Request Body
{
  "primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}
200
{
  "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 tag

deprecated
PUT
/api/tags/{id}

Update an existing tag identified by its ID.

Body

application/json
colorstring | null

Tag color (hex)

Parameters

idstring<uuid>requiredpath

Response

200OKTagResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update a tag
curl -X PUT '/api/tags/{id}' \
  -H 'Content-Type: application/json' \
  -d '{
    "color": "string"
  }'
const response = await fetch('/api/tags/{id}', {
  method: 'PUT',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "color": "string"
    }),
});

const data = await response.json();
import requests

payload = {
  "color": "string"
}

response = requests.put('/api/tags/{id}', json=payload)
data = response.json()
package main

import (
  "fmt"
  "io"
  "net/http"
  "strings"
)

func main() {
  body := strings.NewReader(`{
    "color": "string"
  }`)
  req, _ := http.NewRequest("PUT", "/api/tags/{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))
}
Request Body
{
  "color": "string"
}
200
{
  "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"
}

Update current user

deprecated
PUT
/api/users/me

Update the current user making the API request.

Body

application/json
avatarColorUserAvatarColor | null
emailstring<email>

User email

namestring

User name

passwordstringdeprecated

User password (deprecated, use change password endpoint)

Response

200OKUserAdminResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update current user
curl -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))
}
Request Body
{
  "email": "user@example.com",
  "name": "string",
  "password": "string"
}
200
{
  "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

deprecated
PUT
/api/users/me/preferences

Update the preferences of the current user.

Body

application/json
albumsAlbumsUpdate

Album preferences

Show child attributes
defaultAssetOrderAssetOrderascdesc

Asset sort order

avatarAvatarUpdate
Show child attributes
colorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamber

User avatar color

castCastUpdate
Show child attributes
gCastEnabledboolean

Whether Google Cast is enabled

downloadDownloadUpdate
Show child attributes
archiveSizeinteger[1, 9007199254740991]

Maximum archive size in bytes

includeEmbeddedVideosboolean

Whether to include embedded videos in downloads

emailNotificationsEmailNotificationsUpdate
Show child attributes
albumInviteboolean

Whether to receive email notifications for album invites

albumUpdateboolean

Whether to receive email notifications for album updates

enabledboolean

Whether email notifications are enabled

foldersFoldersUpdate
Show child attributes
enabledboolean

Whether folders are enabled

sidebarWebboolean

Whether folders appear in web sidebar

memoriesMemoriesUpdate
Show child attributes
durationinteger[1, 9007199254740991]

Memory duration in seconds

enabledboolean

Whether memories are enabled

peoplePeopleUpdate
Show child attributes
enabledboolean

Whether people are enabled

minimumFacesinteger[1, 9007199254740991]

People face threshold

sidebarWebboolean

Whether people appear in web sidebar

purchasePurchaseUpdate
Show child attributes
hideBuyButtonUntilstring

Date until which to hide buy button

showSupportBadgeboolean

Whether to show support badge

ratingsRatingsUpdate
Show child attributes
enabledboolean

Whether ratings are enabled

sharedLinksSharedLinksUpdate
Show child attributes
enabledboolean

Whether shared links are enabled

sidebarWebboolean

Whether shared links appear in web sidebar

tagsTagsUpdate
Show child attributes
enabledboolean

Whether tags are enabled

sidebarWebboolean

Whether tags appear in web sidebar

Response

200OKUserPreferencesResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update my preferences
curl -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))
}
Request Body
{
  "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
  }
}
200
{
  "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

deprecated
PUT
/api/workflows/{id}

Update 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

application/json
descriptionstring | null

Workflow description

enabledboolean

Workflow enabled

namestring | null

Workflow name

stepsArray<WorkflowStepDto>
Show child attributes
configobject | nullrequired

Step configuration

enabledboolean

Step is enabled

methodstringrequired

Step plugin method

triggerWorkflowTriggerAssetCreateAssetMetadataExtraction

Plugin trigger type

Parameters

idstring<uuid>requiredpath

Response

200OKWorkflowResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update a workflow
curl -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))
}
Request Body
{
  "description": "string",
  "enabled": true,
  "name": "string",
  "steps": [
    {
      "config": {},
      "enabled": true,
      "method": "string"
    }
  ],
  "trigger": "AssetCreate"
}
200
{
  "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

POST
/api/download/archive

Download a ZIP archive containing the specified assets. The assets must have been previously requested via the "getDownloadInfo" endpoint.

Body

application/json
assetIdsArray<string>required

Asset IDs

editedboolean

Download edited asset if available

Parameters

keystringquery
slugstringquery

Response

200OKstring<binary>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Download asset archive
curl -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))
}
Request Body
{
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "edited": true
}
200
"<binary>"

Retrieve download information

POST
/api/download/info

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

application/json
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

keystringquery
slugstringquery

Response

201CreatedDownloadResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve download information
curl -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))
}
Request Body
{
  "albumId": "550e8400-e29b-41d4-a716-446655440000",
  "archiveSize": 1,
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}
201
{
  "archives": [
    {
      "assetIds": [
        "550e8400-e29b-41d4-a716-446655440000"
      ],
      "size": -9007199254740991
    }
  ],
  "totalSize": -9007199254740991
}

Duplicates

Endpoints for managing and identifying duplicate assets.

Retrieve duplicates

GET
/api/duplicates

Retrieve a list of duplicate assets available to the authenticated user.

Response

200OKArray<DuplicateResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve duplicates
curl -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))
}
200
[
  {
    "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
/api/duplicates

Delete multiple duplicate assets specified by their IDs.

Body

application/json
idsArray<string>required

IDs to process

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete duplicates
curl -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))
}
Request Body
{
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}

Resolve duplicate groups

POST
/api/duplicates/resolve

Resolve duplicate groups by synchronizing metadata across assets and deleting/trashing duplicates.

Body

application/json
groupsArray<DuplicateResolveGroupDto>required

List of duplicate groups to resolve

Show child attributes
duplicateIdstring<uuid>required
keepAssetIdsArray<string>required

Asset IDs to keep

trashAssetIdsArray<string>required

Asset IDs to trash or delete

Response

200OKArray<BulkIdResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Resolve duplicate groups
curl -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))
}
Request Body
{
  "groups": [
    {
      "duplicateId": "550e8400-e29b-41d4-a716-446655440000",
      "keepAssetIds": [
        "550e8400-e29b-41d4-a716-446655440000"
      ],
      "trashAssetIds": [
        "550e8400-e29b-41d4-a716-446655440000"
      ]
    }
  ]
}
200
[
  {
    "error": "duplicate",
    "errorMessage": "string",
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "success": true
  }
]

Dismiss a duplicate group

DELETE
/api/duplicates/{id}

Dismiss a duplicate group by its ID, unlinking all assets in the group without deleting them.

Parameters

idstring<uuid>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Dismiss a duplicate group
curl -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

GET
/api/faces

Retrieve all faces belonging to an asset.

Parameters

idstring<uuid>requiredquery

Face ID

Response

200OKArray<AssetFaceResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve faces for asset
curl -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))
}
200
[
  {
    "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

POST
/api/faces

Create a new face that has not been discovered by facial recognition. The content of the bounding box is considered a face.

Body

application/json
assetIdstring<uuid>required

Asset ID

heightinteger[-9007199254740991, 9007199254740991]required

Face bounding box height

imageHeightinteger[-9007199254740991, 9007199254740991]required

Image height in pixels

imageWidthinteger[-9007199254740991, 9007199254740991]required

Image width in pixels

personIdstring<uuid>required

Person ID

widthinteger[-9007199254740991, 9007199254740991]required

Face bounding box width

xinteger[-9007199254740991, 9007199254740991]required

Face bounding box X coordinate

yinteger[-9007199254740991, 9007199254740991]required

Face bounding box Y coordinate

Response

201Created

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create a face
curl -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))
}
Request Body
{
  "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

PUT
/api/faces/{id}

Re-assign the face provided in the body to the person identified by the id in the path parameter.

Body

application/json
idstring<uuid>required

Face ID

Parameters

idstring<uuid>requiredpath

Response

200OKPersonResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Re-assign a face to another person
curl -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))
}
Request Body
{
  "id": "550e8400-e29b-41d4-a716-446655440000"
}
200
{
  "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
/api/faces/{id}

Delete a face identified by the id. Optionally can be force deleted.

Body

application/json
forcebooleanrequired

Force delete even if person has other faces

Parameters

idstring<uuid>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete a face
curl -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))
}
Request Body
{
  "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

deprecated
GET
/api/jobs

Retrieve the counts of the current queue, as well as the current status.

Response

200OKQueuesResponseLegacyDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve queue counts and status
curl -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))
}
200
{
  "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

POST
/api/jobs

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

application/json
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-allrequired

Manual job name

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create a manual job
curl -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))
}
Request Body
{
  "name": "person-cleanup"
}

Run jobs

deprecated
PUT
/api/jobs/{name}

Queue 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

application/json
commandQueueCommandstartpauseresumeemptyclear-failedrequired

Queue command to execute

forceboolean

Force the command execution (if applicable)

Parameters

nameQueueNamethumbnailGenerationmetadataExtractionvideoConversionfaceDetectionfacialRecognitionsmartSearchduplicateDetectionbackgroundTaskstorageTemplateMigrationmigrationsearchsidecarlibrarynotificationsbackupDatabaseocrworkflowintegrityCheckeditorrequiredpath

Response

200OKQueueResponseLegacyDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Run jobs
curl -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))
}
Request Body
{
  "command": "start",
  "force": true
}
200
{
  "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

GET
/api/libraries

Retrieve a list of external libraries.

Response

200OKArray<LibraryResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve libraries
curl -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))
}
200
[
  {
    "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

POST
/api/libraries

Create a new external library.

Body

application/json
exclusionPatternsArray<string>

Exclusion patterns (max 128)

importPathsArray<string>

Import paths (max 128)

namestring

Library name

ownerIdstring<uuid>required

Owner user ID

Response

201CreatedLibraryResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create a library
curl -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))
}
Request Body
{
  "exclusionPatterns": [
    "string"
  ],
  "importPaths": [
    "string"
  ],
  "name": "string",
  "ownerId": "550e8400-e29b-41d4-a716-446655440000"
}
201
{
  "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

GET
/api/libraries/{id}

Retrieve an external library by its ID.

Parameters

idstring<uuid>requiredpath

Response

200OKLibraryResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve a library
curl -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))
}
200
{
  "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

deprecated
PUT
/api/libraries/{id}

Update an existing external library.

Body

application/json
exclusionPatternsArray<string>

Exclusion patterns (max 128)

importPathsArray<string>

Import paths (max 128)

namestring

Library name

Parameters

idstring<uuid>requiredpath

Response

200OKLibraryResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update a library
curl -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))
}
Request Body
{
  "exclusionPatterns": [
    "string"
  ],
  "importPaths": [
    "string"
  ],
  "name": "string"
}
200
{
  "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
/api/libraries/{id}

Delete an external library by its ID.

Parameters

idstring<uuid>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete a library
curl -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

POST
/api/libraries/{id}/scan

Queue a scan for the external library to find and import new assets.

Parameters

idstring<uuid>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Scan a library
curl -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

GET
/api/libraries/{id}/statistics

Retrieve statistics for a specific external library, including number of videos, images, and storage usage.

Parameters

idstring<uuid>requiredpath

Response

200OKLibraryStatsResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve library statistics
curl -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))
}
200
{
  "photos": -9007199254740991,
  "total": -9007199254740991,
  "usage": -9007199254740991,
  "videos": -9007199254740991
}

Validate library settings

POST
/api/libraries/{id}/validate

Validate the settings of an external library.

Body

application/json
exclusionPatternsArray<string>

Exclusion patterns (max 128)

importPathsArray<string>

Import paths to validate (max 128)

Parameters

idstring<uuid>requiredpath

Response

200OKValidateLibraryResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Validate library settings
curl -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))
}
Request Body
{
  "exclusionPatterns": [
    "string"
  ],
  "importPaths": [
    "string"
  ]
}
200
{
  "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
/api/admin/integrity/report

Get all flagged items by integrity report type

Parameters

cursorstringquery

Cursor for pagination

limitinteger(0, 9007199254740991]500query

Number of items per page

typeIntegrityReportuntracked_filemissing_filechecksum_mismatchrequiredquery

Response

200OKIntegrityReportResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get integrity report by type
curl -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))
}
200
{
  "items": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "path": "string",
      "type": "untracked_file"
    }
  ],
  "nextCursor": "string"
}

Delete integrity report item

DELETE
/api/admin/integrity/report/{id}

Delete a given report item and perform corresponding deletion (e.g. trash asset, delete file)

Parameters

idstring<uuid>requiredpath

Response

200OK

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete integrity report item
curl -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

GET
/api/admin/integrity/report/{id}/file

Download the untracked/broken file if one exists

Parameters

idstring<uuid>requiredpath

Response

200OKstring<binary>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Download flagged file
curl -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))
}
200
"<binary>"

Export integrity report by type as CSV

GET
/api/admin/integrity/report/{type}/csv

Get all integrity report entries for a given type as a CSV

Parameters

typeIntegrityReportuntracked_filemissing_filechecksum_mismatchrequiredpath

Response

200OKstring<binary>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Export integrity report by type as CSV
curl -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))
}
200
"<binary>"

Get integrity report summary

GET
/api/admin/integrity/summary

Get a count of the items flagged in each integrity report

Response

200OKIntegrityReportSummaryResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get integrity report summary
curl -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))
}
200
{
  "checksum_mismatch": 0,
  "missing_file": 0,
  "untracked_file": 0
}

Set maintenance mode

POST
/api/admin/maintenance

Put Immich into or take it out of maintenance mode

Body

application/json
actionMaintenanceActionstartendselect_database_restorerestore_databaserequired

Maintenance action

restoreBackupFilenamestring

Restore backup filename

Response

201Created

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Set maintenance mode
curl -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))
}
Request Body
{
  "action": "start",
  "restoreBackupFilename": "string"
}

Detect existing install

GET
/api/admin/maintenance/detect-install

Collect integrity checks and other heuristics about local data.

Response

200OKMaintenanceDetectInstallResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Detect existing install
curl -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))
}
200
{
  "storage": [
    {
      "files": -9007199254740991,
      "folder": "encoded-video",
      "readable": true,
      "writable": true
    }
  ]
}

Log into maintenance mode

POST
/api/admin/maintenance/login

Login with maintenance token or cookie to receive current information and perform further actions.

Body

application/json
tokenstring

Maintenance token

Response

201CreatedMaintenanceAuthDto
Log into maintenance mode
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))
}
Request Body
{
  "token": "string"
}
201
{
  "username": "string"
}

Get maintenance mode status

GET
/api/admin/maintenance/status

Fetch information about the currently running maintenance action.

Response

200OKMaintenanceStatusResponseDto
Get maintenance mode status
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))
}
200
{
  "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

GET
/api/map/markers

Retrieve a list of latitude and longitude coordinates for every asset with location data.

Parameters

fileCreatedAfterstring<date-time>query

Filter assets created after this date

fileCreatedBeforestring<date-time>query

Filter assets created before this date

isArchivedbooleanquery

Filter by archived status

isFavoritebooleanquery

Filter by favorite status

withPartnersbooleanquery

Include partner assets

withSharedAlbumsbooleanquery

Include shared album assets

Response

200OKArray<MapMarkerResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve map markers
curl -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))
}
200
[
  {
    "city": "string",
    "country": "string",
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "lat": 0,
    "lon": 0,
    "state": "string"
  }
]

Reverse geocode coordinates

GET
/api/map/reverse-geocode

Retrieve location information (e.g., city, country) for given latitude and longitude coordinates.

Parameters

latnumber<double>requiredquery

Latitude (-90 to 90)

lonnumber<double>requiredquery

Longitude (-180 to 180)

Response

200OKArray<MapReverseGeocodeResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Reverse geocode coordinates
curl -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))
}
200
[
  {
    "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

GET
/api/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>query

Filter by date

isSavedbooleanquery

Filter by saved status

isTrashedbooleanquery

Include trashed memories

orderMemorySearchOrderascdescrandomquery
sizeinteger[1, 9007199254740991]query

Number of memories to return

typeMemoryTypeon_this_dayquery

Response

200OKArray<MemoryResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve memories
curl -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))
}
200
[
  {
    "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

POST
/api/memories

Create a new memory by providing a name, description, and a list of asset IDs to include in the memory.

Body

application/json
assetIdsArray<string>

Asset IDs to associate with memory

dataOnThisDayDtorequired
Show child attributes
yearinteger[1000, 9999]required

Year for on this day memory

hideAtstring<date-time>

Date when memory should be hidden

isSavedboolean

Is memory saved

memoryAtstring<date-time>required

Memory date

seenAtstring<date-time>

Date when memory was seen

showAtstring<date-time>

Date when memory should be shown

typeMemoryTypeon_this_dayrequired

Memory type

Response

201CreatedMemoryResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create a memory
curl -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))
}
Request Body
{
  "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"
}
201
{
  "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

GET
/api/memories/statistics

Retrieve statistics about memories, such as total count and other relevant metrics.

Parameters

forstring<date-time>query

Filter by date

isSavedbooleanquery

Filter by saved status

isTrashedbooleanquery

Include trashed memories

orderMemorySearchOrderascdescrandomquery
sizeinteger[1, 9007199254740991]query

Number of memories to return

typeMemoryTypeon_this_dayquery

Response

200OKMemoryStatisticsResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve memories statistics
curl -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))
}
200
{
  "total": -9007199254740991
}

Retrieve a memory

GET
/api/memories/{id}

Retrieve a specific memory by its ID.

Parameters

idstring<uuid>requiredpath

Response

200OKMemoryResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve a memory
curl -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))
}
200
{
  "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

deprecated
PUT
/api/memories/{id}

Update an existing memory by its ID.

Body

application/json
isSavedboolean

Is memory saved

memoryAtstring<date-time>

Memory date

seenAtstring<date-time>

Date when memory was seen

Parameters

idstring<uuid>requiredpath

Response

200OKMemoryResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update a memory
curl -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))
}
Request Body
{
  "isSaved": true,
  "memoryAt": "2024-01-01T00:00:00.000Z",
  "seenAt": "2024-01-01T00:00:00.000Z"
}
200
{
  "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
/api/memories/{id}

Delete a specific memory by its ID.

Parameters

idstring<uuid>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete a memory
curl -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

PUT
/api/memories/{id}/assets

Add a list of asset IDs to a specific memory.

Body

application/json
idsArray<string>required

IDs to process

Parameters

idstring<uuid>requiredpath

Response

200OKArray<BulkIdResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Add assets to a memory
curl -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))
}
Request Body
{
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}
200
[
  {
    "error": "duplicate",
    "errorMessage": "string",
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "success": true
  }
]

Remove assets from a memory

DELETE
/api/memories/{id}/assets

Remove a list of asset IDs from a specific memory.

Body

application/json
idsArray<string>required

IDs to process

Parameters

idstring<uuid>requiredpath

Response

200OKArray<BulkIdResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Remove assets from a memory
curl -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))
}
Request Body
{
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}
200
[
  {
    "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

GET
/api/notifications

Retrieve a list of notifications.

Parameters

idstring<uuid>query

Filter by notification ID

levelNotificationLevelsuccesserrorwarninginfoquery
typeNotificationTypeJobFailedBackupFailedSystemMessageAlbumInviteAlbumUpdateCustomquery
unreadbooleanquery

Filter by unread status

Response

200OKArray<NotificationDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve notifications
curl -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))
}
200
[
  {
    "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

PUT
/api/notifications

Update a list of notifications. Allows to bulk-set the read status of notifications.

Body

application/json
idsArray<string>required

Notification IDs to update

readAtstring<date-time> | null

Date when notifications were read

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update notifications
curl -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))
}
Request Body
{
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "readAt": "2024-01-01T00:00:00.000Z"
}

Delete notifications

DELETE
/api/notifications

Delete a list of notifications at once.

Body

application/json
idsArray<string>required

Notification IDs to delete

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete notifications
curl -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))
}
Request Body
{
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}

Get a notification

GET
/api/notifications/{id}

Retrieve a specific notification identified by id.

Parameters

idstring<uuid>requiredpath

Response

200OKNotificationDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get a notification
curl -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))
}
200
{
  "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

PUT
/api/notifications/{id}

Update a specific notification to set its read status.

Body

application/json
readAtstring<date-time> | null

Date when notification was read

Parameters

idstring<uuid>requiredpath

Response

200OKNotificationDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update a notification
curl -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))
}
Request Body
{
  "readAt": "2024-01-01T00:00:00.000Z"
}
200
{
  "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
/api/notifications/{id}

Delete a specific notification.

Parameters

idstring<uuid>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete a notification
curl -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

POST
/api/admin/notifications

Create a new notification for a specific user.

Body

application/json
dataobject

Additional notification data

descriptionstring | null

Notification description

levelNotificationLevelsuccesserrorwarninginfo

Notification level

readAtstring<date-time> | null

Date when notification was read

titlestringrequired

Notification title

typeNotificationTypeJobFailedBackupFailedSystemMessageAlbumInviteAlbumUpdateCustom

Notification type

userIdstring<uuid>required

User ID to send notification to

Response

201CreatedNotificationDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create a notification
curl -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))
}
Request Body
{
  "data": {},
  "description": "string",
  "level": "success",
  "readAt": "2024-01-01T00:00:00.000Z",
  "title": "string",
  "type": "JobFailed",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}
201
{
  "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

POST
/api/admin/notifications/templates/{name}

Retrieve a preview of the provided email template.

Body

application/json
templatestringrequired

Template name

Parameters

namestringrequiredpath

Response

200OKTemplateResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Render email template
curl -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))
}
Request Body
{
  "template": "string"
}
200
{
  "html": "string",
  "name": "string"
}

Send test email

POST
/api/admin/notifications/test-email

Send a test email using the provided SMTP configuration.

Body

application/json
enabledbooleanrequired

Whether SMTP email notifications are enabled

fromstringrequired

Email address to send from

replyTostringrequired

Email address for replies

transportSystemConfigSmtpTransportDtorequired
Show child attributes
hoststringrequired

SMTP server hostname

ignoreCertbooleanrequired

Whether to ignore SSL certificate errors

passwordstringrequired

SMTP password

portinteger[0, 65535]required

SMTP server port

securebooleanrequired

Whether to use secure connection (TLS/SSL)

usernamestringrequired

SMTP username

Response

200OKTestEmailResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Send test email
curl -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))
}
Request Body
{
  "enabled": true,
  "from": "string",
  "replyTo": "string",
  "transport": {
    "host": "string",
    "ignoreCert": true,
    "password": "string",
    "port": 0,
    "secure": true,
    "username": "string"
  }
}
200
{
  "messageId": "string"
}

Partners

A partner is a link with another user that allows sharing of assets between two users.

Retrieve partners

GET
/api/partners

Retrieve a list of partners with whom assets are shared.

Parameters

directionPartnerDirectionshared-byshared-withrequiredquery

Response

200OKArray<PartnerResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve partners
curl -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))
}
200
[
  {
    "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

POST
/api/partners

Create a new partner to share assets with.

Body

application/json
sharedWithIdstring<uuid>required

User ID to share with

Response

201CreatedPartnerResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create a partner
curl -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))
}
Request Body
{
  "sharedWithId": "550e8400-e29b-41d4-a716-446655440000"
}
201
{
  "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

deprecated
POST
/api/partners/{id}

Create a new partner to share assets with.

Parameters

idstring<uuid>requiredpath

Response

201CreatedPartnerResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create a partner
curl -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))
}
201
{
  "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

PUT
/api/partners/{id}

Specify whether a partner's assets should appear in the user's timeline.

Body

application/json
inTimelinebooleanrequired

Show partner assets in timeline

Parameters

idstring<uuid>requiredpath

Response

200OKPartnerResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update a partner
curl -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))
}
Request Body
{
  "inTimeline": true
}
200
{
  "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

DELETE
/api/partners/{id}

Stop sharing assets with a partner.

Parameters

idstring<uuid>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Remove a partner
curl -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

GET
/api/people

Retrieve a list of all people.

Parameters

closestAssetIdstring<uuid>query

Closest asset ID for similarity search

closestPersonIdstring<uuid>query

Closest person ID for similarity search

pageinteger[1, 9007199254740991]1query

Page number for pagination

sizeinteger[1, 1000]500query

Number of items per page

withHiddenbooleanquery

Include hidden people

Response

200OKPeopleResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get all people
curl -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))
}
200
{
  "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

POST
/api/people

Create a new person that can have multiple faces assigned to them.

Body

application/json
birthDatestring<date> | null

Person date of birth

colorstring | null

Person color (hex)

isFavoriteboolean

Mark as favorite

isHiddenboolean

Person visibility (hidden)

namestring

Person name

Response

201CreatedPersonResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create a person
curl -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))
}
Request Body
{
  "birthDate": "2024-01-15",
  "color": "string",
  "isFavorite": true,
  "isHidden": true,
  "name": "string"
}
201
{
  "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

PUT
/api/people

Bulk update multiple people at once.

Body

application/json
peopleArray<PeopleUpdateItem>required

People to update

Show child attributes
birthDatestring<date> | null

Person date of birth

colorstring | null

Person color (hex)

featureFaceAssetIdstring<uuid>

Asset ID used for feature face thumbnail

idstring<uuid>required

Person ID

isFavoriteboolean

Mark as favorite

isHiddenboolean

Person visibility (hidden)

namestring

Person name

Response

200OKArray<BulkIdResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update people
curl -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))
}
Request Body
{
  "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"
    }
  ]
}
200
[
  {
    "error": "duplicate",
    "errorMessage": "string",
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "success": true
  }
]

Delete people

DELETE
/api/people

Bulk delete a list of people at once.

Body

application/json
idsArray<string>required

IDs to process

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete people
curl -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))
}
Request Body
{
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}

Get a person

GET
/api/people/{id}

Retrieve a person by id.

Parameters

idstring<uuid>requiredpath

Response

200OKPersonResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get a person
curl -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))
}
200
{
  "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

deprecated
PUT
/api/people/{id}

Update an individual person.

Body

application/json
birthDatestring<date> | null

Person date of birth

colorstring | null

Person color (hex)

featureFaceAssetIdstring<uuid>

Asset ID used for feature face thumbnail

isFavoriteboolean

Mark as favorite

isHiddenboolean

Person visibility (hidden)

namestring

Person name

Parameters

idstring<uuid>requiredpath

Response

200OKPersonResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update person
curl -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))
}
Request Body
{
  "birthDate": "2024-01-15",
  "color": "string",
  "featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
  "isFavorite": true,
  "isHidden": true,
  "name": "string"
}
200
{
  "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
/api/people/{id}

Delete an individual person.

Parameters

idstring<uuid>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete person
curl -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

POST
/api/people/{id}/merge

Merge a list of people into the person specified in the path parameter.

Body

application/json
idsArray<string>required

Person IDs to merge

Parameters

idstring<uuid>requiredpath

Response

200OKArray<BulkIdResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Merge people
curl -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))
}
Request Body
{
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}
200
[
  {
    "error": "duplicate",
    "errorMessage": "string",
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "success": true
  }
]

Reassign faces

PUT
/api/people/{id}/reassign

Bulk reassign a list of faces to a different person.

Body

application/json
dataArray<AssetFaceUpdateItem>required

Face update items

Show child attributes
assetIdstring<uuid>required

Asset ID

personIdstring<uuid>required

Person ID

Parameters

idstring<uuid>requiredpath

Response

200OKArray<PersonResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Reassign faces
curl -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))
}
Request Body
{
  "data": [
    {
      "assetId": "550e8400-e29b-41d4-a716-446655440000",
      "personId": "550e8400-e29b-41d4-a716-446655440000"
    }
  ]
}
200
[
  {
    "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

GET
/api/people/{id}/statistics

Retrieve statistics about a specific person.

Parameters

idstring<uuid>requiredpath

Response

200OKPersonStatisticsResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get person statistics
curl -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))
}
200
{
  "assets": -9007199254740991
}

Get person thumbnail

GET
/api/people/{id}/thumbnail

Retrieve the thumbnail file for a person.

Parameters

idstring<uuid>requiredpath

Response

200OKstring<binary>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get person thumbnail
curl -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))
}
200
"<binary>"

Plugins

A plugin is an installed module that makes filters and actions available for the workflow feature.

List all plugins

GET
/api/plugins

Retrieve a list of plugins available to the authenticated user.

Parameters

descriptionstringquery
enabledbooleanquery

Whether the plugin is enabled

idstring<uuid>query

Plugin ID

namestringquery
titlestringquery
versionstringquery

Response

200OKArray<PluginResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
List all plugins
curl -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))
}
200
[
  {
    "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

GET
/api/plugins/methods

Retrieve a list of plugin methods

Parameters

descriptionstringquery
enabledbooleanquery

Whether the plugin method is enabled

idstring<uuid>query

Plugin method ID

namestringquery
pluginNamestringquery

Plugin name

pluginVersionstringquery

Plugin version

titlestringquery
triggerWorkflowTriggerAssetCreateAssetMetadataExtractionquery

Workflow trigger

typeWorkflowTypeAssetV1query

Workflow types

Response

200OKArray<PluginMethodResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve plugin methods
curl -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))
}
200
[
  {
    "description": "string",
    "hostFunctions": true,
    "key": "string",
    "name": "string",
    "schema": {},
    "title": "string",
    "types": [
      "AssetV1"
    ],
    "uiHints": [
      "string"
    ]
  }
]

Retrieve workflow templates

GET
/api/plugins/templates

Retrieve workflow templates provided by installed plugins

Response

200OKArray<PluginTemplateResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve workflow templates
curl -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))
}
200
[
  {
    "description": "string",
    "key": "string",
    "steps": [
      {
        "config": {},
        "enabled": true,
        "method": "string"
      }
    ],
    "title": "string",
    "trigger": "AssetCreate",
    "uiHints": [
      "string"
    ]
  }
]

Retrieve a plugin

GET
/api/plugins/{id}

Retrieve information about a specific plugin by its ID.

Parameters

idstring<uuid>requiredpath

Response

200OKPluginResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve a plugin
curl -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))
}
200
{
  "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

GET
/api/queues

Retrieves a list of queues.

Response

200OKArray<QueueResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
List all queues
curl -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))
}
200
[
  {
    "isPaused": true,
    "name": "thumbnailGeneration",
    "statistics": {
      "active": -9007199254740991,
      "completed": -9007199254740991,
      "delayed": -9007199254740991,
      "failed": -9007199254740991,
      "paused": -9007199254740991,
      "waiting": -9007199254740991
    }
  }
]

Retrieve a queue

GET
/api/queues/{name}

Retrieves a specific queue by its name.

Parameters

nameQueueNamethumbnailGenerationmetadataExtractionvideoConversionfaceDetectionfacialRecognitionsmartSearchduplicateDetectionbackgroundTaskstorageTemplateMigrationmigrationsearchsidecarlibrarynotificationsbackupDatabaseocrworkflowintegrityCheckeditorrequiredpath

Response

200OKQueueResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve a queue
curl -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))
}
200
{
  "isPaused": true,
  "name": "thumbnailGeneration",
  "statistics": {
    "active": -9007199254740991,
    "completed": -9007199254740991,
    "delayed": -9007199254740991,
    "failed": -9007199254740991,
    "paused": -9007199254740991,
    "waiting": -9007199254740991
  }
}

Update a queue

PUT
/api/queues/{name}

Change the paused status of a specific queue.

Body

application/json
isPausedboolean

Whether to pause the queue

Parameters

nameQueueNamethumbnailGenerationmetadataExtractionvideoConversionfaceDetectionfacialRecognitionsmartSearchduplicateDetectionbackgroundTaskstorageTemplateMigrationmigrationsearchsidecarlibrarynotificationsbackupDatabaseocrworkflowintegrityCheckeditorrequiredpath

Response

200OKQueueResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update a queue
curl -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))
}
Request Body
{
  "isPaused": true
}
200
{
  "isPaused": true,
  "name": "thumbnailGeneration",
  "statistics": {
    "active": -9007199254740991,
    "completed": -9007199254740991,
    "delayed": -9007199254740991,
    "failed": -9007199254740991,
    "paused": -9007199254740991,
    "waiting": -9007199254740991
  }
}

Retrieve queue jobs

GET
/api/queues/{name}/jobs

Retrieves a list of queue jobs from the specified queue.

Parameters

nameQueueNamethumbnailGenerationmetadataExtractionvideoConversionfaceDetectionfacialRecognitionsmartSearchduplicateDetectionbackgroundTaskstorageTemplateMigrationmigrationsearchsidecarlibrarynotificationsbackupDatabaseocrworkflowintegrityCheckeditorrequiredpath
statusArray<QueueJobStatus>activefailedcompleteddelayedwaitingpausedquery

Filter jobs by status

Response

200OKArray<QueueJobResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve queue jobs
curl -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))
}
200
[
  {
    "data": {},
    "id": "string",
    "name": "AssetDelete",
    "timestamp": -9007199254740991
  }
]

Empty a queue

DELETE
/api/queues/{name}/jobs

Removes all jobs from the specified queue.

Body

application/json
failedboolean

If true, will also remove failed jobs from the queue.

Parameters

nameQueueNamethumbnailGenerationmetadataExtractionvideoConversionfaceDetectionfacialRecognitionsmartSearchduplicateDetectionbackgroundTaskstorageTemplateMigrationmigrationsearchsidecarlibrarynotificationsbackupDatabaseocrworkflowintegrityCheckeditorrequiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Empty a queue
curl -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))
}
Request Body
{
  "failed": true
}

Retrieve assets by city

GET
/api/search/cities

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

200OKArray<AssetResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve assets by city
curl -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))
}
200
[
  {
    "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

GET
/api/search/explore

Retrieve data for the explore section, such as popular people and places.

Response

200OKArray<SearchExploreResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve explore data
curl -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))
}
200
[
  {
    "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

POST
/api/search/large-assets

Search for assets that are considered large based on specified criteria.

Parameters

albumIdsArray<string>query

Filter by album IDs

citystring | nullquery

Filter by city name

countrystring | nullquery

Filter by country name

createdAfterstring<date-time>query

Filter by creation date (after)

createdBeforestring<date-time>query

Filter by creation date (before)

isEncodedbooleanquery

Filter by encoded status

isFavoritebooleanquery

Filter by favorite status

isMotionbooleanquery

Filter by motion photo status

isNotInAlbumbooleanquery

Filter assets not in any album

isOfflinebooleanquery

Filter by offline status

lensModelstring | nullquery

Filter by lens model

libraryIdstring<uuid> | nullquery

Library ID to filter by

makestring | nullquery

Filter by camera make

minFileSizeinteger[0, 9007199254740991]query

Minimum file size in bytes

modelstring | nullquery

Filter by camera model

ocrstringquery

Filter by OCR text content

personIdsArray<string>query

Filter by person IDs

ratinginteger | null[1, 5]query

Filter by rating [1-5], or null for unrated

sizeinteger[1, 1000]query

Number of results to return

statestring | nullquery

Filter by state/province name

tagIdsArray<string> | nullquery

Filter by tag IDs

takenAfterstring<date-time>query

Filter by taken date (after)

takenBeforestring<date-time>query

Filter by taken date (before)

trashedAfterstring<date-time>query

Filter by trash date (after)

trashedBeforestring<date-time>query

Filter by trash date (before)

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERquery
updatedAfterstring<date-time>query

Filter by update date (after)

updatedBeforestring<date-time>query

Filter by update date (before)

visibilityAssetVisibilityarchivetimelinehiddenlockedquery
withDeletedbooleanquery

Include deleted assets

withExifbooleanquery

Include EXIF data in response

Response

200OKArray<AssetResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Search large assets
curl -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))
}
200
[
  {
    "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

POST
/api/search/metadata

Search for assets based on various metadata criteria.

Body

application/json
albumIdsArray<string>

Filter by album IDs

checksumstring

Filter by file checksum

citystring | null

Filter by city name

countrystring | null

Filter by country name

createdAfterstring<date-time>

Filter by creation date (after)

createdBeforestring<date-time>

Filter by creation date (before)

descriptionstring

Filter by description text

encodedVideoPathstring

Filter by encoded video file path

idstring<uuid>

Filter by asset ID

isEncodedboolean

Filter by encoded status

isFavoriteboolean

Filter by favorite status

isMotionboolean

Filter by motion photo status

isNotInAlbumboolean

Filter assets not in any album

isOfflineboolean

Filter by offline status

lensModelstring | null

Filter by lens model

libraryIdstring<uuid> | null

Library ID to filter by

makestring | null

Filter by camera make

modelstring | null

Filter by camera model

ocrstring

Filter by OCR text content

orderAssetOrderascdescdesc

Asset sort order

originalFileNamestring

Filter by original file name

originalPathstring

Filter by original file path

pageinteger[1, 9007199254740991]

Page number

personIdsArray<string>

Filter by person IDs

previewPathstring

Filter 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 | null

Filter by state/province name

tagIdsArray<string> | null

Filter by tag IDs

takenAfterstring<date-time>

Filter by taken date (after)

takenBeforestring<date-time>

Filter by taken date (before)

thumbnailPathstring

Filter by thumbnail file path

trashedAfterstring<date-time>

Filter by trash date (after)

trashedBeforestring<date-time>

Filter by trash date (before)

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHER

Asset type

updatedAfterstring<date-time>

Filter by update date (after)

updatedBeforestring<date-time>

Filter by update date (before)

visibilityAssetVisibilityarchivetimelinehiddenlocked

Asset visibility

withDeletedboolean

Include deleted assets

withExifboolean

Include EXIF data in response

withPeopleboolean

Include people data in response

withStackedboolean

Include stacked assets

Response

200OKSearchResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Search assets by metadata
curl -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))
}
Request Body
{
  "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
}
200
{
  "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

GET
/api/search/person

Search for people by name.

Parameters

namestringrequiredquery

Person name to search for

withHiddenbooleanquery

Include hidden people

Response

200OKArray<PersonResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Search people
curl -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))
}
200
[
  {
    "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

GET
/api/search/places

Search for places by name.

Parameters

namestringrequiredquery

Place name to search for

Response

200OKArray<PlacesResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Search places
curl -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))
}
200
[
  {
    "admin1name": "string",
    "admin2name": "string",
    "latitude": 0,
    "longitude": 0,
    "name": "string"
  }
]

Search random assets

POST
/api/search/random

Retrieve a random selection of assets based on the provided criteria.

Body

application/json
albumIdsArray<string>

Filter by album IDs

citystring | null

Filter by city name

countrystring | null

Filter by country name

createdAfterstring<date-time>

Filter by creation date (after)

createdBeforestring<date-time>

Filter by creation date (before)

isEncodedboolean

Filter by encoded status

isFavoriteboolean

Filter by favorite status

isMotionboolean

Filter by motion photo status

isNotInAlbumboolean

Filter assets not in any album

isOfflineboolean

Filter by offline status

lensModelstring | null

Filter by lens model

libraryIdstring<uuid> | null

Library ID to filter by

makestring | null

Filter by camera make

modelstring | null

Filter by camera model

ocrstring

Filter 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 | null

Filter by state/province name

tagIdsArray<string> | null

Filter 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)

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHER

Asset type

updatedAfterstring<date-time>

Filter by update date (after)

updatedBeforestring<date-time>

Filter by update date (before)

visibilityAssetVisibilityarchivetimelinehiddenlocked

Asset visibility

withDeletedboolean

Include deleted assets

withExifboolean

Include EXIF data in response

withPeopleboolean

Include people data in response

withStackedboolean

Include stacked assets

Response

200OKArray<AssetResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Search random assets
curl -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))
}
Request Body
{
  "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
}
200
[
  {
    "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

POST
/api/search/smart

Perform a smart search for assets by using machine learning vectors to determine relevance.

Body

application/json
albumIdsArray<string>

Filter by album IDs

citystring | null

Filter by city name

countrystring | null

Filter by country name

createdAfterstring<date-time>

Filter by creation date (after)

createdBeforestring<date-time>

Filter by creation date (before)

isEncodedboolean

Filter by encoded status

isFavoriteboolean

Filter by favorite status

isMotionboolean

Filter by motion photo status

isNotInAlbumboolean

Filter assets not in any album

isOfflineboolean

Filter by offline status

languagestring

Search language code

lensModelstring | null

Filter by lens model

libraryIdstring<uuid> | null

Library ID to filter by

makestring | null

Filter by camera make

modelstring | null

Filter by camera model

ocrstring

Filter by OCR text content

pageinteger[1, 9007199254740991]

Page number

personIdsArray<string>

Filter by person IDs

querystring

Natural 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 | null

Filter by state/province name

tagIdsArray<string> | null

Filter 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)

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHER

Asset type

updatedAfterstring<date-time>

Filter by update date (after)

updatedBeforestring<date-time>

Filter by update date (before)

visibilityAssetVisibilityarchivetimelinehiddenlocked

Asset visibility

withDeletedboolean

Include deleted assets

withExifboolean

Include EXIF data in response

Response

200OKSearchResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Smart asset search
curl -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))
}
Request Body
{
  "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
}
200
{
  "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

POST
/api/search/statistics

Retrieve statistical data about assets based on search criteria, such as the total matching count.

Body

application/json
albumIdsArray<string>

Filter by album IDs

citystring | null

Filter by city name

countrystring | null

Filter by country name

createdAfterstring<date-time>

Filter by creation date (after)

createdBeforestring<date-time>

Filter by creation date (before)

descriptionstring

Filter by description text

isEncodedboolean

Filter by encoded status

isFavoriteboolean

Filter by favorite status

isMotionboolean

Filter by motion photo status

isNotInAlbumboolean

Filter assets not in any album

isOfflineboolean

Filter by offline status

lensModelstring | null

Filter by lens model

libraryIdstring<uuid> | null

Library ID to filter by

makestring | null

Filter by camera make

modelstring | null

Filter by camera model

ocrstring

Filter by OCR text content

personIdsArray<string>

Filter by person IDs

ratinginteger | null[1, 5]

Filter by rating [1-5], or null for unrated

statestring | null

Filter by state/province name

tagIdsArray<string> | null

Filter 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)

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHER

Asset type

updatedAfterstring<date-time>

Filter by update date (after)

updatedBeforestring<date-time>

Filter by update date (before)

visibilityAssetVisibilityarchivetimelinehiddenlocked

Asset visibility

Response

200OKSearchStatisticsResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Search asset statistics
curl -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))
}
Request Body
{
  "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"
}
200
{
  "total": -9007199254740991
}

Retrieve search suggestions

GET
/api/search/suggestions

Retrieve search suggestions based on partial input. This endpoint is used for typeahead search features.

Parameters

countrystringquery

Filter by country

includeNullbooleanquery

Include null values in suggestions

lensModelstringquery

Filter by lens model

makestringquery

Filter by camera make

modelstringquery

Filter by camera model

statestringquery

Filter by state/province

typeSearchSuggestionTypecountrystatecitycamera-makecamera-modelcamera-lens-modelrequiredquery

Response

200OKArray<string>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve search suggestions
curl -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))
}
200
[
  "string"
]

Server

Information about the current server deployment, including version and build information, available features, supported media types, and more.

Get server information

GET
/api/server/about

Retrieve a list of information about the server.

Response

200OKServerAboutResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get server information
curl -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))
}
200
{
  "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 config

GET
/api/server/config

Retrieve the current server configuration.

Response

200OKServerConfigDto
Get config
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))
}
200
{
  "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

GET
/api/server/features

Retrieve available features supported by this server.

Response

200OKServerFeaturesDto
Get features
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))
}
200
{
  "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

GET
/api/server/license

Retrieve information about whether the server currently has a product key registered.

Response

200OKUserLicense
404Not Found

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get product key
curl -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))
}
200
{
  "activatedAt": "2024-01-01T00:00:00.000Z",
  "activationKey": "string",
  "licenseKey": "string"
}

Set server product key

PUT
/api/server/license

Validate and set the server product key if successful.

Body

application/json
activationKeystringrequired

Activation key

licenseKeystringrequired

License key (format: /^IM(SV|CL)(-[\dA-Za-z]{4}){8}$/)

Response

200OKUserLicense

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Set server product key
curl -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))
}
Request Body
{
  "activationKey": "string",
  "licenseKey": "string"
}
200
{
  "activatedAt": "2024-01-01T00:00:00.000Z",
  "activationKey": "string",
  "licenseKey": "string"
}

Delete server product key

DELETE
/api/server/license

Delete the currently set server product key.

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete server product key
curl -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

GET
/api/server/media-types

Retrieve all media types supported by the server.

Response

200OKServerMediaTypesResponseDto
Get supported media types
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))
}
200
{
  "image": [
    "string"
  ],
  "sidecar": [
    "string"
  ],
  "video": [
    "string"
  ]
}

Ping

GET
/api/server/ping

Pong

Response

200OKServerPingResponse
Ping
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))
}
200
{
  "res": "pong"
}

Get statistics

GET
/api/server/statistics

Retrieve statistics about the entire Immich instance such as asset counts.

Response

200OKServerStatsResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get statistics
curl -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))
}
200
{
  "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

GET
/api/server/storage

Retrieve the current storage utilization information of the server.

Response

200OKServerStorageResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get storage
curl -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))
}
200
{
  "diskAvailable": "string",
  "diskAvailableRaw": -9007199254740991,
  "diskSize": "string",
  "diskSizeRaw": -9007199254740991,
  "diskUsagePercentage": 0,
  "diskUse": "string",
  "diskUseRaw": -9007199254740991
}

Get server version

GET
/api/server/version

Retrieve the current server version in semantic versioning (semver) format.

Response

200OKServerVersionResponseDto
Get server version
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))
}
200
{
  "major": 0,
  "minor": 0,
  "patch": 0,
  "prerelease": 0
}

Get version check status

GET
/api/server/version-check

Retrieve information about the last time the version check ran.

Response

200OKVersionCheckStateResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get version check status
curl -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))
}
200
{
  "checkedAt": "string",
  "releaseVersion": "string"
}

Get version history

GET
/api/server/version-history

Retrieve a list of past versions the server has been on.

Response

200OKArray<ServerVersionHistoryResponseDto>
Get version history
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))
}
200
[
  {
    "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

GET
/api/sessions

Retrieve a list of sessions for the user.

Response

200OKArray<SessionResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve sessions
curl -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))
}
200
[
  {
    "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

POST
/api/sessions

Create a session as a child to the current session. This endpoint is used for casting.

Body

application/json
deviceOSstring

Device OS

deviceTypestring

Device type

durationinteger[1, 9007199254740991]

Session duration in seconds

Response

201CreatedSessionCreateResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create a session
curl -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))
}
Request Body
{
  "deviceOS": "string",
  "deviceType": "string",
  "duration": 1
}
201
{
  "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
/api/sessions

Delete all sessions for the user. This will not delete the current session.

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete all sessions
curl -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

deprecated
PUT
/api/sessions/{id}

Update a specific session identified by id.

Body

application/json
isPendingSyncResetboolean

Reset pending sync state

Parameters

idstring<uuid>requiredpath

Response

200OKSessionResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update a session
curl -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))
}
Request Body
{
  "isPendingSyncReset": true
}
200
{
  "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
/api/sessions/{id}

Delete a specific session by id.

Parameters

idstring<uuid>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete a session
curl -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

POST
/api/sessions/{id}/lock

Lock a specific session by id.

Parameters

idstring<uuid>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Lock a session
curl -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))
}

Create a shared link

POST
/api/shared-links

Create a new shared link.

Body

application/json
albumIdstring<uuid>

Album ID (for album sharing)

allowDownloadbooleantrue

Allow downloads

allowUploadboolean

Allow uploads

assetIdsArray<string>

Asset IDs (for individual assets)

descriptionstring | null

Link description

expiresAtstring<date-time> | nullnull

Expiration date

passwordstring | null

Link password

showMetadatabooleantrue

Show metadata

slugstring | null

Custom URL slug

typeSharedLinkTypeALBUMINDIVIDUALrequired

Shared link type

Response

201CreatedSharedLinkResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create a shared link
curl -X POST '/api/shared-links' \
  -H 'Content-Type: application/json' \
  -d '{
    "albumId": "550e8400-e29b-41d4-a716-446655440000",
    "allowDownload": true,
    "allowUpload": true,
    "assetIds": [
      "550e8400-e29b-41d4-a716-446655440000"
    ],
    "description": "string",
    "expiresAt": "2024-01-01T00:00:00.000Z",
    "password": "string",
    "showMetadata": true,
    "slug": "string",
    "type": "ALBUM"
  }'
const response = await fetch('/api/shared-links', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "albumId": "550e8400-e29b-41d4-a716-446655440000",
      "allowDownload": true,
      "allowUpload": true,
      "assetIds": [
        "550e8400-e29b-41d4-a716-446655440000"
      ],
      "description": "string",
      "expiresAt": "2024-01-01T00:00:00.000Z",
      "password": "string",
      "showMetadata": true,
      "slug": "string",
      "type": "ALBUM"
    }),
});

const data = await response.json();
import requests

payload = {
  "albumId": "550e8400-e29b-41d4-a716-446655440000",
  "allowDownload": True,
  "allowUpload": True,
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "description": "string",
  "expiresAt": "2024-01-01T00:00:00.000Z",
  "password": "string",
  "showMetadata": True,
  "slug": "string",
  "type": "ALBUM"
}

response = requests.post('/api/shared-links', json=payload)
data = response.json()
package main

import (
  "fmt"
  "io"
  "net/http"
  "strings"
)

func main() {
  body := strings.NewReader(`{
    "albumId": "550e8400-e29b-41d4-a716-446655440000",
    "allowDownload": true,
    "allowUpload": true,
    "assetIds": [
      "550e8400-e29b-41d4-a716-446655440000"
    ],
    "description": "string",
    "expiresAt": "2024-01-01T00:00:00.000Z",
    "password": "string",
    "showMetadata": true,
    "slug": "string",
    "type": "ALBUM"
  }`)
  req, _ := http.NewRequest("POST", "/api/shared-links", 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))
}
Request Body
{
  "albumId": "550e8400-e29b-41d4-a716-446655440000",
  "allowDownload": true,
  "allowUpload": true,
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "description": "string",
  "expiresAt": "2024-01-01T00:00:00.000Z",
  "password": "string",
  "showMetadata": true,
  "slug": "string",
  "type": "ALBUM"
}
201
{
  "album": {
    "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"
  },
  "allowDownload": true,
  "allowUpload": true,
  "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",
  "description": "string",
  "expiresAt": "2024-01-01T00:00:00.000Z",
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "key": "string",
  "password": "string",
  "showMetadata": true,
  "slug": "string",
  "type": "ALBUM",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

Shared link login

POST
/api/shared-links/login

Login to a password protected shared link

Body

application/json
passwordstringrequired

Shared link password

Parameters

keystringquery
slugstringquery

Response

201CreatedSharedLinkResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Shared link login
curl -X POST '/api/shared-links/login' \
  -H 'Content-Type: application/json' \
  -d '{
    "password": "password"
  }'
const response = await fetch('/api/shared-links/login', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "password": "password"
    }),
});

const data = await response.json();
import requests

payload = {
  "password": "password"
}

response = requests.post('/api/shared-links/login', json=payload)
data = response.json()
package main

import (
  "fmt"
  "io"
  "net/http"
  "strings"
)

func main() {
  body := strings.NewReader(`{
    "password": "password"
  }`)
  req, _ := http.NewRequest("POST", "/api/shared-links/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))
}
Request Body
{
  "password": "password"
}
201
{
  "album": {
    "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"
  },
  "allowDownload": true,
  "allowUpload": true,
  "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",
  "description": "string",
  "expiresAt": "2024-01-01T00:00:00.000Z",
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "key": "string",
  "password": "string",
  "showMetadata": true,
  "slug": "string",
  "type": "ALBUM",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

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

GET
/api/stacks

Retrieve a list of stacks.

Parameters

primaryAssetIdstring<uuid>query

Filter by primary asset ID

Response

200OKArray<StackResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve stacks
curl -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))
}
200
[
  {
    "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

POST
/api/stacks

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

application/json
assetIdsArray<string>required

Asset IDs (first becomes primary, min 2)

Response

201CreatedStackResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create a stack
curl -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))
}
Request Body
{
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}
201
{
  "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
/api/stacks

Delete multiple stacks by providing a list of stack IDs.

Body

application/json
idsArray<string>required

IDs to process

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete stacks
curl -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))
}
Request Body
{
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}

Retrieve a stack

GET
/api/stacks/{id}

Retrieve a specific stack by its ID.

Parameters

idstring<uuid>requiredpath

Response

200OKStackResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve a stack
curl -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))
}
200
{
  "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

deprecated
PUT
/api/stacks/{id}

Update an existing stack by its ID.

Body

application/json
primaryAssetIdstring<uuid>

Primary asset ID

Parameters

idstring<uuid>requiredpath

Response

200OKStackResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update a stack
curl -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))
}
Request Body
{
  "primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}
200
{
  "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
/api/stacks/{id}

Delete a specific stack by its ID.

Parameters

idstring<uuid>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete a stack
curl -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

DELETE
/api/stacks/{id}/assets/{assetId}

Remove a specific asset from a stack by providing the stack ID and asset ID.

Parameters

assetIdstring<uuid>requiredpath
idstring<uuid>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Remove an asset from a stack
curl -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

GET
/api/sync/ack

Retrieve the synchronization acknowledgments for the current session.

Response

200OKArray<SyncAckDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve acknowledgements
curl -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))
}
200
[
  {
    "ack": "string",
    "type": "AuthUserV1"
  }
]

Acknowledge changes

POST
/api/sync/ack

Send a list of synchronization acknowledgements to confirm that the latest changes have been received.

Body

application/json
acksArray<string>required

Acknowledgment IDs (max 1000)

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Acknowledge changes
curl -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))
}
Request Body
{
  "acks": [
    "string"
  ]
}

Delete acknowledgements

DELETE
/api/sync/ack

Delete specific synchronization acknowledgments.

Body

application/json
typesArray<SyncEntityType>AuthUserV1UserV1UserDeleteV1AssetV1AssetV2AssetDeleteV1AssetExifV1AssetEditV1AssetEditDeleteV1AssetMetadataV1AssetMetadataDeleteV1AssetOcrV1AssetOcrDeleteV1PartnerV1PartnerDeleteV1PartnerAssetV1PartnerAssetV2PartnerAssetBackfillV1PartnerAssetBackfillV2PartnerAssetDeleteV1PartnerAssetExifV1PartnerAssetExifBackfillV1PartnerStackBackfillV1PartnerStackDeleteV1PartnerStackV1AlbumV1AlbumV2AlbumDeleteV1AlbumUserV1AlbumUserBackfillV1AlbumUserDeleteV1AlbumAssetCreateV1AlbumAssetCreateV2AlbumAssetUpdateV1AlbumAssetUpdateV2AlbumAssetBackfillV1AlbumAssetBackfillV2AlbumAssetExifCreateV1AlbumAssetExifUpdateV1AlbumAssetExifBackfillV1AlbumToAssetV1AlbumToAssetDeleteV1AlbumToAssetBackfillV1MemoryV1MemoryDeleteV1MemoryToAssetV1MemoryToAssetDeleteV1StackV1StackDeleteV1PersonV1PersonDeleteV1AssetFaceV1AssetFaceV2AssetFaceDeleteV1UserMetadataV1UserMetadataDeleteV1SyncAckV1SyncResetV1SyncCompleteV1

Sync entity types to delete acks for

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete acknowledgements
curl -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))
}
Request Body
{
  "types": [
    "AuthUserV1"
  ]
}

Stream sync changes

POST
/api/sync/stream

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

application/json
resetboolean

Reset sync state

typesArray<SyncRequestType>AlbumsV1AlbumsV2AlbumUsersV1AlbumToAssetsV1AlbumAssetsV1AlbumAssetsV2AlbumAssetExifsV1AssetsV1AssetsV2AssetExifsV1AssetEditsV1AssetMetadataV1AssetOcrV1AuthUsersV1MemoriesV1MemoryToAssetsV1PartnersV1PartnerAssetsV1PartnerAssetsV2PartnerAssetExifsV1PartnerStacksV1StacksV1UsersV1PeopleV1AssetFacesV1AssetFacesV2UserMetadataV1required

Sync request types

Response

200OK

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Stream sync changes
curl -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))
}
Request Body
{
  "reset": true,
  "types": [
    "AlbumsV1"
  ]
}

System config

Endpoints to view, modify, and validate the system configuration settings.

Get system configuration

GET
/api/system-config

Retrieve the current system configuration.

Response

200OKSystemConfigDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get system configuration
curl -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))
}
200
{
  "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

PUT
/api/system-config

Update the system configuration with a new system configuration.

Body

application/json

System configuration

backupSystemConfigBackupsDtorequired
Show child attributes
databaseDatabaseBackupConfigrequired
Show child attributes
cronExpressionstringrequired

Cron expression

enabledbooleanrequired

Enabled

keepLastAmountinteger[1, 9007199254740991]required

Keep last amount

ffmpegSystemConfigFFmpegDtorequired
Show child attributes
accelTranscodeHWAccelnvencqsvvaapirkmppdisabledrequired

Transcode hardware acceleration

accelDecodebooleanrequired

Accelerated decode

acceptedAudioCodecsArray<AudioCodec>mp3aacopuspcm_s16lerequired

Accepted audio codecs

acceptedContainersArray<VideoContainer>movmp4oggwebmrequired

Accepted containers

acceptedVideoCodecsArray<VideoCodec>h264hevcvp9av1required

Accepted video codecs

bframesinteger[-1, 16]required

B-frames

cqModeCQModeautocqpicqrequired

CQ mode

crfinteger[0, 51]required

CRF

gopSizeinteger[0, 9007199254740991]required

GOP size

maxBitratestringrequired

Max bitrate

preferredHwDevicestringrequired

Preferred hardware device

presetstringrequired

Preset

realtimeSystemConfigFFmpegRealtimeDtorequired
Show child attributes
enabledbooleanrequired

Enable real-time HLS transcoding (alpha)

refsinteger[0, 6]required

References

targetAudioCodecAudioCodecmp3aacopuspcm_s16lerequired

Target audio codec

targetResolutionstringrequired

Target resolution

targetVideoCodecVideoCodech264hevcvp9av1required

Target video codec

temporalAQbooleanrequired

Temporal AQ

threadsinteger[0, 9007199254740991]required

Threads

tonemapToneMappinghablemobiusreinharddisabledrequired

Tone mapping

transcodeTranscodePolicyalloptimalbitraterequireddisabledrequired

Transcode policy

twoPassbooleanrequired

Two pass

imageSystemConfigImageDtorequired
Show child attributes
colorspaceColorspacesrgbp3required

Colorspace

extractEmbeddedbooleanrequired

Extract embedded

fullsizeSystemConfigGeneratedFullsizeImageDtorequired
Show child attributes
enabledbooleanrequired

Enabled

formatImageFormatjpegwebprequired

Image format

progressiveboolean

Progressive

qualityinteger[1, 100]required

Quality

previewSystemConfigGeneratedImageDtorequired
Show child attributes
formatImageFormatjpegwebprequired

Image format

progressiveboolean

Progressive

qualityinteger[1, 100]required

Quality

sizeinteger[1, 9007199254740991]required

Size

thumbnailSystemConfigGeneratedImageDtorequired
Show child attributes
formatImageFormatjpegwebprequired

Image format

progressiveboolean

Progressive

qualityinteger[1, 100]required

Quality

sizeinteger[1, 9007199254740991]required

Size

integrityChecksSystemConfigIntegrityChecksrequired

Integrity checks config

Show child attributes
checksumFilesSystemConfigIntegrityChecksumJobrequired

Integrity checksum job config

Show child attributes
cronExpressionstringrequired

Cron expression for when the integrity check should run

enabledbooleanrequired

Enabled

percentageLimitinteger[0, 9007199254740991]required

Percentage limit of the integrity checksum job

timeLimitinteger[0, 9007199254740991]required

How long the integrity checksum job may run for

missingFilesSystemConfigIntegrityJobrequired

Integrity job config

Show child attributes
cronExpressionstringrequired

Cron expression for when the integrity check should run

enabledbooleanrequired

Enabled

untrackedFilesSystemConfigIntegrityJobrequired

Integrity job config

Show child attributes
cronExpressionstringrequired

Cron expression for when the integrity check should run

enabledbooleanrequired

Enabled

jobSystemConfigJobDtorequired
Show child attributes
backgroundTaskJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

editorJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

faceDetectionJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

integrityCheckJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

libraryJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

metadataExtractionJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

migrationJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

notificationsJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

ocrJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

searchJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

sidecarJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

smartSearchJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

thumbnailGenerationJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

videoConversionJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

workflowJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

librarySystemConfigLibraryDtorequired
Show child attributes
scanSystemConfigLibraryScanDtorequired
Show child attributes
cronExpressionstringrequired

Cron expression

enabledbooleanrequired

Enabled

watchSystemConfigLibraryWatchDtorequired
Show child attributes
enabledbooleanrequired

Enabled

loggingSystemConfigLoggingDtorequired
Show child attributes
enabledbooleanrequired

Enabled

levelLogLevelverbosedebuglogwarnerrorfatalrequired

Log level

machineLearningSystemConfigMachineLearningDtorequired
Show child attributes
availabilityChecksMachineLearningAvailabilityChecksDtorequired
Show child attributes
enabledbooleanrequired

Enabled

intervalinteger[-9007199254740991, 9007199254740991]required
timeoutinteger[-9007199254740991, 9007199254740991]required
clipCLIPConfigrequired
Show child attributes
enabledbooleanrequired

Whether the task is enabled

modelNamestringrequired

Name of the model to use

duplicateDetectionDuplicateDetectionConfigrequired
Show child attributes
enabledbooleanrequired

Whether the task is enabled

maxDistancenumber<double>[0.001, 0.1]required

Maximum distance threshold for duplicate detection

enabledbooleanrequired

Enabled

facialRecognitionFacialRecognitionConfigrequired
Show child attributes
enabledbooleanrequired

Whether the task is enabled

maxDistancenumber<double>[0.1, 2]required

Maximum distance threshold for face recognition

minFacesinteger[1, 9007199254740991]required

Minimum number of faces required for recognition

minScorenumber<double>[0.1, 1]required

Minimum confidence score for face detection

modelNamestringrequired

Name of the model to use

ocrOcrConfigrequired
Show child attributes
enabledbooleanrequired

Whether the task is enabled

maxResolutioninteger[1, 9007199254740991]required

Maximum resolution for OCR processing

minDetectionScorenumber<double>[0.1, 1]required

Minimum confidence score for text detection

minRecognitionScorenumber<double>[0.1, 1]required

Minimum confidence score for text recognition

modelNamestringrequired

Name of the model to use

urlsArray<string>required

ML service URLs

mapSystemConfigMapDtorequired
Show child attributes
darkStylestring<uri>required

Dark map style URL

enabledbooleanrequired

Enabled

lightStylestring<uri>required

Light map style URL

metadataSystemConfigMetadataDtorequired
Show child attributes
facesSystemConfigFacesDtorequired
Show child attributes
importbooleanrequired

Import

newVersionCheckSystemConfigNewVersionCheckDtorequired
Show child attributes
channelReleaseChannelstablereleaseCandidaterequired

Release channel

enabledbooleanrequired

Enabled

nightlyTasksSystemConfigNightlyTasksDtorequired
Show child attributes
clusterNewFacesbooleanrequired

Cluster new faces

databaseCleanupbooleanrequired

Database cleanup

generateMemoriesbooleanrequired

Generate memories

missingThumbnailsbooleanrequired

Missing thumbnails

startTimestringrequired

Start time (HH:MM)

syncQuotaUsagebooleanrequired

Sync quota usage

notificationsSystemConfigNotificationsDtorequired
Show child attributes
smtpSystemConfigSmtpDtorequired
Show child attributes
enabledbooleanrequired

Whether SMTP email notifications are enabled

fromstringrequired

Email address to send from

replyTostringrequired

Email address for replies

transportSystemConfigSmtpTransportDtorequired
Show child attributes
hoststringrequired

SMTP server hostname

ignoreCertbooleanrequired

Whether to ignore SSL certificate errors

passwordstringrequired

SMTP password

portinteger[0, 65535]required

SMTP server port

securebooleanrequired

Whether to use secure connection (TLS/SSL)

usernamestringrequired

SMTP username

oauthSystemConfigOAuthDtorequired
Show child attributes
allowInsecureRequestsbooleanrequired

Allow insecure requests

autoLaunchbooleanrequired

Auto launch

autoRegisterbooleanrequired

Auto register

buttonTextstringrequired

Button text

clientIdstringrequired

Client ID

clientSecretstringrequired

Client secret

defaultStorageQuotainteger | null[0, 9007199254740991]required

Default storage quota

enabledbooleanrequired

Enabled

endSessionEndpointstringrequired

End session endpoint

issuerUrlstringrequired

Issuer URL

mobileOverrideEnabledbooleanrequired

Mobile override enabled

mobileRedirectUristringrequired

Mobile redirect URI (set to empty string to disable)

profileSigningAlgorithmstringrequired

Profile signing algorithm

promptstringrequired

OAuth prompt parameter (e.g. select_account, login, consent)

roleClaimstringrequired

Role claim

scopestringrequired

Scope

signingAlgorithmstringrequired

Signing algorithm

storageLabelClaimstringrequired

Storage label claim

storageQuotaClaimstringrequired

Storage quota claim

timeoutinteger[1, 9007199254740991]required

Timeout

tokenEndpointAuthMethodOAuthTokenEndpointAuthMethodclient_secret_postclient_secret_basicrequired

OAuth token endpoint auth method

passwordLoginSystemConfigPasswordLoginDtorequired
Show child attributes
enabledbooleanrequired

Enabled

reverseGeocodingSystemConfigReverseGeocodingDtorequired
Show child attributes
enabledbooleanrequired

Enabled

serverSystemConfigServerDtorequired
Show child attributes
externalDomainstringrequired

External domain

loginPageMessagestringrequired

Login page message

publicUsersbooleanrequired

Public users

storageTemplateSystemConfigStorageTemplateDtorequired
Show child attributes
enabledbooleanrequired

Enabled

hashVerificationEnabledbooleanrequired

Hash verification enabled

templatestringrequired

Template

templatesSystemConfigTemplatesDtorequired
Show child attributes
emailSystemConfigTemplateEmailsDtorequired
Show child attributes
albumInviteTemplatestringrequired

Album invite template

albumUpdateTemplatestringrequired

Album update template

welcomeTemplatestringrequired

Welcome template

themeSystemConfigThemeDtorequired
Show child attributes
customCssstringrequired

Custom CSS for theming

trashSystemConfigTrashDtorequired
Show child attributes
daysinteger[0, 9007199254740991]required

Days

enabledbooleanrequired

Enabled

userSystemConfigUserDtorequired
Show child attributes
deleteDelayinteger[1, 9007199254740991]required

Delete delay

Response

200OKSystemConfigDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update system configuration
curl -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))
}
Request Body
{
  "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
  }
}
200
{
  "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

GET
/api/system-config/defaults

Retrieve the default values for the system configuration.

Response

200OKSystemConfigDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get system configuration defaults
curl -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))
}
200
{
  "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

GET
/api/system-config/storage-template-options

Retrieve exemplary storage template options.

Response

200OKSystemConfigTemplateStorageOptionDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get storage template options
curl -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))
}
200
{
  "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

GET
/api/system-metadata/admin-onboarding

Retrieve the current admin onboarding status.

Response

200OKAdminOnboardingUpdateDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve admin onboarding
curl -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))
}
200
{
  "isOnboarded": true
}

Update admin onboarding

POST
/api/system-metadata/admin-onboarding

Update the admin onboarding status.

Body

application/json
isOnboardedbooleanrequired

Is admin onboarded

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update admin onboarding
curl -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))
}
Request Body
{
  "isOnboarded": true
}

Retrieve reverse geocoding state

GET
/api/system-metadata/reverse-geocoding-state

Retrieve the current state of the reverse geocoding import.

Response

200OKReverseGeocodingStateResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve reverse geocoding state
curl -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))
}
200
{
  "lastImportFileName": "string",
  "lastUpdate": "string"
}

Retrieve version check state

GET
/api/system-metadata/version-check-state

Retrieve the current state of the version check process.

Response

200OKVersionCheckStateResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve version check state
curl -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))
}
200
{
  "checkedAt": "string",
  "releaseVersion": "string"
}

Tags

A tag is a user-defined label that can be applied to assets for organizational purposes. Tags can also be hierarchical, allowing for parent-child relationships between tags.

Retrieve tags

GET
/api/tags

Retrieve a list of all tags.

Response

200OKArray<TagResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve tags
curl -X GET '/api/tags'
const response = await fetch('/api/tags', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/api/tags')
data = response.json()
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  req, _ := http.NewRequest("GET", "/api/tags", nil)
  resp, _ := http.DefaultClient.Do(req)
  defer resp.Body.Close()
  data, _ := io.ReadAll(resp.Body)
  fmt.Println(string(data))
}
200
[
  {
    "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"
  }
]

Create a tag

POST
/api/tags

Create a new tag by providing a name and optional color.

Body

application/json
colorstring | null

Tag color (hex)

namestringrequired

Tag name

parentIdstring<uuid> | null

Parent tag ID

Response

201CreatedTagResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create a tag
curl -X POST '/api/tags' \
  -H 'Content-Type: application/json' \
  -d '{
    "color": "string",
    "name": "string",
    "parentId": "550e8400-e29b-41d4-a716-446655440000"
  }'
const response = await fetch('/api/tags', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "color": "string",
      "name": "string",
      "parentId": "550e8400-e29b-41d4-a716-446655440000"
    }),
});

const data = await response.json();
import requests

payload = {
  "color": "string",
  "name": "string",
  "parentId": "550e8400-e29b-41d4-a716-446655440000"
}

response = requests.post('/api/tags', json=payload)
data = response.json()
package main

import (
  "fmt"
  "io"
  "net/http"
  "strings"
)

func main() {
  body := strings.NewReader(`{
    "color": "string",
    "name": "string",
    "parentId": "550e8400-e29b-41d4-a716-446655440000"
  }`)
  req, _ := http.NewRequest("POST", "/api/tags", 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))
}
Request Body
{
  "color": "string",
  "name": "string",
  "parentId": "550e8400-e29b-41d4-a716-446655440000"
}
201
{
  "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"
}

Upsert tags

PUT
/api/tags

Create or update multiple tags in a single request.

Body

application/json
tagsArray<string>required

Tag names to upsert

Response

200OKArray<TagResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Upsert tags
curl -X PUT '/api/tags' \
  -H 'Content-Type: application/json' \
  -d '{
    "tags": [
      "string"
    ]
  }'
const response = await fetch('/api/tags', {
  method: 'PUT',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "tags": [
        "string"
      ]
    }),
});

const data = await response.json();
import requests

payload = {
  "tags": [
    "string"
  ]
}

response = requests.put('/api/tags', json=payload)
data = response.json()
package main

import (
  "fmt"
  "io"
  "net/http"
  "strings"
)

func main() {
  body := strings.NewReader(`{
    "tags": [
      "string"
    ]
  }`)
  req, _ := http.NewRequest("PUT", "/api/tags", 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))
}
Request Body
{
  "tags": [
    "string"
  ]
}
200
[
  {
    "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"
  }
]

Tag assets

PUT
/api/tags/assets

Add multiple tags to multiple assets in a single request.

Body

application/json
assetIdsArray<string>required

Asset IDs

tagIdsArray<string>required

Tag IDs

Response

200OKTagBulkAssetsResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Tag assets
curl -X PUT '/api/tags/assets' \
  -H 'Content-Type: application/json' \
  -d '{
    "assetIds": [
      "550e8400-e29b-41d4-a716-446655440000"
    ],
    "tagIds": [
      "550e8400-e29b-41d4-a716-446655440000"
    ]
  }'
const response = await fetch('/api/tags/assets', {
  method: 'PUT',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "assetIds": [
        "550e8400-e29b-41d4-a716-446655440000"
      ],
      "tagIds": [
        "550e8400-e29b-41d4-a716-446655440000"
      ]
    }),
});

const data = await response.json();
import requests

payload = {
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "tagIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}

response = requests.put('/api/tags/assets', json=payload)
data = response.json()
package main

import (
  "fmt"
  "io"
  "net/http"
  "strings"
)

func main() {
  body := strings.NewReader(`{
    "assetIds": [
      "550e8400-e29b-41d4-a716-446655440000"
    ],
    "tagIds": [
      "550e8400-e29b-41d4-a716-446655440000"
    ]
  }`)
  req, _ := http.NewRequest("PUT", "/api/tags/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))
}
Request Body
{
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "tagIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}
200
{
  "count": -9007199254740991
}

Retrieve a tag

GET
/api/tags/{id}

Retrieve a specific tag by its ID.

Parameters

idstring<uuid>requiredpath

Response

200OKTagResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve a tag
curl -X GET '/api/tags/{id}'
const response = await fetch('/api/tags/{id}', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/api/tags/{id}')
data = response.json()
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  req, _ := http.NewRequest("GET", "/api/tags/{id}", nil)
  resp, _ := http.DefaultClient.Do(req)
  defer resp.Body.Close()
  data, _ := io.ReadAll(resp.Body)
  fmt.Println(string(data))
}
200
{
  "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"
}

Update a tag

deprecated
PUT
/api/tags/{id}

Update an existing tag identified by its ID.

Body

application/json
colorstring | null

Tag color (hex)

Parameters

idstring<uuid>requiredpath

Response

200OKTagResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update a tag
curl -X PUT '/api/tags/{id}' \
  -H 'Content-Type: application/json' \
  -d '{
    "color": "string"
  }'
const response = await fetch('/api/tags/{id}', {
  method: 'PUT',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
      "color": "string"
    }),
});

const data = await response.json();
import requests

payload = {
  "color": "string"
}

response = requests.put('/api/tags/{id}', json=payload)
data = response.json()
package main

import (
  "fmt"
  "io"
  "net/http"
  "strings"
)

func main() {
  body := strings.NewReader(`{
    "color": "string"
  }`)
  req, _ := http.NewRequest("PUT", "/api/tags/{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))
}
Request Body
{
  "color": "string"
}
200
{
  "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"
}

Delete a tag

DELETE
/api/tags/{id}

Delete a specific tag by its ID.

Parameters

idstring<uuid>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete a tag
curl -X DELETE '/api/tags/{id}'
const response = await fetch('/api/tags/{id}', {
  method: 'DELETE',
});

const data = await response.json();
import requests

response = requests.delete('/api/tags/{id}')
data = response.json()
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  req, _ := http.NewRequest("DELETE", "/api/tags/{id}", nil)
  resp, _ := http.DefaultClient.Do(req)
  defer resp.Body.Close()
  data, _ := io.ReadAll(resp.Body)
  fmt.Println(string(data))
}

Tag assets

PUT
/api/tags/{id}/assets

Add a tag to all the specified assets.

Body

application/json
idsArray<string>required

IDs to process

Parameters

idstring<uuid>requiredpath

Response

200OKArray<BulkIdResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Tag assets
curl -X PUT '/api/tags/{id}/assets' \
  -H 'Content-Type: application/json' \
  -d '{
    "ids": [
      "550e8400-e29b-41d4-a716-446655440000"
    ]
  }'
const response = await fetch('/api/tags/{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/tags/{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/tags/{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))
}
Request Body
{
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}
200
[
  {
    "error": "duplicate",
    "errorMessage": "string",
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "success": true
  }
]

Untag assets

DELETE
/api/tags/{id}/assets

Remove a tag from all the specified assets.

Body

application/json
idsArray<string>required

IDs to process

Parameters

idstring<uuid>requiredpath

Response

200OKArray<BulkIdResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Untag assets
curl -X DELETE '/api/tags/{id}/assets' \
  -H 'Content-Type: application/json' \
  -d '{
    "ids": [
      "550e8400-e29b-41d4-a716-446655440000"
    ]
  }'
const response = await fetch('/api/tags/{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/tags/{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/tags/{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))
}
Request Body
{
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}
200
[
  {
    "error": "duplicate",
    "errorMessage": "string",
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "success": true
  }
]

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

GET
/api/timeline/bucket

Retrieve a string of all asset ids in a given time bucket.

Parameters

albumIdstring<uuid>query

Filter assets belonging to a specific album

bboxstringquery

Bounding box coordinates as west,south,east,north (WGS84)

isFavoritebooleanquery

Filter by favorite status (true for favorites only, false for non-favorites only)

isTrashedbooleanquery

Filter by trash status (true for trashed assets only, false for non-trashed only)

keystringquery
orderAssetOrderascdescquery

Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)

orderByAssetOrderBytakenAtcreatedAtquery

Date to group and order assets by (takenAt for date taken, createdAt for date added to Immich)

personIdstring<uuid>query

Filter assets containing a specific person (face recognition)

slugstringquery
tagIdstring<uuid>query

Filter assets with a specific tag

timeBucketstringrequiredquery

Time bucket identifier in YYYY-MM-DD format

userIdstring<uuid>query

Filter assets by specific user ID

visibilityAssetVisibilityarchivetimelinehiddenlockedquery

Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)

withCoordinatesbooleanquery

Include location data in the response

withPartnersbooleanquery

Include assets shared by partners

withStackedbooleanquery

Include stacked assets in the response. When true, only primary assets from stacks are returned.

Response

200OKTimeBucketAssetResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get time bucket
curl -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))
}
200
{
  "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

GET
/api/timeline/buckets

Retrieve a list of all minimal time buckets.

Parameters

albumIdstring<uuid>query

Filter assets belonging to a specific album

bboxstringquery

Bounding box coordinates as west,south,east,north (WGS84)

isFavoritebooleanquery

Filter by favorite status (true for favorites only, false for non-favorites only)

isTrashedbooleanquery

Filter by trash status (true for trashed assets only, false for non-trashed only)

keystringquery
orderAssetOrderascdescquery

Sort order for assets within time buckets (ASC for oldest first, DESC for newest first)

orderByAssetOrderBytakenAtcreatedAtquery

Date to group and order assets by (takenAt for date taken, createdAt for date added to Immich)

personIdstring<uuid>query

Filter assets containing a specific person (face recognition)

slugstringquery
tagIdstring<uuid>query

Filter assets with a specific tag

userIdstring<uuid>query

Filter assets by specific user ID

visibilityAssetVisibilityarchivetimelinehiddenlockedquery

Filter by asset visibility status (ARCHIVE, TIMELINE, HIDDEN, LOCKED)

withCoordinatesbooleanquery

Include location data in the response

withPartnersbooleanquery

Include assets shared by partners

withStackedbooleanquery

Include stacked assets in the response. When true, only primary assets from stacks are returned.

Response

200OKArray<TimeBucketsResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get time buckets
curl -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))
}
200
[
  {
    "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

POST
/api/trash/empty

Permanently delete all items in the trash.

Response

200OKTrashResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Empty trash
curl -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))
}
200
{
  "count": -9007199254740991
}

Restore trash

POST
/api/trash/restore

Restore all items in the trash.

Response

200OKTrashResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Restore trash
curl -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))
}
200
{
  "count": -9007199254740991
}

Restore assets

POST
/api/trash/restore/assets

Restore specific assets from the trash.

Body

application/json
idsArray<string>required

IDs to process

Response

200OKTrashResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Restore assets
curl -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))
}
Request Body
{
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}
200
{
  "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

GET
/api/admin/users

Search for users.

Parameters

idstring<uuid>query

User ID filter

withDeletedbooleanquery

Include deleted users

Response

200OKArray<UserAdminResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Search users
curl -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))
}
200
[
  {
    "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

POST
/api/admin/users

Create a new user.

Body

application/json
avatarColorUserAvatarColor | null
emailstring<email>required

User email

isAdminboolean

Grant admin privileges

namestringrequired

User name

notifyboolean

Send notification email

passwordstringrequired

User password

pinCodestring | null

PIN code

quotaSizeInBytesinteger | null[0, 9007199254740991]

Storage quota in bytes

shouldChangePasswordboolean

Require password change on next login

storageLabelstring | null

Storage label

Response

201CreatedUserAdminResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create a user
curl -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))
}
Request Body
{
  "email": "user@example.com",
  "isAdmin": true,
  "name": "string",
  "notify": true,
  "password": "string",
  "pinCode": "123456",
  "quotaSizeInBytes": 0,
  "shouldChangePassword": true,
  "storageLabel": "string"
}
201
{
  "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

GET
/api/admin/users/{id}

Retrieve a specific user by their ID.

Parameters

idstring<uuid>requiredpath

Response

200OKUserAdminResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve a user
curl -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))
}
200
{
  "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

deprecated
PUT
/api/admin/users/{id}

Update an existing user.

Body

application/json
avatarColorUserAvatarColor | null
emailstring<email>

User email

isAdminboolean

Grant admin privileges

namestring

User name

passwordstring

User password

pinCodestring | null

PIN code

quotaSizeInBytesinteger | null[0, 9007199254740991]

Storage quota in bytes

shouldChangePasswordboolean

Require password change on next login

storageLabelstring | null

Storage label

Parameters

idstring<uuid>requiredpath

Response

200OKUserAdminResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update a user
curl -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))
}
Request Body
{
  "email": "user@example.com",
  "isAdmin": true,
  "name": "string",
  "password": "string",
  "pinCode": "123456",
  "quotaSizeInBytes": 0,
  "shouldChangePassword": true,
  "storageLabel": "string"
}
200
{
  "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
/api/admin/users/{id}

Delete a user.

Body

application/json
forceboolean

Force delete even if user has assets

Parameters

idstring<uuid>requiredpath

Response

200OKUserAdminResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete a user
curl -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))
}
Request Body
{
  "force": true
}
200
{
  "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

GET
/api/admin/users/{id}/calendar-heatmap

Retrieve activity counts for a specified period, in a calendar heatmap format.

Parameters

fromstring<date>query

Start date in UTC

idstring<uuid>requiredpath
tostring<date>query

End date in UTC

typeCalendarHeatmapTypeUploadTakenUploadquery

Response

200OKCalendarHeatmapResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve calendar heatmap activity
curl -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))
}
200
{
  "from": "2024-01-01",
  "series": [
    {
      "count": 0,
      "date": "2024-01-01"
    }
  ],
  "to": "2024-12-31",
  "totalCount": 0
}

Retrieve user preferences

GET
/api/admin/users/{id}/preferences

Retrieve the preferences of a specific user.

Parameters

idstring<uuid>requiredpath

Response

200OKUserPreferencesResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve user preferences
curl -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))
}
200
{
  "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

deprecated
PUT
/api/admin/users/{id}/preferences

Update the preferences of a specific user.

Body

application/json
albumsAlbumsUpdate

Album preferences

Show child attributes
defaultAssetOrderAssetOrderascdesc

Asset sort order

avatarAvatarUpdate
Show child attributes
colorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamber

User avatar color

castCastUpdate
Show child attributes
gCastEnabledboolean

Whether Google Cast is enabled

downloadDownloadUpdate
Show child attributes
archiveSizeinteger[1, 9007199254740991]

Maximum archive size in bytes

includeEmbeddedVideosboolean

Whether to include embedded videos in downloads

emailNotificationsEmailNotificationsUpdate
Show child attributes
albumInviteboolean

Whether to receive email notifications for album invites

albumUpdateboolean

Whether to receive email notifications for album updates

enabledboolean

Whether email notifications are enabled

foldersFoldersUpdate
Show child attributes
enabledboolean

Whether folders are enabled

sidebarWebboolean

Whether folders appear in web sidebar

memoriesMemoriesUpdate
Show child attributes
durationinteger[1, 9007199254740991]

Memory duration in seconds

enabledboolean

Whether memories are enabled

peoplePeopleUpdate
Show child attributes
enabledboolean

Whether people are enabled

minimumFacesinteger[1, 9007199254740991]

People face threshold

sidebarWebboolean

Whether people appear in web sidebar

purchasePurchaseUpdate
Show child attributes
hideBuyButtonUntilstring

Date until which to hide buy button

showSupportBadgeboolean

Whether to show support badge

ratingsRatingsUpdate
Show child attributes
enabledboolean

Whether ratings are enabled

sharedLinksSharedLinksUpdate
Show child attributes
enabledboolean

Whether shared links are enabled

sidebarWebboolean

Whether shared links appear in web sidebar

tagsTagsUpdate
Show child attributes
enabledboolean

Whether tags are enabled

sidebarWebboolean

Whether tags appear in web sidebar

Parameters

idstring<uuid>requiredpath

Response

200OKUserPreferencesResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update user preferences
curl -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))
}
Request Body
{
  "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
  }
}
200
{
  "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

POST
/api/admin/users/{id}/restore

Restore a previously deleted user.

Parameters

idstring<uuid>requiredpath

Response

200OKUserAdminResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Restore a deleted user
curl -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))
}
200
{
  "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

GET
/api/admin/users/{id}/sessions

Retrieve all sessions for a specific user.

Parameters

idstring<uuid>requiredpath

Response

200OKArray<SessionResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve user sessions
curl -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))
}
200
[
  {
    "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

GET
/api/admin/users/{id}/statistics

Retrieve asset statistics for a specific user.

Parameters

idstring<uuid>requiredpath
isFavoritebooleanquery

Filter by favorite status

isTrashedbooleanquery

Filter by trash status

visibilityAssetVisibilityarchivetimelinehiddenlockedquery

Response

200OKAssetStatsResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve user statistics
curl -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))
}
200
{
  "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

GET
/api/users

Retrieve a list of all users on the server.

Response

200OKArray<UserResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get all users
curl -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))
}
200
[
  {
    "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

GET
/api/users/me

Retrieve information about the user making the API request.

Response

200OKUserAdminResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get current user
curl -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))
}
200
{
  "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

deprecated
PUT
/api/users/me

Update the current user making the API request.

Body

application/json
avatarColorUserAvatarColor | null
emailstring<email>

User email

namestring

User name

passwordstringdeprecated

User password (deprecated, use change password endpoint)

Response

200OKUserAdminResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update current user
curl -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))
}
Request Body
{
  "email": "user@example.com",
  "name": "string",
  "password": "string"
}
200
{
  "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

GET
/api/users/me/calendar-heatmap

Retrieve activity counts for a specified period, in a calendar heatmap format.

Parameters

fromstring<date>query

Start date in UTC

tostring<date>query

End date in UTC

typeCalendarHeatmapTypeUploadTakenUploadquery

Response

200OKCalendarHeatmapResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve calendar heatmap activity
curl -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))
}
200
{
  "from": "2024-01-01",
  "series": [
    {
      "count": 0,
      "date": "2024-01-01"
    }
  ],
  "to": "2024-12-31",
  "totalCount": 0
}

Retrieve user product key

GET
/api/users/me/license

Retrieve information about whether the current user has a registered product key.

Response

200OKUserLicense

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve user product key
curl -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))
}
200
{
  "activatedAt": "2024-01-01T00:00:00.000Z",
  "activationKey": "string",
  "licenseKey": "string"
}

Set user product key

PUT
/api/users/me/license

Register a product key for the current user.

Body

application/json
activationKeystringrequired

Activation key

licenseKeystringrequired

License key (format: /^IM(SV|CL)(-[\dA-Za-z]{4}){8}$/)

Response

200OKUserLicense

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Set user product key
curl -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))
}
Request Body
{
  "activationKey": "string",
  "licenseKey": "string"
}
200
{
  "activatedAt": "2024-01-01T00:00:00.000Z",
  "activationKey": "string",
  "licenseKey": "string"
}

Delete user product key

DELETE
/api/users/me/license

Delete the registered product key for the current user.

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete user product key
curl -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

GET
/api/users/me/onboarding

Retrieve the onboarding status of the current user.

Response

200OKOnboardingResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve user onboarding
curl -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))
}
200
{
  "isOnboarded": true
}

Update user onboarding

PUT
/api/users/me/onboarding

Update the onboarding status of the current user.

Body

application/json
isOnboardedbooleanrequired

Is user onboarded

Response

200OKOnboardingResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update user onboarding
curl -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))
}
Request Body
{
  "isOnboarded": true
}
200
{
  "isOnboarded": true
}

Delete user onboarding

DELETE
/api/users/me/onboarding

Delete the onboarding status of the current user.

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete user onboarding
curl -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

GET
/api/users/me/preferences

Retrieve the preferences for the current user.

Response

200OKUserPreferencesResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Get my preferences
curl -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))
}
200
{
  "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

deprecated
PUT
/api/users/me/preferences

Update the preferences of the current user.

Body

application/json
albumsAlbumsUpdate

Album preferences

Show child attributes
defaultAssetOrderAssetOrderascdesc

Asset sort order

avatarAvatarUpdate
Show child attributes
colorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamber

User avatar color

castCastUpdate
Show child attributes
gCastEnabledboolean

Whether Google Cast is enabled

downloadDownloadUpdate
Show child attributes
archiveSizeinteger[1, 9007199254740991]

Maximum archive size in bytes

includeEmbeddedVideosboolean

Whether to include embedded videos in downloads

emailNotificationsEmailNotificationsUpdate
Show child attributes
albumInviteboolean

Whether to receive email notifications for album invites

albumUpdateboolean

Whether to receive email notifications for album updates

enabledboolean

Whether email notifications are enabled

foldersFoldersUpdate
Show child attributes
enabledboolean

Whether folders are enabled

sidebarWebboolean

Whether folders appear in web sidebar

memoriesMemoriesUpdate
Show child attributes
durationinteger[1, 9007199254740991]

Memory duration in seconds

enabledboolean

Whether memories are enabled

peoplePeopleUpdate
Show child attributes
enabledboolean

Whether people are enabled

minimumFacesinteger[1, 9007199254740991]

People face threshold

sidebarWebboolean

Whether people appear in web sidebar

purchasePurchaseUpdate
Show child attributes
hideBuyButtonUntilstring

Date until which to hide buy button

showSupportBadgeboolean

Whether to show support badge

ratingsRatingsUpdate
Show child attributes
enabledboolean

Whether ratings are enabled

sharedLinksSharedLinksUpdate
Show child attributes
enabledboolean

Whether shared links are enabled

sidebarWebboolean

Whether shared links appear in web sidebar

tagsTagsUpdate
Show child attributes
enabledboolean

Whether tags are enabled

sidebarWebboolean

Whether tags appear in web sidebar

Response

200OKUserPreferencesResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update my preferences
curl -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))
}
Request Body
{
  "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
  }
}
200
{
  "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

POST
/api/users/profile-image

Upload and set a new profile image for the current user.

Body

multipart/form-data

A new avatar for the user

filestring<binary>required

Profile image file

Response

201CreatedCreateProfileImageResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create user profile image
curl -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))
}
Request Body
{
  "file": "<binary>"
}
201
{
  "profileChangedAt": "2024-01-01T00:00:00.000Z",
  "profileImagePath": "string",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

Delete user profile image

DELETE
/api/users/profile-image

Delete the profile image of the current user.

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete user profile image
curl -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

GET
/api/users/{id}

Retrieve a specific user by their ID.

Parameters

idstring<uuid>requiredpath

Response

200OKUserResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve a user
curl -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))
}
200
{
  "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

GET
/api/users/{id}/profile-image

Retrieve the profile image file for a user.

Parameters

idstring<uuid>requiredpath

Response

200OKstring<binary>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve user profile image
curl -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))
}
200
"<binary>"

Views

Endpoints for specialized views, such as the folder view.

Retrieve assets by original path

GET
/api/view/folder

Retrieve assets that are children of a specific folder.

Parameters

pathstringrequiredquery

Response

200OKArray<AssetResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve assets by original path
curl -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))
}
200
[
  {
    "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

GET
/api/view/folder/unique-paths

Retrieve a list of unique folder paths from asset original paths.

Response

200OKArray<string>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve unique paths
curl -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))
}
200
[
  "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

GET
/api/workflows

Retrieve a list of workflows available to the authenticated user.

Parameters

descriptionstringquery

Workflow description

enabledbooleanquery

Workflow enabled

idstring<uuid>query

Workflow ID

namestringquery

Workflow name

triggerWorkflowTriggerAssetCreateAssetMetadataExtractionquery

Workflow trigger type

Response

200OKArray<WorkflowResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
List all workflows
curl -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))
}
200
[
  {
    "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

POST
/api/workflows

Create a new workflow, the workflow can also be created with empty filters and actions.

Body

application/json
descriptionstring | null

Workflow description

enabledboolean

Workflow enabled

namestring | null

Workflow name

stepsArray<WorkflowStepDto>
Show child attributes
configobject | nullrequired

Step configuration

enabledboolean

Step is enabled

methodstringrequired

Step plugin method

triggerWorkflowTriggerAssetCreateAssetMetadataExtractionrequired

Plugin trigger type

Response

201CreatedWorkflowResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Create a workflow
curl -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))
}
Request Body
{
  "description": "string",
  "enabled": true,
  "name": "string",
  "steps": [
    {
      "config": {},
      "enabled": true,
      "method": "string"
    }
  ],
  "trigger": "AssetCreate"
}
201
{
  "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

GET
/api/workflows/triggers

Retrieve a list of all available workflow triggers.

Response

200OKArray<WorkflowTriggerResponseDto>

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
List all workflow triggers
curl -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))
}
200
[
  {
    "trigger": "AssetCreate",
    "types": [
      "AssetV1"
    ]
  }
]

Retrieve a workflow

GET
/api/workflows/{id}

Retrieve information about a specific workflow by its ID.

Parameters

idstring<uuid>requiredpath

Response

200OKWorkflowResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve a workflow
curl -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))
}
200
{
  "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

deprecated
PUT
/api/workflows/{id}

Update 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

application/json
descriptionstring | null

Workflow description

enabledboolean

Workflow enabled

namestring | null

Workflow name

stepsArray<WorkflowStepDto>
Show child attributes
configobject | nullrequired

Step configuration

enabledboolean

Step is enabled

methodstringrequired

Step plugin method

triggerWorkflowTriggerAssetCreateAssetMetadataExtraction

Plugin trigger type

Parameters

idstring<uuid>requiredpath

Response

200OKWorkflowResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Update a workflow
curl -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))
}
Request Body
{
  "description": "string",
  "enabled": true,
  "name": "string",
  "steps": [
    {
      "config": {},
      "enabled": true,
      "method": "string"
    }
  ],
  "trigger": "AssetCreate"
}
200
{
  "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
/api/workflows/{id}

Delete a workflow by its ID.

Parameters

idstring<uuid>requiredpath

Response

204No Content

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Delete a workflow
curl -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))
}

Retrieve a workflow

GET
/api/workflows/{id}/share

Retrieve a workflow details without ids, default values, etc.

Parameters

idstring<uuid>requiredpath

Response

200OKWorkflowShareResponseDto

Authorization

bearerhttp (Bearer) in header
cookieapiKey in cookie
api_keyapiKey in header
Retrieve a workflow
curl -X GET '/api/workflows/{id}/share'
const response = await fetch('/api/workflows/{id}/share', {
  method: 'GET',
});

const data = await response.json();
import requests

response = requests.get('/api/workflows/{id}/share')
data = response.json()
package main

import (
  "fmt"
  "io"
  "net/http"
)

func main() {
  req, _ := http.NewRequest("GET", "/api/workflows/{id}/share", nil)
  resp, _ := http.DefaultClient.Do(req)
  defer resp.Body.Close()
  data, _ := io.ReadAll(resp.Body)
  fmt.Println(string(data))
}
200
{
  "description": "string",
  "name": "string",
  "steps": [
    {
      "config": {},
      "enabled": true,
      "method": "string"
    }
  ],
  "trigger": "AssetCreate"
}

Models

ActivityCreateDto

object

Activity create

albumIdstring<uuid>required

Album ID

assetIdstring<uuid>

Asset ID (if activity is for an asset)

commentstring

Comment text (required if type is comment)

typeReactionTypecommentlikerequired

Reaction type

Example
{
  "albumId": "550e8400-e29b-41d4-a716-446655440000",
  "assetId": "550e8400-e29b-41d4-a716-446655440000",
  "comment": "string",
  "type": "comment"
}

ActivityResponseDto

object
assetIdstring<uuid> | nullrequired

Asset ID (if activity is for an asset)

commentstring | null

Comment text (for comment activities)

createdAtstring<date-time>required

Creation date

idstring<uuid>required

Activity ID

typeReactionTypecommentlikerequired

Reaction type

userUserResponseDtorequired
Show child attributes
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

emailstring<email>required

User email

idstring<uuid>required

User ID

namestringrequired

User name

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

Example
{
  "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

object
commentsinteger[0, 9007199254740991]required

Number of comments

likesinteger[0, 9007199254740991]required

Number of likes

Example
{
  "comments": 0,
  "likes": 0
}

AddUsersDto

object
albumUsersArray<AlbumUserAddDto>required

Album users to add

Show child attributes
roleAlbumUserRoleeditorownerviewereditor

Album user role

userIdstring<uuid>required

User ID

Example
{
  "albumUsers": [
    {
      "role": "editor",
      "userId": "550e8400-e29b-41d4-a716-446655440000"
    }
  ]
}

AdminOnboardingUpdateDto

object
isOnboardedbooleanrequired

Is admin onboarded

Example
{
  "isOnboarded": true
}

AlbumResponseDto

object
albumNamestringrequired

Album name

albumThumbnailAssetIdstring<uuid> | nullrequired

Thumbnail asset ID

albumUsersArray<AlbumUserResponseDto>required

First entry is always the album owner. Second entry is the auth user, if it differs from the owner. The rest are ordered alphabetically.

Show child attributes
roleAlbumUserRoleeditorownerviewerrequired

Album user role

userUserResponseDtorequired
Show child attributes
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

emailstring<email>required

User email

idstring<uuid>required

User ID

namestringrequired

User name

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

assetCountinteger[0, 9007199254740991]required

Number of assets

contributorCountsArray<ContributorCountResponseDto>
Show child attributes
assetCountinteger[0, 9007199254740991]required

Number of assets contributed

userIdstring<uuid>required

User ID

createdAtstring<date-time>required

Creation date

descriptionstringrequired

Album description

endDatestring<date-time>

End date (latest asset)

hasSharedLinkbooleanrequired

Has shared link

idstring<uuid>required

Album ID

isActivityEnabledbooleanrequired

Activity feed enabled

lastModifiedAssetTimestampstring<date-time>

Last modified asset timestamp

orderAssetOrderascdesc

Asset sort order

sharedbooleanrequired

Is shared album

startDatestring<date-time>

Start date (earliest asset)

updatedAtstring<date-time>required

Last update date

Example
{
  "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

object
notSharedinteger[0, 9007199254740991]required

Number of non-shared albums

ownedinteger[0, 9007199254740991]required

Number of owned albums

sharedinteger[0, 9007199254740991]required

Number of shared albums

Example
{
  "notShared": 0,
  "owned": 0,
  "shared": 0
}

AlbumUserAddDto

object
roleAlbumUserRoleeditorownerviewereditor

Album user role

userIdstring<uuid>required

User ID

Example
{
  "role": "editor",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

AlbumUserCreateDto

object
roleAlbumUserRoleeditorownerviewerrequired

Album user role

userIdstring<uuid>required

User ID

Example
{
  "role": "editor",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

AlbumUserResponseDto

object
roleAlbumUserRoleeditorownerviewerrequired

Album user role

userUserResponseDtorequired
Show child attributes
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

emailstring<email>required

User email

idstring<uuid>required

User ID

namestringrequired

User name

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

Example
{
  "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"
  }
}

AlbumUserRole

string

Album user role

AlbumUserRoleeditorownerviewer
Example
"editor"

AlbumsAddAssetsDto

object
albumIdsArray<string>required

Album IDs

assetIdsArray<string>required

Asset IDs

Example
{
  "albumIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}

AlbumsAddAssetsResponseDto

object
errorBulkIdErrorReasonduplicateno_permissionnot_foundunknownvalidation

Error reason

successbooleanrequired

Operation success

Example
{
  "error": "duplicate",
  "success": true
}

AlbumsResponse

object
defaultAssetOrderAssetOrderascdescrequired

Asset sort order

Example
{
  "defaultAssetOrder": "asc"
}

AlbumsUpdate

object

Album preferences

defaultAssetOrderAssetOrderascdesc

Asset sort order

Example
{
  "defaultAssetOrder": "asc"
}

ApiKeyCreateDto

object
namestring

API 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.unlinkAllrequired

List of permissions

Example
{
  "name": "string",
  "permissions": [
    "all"
  ]
}

ApiKeyCreateResponseDto

object
apiKeyApiKeyResponseDtorequired
Show child attributes
createdAtstring<date-time>required

Creation date

idstring<uuid>required

API key ID

namestringrequired

API 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.unlinkAllrequired

List of permissions

updatedAtstring<date-time>required

Last update date

secretstringrequired

API key secret (only shown once)

Example
{
  "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

object
createdAtstring<date-time>required

Creation date

idstring<uuid>required

API key ID

namestringrequired

API 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.unlinkAllrequired

List of permissions

updatedAtstring<date-time>required

Last update date

Example
{
  "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

object
namestring

API 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.unlinkAll

List of permissions

Example
{
  "name": "string",
  "permissions": [
    "all"
  ]
}

AssetBulkDeleteDto

object
forceboolean

Force delete even if in use

idsArray<string>required

IDs to process

Example
{
  "force": true,
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}

AssetBulkUpdateDto

object
dateTimeOriginalstring

Original date and time

dateTimeRelativeinteger[-9007199254740991, 9007199254740991]

Relative time offset in minutes

descriptionstring

Asset description

duplicateIdstring | null

Duplicate ID

idsArray<string>required

Asset IDs to update

isFavoriteboolean

Mark 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)

timeZonestring

Time zone (IANA timezone)

visibilityAssetVisibilityarchivetimelinehiddenlocked

Asset visibility

Example
{
  "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

object
assetsArray<AssetBulkUploadCheckItem>required

Assets to check

Show child attributes
checksumstringrequired

Base64 or hex encoded SHA1 hash

idstringrequired

Client-side identifier echoed in the response to match results to inputs (e.g. filename)

Example
{
  "assets": [
    {
      "checksum": "string",
      "id": "string"
    }
  ]
}

AssetBulkUploadCheckItem

object
checksumstringrequired

Base64 or hex encoded SHA1 hash

idstringrequired

Client-side identifier echoed in the response to match results to inputs (e.g. filename)

Example
{
  "checksum": "string",
  "id": "string"
}

AssetBulkUploadCheckResponseDto

object
resultsArray<AssetBulkUploadCheckResult>required

Upload check results

Show child attributes
actionAssetUploadActionacceptrejectrequired

Upload action

assetIdstring

Existing asset ID if duplicate

idstring<uuid>required

Asset ID

isTrashedboolean

Whether existing asset is trashed

reasonAssetRejectReasonduplicateunsupported-format

Rejection reason if rejected

Example
{
  "results": [
    {
      "action": "accept",
      "assetId": "string",
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "isTrashed": true,
      "reason": "duplicate"
    }
  ]
}

AssetBulkUploadCheckResult

object
actionAssetUploadActionacceptrejectrequired

Upload action

assetIdstring

Existing asset ID if duplicate

idstring<uuid>required

Asset ID

isTrashedboolean

Whether existing asset is trashed

reasonAssetRejectReasonduplicateunsupported-format

Rejection reason if rejected

Example
{
  "action": "accept",
  "assetId": "string",
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "isTrashed": true,
  "reason": "duplicate"
}

AssetCopyDto

object
albumsbooleantrue

Copy album associations

favoritebooleantrue

Copy favorite status

sharedLinksbooleantrue

Copy shared links

sidecarbooleantrue

Copy sidecar file

sourceIdstring<uuid>required

Source asset ID

stackbooleantrue

Copy stack association

targetIdstring<uuid>required

Target asset ID

Example
{
  "albums": true,
  "favorite": true,
  "sharedLinks": true,
  "sidecar": true,
  "sourceId": "550e8400-e29b-41d4-a716-446655440000",
  "stack": true,
  "targetId": "550e8400-e29b-41d4-a716-446655440000"
}

AssetEditAction

string

Type of edit action to perform

AssetEditActioncroprotatemirror
Example
"crop"

AssetEditActionItemDto

object
actionAssetEditActioncroprotatemirrorrequired

Type of edit action to perform

parametersCropParameters | RotateParameters | MirrorParametersrequired

List of edit actions to apply (crop, rotate, or mirror)

Example
{
  "action": "crop",
  "parameters": {
    "height": 1,
    "width": 1,
    "x": 0,
    "y": 0
  }
}

AssetEditActionItemResponseDto

object
actionAssetEditActioncroprotatemirrorrequired

Type of edit action to perform

idstring<uuid>required

Asset edit ID

parametersCropParameters | RotateParameters | MirrorParametersrequired

List of edit actions to apply (crop, rotate, or mirror)

Example
{
  "action": "crop",
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "parameters": {
    "height": 1,
    "width": 1,
    "x": 0,
    "y": 0
  }
}

AssetEditsCreateDto

object
editsArray<AssetEditActionItemDto>required

List of edit actions to apply (crop, rotate, or mirror)

Show child attributes
actionAssetEditActioncroprotatemirrorrequired

Type of edit action to perform

parametersCropParameters | RotateParameters | MirrorParametersrequired

List of edit actions to apply (crop, rotate, or mirror)

Example
{
  "edits": [
    {
      "action": "crop",
      "parameters": {
        "height": 1,
        "width": 1,
        "x": 0,
        "y": 0
      }
    }
  ]
}

AssetEditsResponseDto

object
assetIdstring<uuid>required

Asset ID these edits belong to

editsArray<AssetEditActionItemResponseDto>required

List of edit actions applied to the asset

Show child attributes
actionAssetEditActioncroprotatemirrorrequired

Type of edit action to perform

idstring<uuid>required

Asset edit ID

parametersCropParameters | RotateParameters | MirrorParametersrequired

List of edit actions to apply (crop, rotate, or mirror)

Example
{
  "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

object
assetIdstring<uuid>required

Asset ID

heightinteger[-9007199254740991, 9007199254740991]required

Face bounding box height

imageHeightinteger[-9007199254740991, 9007199254740991]required

Image height in pixels

imageWidthinteger[-9007199254740991, 9007199254740991]required

Image width in pixels

personIdstring<uuid>required

Person ID

widthinteger[-9007199254740991, 9007199254740991]required

Face bounding box width

xinteger[-9007199254740991, 9007199254740991]required

Face bounding box X coordinate

yinteger[-9007199254740991, 9007199254740991]required

Face bounding box Y coordinate

Example
{
  "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

object
forcebooleanrequired

Force delete even if person has other faces

Example
{
  "force": true
}

AssetFaceResponseDto

object

Asset face with person

boundingBoxX1integer[-9007199254740991, 9007199254740991]required

Bounding box X1 coordinate

boundingBoxX2integer[-9007199254740991, 9007199254740991]required

Bounding box X2 coordinate

boundingBoxY1integer[-9007199254740991, 9007199254740991]required

Bounding box Y1 coordinate

boundingBoxY2integer[-9007199254740991, 9007199254740991]required

Bounding box Y2 coordinate

idstring<uuid>required

Face ID

imageHeightinteger[0, 9007199254740991]required

Image height in pixels

imageWidthinteger[0, 9007199254740991]required

Image width in pixels

personPersonResponseDto | nullrequired
sourceTypeSourceTypemachine-learningexifmanual

Face detection source type

Example
{
  "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

object
dataArray<AssetFaceUpdateItem>required

Face update items

Show child attributes
assetIdstring<uuid>required

Asset ID

personIdstring<uuid>required

Person ID

Example
{
  "data": [
    {
      "assetId": "550e8400-e29b-41d4-a716-446655440000",
      "personId": "550e8400-e29b-41d4-a716-446655440000"
    }
  ]
}

AssetFaceUpdateItem

object
assetIdstring<uuid>required

Asset ID

personIdstring<uuid>required

Person ID

Example
{
  "assetId": "550e8400-e29b-41d4-a716-446655440000",
  "personId": "550e8400-e29b-41d4-a716-446655440000"
}

AssetIdErrorReason

string

Error reason if failed

AssetIdErrorReasonduplicateno_permissionnot_found
Example
"duplicate"

AssetIdsDto

object
assetIdsArray<string>required

Asset IDs

Example
{
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}

AssetIdsResponseDto

object
assetIdstring<uuid>required

Asset ID

errorAssetIdErrorReasonduplicateno_permissionnot_found

Error reason if failed

successbooleanrequired

Whether operation succeeded

Example
{
  "assetId": "550e8400-e29b-41d4-a716-446655440000",
  "error": "duplicate",
  "success": true
}

AssetJobName

string

Job name

AssetJobNamerefresh-facesrefresh-metadataregenerate-thumbnailtranscode-video
Example
"refresh-faces"

AssetJobsDto

object
assetIdsArray<string>required

Asset IDs

nameAssetJobNamerefresh-facesrefresh-metadataregenerate-thumbnailtranscode-videorequired

Job name

Example
{
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "name": "refresh-faces"
}

AssetMediaCreateDto

object
assetDatastring<binary>required

Asset file data

durationinteger[0, 9007199254740991]

Duration in milliseconds (for videos)

fileCreatedAtstring<date-time>required

File creation date

fileModifiedAtstring<date-time>required

File modification date

filenamestring

Filename

isFavoriteboolean

Mark as favorite

livePhotoVideoIdstring<uuid>

Live photo video ID

metadataArray<AssetMetadataUpsertItemDto>

Asset metadata items

Show child attributes
keystringrequired

Metadata key

valueobjectrequired

Metadata value (object)

sidecarDatastring<binary>

Sidecar file data

visibilityAssetVisibilityarchivetimelinehiddenlocked

Asset visibility

Example
{
  "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

object
idstring<uuid>required

Asset media ID

statusAssetMediaStatuscreatedduplicaterequired

Upload status

Example
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "status": "created"
}

AssetMediaSize

string

Asset media size

AssetMediaSizeoriginalfullsizepreviewthumbnail
Example
"original"

AssetMediaStatus

string

Upload status

AssetMediaStatuscreatedduplicate
Example
"created"

AssetMetadataBulkDeleteDto

object
itemsArray<AssetMetadataBulkDeleteItemDto>required

Metadata items to delete

Show child attributes
assetIdstring<uuid>required

Asset ID

keystringrequired

Metadata key

Example
{
  "items": [
    {
      "assetId": "550e8400-e29b-41d4-a716-446655440000",
      "key": "string"
    }
  ]
}

AssetMetadataBulkDeleteItemDto

object
assetIdstring<uuid>required

Asset ID

keystringrequired

Metadata key

Example
{
  "assetId": "550e8400-e29b-41d4-a716-446655440000",
  "key": "string"
}

AssetMetadataBulkResponseDto

object
assetIdstring<uuid>required

Asset ID

keystringrequired

Metadata key

updatedAtstring<date-time>required

Last update date

valueobjectrequired

Metadata value (object)

Example
{
  "assetId": "550e8400-e29b-41d4-a716-446655440000",
  "key": "string",
  "updatedAt": "2024-01-01T00:00:00.000Z",
  "value": {}
}

AssetMetadataBulkUpsertDto

object
itemsArray<AssetMetadataBulkUpsertItemDto>required

Metadata items to upsert

Show child attributes
assetIdstring<uuid>required

Asset ID

keystringrequired

Metadata key

valueobjectrequired

Metadata value (object)

Example
{
  "items": [
    {
      "assetId": "550e8400-e29b-41d4-a716-446655440000",
      "key": "string",
      "value": {}
    }
  ]
}

AssetMetadataBulkUpsertItemDto

object
assetIdstring<uuid>required

Asset ID

keystringrequired

Metadata key

valueobjectrequired

Metadata value (object)

Example
{
  "assetId": "550e8400-e29b-41d4-a716-446655440000",
  "key": "string",
  "value": {}
}

AssetMetadataResponseDto

object
keystringrequired

Metadata key

updatedAtstring<date-time>required

Last update date

valueobjectrequired

Metadata value (object)

Example
{
  "key": "string",
  "updatedAt": "2024-01-01T00:00:00.000Z",
  "value": {}
}

AssetMetadataUpsertDto

object
itemsArray<AssetMetadataUpsertItemDto>required

Metadata items to upsert

Show child attributes
keystringrequired

Metadata key

valueobjectrequired

Metadata value (object)

Example
{
  "items": [
    {
      "key": "string",
      "value": {}
    }
  ]
}

AssetMetadataUpsertItemDto

object
keystringrequired

Metadata key

valueobjectrequired

Metadata value (object)

Example
{
  "key": "string",
  "value": {}
}

AssetOcrResponseDto

object
assetIdstring<uuid>required
boxScorenumber<double>required

Confidence score for text detection box

idstring<uuid>required
textstringrequired

Recognized text

textScorenumber<double>required

Confidence score for text recognition

x1number<double>required

Normalized x coordinate of box corner 1 (0-1)

x2number<double>required

Normalized x coordinate of box corner 2 (0-1)

x3number<double>required

Normalized x coordinate of box corner 3 (0-1)

x4number<double>required

Normalized x coordinate of box corner 4 (0-1)

y1number<double>required

Normalized y coordinate of box corner 1 (0-1)

y2number<double>required

Normalized y coordinate of box corner 2 (0-1)

y3number<double>required

Normalized y coordinate of box corner 3 (0-1)

y4number<double>required

Normalized y coordinate of box corner 4 (0-1)

Example
{
  "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
}

AssetOrder

string

Asset sort order

AssetOrderascdesc
Example
"asc"

AssetOrderBy

string

Asset sorting property

AssetOrderBytakenAtcreatedAt
Example
"takenAt"

AssetRejectReason

string

Rejection reason if rejected

AssetRejectReasonduplicateunsupported-format
Example
"duplicate"

AssetResponseDto

object
checksumstringrequired

Base64 encoded SHA1 hash

createdAtstring<date-time>required

The UTC timestamp when the asset was originally uploaded to Immich.

duplicateIdstring<uuid> | null

Duplicate group ID

durationinteger | null[0, 2147483647]required

Video/gif duration in milliseconds (null for static images)

exifInfoExifResponseDto

EXIF response

Show child attributes
citystring | nullnull

City name

countrystring | nullnull

Country name

dateTimeOriginalstring<date-time> | nullnull

Original date/time

descriptionstring | nullnull

Image description

exifImageHeightinteger | null[0, 9007199254740991]null

Image height in pixels

exifImageWidthinteger | null[0, 9007199254740991]null

Image width in pixels

exposureTimestring | nullnull

Exposure time

fNumbernumber | nullnull

F-number (aperture)

fileSizeInByteinteger | null[0, 9007199254740991]null

File size in bytes

focalLengthnumber | nullnull

Focal length in mm

isointeger | null[-9007199254740991, 9007199254740991]null

ISO sensitivity

latitudenumber | nullnull

GPS latitude

lensModelstring | nullnull

Lens model

longitudenumber | nullnull

GPS longitude

makestring | nullnull

Camera make

modelstring | nullnull

Camera model

modifyDatestring<date-time> | nullnull

Modification date/time

orientationstring | nullnull

Image orientation

projectionTypestring | nullnull

Projection type

ratinginteger | null[1, 5]null

Rating

statestring | nullnull

State/province name

timeZonestring | nullnull

Time zone

fileCreatedAtstring<date-time>required

The 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>required

The 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.

hasMetadatabooleanrequired

Whether asset has metadata

heightinteger | null[0, 9007199254740991]required

Asset height

idstring<uuid>required

Asset ID

isArchivedbooleanrequired

Is archived

isEditedbooleanrequired

Is edited

isFavoritebooleanrequired

Is favorite

isOfflinebooleanrequired

Is offline

isTrashedbooleanrequired

Is trashed

libraryIdstring<uuid> | null

Library ID

livePhotoVideoIdstring | null

Live photo video ID

localDateTimestring<date-time>required

The 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.

originalFileNamestringrequired

Original file name

originalMimeTypestring

Original MIME type

originalPathstringrequired

Original file path

ownerUserResponseDto
Show child attributes
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

emailstring<email>required

User email

idstring<uuid>required

User ID

namestringrequired

User name

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

ownerIdstring<uuid>required

Owner user ID

peopleArray<PersonResponseDto>
Show child attributes
birthDatestring<date> | nullrequired

Person date of birth

colorstring

Person color (hex)

idstring<uuid>required

Person ID

isFavoriteboolean

Is favorite

isHiddenbooleanrequired

Is hidden

namestringrequired

Person name

thumbnailPathstringrequired

Thumbnail path

updatedAtstring<date-time>

Last update date

resizedboolean

Is resized

stackAssetStackResponseDto | null
tagsArray<TagResponseDto>
Show child attributes
colorstring

Tag color (hex)

createdAtstring<date-time>required

Creation date

idstring<uuid>required

Tag ID

namestringrequired

Tag name

parentIdstring

Parent tag ID

updatedAtstring<date-time>required

Last update date

valuestringrequired

Tag value (full path)

thumbhashstring | nullrequired

Thumbhash for thumbnail generation (base64) also used as the c query param for thumbnail cache busting.

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERrequired

Asset type

updatedAtstring<date-time>required

The 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.

visibilityAssetVisibilityarchivetimelinehiddenlockedrequired

Asset visibility

widthinteger | null[0, 9007199254740991]required

Asset width

Example
{
  "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

object
assetCountinteger[0, 9007199254740991]required

Number of assets in stack

idstring<uuid>required

Stack ID

primaryAssetIdstring<uuid>required

Primary asset ID

Example
{
  "assetCount": 0,
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}

AssetStatsResponseDto

object
imagesinteger[-9007199254740991, 9007199254740991]required

Number of images

totalinteger[-9007199254740991, 9007199254740991]required

Total number of assets

videosinteger[-9007199254740991, 9007199254740991]required

Number of videos

Example
{
  "images": -9007199254740991,
  "total": -9007199254740991,
  "videos": -9007199254740991
}

AssetTypeEnum

string

Asset type

AssetTypeEnumIMAGEVIDEOAUDIOOTHER
Example
"IMAGE"

AssetUploadAction

string

Upload action

AssetUploadActionacceptreject
Example
"accept"

AssetVisibility

string

Asset visibility

AssetVisibilityarchivetimelinehiddenlocked
Example
"archive"

AudioCodec

string

Target audio codec

AudioCodecmp3aacopuspcm_s16le
Example
"mp3"

AuthStatusResponseDto

object
expiresAtstring

Session expiration date

isElevatedbooleanrequired

Is elevated session

passwordbooleanrequired

Has password set

pinCodebooleanrequired

Has PIN code set

pinExpiresAtstring

PIN expiration date

Example
{
  "expiresAt": "string",
  "isElevated": true,
  "password": true,
  "pinCode": true,
  "pinExpiresAt": "string"
}

AvatarUpdate

object
colorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamber

User avatar color

Example
{
  "color": "primary"
}

BulkIdErrorReason

string

Error reason

BulkIdErrorReasonduplicateno_permissionnot_foundunknownvalidation
Example
"duplicate"

BulkIdResponseDto

object
errorBulkIdErrorReasonduplicateno_permissionnot_foundunknownvalidation

Error reason

errorMessagestring
idstring<uuid>required

ID

successbooleanrequired

Whether operation succeeded

Example
{
  "error": "duplicate",
  "errorMessage": "string",
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "success": true
}

BulkIdsDto

object
idsArray<string>required

IDs to process

Example
{
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}

CLIPConfig

object
enabledbooleanrequired

Whether the task is enabled

modelNamestringrequired

Name of the model to use

Example
{
  "enabled": true,
  "modelName": "string"
}

CQMode

string

CQ mode

CQModeautocqpicq
Example
"auto"

CalendarHeatmapResponseDto

object
fromstringrequired

Start date in UTC

seriesArray<object>required
Show child attributes
countinteger[0, 9007199254740991]required

Activity count

datestringrequired

Date in UTC

tostringrequired

End date in UTC

totalCountinteger[0, 9007199254740991]required

Total activity count over the period

Example
{
  "from": "2024-01-01",
  "series": [
    {
      "count": 0,
      "date": "2024-01-01"
    }
  ],
  "to": "2024-12-31",
  "totalCount": 0
}

CalendarHeatmapType

string

Type of calendar heatmap

stringUploadTaken
Example
"Upload"

CastResponse

object
gCastEnabledbooleanrequired

Whether Google Cast is enabled

Example
{
  "gCastEnabled": true
}

CastUpdate

object
gCastEnabledboolean

Whether Google Cast is enabled

Example
{
  "gCastEnabled": true
}

ChangePasswordDto

object
invalidateSessionsbooleanfalse

Invalidate all other sessions

newPasswordstringrequired

New password (min 8 characters)

passwordstringrequired

Current password

Example
{
  "invalidateSessions": false,
  "newPassword": "password",
  "password": "password"
}

Colorspace

string

Colorspace

Colorspacesrgbp3
Example
"srgb"

ContributorCountResponseDto

object
assetCountinteger[0, 9007199254740991]required

Number of assets contributed

userIdstring<uuid>required

User ID

Example
{
  "assetCount": 0,
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

CreateAlbumDto

object
albumNamestringrequired

Album name

albumUsersArray<AlbumUserCreateDto>

Album users

Show child attributes
roleAlbumUserRoleeditorownerviewerrequired

Album user role

userIdstring<uuid>required

User ID

assetIdsArray<string>

Initial asset IDs

descriptionstring

Album description

Example
{
  "albumName": "string",
  "albumUsers": [
    {
      "role": "editor",
      "userId": "550e8400-e29b-41d4-a716-446655440000"
    }
  ],
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "description": "string"
}

CreateLibraryDto

object
exclusionPatternsArray<string>

Exclusion patterns (max 128)

importPathsArray<string>

Import paths (max 128)

namestring

Library name

ownerIdstring<uuid>required

Owner user ID

Example
{
  "exclusionPatterns": [
    "string"
  ],
  "importPaths": [
    "string"
  ],
  "name": "string",
  "ownerId": "550e8400-e29b-41d4-a716-446655440000"
}

CreateProfileImageDto

object
filestring<binary>required

Profile image file

Example
{
  "file": "<binary>"
}

CreateProfileImageResponseDto

object
profileChangedAtstring<date-time>required

Profile image change date

profileImagePathstringrequired

Profile image file path

userIdstring<uuid>required

User ID

Example
{
  "profileChangedAt": "2024-01-01T00:00:00.000Z",
  "profileImagePath": "string",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

CropParameters

object
heightinteger[1, 9007199254740991]required

Height of the crop

widthinteger[1, 9007199254740991]required

Width of the crop

xinteger[0, 9007199254740991]required

Top-Left X coordinate of crop

yinteger[0, 9007199254740991]required

Top-Left Y coordinate of crop

Example
{
  "height": 1,
  "width": 1,
  "x": 0,
  "y": 0
}

DatabaseBackupConfig

object
cronExpressionstringrequired

Cron expression

enabledbooleanrequired

Enabled

keepLastAmountinteger[1, 9007199254740991]required

Keep last amount

Example
{
  "cronExpression": "string",
  "enabled": true,
  "keepLastAmount": 1
}

DatabaseBackupDeleteDto

object
backupsArray<string>required

Backup filenames to delete

Example
{
  "backups": [
    "string"
  ]
}

DatabaseBackupDto

object
filenamestringrequired

Backup filename

filesizeinteger[-9007199254740991, 9007199254740991]required

Backup file size

timezonestringrequired

Backup timezone

Example
{
  "filename": "string",
  "filesize": -9007199254740991,
  "timezone": "string"
}

DatabaseBackupListResponseDto

object
backupsArray<DatabaseBackupDto>required

List of backups

Show child attributes
filenamestringrequired

Backup filename

filesizeinteger[-9007199254740991, 9007199254740991]required

Backup file size

timezonestringrequired

Backup timezone

Example
{
  "backups": [
    {
      "filename": "string",
      "filesize": -9007199254740991,
      "timezone": "string"
    }
  ]
}

DatabaseBackupUploadDto

object
filestring<binary>

Database backup file

Example
{
  "file": "<binary>"
}

DownloadArchiveDto

object
assetIdsArray<string>required

Asset IDs

editedboolean

Download edited asset if available

Example
{
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "edited": true
}

DownloadArchiveInfo

object
assetIdsArray<string>required

Asset IDs in this archive

sizeinteger[-9007199254740991, 9007199254740991]required

Archive size in bytes

Example
{
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "size": -9007199254740991
}

DownloadInfoDto

object
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

Example
{
  "albumId": "550e8400-e29b-41d4-a716-446655440000",
  "archiveSize": 1,
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

DownloadResponse

object
archiveSizeinteger[-9007199254740991, 9007199254740991]required

Maximum archive size in bytes

includeEmbeddedVideosbooleanrequired

Whether to include embedded videos in downloads

Example
{
  "archiveSize": -9007199254740991,
  "includeEmbeddedVideos": true
}

DownloadResponseDto

object
archivesArray<DownloadArchiveInfo>required

Archive information

Show child attributes
assetIdsArray<string>required

Asset IDs in this archive

sizeinteger[-9007199254740991, 9007199254740991]required

Archive size in bytes

totalSizeinteger[-9007199254740991, 9007199254740991]required

Total size in bytes

Example
{
  "archives": [
    {
      "assetIds": [
        "550e8400-e29b-41d4-a716-446655440000"
      ],
      "size": -9007199254740991
    }
  ],
  "totalSize": -9007199254740991
}

DownloadUpdate

object
archiveSizeinteger[1, 9007199254740991]

Maximum archive size in bytes

includeEmbeddedVideosboolean

Whether to include embedded videos in downloads

Example
{
  "archiveSize": 1,
  "includeEmbeddedVideos": true
}

DuplicateDetectionConfig

object
enabledbooleanrequired

Whether the task is enabled

maxDistancenumber<double>[0.001, 0.1]required

Maximum distance threshold for duplicate detection

Example
{
  "enabled": true,
  "maxDistance": 0.001
}

DuplicateResolveDto

object
groupsArray<DuplicateResolveGroupDto>required

List of duplicate groups to resolve

Show child attributes
duplicateIdstring<uuid>required
keepAssetIdsArray<string>required

Asset IDs to keep

trashAssetIdsArray<string>required

Asset IDs to trash or delete

Example
{
  "groups": [
    {
      "duplicateId": "550e8400-e29b-41d4-a716-446655440000",
      "keepAssetIds": [
        "550e8400-e29b-41d4-a716-446655440000"
      ],
      "trashAssetIds": [
        "550e8400-e29b-41d4-a716-446655440000"
      ]
    }
  ]
}

DuplicateResolveGroupDto

object
duplicateIdstring<uuid>required
keepAssetIdsArray<string>required

Asset IDs to keep

trashAssetIdsArray<string>required

Asset IDs to trash or delete

Example
{
  "duplicateId": "550e8400-e29b-41d4-a716-446655440000",
  "keepAssetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "trashAssetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}

DuplicateResponseDto

object
assetsArray<AssetResponseDto>required

Duplicate assets

Show child attributes
checksumstringrequired

Base64 encoded SHA1 hash

createdAtstring<date-time>required

The UTC timestamp when the asset was originally uploaded to Immich.

duplicateIdstring<uuid> | null

Duplicate group ID

durationinteger | null[0, 2147483647]required

Video/gif duration in milliseconds (null for static images)

exifInfoExifResponseDto

EXIF response

Show child attributes
citystring | nullnull

City name

countrystring | nullnull

Country name

dateTimeOriginalstring<date-time> | nullnull

Original date/time

descriptionstring | nullnull

Image description

exifImageHeightinteger | null[0, 9007199254740991]null

Image height in pixels

exifImageWidthinteger | null[0, 9007199254740991]null

Image width in pixels

exposureTimestring | nullnull

Exposure time

fNumbernumber | nullnull

F-number (aperture)

fileSizeInByteinteger | null[0, 9007199254740991]null

File size in bytes

focalLengthnumber | nullnull

Focal length in mm

isointeger | null[-9007199254740991, 9007199254740991]null

ISO sensitivity

latitudenumber | nullnull

GPS latitude

lensModelstring | nullnull

Lens model

longitudenumber | nullnull

GPS longitude

makestring | nullnull

Camera make

modelstring | nullnull

Camera model

modifyDatestring<date-time> | nullnull

Modification date/time

orientationstring | nullnull

Image orientation

projectionTypestring | nullnull

Projection type

ratinginteger | null[1, 5]null

Rating

statestring | nullnull

State/province name

timeZonestring | nullnull

Time zone

fileCreatedAtstring<date-time>required

The 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>required

The 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.

hasMetadatabooleanrequired

Whether asset has metadata

heightinteger | null[0, 9007199254740991]required

Asset height

idstring<uuid>required

Asset ID

isArchivedbooleanrequired

Is archived

isEditedbooleanrequired

Is edited

isFavoritebooleanrequired

Is favorite

isOfflinebooleanrequired

Is offline

isTrashedbooleanrequired

Is trashed

libraryIdstring<uuid> | null

Library ID

livePhotoVideoIdstring | null

Live photo video ID

localDateTimestring<date-time>required

The 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.

originalFileNamestringrequired

Original file name

originalMimeTypestring

Original MIME type

originalPathstringrequired

Original file path

ownerUserResponseDto
Show child attributes
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

emailstring<email>required

User email

idstring<uuid>required

User ID

namestringrequired

User name

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

ownerIdstring<uuid>required

Owner user ID

peopleArray<PersonResponseDto>
Show child attributes
birthDatestring<date> | nullrequired

Person date of birth

colorstring

Person color (hex)

idstring<uuid>required

Person ID

isFavoriteboolean

Is favorite

isHiddenbooleanrequired

Is hidden

namestringrequired

Person name

thumbnailPathstringrequired

Thumbnail path

updatedAtstring<date-time>

Last update date

resizedboolean

Is resized

stackAssetStackResponseDto | null
tagsArray<TagResponseDto>
Show child attributes
colorstring

Tag color (hex)

createdAtstring<date-time>required

Creation date

idstring<uuid>required

Tag ID

namestringrequired

Tag name

parentIdstring

Parent tag ID

updatedAtstring<date-time>required

Last update date

valuestringrequired

Tag value (full path)

thumbhashstring | nullrequired

Thumbhash for thumbnail generation (base64) also used as the c query param for thumbnail cache busting.

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERrequired

Asset type

updatedAtstring<date-time>required

The 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.

visibilityAssetVisibilityarchivetimelinehiddenlockedrequired

Asset visibility

widthinteger | null[0, 9007199254740991]required

Asset width

duplicateIdstring<uuid>required

Duplicate group ID

suggestedKeepAssetIdsArray<string>required

Suggested asset IDs to keep based on file size and EXIF data

Example
{
  "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

object
albumInvitebooleanrequired

Whether to receive email notifications for album invites

albumUpdatebooleanrequired

Whether to receive email notifications for album updates

enabledbooleanrequired

Whether email notifications are enabled

Example
{
  "albumInvite": true,
  "albumUpdate": true,
  "enabled": true
}

EmailNotificationsUpdate

object
albumInviteboolean

Whether to receive email notifications for album invites

albumUpdateboolean

Whether to receive email notifications for album updates

enabledboolean

Whether email notifications are enabled

Example
{
  "albumInvite": true,
  "albumUpdate": true,
  "enabled": true
}

ExifResponseDto

object

EXIF response

citystring | nullnull

City name

countrystring | nullnull

Country name

dateTimeOriginalstring<date-time> | nullnull

Original date/time

descriptionstring | nullnull

Image description

exifImageHeightinteger | null[0, 9007199254740991]null

Image height in pixels

exifImageWidthinteger | null[0, 9007199254740991]null

Image width in pixels

exposureTimestring | nullnull

Exposure time

fNumbernumber | nullnull

F-number (aperture)

fileSizeInByteinteger | null[0, 9007199254740991]null

File size in bytes

focalLengthnumber | nullnull

Focal length in mm

isointeger | null[-9007199254740991, 9007199254740991]null

ISO sensitivity

latitudenumber | nullnull

GPS latitude

lensModelstring | nullnull

Lens model

longitudenumber | nullnull

GPS longitude

makestring | nullnull

Camera make

modelstring | nullnull

Camera model

modifyDatestring<date-time> | nullnull

Modification date/time

orientationstring | nullnull

Image orientation

projectionTypestring | nullnull

Projection type

ratinginteger | null[1, 5]null

Rating

statestring | nullnull

State/province name

timeZonestring | nullnull

Time zone

Example
{
  "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
}

FaceDto

object
idstring<uuid>required

Face ID

Example
{
  "id": "550e8400-e29b-41d4-a716-446655440000"
}

FacialRecognitionConfig

object
enabledbooleanrequired

Whether the task is enabled

maxDistancenumber<double>[0.1, 2]required

Maximum distance threshold for face recognition

minFacesinteger[1, 9007199254740991]required

Minimum number of faces required for recognition

minScorenumber<double>[0.1, 1]required

Minimum confidence score for face detection

modelNamestringrequired

Name of the model to use

Example
{
  "enabled": true,
  "maxDistance": 0.1,
  "minFaces": 1,
  "minScore": 0.1,
  "modelName": "string"
}

FoldersResponse

object
enabledbooleanrequired

Whether folders are enabled

sidebarWebbooleanrequired

Whether folders appear in web sidebar

Example
{
  "enabled": true,
  "sidebarWeb": true
}

FoldersUpdate

object
enabledboolean

Whether folders are enabled

sidebarWebboolean

Whether folders appear in web sidebar

Example
{
  "enabled": true,
  "sidebarWeb": true
}

ImageFormat

string

Image format

ImageFormatjpegwebp
Example
"jpeg"

IntegrityReport

string

Integrity report type

IntegrityReportuntracked_filemissing_filechecksum_mismatch
Example
"untracked_file"

IntegrityReportResponseDto

object
itemsArray<object>required
Show child attributes
idstring<uuid>required

Integrity report item id

pathstringrequired

Integrity report item path

typeIntegrityReportuntracked_filemissing_filechecksum_mismatchrequired

Integrity report type

nextCursorstring
Example
{
  "items": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "path": "string",
      "type": "untracked_file"
    }
  ],
  "nextCursor": "string"
}

IntegrityReportSummaryResponseDto

object
checksum_mismatchinteger[0, 9007199254740991]required
missing_fileinteger[0, 9007199254740991]required
untracked_fileinteger[0, 9007199254740991]required
Example
{
  "checksum_mismatch": 0,
  "missing_file": 0,
  "untracked_file": 0
}

JobCreateDto

object
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-allrequired

Manual job name

Example
{
  "name": "person-cleanup"
}

JobName

string

Job name

JobNameAssetDeleteAssetDeleteCheckAssetDetectFacesQueueAllAssetDetectFacesAssetDetectDuplicatesQueueAllAssetDetectDuplicatesAssetEditThumbnailGenerationAssetEncodeVideoQueueAllAssetEncodeVideoAssetEmptyTrashAssetExtractMetadataQueueAllAssetExtractMetadataAssetFileMigrationAssetGenerateThumbnailsQueueAllAssetGenerateThumbnailsAuditTableCleanupDatabaseBackupFacialRecognitionQueueAllFacialRecognitionFileDeleteFileMigrationQueueAllLibraryDeleteCheckLibraryDeleteLibraryRemoveAssetLibraryScanAssetsQueueAllLibrarySyncAssetsLibrarySyncFilesQueueAllLibrarySyncFilesLibraryScanQueueAllHlsSessionCleanupMemoryCleanupMemoryGenerateNotificationsCleanupNotifyUserSignupNotifyAlbumInviteNotifyAlbumUpdateUserDeleteUserDeleteCheckUserSyncUsagePersonCleanupPersonFileMigrationPersonGenerateThumbnailSessionCleanupSendMailSidecarQueueAllSidecarCheckSidecarWriteSmartSearchQueueAllSmartSearchStorageTemplateMigrationStorageTemplateMigrationSingleTagCleanupVersionCheckOcrQueueAllOcrWorkflowAssetTriggerIntegrityUntrackedFilesQueueAllIntegrityUntrackedFilesIntegrityUntrackedRefreshIntegrityMissingFilesQueueAllIntegrityMissingFilesIntegrityMissingFilesRefreshIntegrityChecksumFilesIntegrityChecksumFilesRefreshIntegrityDeleteReportTypeIntegrityDeleteReports
Example
"AssetDelete"

JobSettingsDto

object
concurrencyinteger[1, 9007199254740991]required

Concurrency

Example
{
  "concurrency": 1
}

LibraryResponseDto

object
assetCountinteger[-9007199254740991, 9007199254740991]required

Number of assets

createdAtstring<date-time>required

Creation date

exclusionPatternsArray<string>required

Exclusion patterns

idstring<uuid>required

Library ID

importPathsArray<string>required

Import paths

namestringrequired

Library name

ownerIdstring<uuid>required

Owner user ID

refreshedAtstring<date-time> | nullrequired

Last refresh date

updatedAtstring<date-time>required

Last update date

Example
{
  "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

object
photosinteger[-9007199254740991, 9007199254740991]required

Number of photos

totalinteger[-9007199254740991, 9007199254740991]required

Total number of assets

usageinteger[-9007199254740991, 9007199254740991]required

Storage usage in bytes

videosinteger[-9007199254740991, 9007199254740991]required

Number of videos

Example
{
  "photos": -9007199254740991,
  "total": -9007199254740991,
  "usage": -9007199254740991,
  "videos": -9007199254740991
}

LicenseKeyDto

object
activationKeystringrequired

Activation key

licenseKeystringrequired

License key (format: /^IM(SV|CL)(-[\dA-Za-z]{4}){8}$/)

Example
{
  "activationKey": "string",
  "licenseKey": "string"
}

LicenseResponseDto

object
activatedAtstring<date-time>required

Activation date

activationKeystringrequired

Activation key

licenseKeystringrequired

License key (format: /^IM(SV|CL)(-[\dA-Za-z]{4}){8}$/)

Example
{
  "activatedAt": "2024-01-01T00:00:00.000Z",
  "activationKey": "string",
  "licenseKey": "string"
}

LogLevel

string

Log level

LogLevelverbosedebuglogwarnerrorfatal
Example
"verbose"

LoginCredentialDto

object
emailstring<email>required

User email

passwordstringrequired

User password

Example
{
  "email": "testuser@email.com",
  "password": "password"
}

LoginResponseDto

object
accessTokenstringrequired

Access token

isAdminbooleanrequired

Is admin user

isOnboardedbooleanrequired

Is onboarded

namestringrequired

User name

profileImagePathstringrequired

Profile image path

shouldChangePasswordbooleanrequired

Should change password

userEmailstring<email>required

User email

userIdstring<uuid>required

User ID

Example
{
  "accessToken": "string",
  "isAdmin": true,
  "isOnboarded": true,
  "name": "string",
  "profileImagePath": "string",
  "shouldChangePassword": true,
  "userEmail": "user@example.com",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

LogoutResponseDto

object
redirectUristringrequired

Redirect URI

successfulbooleanrequired

Logout successful

Example
{
  "redirectUri": "string",
  "successful": true
}

MachineLearningAvailabilityChecksDto

object
enabledbooleanrequired

Enabled

intervalinteger[-9007199254740991, 9007199254740991]required
timeoutinteger[-9007199254740991, 9007199254740991]required
Example
{
  "enabled": true,
  "interval": -9007199254740991,
  "timeout": -9007199254740991
}

MaintenanceAction

string

Maintenance action

MaintenanceActionstartendselect_database_restorerestore_database
Example
"start"

MaintenanceAuthDto

object
usernamestringrequired

Maintenance username

Example
{
  "username": "string"
}

MaintenanceDetectInstallResponseDto

object
storageArray<MaintenanceDetectInstallStorageFolderDto>required
Show child attributes
filesinteger[-9007199254740991, 9007199254740991]required

Number of files in the folder

folderStorageFolderencoded-videolibraryuploadprofilethumbsbackupsrequired

Storage folder

readablebooleanrequired

Whether the folder is readable

writablebooleanrequired

Whether the folder is writable

Example
{
  "storage": [
    {
      "files": -9007199254740991,
      "folder": "encoded-video",
      "readable": true,
      "writable": true
    }
  ]
}

MaintenanceDetectInstallStorageFolderDto

object
filesinteger[-9007199254740991, 9007199254740991]required

Number of files in the folder

folderStorageFolderencoded-videolibraryuploadprofilethumbsbackupsrequired

Storage folder

readablebooleanrequired

Whether the folder is readable

writablebooleanrequired

Whether the folder is writable

Example
{
  "files": -9007199254740991,
  "folder": "encoded-video",
  "readable": true,
  "writable": true
}

MaintenanceLoginDto

object
tokenstring

Maintenance token

Example
{
  "token": "string"
}

MaintenanceStatusResponseDto

object
actionMaintenanceActionstartendselect_database_restorerestore_databaserequired

Maintenance action

activebooleanrequired
errorstring
progressinteger[-9007199254740991, 9007199254740991]
taskstring
Example
{
  "action": "start",
  "active": true,
  "error": "string",
  "progress": -9007199254740991,
  "task": "string"
}

ManualJobName

string

Manual job name

ManualJobNameperson-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-all
Example
"person-cleanup"

MapMarkerResponseDto

object
citystring | nullrequired

City name

countrystring | nullrequired

Country name

idstring<uuid>required

Asset ID

latnumber<double>required

Latitude

lonnumber<double>required

Longitude

statestring | nullrequired

State/Province name

Example
{
  "city": "string",
  "country": "string",
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "lat": 0,
  "lon": 0,
  "state": "string"
}

MapReverseGeocodeResponseDto

object
citystring | nullrequired

City name

countrystring | nullrequired

Country name

statestring | nullrequired

State/Province name

Example
{
  "city": "string",
  "country": "string",
  "state": "string"
}

MemoriesResponse

object
durationinteger[-9007199254740991, 9007199254740991]required

Memory duration in seconds

enabledbooleanrequired

Whether memories are enabled

Example
{
  "duration": -9007199254740991,
  "enabled": true
}

MemoriesUpdate

object
durationinteger[1, 9007199254740991]

Memory duration in seconds

enabledboolean

Whether memories are enabled

Example
{
  "duration": 1,
  "enabled": true
}

MemoryCreateDto

object
assetIdsArray<string>

Asset IDs to associate with memory

dataOnThisDayDtorequired
Show child attributes
yearinteger[1000, 9999]required

Year for on this day memory

hideAtstring<date-time>

Date when memory should be hidden

isSavedboolean

Is memory saved

memoryAtstring<date-time>required

Memory date

seenAtstring<date-time>

Date when memory was seen

showAtstring<date-time>

Date when memory should be shown

typeMemoryTypeon_this_dayrequired

Memory type

Example
{
  "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

object
assetsArray<AssetResponseDto>required
Show child attributes
checksumstringrequired

Base64 encoded SHA1 hash

createdAtstring<date-time>required

The UTC timestamp when the asset was originally uploaded to Immich.

duplicateIdstring<uuid> | null

Duplicate group ID

durationinteger | null[0, 2147483647]required

Video/gif duration in milliseconds (null for static images)

exifInfoExifResponseDto

EXIF response

Show child attributes
citystring | nullnull

City name

countrystring | nullnull

Country name

dateTimeOriginalstring<date-time> | nullnull

Original date/time

descriptionstring | nullnull

Image description

exifImageHeightinteger | null[0, 9007199254740991]null

Image height in pixels

exifImageWidthinteger | null[0, 9007199254740991]null

Image width in pixels

exposureTimestring | nullnull

Exposure time

fNumbernumber | nullnull

F-number (aperture)

fileSizeInByteinteger | null[0, 9007199254740991]null

File size in bytes

focalLengthnumber | nullnull

Focal length in mm

isointeger | null[-9007199254740991, 9007199254740991]null

ISO sensitivity

latitudenumber | nullnull

GPS latitude

lensModelstring | nullnull

Lens model

longitudenumber | nullnull

GPS longitude

makestring | nullnull

Camera make

modelstring | nullnull

Camera model

modifyDatestring<date-time> | nullnull

Modification date/time

orientationstring | nullnull

Image orientation

projectionTypestring | nullnull

Projection type

ratinginteger | null[1, 5]null

Rating

statestring | nullnull

State/province name

timeZonestring | nullnull

Time zone

fileCreatedAtstring<date-time>required

The 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>required

The 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.

hasMetadatabooleanrequired

Whether asset has metadata

heightinteger | null[0, 9007199254740991]required

Asset height

idstring<uuid>required

Asset ID

isArchivedbooleanrequired

Is archived

isEditedbooleanrequired

Is edited

isFavoritebooleanrequired

Is favorite

isOfflinebooleanrequired

Is offline

isTrashedbooleanrequired

Is trashed

libraryIdstring<uuid> | null

Library ID

livePhotoVideoIdstring | null

Live photo video ID

localDateTimestring<date-time>required

The 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.

originalFileNamestringrequired

Original file name

originalMimeTypestring

Original MIME type

originalPathstringrequired

Original file path

ownerUserResponseDto
Show child attributes
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

emailstring<email>required

User email

idstring<uuid>required

User ID

namestringrequired

User name

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

ownerIdstring<uuid>required

Owner user ID

peopleArray<PersonResponseDto>
Show child attributes
birthDatestring<date> | nullrequired

Person date of birth

colorstring

Person color (hex)

idstring<uuid>required

Person ID

isFavoriteboolean

Is favorite

isHiddenbooleanrequired

Is hidden

namestringrequired

Person name

thumbnailPathstringrequired

Thumbnail path

updatedAtstring<date-time>

Last update date

resizedboolean

Is resized

stackAssetStackResponseDto | null
tagsArray<TagResponseDto>
Show child attributes
colorstring

Tag color (hex)

createdAtstring<date-time>required

Creation date

idstring<uuid>required

Tag ID

namestringrequired

Tag name

parentIdstring

Parent tag ID

updatedAtstring<date-time>required

Last update date

valuestringrequired

Tag value (full path)

thumbhashstring | nullrequired

Thumbhash for thumbnail generation (base64) also used as the c query param for thumbnail cache busting.

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERrequired

Asset type

updatedAtstring<date-time>required

The 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.

visibilityAssetVisibilityarchivetimelinehiddenlockedrequired

Asset visibility

widthinteger | null[0, 9007199254740991]required

Asset width

createdAtstring<date-time>required

Creation date

dataOnThisDayDtorequired
Show child attributes
yearinteger[1000, 9999]required

Year for on this day memory

deletedAtstring<date-time>

Deletion date

hideAtstring<date-time>

Date when memory should be hidden

idstring<uuid>required

Memory ID

isSavedbooleanrequired

Is memory saved

memoryAtstring<date-time>required

Memory date

ownerIdstring<uuid>required

Owner user ID

seenAtstring<date-time>

Date when memory was seen

showAtstring<date-time>

Date when memory should be shown

typeMemoryTypeon_this_dayrequired

Memory type

updatedAtstring<date-time>required

Last update date

Example
{
  "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"
}

MemorySearchOrder

string

Sort order

MemorySearchOrderascdescrandom
Example
"asc"

MemoryStatisticsResponseDto

object
totalinteger[-9007199254740991, 9007199254740991]required

Total number of memories

Example
{
  "total": -9007199254740991
}

MemoryType

string

Memory type

MemoryTypeon_this_day
Example
"on_this_day"

MemoryUpdateDto

object
isSavedboolean

Is memory saved

memoryAtstring<date-time>

Memory date

seenAtstring<date-time>

Date when memory was seen

Example
{
  "isSaved": true,
  "memoryAt": "2024-01-01T00:00:00.000Z",
  "seenAt": "2024-01-01T00:00:00.000Z"
}

MergePersonDto

object
idsArray<string>required

Person IDs to merge

Example
{
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}

MetadataSearchDto

object
albumIdsArray<string>

Filter by album IDs

checksumstring

Filter by file checksum

citystring | null

Filter by city name

countrystring | null

Filter by country name

createdAfterstring<date-time>

Filter by creation date (after)

createdBeforestring<date-time>

Filter by creation date (before)

descriptionstring

Filter by description text

encodedVideoPathstring

Filter by encoded video file path

idstring<uuid>

Filter by asset ID

isEncodedboolean

Filter by encoded status

isFavoriteboolean

Filter by favorite status

isMotionboolean

Filter by motion photo status

isNotInAlbumboolean

Filter assets not in any album

isOfflineboolean

Filter by offline status

lensModelstring | null

Filter by lens model

libraryIdstring<uuid> | null

Library ID to filter by

makestring | null

Filter by camera make

modelstring | null

Filter by camera model

ocrstring

Filter by OCR text content

orderAssetOrderascdescdesc

Asset sort order

originalFileNamestring

Filter by original file name

originalPathstring

Filter by original file path

pageinteger[1, 9007199254740991]

Page number

personIdsArray<string>

Filter by person IDs

previewPathstring

Filter 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 | null

Filter by state/province name

tagIdsArray<string> | null

Filter by tag IDs

takenAfterstring<date-time>

Filter by taken date (after)

takenBeforestring<date-time>

Filter by taken date (before)

thumbnailPathstring

Filter by thumbnail file path

trashedAfterstring<date-time>

Filter by trash date (after)

trashedBeforestring<date-time>

Filter by trash date (before)

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHER

Asset type

updatedAfterstring<date-time>

Filter by update date (after)

updatedBeforestring<date-time>

Filter by update date (before)

visibilityAssetVisibilityarchivetimelinehiddenlocked

Asset visibility

withDeletedboolean

Include deleted assets

withExifboolean

Include EXIF data in response

withPeopleboolean

Include people data in response

withStackedboolean

Include stacked assets

Example
{
  "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
}

MirrorAxis

string

Axis to mirror along

MirrorAxishorizontalvertical
Example
"horizontal"

MirrorParameters

object
axisMirrorAxishorizontalverticalrequired

Axis to mirror along

Example
{
  "axis": "horizontal"
}

NotificationCreateDto

object
dataobject

Additional notification data

descriptionstring | null

Notification description

levelNotificationLevelsuccesserrorwarninginfo

Notification level

readAtstring<date-time> | null

Date when notification was read

titlestringrequired

Notification title

typeNotificationTypeJobFailedBackupFailedSystemMessageAlbumInviteAlbumUpdateCustom

Notification type

userIdstring<uuid>required

User ID to send notification to

Example
{
  "data": {},
  "description": "string",
  "level": "success",
  "readAt": "2024-01-01T00:00:00.000Z",
  "title": "string",
  "type": "JobFailed",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

NotificationDeleteAllDto

object
idsArray<string>required

Notification IDs to delete

Example
{
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}

NotificationDto

object
createdAtstring<date-time>required

Creation date

dataobject

Additional notification data

descriptionstring

Notification description

idstring<uuid>required

Notification ID

levelNotificationLevelsuccesserrorwarninginforequired

Notification level

readAtstring<date-time>

Date when notification was read

titlestringrequired

Notification title

typeNotificationTypeJobFailedBackupFailedSystemMessageAlbumInviteAlbumUpdateCustomrequired

Notification type

Example
{
  "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"
}

NotificationLevel

string

Notification level

NotificationLevelsuccesserrorwarninginfo
Example
"success"

NotificationType

string

Notification type

NotificationTypeJobFailedBackupFailedSystemMessageAlbumInviteAlbumUpdateCustom
Example
"JobFailed"

NotificationUpdateAllDto

object
idsArray<string>required

Notification IDs to update

readAtstring<date-time> | null

Date when notifications were read

Example
{
  "ids": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "readAt": "2024-01-01T00:00:00.000Z"
}

NotificationUpdateDto

object
readAtstring<date-time> | null

Date when notification was read

Example
{
  "readAt": "2024-01-01T00:00:00.000Z"
}

OAuthAuthorizeResponseDto

object
urlstringrequired

OAuth authorization URL

Example
{
  "url": "string"
}

OAuthBackchannelLogoutDto

object
logout_tokenstringrequired

OAuth logout token

Example
{
  "logout_token": "string"
}

OAuthCallbackDto

object
codeVerifierstring

OAuth code verifier (PKCE)

statestring

OAuth state parameter

urlstringrequired

OAuth callback URL

Example
{
  "codeVerifier": "string",
  "state": "string",
  "url": "string"
}

OAuthConfigDto

object
codeChallengestring

OAuth code challenge (PKCE)

redirectUristringrequired

OAuth redirect URI

statestring

OAuth state parameter

Example
{
  "codeChallenge": "string",
  "redirectUri": "string",
  "state": "string"
}

OAuthTokenEndpointAuthMethod

string

OAuth token endpoint auth method

OAuthTokenEndpointAuthMethodclient_secret_postclient_secret_basic
Example
"client_secret_post"

OcrConfig

object
enabledbooleanrequired

Whether the task is enabled

maxResolutioninteger[1, 9007199254740991]required

Maximum resolution for OCR processing

minDetectionScorenumber<double>[0.1, 1]required

Minimum confidence score for text detection

minRecognitionScorenumber<double>[0.1, 1]required

Minimum confidence score for text recognition

modelNamestringrequired

Name of the model to use

Example
{
  "enabled": true,
  "maxResolution": 1,
  "minDetectionScore": 0.1,
  "minRecognitionScore": 0.1,
  "modelName": "string"
}

OnThisDayDto

object
yearinteger[1000, 9999]required

Year for on this day memory

Example
{
  "year": 1000
}

OnboardingDto

object
isOnboardedbooleanrequired

Is user onboarded

Example
{
  "isOnboarded": true
}

OnboardingResponseDto

object
isOnboardedbooleanrequired

Is user onboarded

Example
{
  "isOnboarded": true
}

PartnerCreateDto

object
sharedWithIdstring<uuid>required

User ID to share with

Example
{
  "sharedWithId": "550e8400-e29b-41d4-a716-446655440000"
}

PartnerDirection

string

Partner direction

PartnerDirectionshared-byshared-with
Example
"shared-by"

PartnerResponseDto

object

Partner response

avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

emailstring<email>required

User email

idstring<uuid>required

User ID

inTimelineboolean

Show in timeline

namestringrequired

User name

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

Example
{
  "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

object
inTimelinebooleanrequired

Show partner assets in timeline

Example
{
  "inTimeline": true
}

PeopleResponse

object
enabledbooleanrequired

Whether people are enabled

minimumFacesinteger[1, 9007199254740991]

People face threshold

sidebarWebbooleanrequired

Whether people appear in web sidebar

Example
{
  "enabled": true,
  "minimumFaces": 1,
  "sidebarWeb": true
}

PeopleResponseDto

object

People response

hasNextPageboolean

Whether there are more pages

hiddeninteger[0, 9007199254740991]required

Number of hidden people

peopleArray<PersonResponseDto>required
Show child attributes
birthDatestring<date> | nullrequired

Person date of birth

colorstring

Person color (hex)

idstring<uuid>required

Person ID

isFavoriteboolean

Is favorite

isHiddenbooleanrequired

Is hidden

namestringrequired

Person name

thumbnailPathstringrequired

Thumbnail path

updatedAtstring<date-time>

Last update date

totalinteger[0, 9007199254740991]required

Total number of people

Example
{
  "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

object
enabledboolean

Whether people are enabled

minimumFacesinteger[1, 9007199254740991]

People face threshold

sidebarWebboolean

Whether people appear in web sidebar

Example
{
  "enabled": true,
  "minimumFaces": 1,
  "sidebarWeb": true
}

PeopleUpdateDto

object
peopleArray<PeopleUpdateItem>required

People to update

Show child attributes
birthDatestring<date> | null

Person date of birth

colorstring | null

Person color (hex)

featureFaceAssetIdstring<uuid>

Asset ID used for feature face thumbnail

idstring<uuid>required

Person ID

isFavoriteboolean

Mark as favorite

isHiddenboolean

Person visibility (hidden)

namestring

Person name

Example
{
  "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

object
birthDatestring<date> | null

Person date of birth

colorstring | null

Person color (hex)

featureFaceAssetIdstring<uuid>

Asset ID used for feature face thumbnail

idstring<uuid>required

Person ID

isFavoriteboolean

Mark as favorite

isHiddenboolean

Person visibility (hidden)

namestring

Person name

Example
{
  "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

string

List of permissions

Permissionallactivity.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.unlinkAll
Example
"all"

PersonCreateDto

object
birthDatestring<date> | null

Person date of birth

colorstring | null

Person color (hex)

isFavoriteboolean

Mark as favorite

isHiddenboolean

Person visibility (hidden)

namestring

Person name

Example
{
  "birthDate": "2024-01-15",
  "color": "string",
  "isFavorite": true,
  "isHidden": true,
  "name": "string"
}

PersonResponseDto

object
birthDatestring<date> | nullrequired

Person date of birth

colorstring

Person color (hex)

idstring<uuid>required

Person ID

isFavoriteboolean

Is favorite

isHiddenbooleanrequired

Is hidden

namestringrequired

Person name

thumbnailPathstringrequired

Thumbnail path

updatedAtstring<date-time>

Last update date

Example
{
  "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

object
assetsinteger[-9007199254740991, 9007199254740991]required

Number of assets

Example
{
  "assets": -9007199254740991
}

PersonUpdateDto

object
birthDatestring<date> | null

Person date of birth

colorstring | null

Person color (hex)

featureFaceAssetIdstring<uuid>

Asset ID used for feature face thumbnail

isFavoriteboolean

Mark as favorite

isHiddenboolean

Person visibility (hidden)

namestring

Person name

Example
{
  "birthDate": "2024-01-15",
  "color": "string",
  "featureFaceAssetId": "550e8400-e29b-41d4-a716-446655440000",
  "isFavorite": true,
  "isHidden": true,
  "name": "string"
}

PinCodeChangeDto

object
newPinCodestringrequired

New PIN code (4-6 digits)

passwordstring

User password (required if PIN code is not provided)

pinCodestring

New PIN code (4-6 digits)

Example
{
  "newPinCode": "string",
  "password": "password",
  "pinCode": "123456"
}

PinCodeResetDto

object
passwordstring

User password (required if PIN code is not provided)

pinCodestring

New PIN code (4-6 digits)

Example
{
  "password": "password",
  "pinCode": "123456"
}

PinCodeSetupDto

object
pinCodestringrequired

PIN code (4-6 digits)

Example
{
  "pinCode": "123456"
}

PlacesResponseDto

object
admin1namestring

Administrative level 1 name (state/province)

admin2namestring

Administrative level 2 name (county/district)

latitudenumberrequired

Latitude coordinate

longitudenumberrequired

Longitude coordinate

namestringrequired

Place name

Example
{
  "admin1name": "string",
  "admin2name": "string",
  "latitude": 0,
  "longitude": 0,
  "name": "string"
}

PluginMethodResponseDto

object
descriptionstringrequired

Description

hostFunctionsbooleanrequired
keystringrequired

Key

namestringrequired

Name

schemaobject
Show child attributes
titlestringrequired

Title

typesArray<WorkflowType>AssetV1required

Workflow types

uiHintsArray<string>required

Ui hints

Example
{
  "description": "string",
  "hostFunctions": true,
  "key": "string",
  "name": "string",
  "schema": {},
  "title": "string",
  "types": [
    "AssetV1"
  ],
  "uiHints": [
    "string"
  ]
}

PluginResponseDto

object
authorstringrequired

Plugin author

createdAtstringrequired

Creation date

descriptionstringrequired

Plugin description

idstring<uuid>required

Plugin ID

methodsArray<PluginMethodResponseDto>required

Plugin methods

Show child attributes
descriptionstringrequired

Description

hostFunctionsbooleanrequired
keystringrequired

Key

namestringrequired

Name

schemaobject
Show child attributes
titlestringrequired

Title

typesArray<WorkflowType>AssetV1required

Workflow types

uiHintsArray<string>required

Ui hints

namestringrequired

Plugin name

titlestringrequired

Plugin title

updatedAtstringrequired

Last update date

versionstringrequired

Plugin version

Example
{
  "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

object
descriptionstringrequired

Template description

keystringrequired

Template key (unique across all templates)

stepsArray<PluginTemplateStepResponseDto>required

Workflow steps

Show child attributes
configobject | nullrequired

Step configuration

enabledboolean

Whether the step is enabled

methodstringrequired

Step plugin method

titlestringrequired

Template title

triggerWorkflowTriggerAssetCreateAssetMetadataExtractionrequired

Plugin trigger type

uiHintsArray<string>required

Ui hints, for example "smart-album"

Example
{
  "description": "string",
  "key": "string",
  "steps": [
    {
      "config": {},
      "enabled": true,
      "method": "string"
    }
  ],
  "title": "string",
  "trigger": "AssetCreate",
  "uiHints": [
    "string"
  ]
}

PluginTemplateStepResponseDto

object
configobject | nullrequired

Step configuration

enabledboolean

Whether the step is enabled

methodstringrequired

Step plugin method

Example
{
  "config": {},
  "enabled": true,
  "method": "string"
}

PurchaseResponse

object
hideBuyButtonUntilstringrequired

Date until which to hide buy button

showSupportBadgebooleanrequired

Whether to show support badge

Example
{
  "hideBuyButtonUntil": "string",
  "showSupportBadge": true
}

PurchaseUpdate

object
hideBuyButtonUntilstring

Date until which to hide buy button

showSupportBadgeboolean

Whether to show support badge

Example
{
  "hideBuyButtonUntil": "string",
  "showSupportBadge": true
}

QueueCommand

string

Queue command to execute

QueueCommandstartpauseresumeemptyclear-failed
Example
"start"

QueueCommandDto

object
commandQueueCommandstartpauseresumeemptyclear-failedrequired

Queue command to execute

forceboolean

Force the command execution (if applicable)

Example
{
  "command": "start",
  "force": true
}

QueueDeleteDto

object
failedboolean

If true, will also remove failed jobs from the queue.

Example
{
  "failed": true
}

QueueJobResponseDto

object
dataobjectrequired

Job data payload

idstring

Job ID

nameJobNameAssetDeleteAssetDeleteCheckAssetDetectFacesQueueAllAssetDetectFacesAssetDetectDuplicatesQueueAllAssetDetectDuplicatesAssetEditThumbnailGenerationAssetEncodeVideoQueueAllAssetEncodeVideoAssetEmptyTrashAssetExtractMetadataQueueAllAssetExtractMetadataAssetFileMigrationAssetGenerateThumbnailsQueueAllAssetGenerateThumbnailsAuditTableCleanupDatabaseBackupFacialRecognitionQueueAllFacialRecognitionFileDeleteFileMigrationQueueAllLibraryDeleteCheckLibraryDeleteLibraryRemoveAssetLibraryScanAssetsQueueAllLibrarySyncAssetsLibrarySyncFilesQueueAllLibrarySyncFilesLibraryScanQueueAllHlsSessionCleanupMemoryCleanupMemoryGenerateNotificationsCleanupNotifyUserSignupNotifyAlbumInviteNotifyAlbumUpdateUserDeleteUserDeleteCheckUserSyncUsagePersonCleanupPersonFileMigrationPersonGenerateThumbnailSessionCleanupSendMailSidecarQueueAllSidecarCheckSidecarWriteSmartSearchQueueAllSmartSearchStorageTemplateMigrationStorageTemplateMigrationSingleTagCleanupVersionCheckOcrQueueAllOcrWorkflowAssetTriggerIntegrityUntrackedFilesQueueAllIntegrityUntrackedFilesIntegrityUntrackedRefreshIntegrityMissingFilesQueueAllIntegrityMissingFilesIntegrityMissingFilesRefreshIntegrityChecksumFilesIntegrityChecksumFilesRefreshIntegrityDeleteReportTypeIntegrityDeleteReportsrequired

Job name

timestampinteger[-9007199254740991, 9007199254740991]required

Job creation timestamp

Example
{
  "data": {},
  "id": "string",
  "name": "AssetDelete",
  "timestamp": -9007199254740991
}

QueueJobStatus

string

Queue job status

QueueJobStatusactivefailedcompleteddelayedwaitingpaused
Example
"active"

QueueName

string

Queue name

QueueNamethumbnailGenerationmetadataExtractionvideoConversionfaceDetectionfacialRecognitionsmartSearchduplicateDetectionbackgroundTaskstorageTemplateMigrationmigrationsearchsidecarlibrarynotificationsbackupDatabaseocrworkflowintegrityCheckeditor
Example
"thumbnailGeneration"

QueueResponseDto

object
isPausedbooleanrequired

Whether the queue is paused

nameQueueNamethumbnailGenerationmetadataExtractionvideoConversionfaceDetectionfacialRecognitionsmartSearchduplicateDetectionbackgroundTaskstorageTemplateMigrationmigrationsearchsidecarlibrarynotificationsbackupDatabaseocrworkflowintegrityCheckeditorrequired

Queue name

statisticsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

Example
{
  "isPaused": true,
  "name": "thumbnailGeneration",
  "statistics": {
    "active": -9007199254740991,
    "completed": -9007199254740991,
    "delayed": -9007199254740991,
    "failed": -9007199254740991,
    "paused": -9007199254740991,
    "waiting": -9007199254740991
  }
}

QueueResponseLegacyDto

object
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

Example
{
  "jobCounts": {
    "active": -9007199254740991,
    "completed": -9007199254740991,
    "delayed": -9007199254740991,
    "failed": -9007199254740991,
    "paused": -9007199254740991,
    "waiting": -9007199254740991
  },
  "queueStatus": {
    "isActive": true,
    "isPaused": true
  }
}

QueueStatisticsDto

object
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

Example
{
  "active": -9007199254740991,
  "completed": -9007199254740991,
  "delayed": -9007199254740991,
  "failed": -9007199254740991,
  "paused": -9007199254740991,
  "waiting": -9007199254740991
}

QueueStatusLegacyDto

object
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

Example
{
  "isActive": true,
  "isPaused": true
}

QueueUpdateDto

object
isPausedboolean

Whether to pause the queue

Example
{
  "isPaused": true
}

QueuesResponseLegacyDto

object
backgroundTaskQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

backupDatabaseQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

duplicateDetectionQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

editorQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

faceDetectionQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

facialRecognitionQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

integrityCheckQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

libraryQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

metadataExtractionQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

migrationQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

notificationsQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

ocrQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

searchQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

sidecarQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

smartSearchQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

storageTemplateMigrationQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

thumbnailGenerationQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

videoConversionQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

workflowQueueResponseLegacyDtorequired
Show child attributes
jobCountsQueueStatisticsDtorequired
Show child attributes
activeinteger[-9007199254740991, 9007199254740991]required

Number of active jobs

completedinteger[-9007199254740991, 9007199254740991]required

Number of completed jobs

delayedinteger[-9007199254740991, 9007199254740991]required

Number of delayed jobs

failedinteger[-9007199254740991, 9007199254740991]required

Number of failed jobs

pausedinteger[-9007199254740991, 9007199254740991]required

Number of paused jobs

waitinginteger[-9007199254740991, 9007199254740991]required

Number of waiting jobs

queueStatusQueueStatusLegacyDtorequired
Show child attributes
isActivebooleanrequired

Whether the queue is currently active (has running jobs)

isPausedbooleanrequired

Whether the queue is paused

Example
{
  "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

object
albumIdsArray<string>

Filter by album IDs

citystring | null

Filter by city name

countrystring | null

Filter by country name

createdAfterstring<date-time>

Filter by creation date (after)

createdBeforestring<date-time>

Filter by creation date (before)

isEncodedboolean

Filter by encoded status

isFavoriteboolean

Filter by favorite status

isMotionboolean

Filter by motion photo status

isNotInAlbumboolean

Filter assets not in any album

isOfflineboolean

Filter by offline status

lensModelstring | null

Filter by lens model

libraryIdstring<uuid> | null

Library ID to filter by

makestring | null

Filter by camera make

modelstring | null

Filter by camera model

ocrstring

Filter 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 | null

Filter by state/province name

tagIdsArray<string> | null

Filter 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)

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHER

Asset type

updatedAfterstring<date-time>

Filter by update date (after)

updatedBeforestring<date-time>

Filter by update date (before)

visibilityAssetVisibilityarchivetimelinehiddenlocked

Asset visibility

withDeletedboolean

Include deleted assets

withExifboolean

Include EXIF data in response

withPeopleboolean

Include people data in response

withStackedboolean

Include stacked assets

Example
{
  "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
}

RatingsResponse

object
enabledbooleanrequired

Whether ratings are enabled

Example
{
  "enabled": true
}

RatingsUpdate

object
enabledboolean

Whether ratings are enabled

Example
{
  "enabled": true
}

ReactionLevel

string

Reaction level

ReactionLevelalbumasset
Example
"album"

ReactionType

string

Reaction type

ReactionTypecommentlike
Example
"comment"

ReleaseChannel

string

Release channel

ReleaseChannelstablereleaseCandidate
Example
"stable"

ReleaseEventV1

object
checkedAtstringrequired

When the server last checked for a latest version. As an ISO timestamp

isAvailablebooleanrequired

Whether a new version is available

releaseVersionServerVersionResponseDtorequired
Show child attributes
majorinteger[0, 9007199254740991]required

Major version number

minorinteger[0, 9007199254740991]required

Minor version number

patchinteger[0, 9007199254740991]required

Patch version number

prereleaseinteger | null[0, 9007199254740991]required

Pre-release version number

serverVersionServerVersionResponseDtorequired
Show child attributes
majorinteger[0, 9007199254740991]required

Major version number

minorinteger[0, 9007199254740991]required

Minor version number

patchinteger[0, 9007199254740991]required

Patch version number

prereleaseinteger | null[0, 9007199254740991]required

Pre-release version number

typeReleaseType | nullmajorpremajorminorpreminorpatchprepatchprereleaserequired

Release type

Example
{
  "checkedAt": "string",
  "isAvailable": true,
  "releaseVersion": {
    "major": 0,
    "minor": 0,
    "patch": 0,
    "prerelease": 0
  },
  "serverVersion": {
    "major": 0,
    "minor": 0,
    "patch": 0,
    "prerelease": 0
  },
  "type": "major"
}

ReleaseType

string
stringmajorpremajorminorpreminorpatchprepatchprerelease
Example
"major"

ReverseGeocodingStateResponseDto

object
lastImportFileNamestring | nullrequired

Last import file name

lastUpdatestring | nullrequired

Last update timestamp

Example
{
  "lastImportFileName": "string",
  "lastUpdate": "string"
}

RotateParameters

object
anglenumberrequired

Rotation angle in degrees

Example
{
  "angle": 0
}

SearchAlbumResponseDto

object
countinteger[0, 9007199254740991]required

Number of albums in this page

facetsArray<SearchFacetResponseDto>required
Show child attributes
countsArray<SearchFacetCountResponseDto>required
Show child attributes
countinteger[0, 9007199254740991]required

Number of assets with this facet value

valuestringrequired

Facet value

fieldNamestringrequired

Facet field name

itemsArray<AlbumResponseDto>required
Show child attributes
albumNamestringrequired

Album name

albumThumbnailAssetIdstring<uuid> | nullrequired

Thumbnail asset ID

albumUsersArray<AlbumUserResponseDto>required

First entry is always the album owner. Second entry is the auth user, if it differs from the owner. The rest are ordered alphabetically.

Show child attributes
roleAlbumUserRoleeditorownerviewerrequired

Album user role

userUserResponseDtorequired
Show child attributes
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

emailstring<email>required

User email

idstring<uuid>required

User ID

namestringrequired

User name

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

assetCountinteger[0, 9007199254740991]required

Number of assets

contributorCountsArray<ContributorCountResponseDto>
Show child attributes
assetCountinteger[0, 9007199254740991]required

Number of assets contributed

userIdstring<uuid>required

User ID

createdAtstring<date-time>required

Creation date

descriptionstringrequired

Album description

endDatestring<date-time>

End date (latest asset)

hasSharedLinkbooleanrequired

Has shared link

idstring<uuid>required

Album ID

isActivityEnabledbooleanrequired

Activity feed enabled

lastModifiedAssetTimestampstring<date-time>

Last modified asset timestamp

orderAssetOrderascdesc

Asset sort order

sharedbooleanrequired

Is shared album

startDatestring<date-time>

Start date (earliest asset)

updatedAtstring<date-time>required

Last update date

totalinteger[0, 9007199254740991]required

Total number of matching albums

Example
{
  "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

object
countinteger[0, 9007199254740991]required

Number of assets in this page

facetsArray<SearchFacetResponseDto>required
Show child attributes
countsArray<SearchFacetCountResponseDto>required
Show child attributes
countinteger[0, 9007199254740991]required

Number of assets with this facet value

valuestringrequired

Facet value

fieldNamestringrequired

Facet field name

itemsArray<AssetResponseDto>required
Show child attributes
checksumstringrequired

Base64 encoded SHA1 hash

createdAtstring<date-time>required

The UTC timestamp when the asset was originally uploaded to Immich.

duplicateIdstring<uuid> | null

Duplicate group ID

durationinteger | null[0, 2147483647]required

Video/gif duration in milliseconds (null for static images)

exifInfoExifResponseDto

EXIF response

Show child attributes
citystring | nullnull

City name

countrystring | nullnull

Country name

dateTimeOriginalstring<date-time> | nullnull

Original date/time

descriptionstring | nullnull

Image description

exifImageHeightinteger | null[0, 9007199254740991]null

Image height in pixels

exifImageWidthinteger | null[0, 9007199254740991]null

Image width in pixels

exposureTimestring | nullnull

Exposure time

fNumbernumber | nullnull

F-number (aperture)

fileSizeInByteinteger | null[0, 9007199254740991]null

File size in bytes

focalLengthnumber | nullnull

Focal length in mm

isointeger | null[-9007199254740991, 9007199254740991]null

ISO sensitivity

latitudenumber | nullnull

GPS latitude

lensModelstring | nullnull

Lens model

longitudenumber | nullnull

GPS longitude

makestring | nullnull

Camera make

modelstring | nullnull

Camera model

modifyDatestring<date-time> | nullnull

Modification date/time

orientationstring | nullnull

Image orientation

projectionTypestring | nullnull

Projection type

ratinginteger | null[1, 5]null

Rating

statestring | nullnull

State/province name

timeZonestring | nullnull

Time zone

fileCreatedAtstring<date-time>required

The 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>required

The 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.

hasMetadatabooleanrequired

Whether asset has metadata

heightinteger | null[0, 9007199254740991]required

Asset height

idstring<uuid>required

Asset ID

isArchivedbooleanrequired

Is archived

isEditedbooleanrequired

Is edited

isFavoritebooleanrequired

Is favorite

isOfflinebooleanrequired

Is offline

isTrashedbooleanrequired

Is trashed

libraryIdstring<uuid> | null

Library ID

livePhotoVideoIdstring | null

Live photo video ID

localDateTimestring<date-time>required

The 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.

originalFileNamestringrequired

Original file name

originalMimeTypestring

Original MIME type

originalPathstringrequired

Original file path

ownerUserResponseDto
Show child attributes
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

emailstring<email>required

User email

idstring<uuid>required

User ID

namestringrequired

User name

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

ownerIdstring<uuid>required

Owner user ID

peopleArray<PersonResponseDto>
Show child attributes
birthDatestring<date> | nullrequired

Person date of birth

colorstring

Person color (hex)

idstring<uuid>required

Person ID

isFavoriteboolean

Is favorite

isHiddenbooleanrequired

Is hidden

namestringrequired

Person name

thumbnailPathstringrequired

Thumbnail path

updatedAtstring<date-time>

Last update date

resizedboolean

Is resized

stackAssetStackResponseDto | null
tagsArray<TagResponseDto>
Show child attributes
colorstring

Tag color (hex)

createdAtstring<date-time>required

Creation date

idstring<uuid>required

Tag ID

namestringrequired

Tag name

parentIdstring

Parent tag ID

updatedAtstring<date-time>required

Last update date

valuestringrequired

Tag value (full path)

thumbhashstring | nullrequired

Thumbhash for thumbnail generation (base64) also used as the c query param for thumbnail cache busting.

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERrequired

Asset type

updatedAtstring<date-time>required

The 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.

visibilityAssetVisibilityarchivetimelinehiddenlockedrequired

Asset visibility

widthinteger | null[0, 9007199254740991]required

Asset width

nextPagestring | nullrequired

Next page token

totalinteger[0, 9007199254740991]required

Total number of matching assets

Example
{
  "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

object
dataAssetResponseDtorequired
Show child attributes
checksumstringrequired

Base64 encoded SHA1 hash

createdAtstring<date-time>required

The UTC timestamp when the asset was originally uploaded to Immich.

duplicateIdstring<uuid> | null

Duplicate group ID

durationinteger | null[0, 2147483647]required

Video/gif duration in milliseconds (null for static images)

exifInfoExifResponseDto

EXIF response

Show child attributes
citystring | nullnull

City name

countrystring | nullnull

Country name

dateTimeOriginalstring<date-time> | nullnull

Original date/time

descriptionstring | nullnull

Image description

exifImageHeightinteger | null[0, 9007199254740991]null

Image height in pixels

exifImageWidthinteger | null[0, 9007199254740991]null

Image width in pixels

exposureTimestring | nullnull

Exposure time

fNumbernumber | nullnull

F-number (aperture)

fileSizeInByteinteger | null[0, 9007199254740991]null

File size in bytes

focalLengthnumber | nullnull

Focal length in mm

isointeger | null[-9007199254740991, 9007199254740991]null

ISO sensitivity

latitudenumber | nullnull

GPS latitude

lensModelstring | nullnull

Lens model

longitudenumber | nullnull

GPS longitude

makestring | nullnull

Camera make

modelstring | nullnull

Camera model

modifyDatestring<date-time> | nullnull

Modification date/time

orientationstring | nullnull

Image orientation

projectionTypestring | nullnull

Projection type

ratinginteger | null[1, 5]null

Rating

statestring | nullnull

State/province name

timeZonestring | nullnull

Time zone

fileCreatedAtstring<date-time>required

The 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>required

The 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.

hasMetadatabooleanrequired

Whether asset has metadata

heightinteger | null[0, 9007199254740991]required

Asset height

idstring<uuid>required

Asset ID

isArchivedbooleanrequired

Is archived

isEditedbooleanrequired

Is edited

isFavoritebooleanrequired

Is favorite

isOfflinebooleanrequired

Is offline

isTrashedbooleanrequired

Is trashed

libraryIdstring<uuid> | null

Library ID

livePhotoVideoIdstring | null

Live photo video ID

localDateTimestring<date-time>required

The 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.

originalFileNamestringrequired

Original file name

originalMimeTypestring

Original MIME type

originalPathstringrequired

Original file path

ownerUserResponseDto
Show child attributes
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

emailstring<email>required

User email

idstring<uuid>required

User ID

namestringrequired

User name

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

ownerIdstring<uuid>required

Owner user ID

peopleArray<PersonResponseDto>
Show child attributes
birthDatestring<date> | nullrequired

Person date of birth

colorstring

Person color (hex)

idstring<uuid>required

Person ID

isFavoriteboolean

Is favorite

isHiddenbooleanrequired

Is hidden

namestringrequired

Person name

thumbnailPathstringrequired

Thumbnail path

updatedAtstring<date-time>

Last update date

resizedboolean

Is resized

stackAssetStackResponseDto | null
tagsArray<TagResponseDto>
Show child attributes
colorstring

Tag color (hex)

createdAtstring<date-time>required

Creation date

idstring<uuid>required

Tag ID

namestringrequired

Tag name

parentIdstring

Parent tag ID

updatedAtstring<date-time>required

Last update date

valuestringrequired

Tag value (full path)

thumbhashstring | nullrequired

Thumbhash for thumbnail generation (base64) also used as the c query param for thumbnail cache busting.

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERrequired

Asset type

updatedAtstring<date-time>required

The 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.

visibilityAssetVisibilityarchivetimelinehiddenlockedrequired

Asset visibility

widthinteger | null[0, 9007199254740991]required

Asset width

valuestringrequired

Explore value

Example
{
  "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

object
fieldNamestringrequired

Explore field name

itemsArray<SearchExploreItem>required
Show child attributes
dataAssetResponseDtorequired
Show child attributes
checksumstringrequired

Base64 encoded SHA1 hash

createdAtstring<date-time>required

The UTC timestamp when the asset was originally uploaded to Immich.

duplicateIdstring<uuid> | null

Duplicate group ID

durationinteger | null[0, 2147483647]required

Video/gif duration in milliseconds (null for static images)

exifInfoExifResponseDto

EXIF response

Show child attributes
citystring | nullnull

City name

countrystring | nullnull

Country name

dateTimeOriginalstring<date-time> | nullnull

Original date/time

descriptionstring | nullnull

Image description

exifImageHeightinteger | null[0, 9007199254740991]null

Image height in pixels

exifImageWidthinteger | null[0, 9007199254740991]null

Image width in pixels

exposureTimestring | nullnull

Exposure time

fNumbernumber | nullnull

F-number (aperture)

fileSizeInByteinteger | null[0, 9007199254740991]null

File size in bytes

focalLengthnumber | nullnull

Focal length in mm

isointeger | null[-9007199254740991, 9007199254740991]null

ISO sensitivity

latitudenumber | nullnull

GPS latitude

lensModelstring | nullnull

Lens model

longitudenumber | nullnull

GPS longitude

makestring | nullnull

Camera make

modelstring | nullnull

Camera model

modifyDatestring<date-time> | nullnull

Modification date/time

orientationstring | nullnull

Image orientation

projectionTypestring | nullnull

Projection type

ratinginteger | null[1, 5]null

Rating

statestring | nullnull

State/province name

timeZonestring | nullnull

Time zone

fileCreatedAtstring<date-time>required

The 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>required

The 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.

hasMetadatabooleanrequired

Whether asset has metadata

heightinteger | null[0, 9007199254740991]required

Asset height

idstring<uuid>required

Asset ID

isArchivedbooleanrequired

Is archived

isEditedbooleanrequired

Is edited

isFavoritebooleanrequired

Is favorite

isOfflinebooleanrequired

Is offline

isTrashedbooleanrequired

Is trashed

libraryIdstring<uuid> | null

Library ID

livePhotoVideoIdstring | null

Live photo video ID

localDateTimestring<date-time>required

The 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.

originalFileNamestringrequired

Original file name

originalMimeTypestring

Original MIME type

originalPathstringrequired

Original file path

ownerUserResponseDto
Show child attributes
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

emailstring<email>required

User email

idstring<uuid>required

User ID

namestringrequired

User name

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

ownerIdstring<uuid>required

Owner user ID

peopleArray<PersonResponseDto>
Show child attributes
birthDatestring<date> | nullrequired

Person date of birth

colorstring

Person color (hex)

idstring<uuid>required

Person ID

isFavoriteboolean

Is favorite

isHiddenbooleanrequired

Is hidden

namestringrequired

Person name

thumbnailPathstringrequired

Thumbnail path

updatedAtstring<date-time>

Last update date

resizedboolean

Is resized

stackAssetStackResponseDto | null
tagsArray<TagResponseDto>
Show child attributes
colorstring

Tag color (hex)

createdAtstring<date-time>required

Creation date

idstring<uuid>required

Tag ID

namestringrequired

Tag name

parentIdstring

Parent tag ID

updatedAtstring<date-time>required

Last update date

valuestringrequired

Tag value (full path)

thumbhashstring | nullrequired

Thumbhash for thumbnail generation (base64) also used as the c query param for thumbnail cache busting.

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERrequired

Asset type

updatedAtstring<date-time>required

The 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.

visibilityAssetVisibilityarchivetimelinehiddenlockedrequired

Asset visibility

widthinteger | null[0, 9007199254740991]required

Asset width

valuestringrequired

Explore value

Example
{
  "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

object
countinteger[0, 9007199254740991]required

Number of assets with this facet value

valuestringrequired

Facet value

Example
{
  "count": 0,
  "value": "string"
}

SearchFacetResponseDto

object
countsArray<SearchFacetCountResponseDto>required
Show child attributes
countinteger[0, 9007199254740991]required

Number of assets with this facet value

valuestringrequired

Facet value

fieldNamestringrequired

Facet field name

Example
{
  "counts": [
    {
      "count": 0,
      "value": "string"
    }
  ],
  "fieldName": "string"
}

SearchResponseDto

object
albumsSearchAlbumResponseDtorequired
Show child attributes
countinteger[0, 9007199254740991]required

Number of albums in this page

facetsArray<SearchFacetResponseDto>required
Show child attributes
countsArray<SearchFacetCountResponseDto>required
Show child attributes
countinteger[0, 9007199254740991]required

Number of assets with this facet value

valuestringrequired

Facet value

fieldNamestringrequired

Facet field name

itemsArray<AlbumResponseDto>required
Show child attributes
albumNamestringrequired

Album name

albumThumbnailAssetIdstring<uuid> | nullrequired

Thumbnail asset ID

albumUsersArray<AlbumUserResponseDto>required

First entry is always the album owner. Second entry is the auth user, if it differs from the owner. The rest are ordered alphabetically.

Show child attributes
roleAlbumUserRoleeditorownerviewerrequired

Album user role

userUserResponseDtorequired
Show child attributes
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

emailstring<email>required

User email

idstring<uuid>required

User ID

namestringrequired

User name

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

assetCountinteger[0, 9007199254740991]required

Number of assets

contributorCountsArray<ContributorCountResponseDto>
Show child attributes
assetCountinteger[0, 9007199254740991]required

Number of assets contributed

userIdstring<uuid>required

User ID

createdAtstring<date-time>required

Creation date

descriptionstringrequired

Album description

endDatestring<date-time>

End date (latest asset)

hasSharedLinkbooleanrequired

Has shared link

idstring<uuid>required

Album ID

isActivityEnabledbooleanrequired

Activity feed enabled

lastModifiedAssetTimestampstring<date-time>

Last modified asset timestamp

orderAssetOrderascdesc

Asset sort order

sharedbooleanrequired

Is shared album

startDatestring<date-time>

Start date (earliest asset)

updatedAtstring<date-time>required

Last update date

totalinteger[0, 9007199254740991]required

Total number of matching albums

assetsSearchAssetResponseDtorequired
Show child attributes
countinteger[0, 9007199254740991]required

Number of assets in this page

facetsArray<SearchFacetResponseDto>required
Show child attributes
countsArray<SearchFacetCountResponseDto>required
Show child attributes
countinteger[0, 9007199254740991]required

Number of assets with this facet value

valuestringrequired

Facet value

fieldNamestringrequired

Facet field name

itemsArray<AssetResponseDto>required
Show child attributes
checksumstringrequired

Base64 encoded SHA1 hash

createdAtstring<date-time>required

The UTC timestamp when the asset was originally uploaded to Immich.

duplicateIdstring<uuid> | null

Duplicate group ID

durationinteger | null[0, 2147483647]required

Video/gif duration in milliseconds (null for static images)

exifInfoExifResponseDto

EXIF response

Show child attributes
citystring | nullnull

City name

countrystring | nullnull

Country name

dateTimeOriginalstring<date-time> | nullnull

Original date/time

descriptionstring | nullnull

Image description

exifImageHeightinteger | null[0, 9007199254740991]null

Image height in pixels

exifImageWidthinteger | null[0, 9007199254740991]null

Image width in pixels

exposureTimestring | nullnull

Exposure time

fNumbernumber | nullnull

F-number (aperture)

fileSizeInByteinteger | null[0, 9007199254740991]null

File size in bytes

focalLengthnumber | nullnull

Focal length in mm

isointeger | null[-9007199254740991, 9007199254740991]null

ISO sensitivity

latitudenumber | nullnull

GPS latitude

lensModelstring | nullnull

Lens model

longitudenumber | nullnull

GPS longitude

makestring | nullnull

Camera make

modelstring | nullnull

Camera model

modifyDatestring<date-time> | nullnull

Modification date/time

orientationstring | nullnull

Image orientation

projectionTypestring | nullnull

Projection type

ratinginteger | null[1, 5]null

Rating

statestring | nullnull

State/province name

timeZonestring | nullnull

Time zone

fileCreatedAtstring<date-time>required

The 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>required

The 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.

hasMetadatabooleanrequired

Whether asset has metadata

heightinteger | null[0, 9007199254740991]required

Asset height

idstring<uuid>required

Asset ID

isArchivedbooleanrequired

Is archived

isEditedbooleanrequired

Is edited

isFavoritebooleanrequired

Is favorite

isOfflinebooleanrequired

Is offline

isTrashedbooleanrequired

Is trashed

libraryIdstring<uuid> | null

Library ID

livePhotoVideoIdstring | null

Live photo video ID

localDateTimestring<date-time>required

The 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.

originalFileNamestringrequired

Original file name

originalMimeTypestring

Original MIME type

originalPathstringrequired

Original file path

ownerUserResponseDto
Show child attributes
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

emailstring<email>required

User email

idstring<uuid>required

User ID

namestringrequired

User name

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

ownerIdstring<uuid>required

Owner user ID

peopleArray<PersonResponseDto>
Show child attributes
birthDatestring<date> | nullrequired

Person date of birth

colorstring

Person color (hex)

idstring<uuid>required

Person ID

isFavoriteboolean

Is favorite

isHiddenbooleanrequired

Is hidden

namestringrequired

Person name

thumbnailPathstringrequired

Thumbnail path

updatedAtstring<date-time>

Last update date

resizedboolean

Is resized

stackAssetStackResponseDto | null
tagsArray<TagResponseDto>
Show child attributes
colorstring

Tag color (hex)

createdAtstring<date-time>required

Creation date

idstring<uuid>required

Tag ID

namestringrequired

Tag name

parentIdstring

Parent tag ID

updatedAtstring<date-time>required

Last update date

valuestringrequired

Tag value (full path)

thumbhashstring | nullrequired

Thumbhash for thumbnail generation (base64) also used as the c query param for thumbnail cache busting.

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERrequired

Asset type

updatedAtstring<date-time>required

The 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.

visibilityAssetVisibilityarchivetimelinehiddenlockedrequired

Asset visibility

widthinteger | null[0, 9007199254740991]required

Asset width

nextPagestring | nullrequired

Next page token

totalinteger[0, 9007199254740991]required

Total number of matching assets

Example
{
  "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

object
totalinteger[-9007199254740991, 9007199254740991]required

Total number of matching assets

Example
{
  "total": -9007199254740991
}

SearchSuggestionType

string

Suggestion type

SearchSuggestionTypecountrystatecitycamera-makecamera-modelcamera-lens-model
Example
"country"

ServerAboutResponseDto

object
buildstring

Build identifier

buildImagestring

Build image name

buildImageUrlstring

Build image URL

buildUrlstring

Build URL

exiftoolstring

ExifTool version

ffmpegstring

FFmpeg version

imagemagickstring

ImageMagick version

libvipsstring

libvips version

licensedbooleanrequired

Whether the server is licensed

nodejsstring

Node.js version

repositorystring

Repository name

repositoryUrlstring

Repository URL

sourceCommitstring

Source commit hash

sourceRefstring

Source reference (branch/tag)

sourceUrlstring

Source URL

thirdPartyBugFeatureUrlstring

Third-party bug/feature URL

thirdPartyDocumentationUrlstring

Third-party documentation URL

thirdPartySourceUrlstring

Third-party source URL

thirdPartySupportUrlstring

Third-party support URL

versionstringrequired

Server version

versionUrlstringrequired

URL to version information

Example
{
  "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

object
arm64v8astringrequired

APK download link for ARM64 v8a architecture

armeabiv7astringrequired

APK download link for ARM EABI v7a architecture

universalstringrequired

APK download link for universal architecture

x86_64stringrequired

APK download link for x86_64 architecture

Example
{
  "arm64v8a": "string",
  "armeabiv7a": "string",
  "universal": "string",
  "x86_64": "string"
}

ServerConfigDto

object
externalDomainstringrequired

External domain URL

isInitializedbooleanrequired

Whether the server has been initialized

isOnboardedbooleanrequired

Whether the admin has completed onboarding

loginPageMessagestringrequired

Login page message

maintenanceModebooleanrequired

Whether maintenance mode is active

mapDarkStyleUrlstringrequired

Map dark style URL

mapLightStyleUrlstringrequired

Map light style URL

minFacesinteger[-9007199254740991, 9007199254740991]required

People min faces server default

oauthButtonTextstringrequired

OAuth button text

publicUsersbooleanrequired

Whether public user registration is enabled

trashDaysinteger[-9007199254740991, 9007199254740991]required

Number of days before trashed assets are permanently deleted

userDeleteDelayinteger[-9007199254740991, 9007199254740991]required

Delay in days before deleted users are permanently removed

Example
{
  "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

object
configFilebooleanrequired

Whether config file is available

duplicateDetectionbooleanrequired

Whether duplicate detection is enabled

emailbooleanrequired

Whether email notifications are enabled

facialRecognitionbooleanrequired

Whether facial recognition is enabled

importFacesbooleanrequired

Whether face import is enabled

mapbooleanrequired

Whether map feature is enabled

oauthbooleanrequired

Whether OAuth is enabled

oauthAutoLaunchbooleanrequired

Whether OAuth auto-launch is enabled

ocrbooleanrequired

Whether OCR is enabled

passwordLoginbooleanrequired

Whether password login is enabled

realtimeTranscodingbooleanrequired

Whether real-time transcoding is enabled

reverseGeocodingbooleanrequired

Whether reverse geocoding is enabled

searchbooleanrequired

Whether search is enabled

sidecarbooleanrequired

Whether sidecar files are supported

smartSearchbooleanrequired

Whether smart search is enabled

trashbooleanrequired

Whether trash feature is enabled

Example
{
  "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

object
imageArray<string>required

Supported image MIME types

sidecarArray<string>required

Supported sidecar MIME types

videoArray<string>required

Supported video MIME types

Example
{
  "image": [
    "string"
  ],
  "sidecar": [
    "string"
  ],
  "video": [
    "string"
  ]
}

ServerPingResponse

object
resstringrequired
Example
{
  "res": "pong"
}

ServerStatsResponseDto

object
photosinteger[-9007199254740991, 9007199254740991]required

Total number of photos

usageinteger[-9007199254740991, 9007199254740991]required

Total storage usage in bytes

usageByUserArray<UsageByUserDto>required

Array of usage for each user

Show child attributes
photosinteger[-9007199254740991, 9007199254740991]required

Number of photos

quotaSizeInBytesinteger | null[-9007199254740991, 9007199254740991]required

User quota size in bytes (null if unlimited)

usageinteger[-9007199254740991, 9007199254740991]required

Total storage usage in bytes

usagePhotosinteger[-9007199254740991, 9007199254740991]required

Storage usage for photos in bytes

usageVideosinteger[-9007199254740991, 9007199254740991]required

Storage usage for videos in bytes

userIdstring<uuid>required

User ID

userNamestringrequired

User name

videosinteger[-9007199254740991, 9007199254740991]required

Number of videos

usagePhotosinteger[-9007199254740991, 9007199254740991]required

Storage usage for photos in bytes

usageVideosinteger[-9007199254740991, 9007199254740991]required

Storage usage for videos in bytes

videosinteger[-9007199254740991, 9007199254740991]required

Total number of videos

Example
{
  "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

object
diskAvailablestringrequired

Available disk space (human-readable format)

diskAvailableRawinteger[-9007199254740991, 9007199254740991]required

Available disk space in bytes

diskSizestringrequired

Total disk size (human-readable format)

diskSizeRawinteger[-9007199254740991, 9007199254740991]required

Total disk size in bytes

diskUsagePercentagenumber<double>required

Disk usage percentage (0-100)

diskUsestringrequired

Used disk space (human-readable format)

diskUseRawinteger[-9007199254740991, 9007199254740991]required

Used disk space in bytes

Example
{
  "diskAvailable": "string",
  "diskAvailableRaw": -9007199254740991,
  "diskSize": "string",
  "diskSizeRaw": -9007199254740991,
  "diskUsagePercentage": 0,
  "diskUse": "string",
  "diskUseRaw": -9007199254740991
}

ServerVersionHistoryResponseDto

object
createdAtstring<date-time>required

When this version was first seen

idstring<uuid>required

Version history entry ID

versionstringrequired

Version string

Example
{
  "createdAt": "2024-01-01T00:00:00.000Z",
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "version": "string"
}

ServerVersionResponseDto

object
majorinteger[0, 9007199254740991]required

Major version number

minorinteger[0, 9007199254740991]required

Minor version number

patchinteger[0, 9007199254740991]required

Patch version number

prereleaseinteger | null[0, 9007199254740991]required

Pre-release version number

Example
{
  "major": 0,
  "minor": 0,
  "patch": 0,
  "prerelease": 0
}

SessionCreateDto

object
deviceOSstring

Device OS

deviceTypestring

Device type

durationinteger[1, 9007199254740991]

Session duration in seconds

Example
{
  "deviceOS": "string",
  "deviceType": "string",
  "duration": 1
}

SessionCreateResponseDto

object
appVersionstring | nullrequired

App version

createdAtstringrequired

Creation date

currentbooleanrequired

Is current session

deviceOSstringrequired

Device OS

deviceTypestringrequired

Device type

expiresAtstring

Expiration date

idstring<uuid>required

Session ID

isPendingSyncResetbooleanrequired

Is pending sync reset

tokenstringrequired

Session token

updatedAtstringrequired

Last update date

Example
{
  "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

object
appVersionstring | nullrequired

App version

createdAtstringrequired

Creation date

currentbooleanrequired

Is current session

deviceOSstringrequired

Device OS

deviceTypestringrequired

Device type

expiresAtstring

Expiration date

idstring<uuid>required

Session ID

isPendingSyncResetbooleanrequired

Is pending sync reset

updatedAtstringrequired

Last update date

Example
{
  "appVersion": "string",
  "createdAt": "string",
  "current": true,
  "deviceOS": "string",
  "deviceType": "string",
  "expiresAt": "string",
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "isPendingSyncReset": true,
  "updatedAt": "string"
}

SessionUnlockDto

object
passwordstring

User password (required if PIN code is not provided)

pinCodestring

New PIN code (4-6 digits)

Example
{
  "password": "password",
  "pinCode": "123456"
}

SessionUpdateDto

object
isPendingSyncResetboolean

Reset pending sync state

Example
{
  "isPendingSyncReset": true
}

SetMaintenanceModeDto

object
actionMaintenanceActionstartendselect_database_restorerestore_databaserequired

Maintenance action

restoreBackupFilenamestring

Restore backup filename

Example
{
  "action": "start",
  "restoreBackupFilename": "string"
}

SharedLinkCreateDto

object
albumIdstring<uuid>

Album ID (for album sharing)

allowDownloadbooleantrue

Allow downloads

allowUploadboolean

Allow uploads

assetIdsArray<string>

Asset IDs (for individual assets)

descriptionstring | null

Link description

expiresAtstring<date-time> | nullnull

Expiration date

passwordstring | null

Link password

showMetadatabooleantrue

Show metadata

slugstring | null

Custom URL slug

typeSharedLinkTypeALBUMINDIVIDUALrequired

Shared link type

Example
{
  "albumId": "550e8400-e29b-41d4-a716-446655440000",
  "allowDownload": true,
  "allowUpload": true,
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "description": "string",
  "expiresAt": "2024-01-01T00:00:00.000Z",
  "password": "string",
  "showMetadata": true,
  "slug": "string",
  "type": "ALBUM"
}

SharedLinkEditDto

object
allowDownloadboolean

Allow downloads

allowUploadboolean

Allow uploads

descriptionstring | null

Link description

expiresAtstring<date-time> | null

Expiration date

passwordstring | null

Link password

showMetadataboolean

Show metadata

slugstring | null

Custom URL slug

Example
{
  "allowDownload": true,
  "allowUpload": true,
  "description": "string",
  "expiresAt": "2024-01-01T00:00:00.000Z",
  "password": "string",
  "showMetadata": true,
  "slug": "string"
}

SharedLinkLoginDto

object
passwordstringrequired

Shared link password

Example
{
  "password": "password"
}

SharedLinkResponseDto

object

Shared link response

albumAlbumResponseDto
Show child attributes
albumNamestringrequired

Album name

albumThumbnailAssetIdstring<uuid> | nullrequired

Thumbnail asset ID

albumUsersArray<AlbumUserResponseDto>required

First entry is always the album owner. Second entry is the auth user, if it differs from the owner. The rest are ordered alphabetically.

Show child attributes
roleAlbumUserRoleeditorownerviewerrequired

Album user role

userUserResponseDtorequired
Show child attributes
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

emailstring<email>required

User email

idstring<uuid>required

User ID

namestringrequired

User name

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

assetCountinteger[0, 9007199254740991]required

Number of assets

contributorCountsArray<ContributorCountResponseDto>
Show child attributes
assetCountinteger[0, 9007199254740991]required

Number of assets contributed

userIdstring<uuid>required

User ID

createdAtstring<date-time>required

Creation date

descriptionstringrequired

Album description

endDatestring<date-time>

End date (latest asset)

hasSharedLinkbooleanrequired

Has shared link

idstring<uuid>required

Album ID

isActivityEnabledbooleanrequired

Activity feed enabled

lastModifiedAssetTimestampstring<date-time>

Last modified asset timestamp

orderAssetOrderascdesc

Asset sort order

sharedbooleanrequired

Is shared album

startDatestring<date-time>

Start date (earliest asset)

updatedAtstring<date-time>required

Last update date

allowDownloadbooleanrequired

Allow downloads

allowUploadbooleanrequired

Allow uploads

assetsArray<AssetResponseDto>required
Show child attributes
checksumstringrequired

Base64 encoded SHA1 hash

createdAtstring<date-time>required

The UTC timestamp when the asset was originally uploaded to Immich.

duplicateIdstring<uuid> | null

Duplicate group ID

durationinteger | null[0, 2147483647]required

Video/gif duration in milliseconds (null for static images)

exifInfoExifResponseDto

EXIF response

Show child attributes
citystring | nullnull

City name

countrystring | nullnull

Country name

dateTimeOriginalstring<date-time> | nullnull

Original date/time

descriptionstring | nullnull

Image description

exifImageHeightinteger | null[0, 9007199254740991]null

Image height in pixels

exifImageWidthinteger | null[0, 9007199254740991]null

Image width in pixels

exposureTimestring | nullnull

Exposure time

fNumbernumber | nullnull

F-number (aperture)

fileSizeInByteinteger | null[0, 9007199254740991]null

File size in bytes

focalLengthnumber | nullnull

Focal length in mm

isointeger | null[-9007199254740991, 9007199254740991]null

ISO sensitivity

latitudenumber | nullnull

GPS latitude

lensModelstring | nullnull

Lens model

longitudenumber | nullnull

GPS longitude

makestring | nullnull

Camera make

modelstring | nullnull

Camera model

modifyDatestring<date-time> | nullnull

Modification date/time

orientationstring | nullnull

Image orientation

projectionTypestring | nullnull

Projection type

ratinginteger | null[1, 5]null

Rating

statestring | nullnull

State/province name

timeZonestring | nullnull

Time zone

fileCreatedAtstring<date-time>required

The 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>required

The 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.

hasMetadatabooleanrequired

Whether asset has metadata

heightinteger | null[0, 9007199254740991]required

Asset height

idstring<uuid>required

Asset ID

isArchivedbooleanrequired

Is archived

isEditedbooleanrequired

Is edited

isFavoritebooleanrequired

Is favorite

isOfflinebooleanrequired

Is offline

isTrashedbooleanrequired

Is trashed

libraryIdstring<uuid> | null

Library ID

livePhotoVideoIdstring | null

Live photo video ID

localDateTimestring<date-time>required

The 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.

originalFileNamestringrequired

Original file name

originalMimeTypestring

Original MIME type

originalPathstringrequired

Original file path

ownerUserResponseDto
Show child attributes
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

emailstring<email>required

User email

idstring<uuid>required

User ID

namestringrequired

User name

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

ownerIdstring<uuid>required

Owner user ID

peopleArray<PersonResponseDto>
Show child attributes
birthDatestring<date> | nullrequired

Person date of birth

colorstring

Person color (hex)

idstring<uuid>required

Person ID

isFavoriteboolean

Is favorite

isHiddenbooleanrequired

Is hidden

namestringrequired

Person name

thumbnailPathstringrequired

Thumbnail path

updatedAtstring<date-time>

Last update date

resizedboolean

Is resized

stackAssetStackResponseDto | null
tagsArray<TagResponseDto>
Show child attributes
colorstring

Tag color (hex)

createdAtstring<date-time>required

Creation date

idstring<uuid>required

Tag ID

namestringrequired

Tag name

parentIdstring

Parent tag ID

updatedAtstring<date-time>required

Last update date

valuestringrequired

Tag value (full path)

thumbhashstring | nullrequired

Thumbhash for thumbnail generation (base64) also used as the c query param for thumbnail cache busting.

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERrequired

Asset type

updatedAtstring<date-time>required

The 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.

visibilityAssetVisibilityarchivetimelinehiddenlockedrequired

Asset visibility

widthinteger | null[0, 9007199254740991]required

Asset width

createdAtstring<date-time>required

Creation date

descriptionstring | nullrequired

Link description

expiresAtstring<date-time> | nullrequired

Expiration date

idstring<uuid>required

Shared link ID

keystringrequired

Encryption key (base64url)

passwordstring | nullrequired

Has password

showMetadatabooleanrequired

Show metadata

slugstring | nullrequired

Custom URL slug

typeSharedLinkTypeALBUMINDIVIDUALrequired

Shared link type

userIdstring<uuid>required

Owner user ID

Example
{
  "album": {
    "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"
  },
  "allowDownload": true,
  "allowUpload": true,
  "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",
  "description": "string",
  "expiresAt": "2024-01-01T00:00:00.000Z",
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "key": "string",
  "password": "string",
  "showMetadata": true,
  "slug": "string",
  "type": "ALBUM",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

SharedLinkType

string

Shared link type

SharedLinkTypeALBUMINDIVIDUAL
Example
"ALBUM"

SharedLinksResponse

object
enabledbooleanrequired

Whether shared links are enabled

sidebarWebbooleanrequired

Whether shared links appear in web sidebar

Example
{
  "enabled": true,
  "sidebarWeb": true
}

SharedLinksUpdate

object
enabledboolean

Whether shared links are enabled

sidebarWebboolean

Whether shared links appear in web sidebar

Example
{
  "enabled": true,
  "sidebarWeb": true
}

SignUpDto

object
emailstring<email>required

User email

namestringrequired

User name

passwordstringrequired

User password

Example
{
  "email": "testuser@email.com",
  "name": "Admin",
  "password": "password"
}

SmartSearchDto

object
albumIdsArray<string>

Filter by album IDs

citystring | null

Filter by city name

countrystring | null

Filter by country name

createdAfterstring<date-time>

Filter by creation date (after)

createdBeforestring<date-time>

Filter by creation date (before)

isEncodedboolean

Filter by encoded status

isFavoriteboolean

Filter by favorite status

isMotionboolean

Filter by motion photo status

isNotInAlbumboolean

Filter assets not in any album

isOfflineboolean

Filter by offline status

languagestring

Search language code

lensModelstring | null

Filter by lens model

libraryIdstring<uuid> | null

Library ID to filter by

makestring | null

Filter by camera make

modelstring | null

Filter by camera model

ocrstring

Filter by OCR text content

pageinteger[1, 9007199254740991]

Page number

personIdsArray<string>

Filter by person IDs

querystring

Natural 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 | null

Filter by state/province name

tagIdsArray<string> | null

Filter 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)

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHER

Asset type

updatedAfterstring<date-time>

Filter by update date (after)

updatedBeforestring<date-time>

Filter by update date (before)

visibilityAssetVisibilityarchivetimelinehiddenlocked

Asset visibility

withDeletedboolean

Include deleted assets

withExifboolean

Include EXIF data in response

Example
{
  "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

string

Face detection source type

SourceTypemachine-learningexifmanual
Example
"machine-learning"

StackCreateDto

object
assetIdsArray<string>required

Asset IDs (first becomes primary, min 2)

Example
{
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}

StackResponseDto

object

Stack response

assetsArray<AssetResponseDto>required
Show child attributes
checksumstringrequired

Base64 encoded SHA1 hash

createdAtstring<date-time>required

The UTC timestamp when the asset was originally uploaded to Immich.

duplicateIdstring<uuid> | null

Duplicate group ID

durationinteger | null[0, 2147483647]required

Video/gif duration in milliseconds (null for static images)

exifInfoExifResponseDto

EXIF response

Show child attributes
citystring | nullnull

City name

countrystring | nullnull

Country name

dateTimeOriginalstring<date-time> | nullnull

Original date/time

descriptionstring | nullnull

Image description

exifImageHeightinteger | null[0, 9007199254740991]null

Image height in pixels

exifImageWidthinteger | null[0, 9007199254740991]null

Image width in pixels

exposureTimestring | nullnull

Exposure time

fNumbernumber | nullnull

F-number (aperture)

fileSizeInByteinteger | null[0, 9007199254740991]null

File size in bytes

focalLengthnumber | nullnull

Focal length in mm

isointeger | null[-9007199254740991, 9007199254740991]null

ISO sensitivity

latitudenumber | nullnull

GPS latitude

lensModelstring | nullnull

Lens model

longitudenumber | nullnull

GPS longitude

makestring | nullnull

Camera make

modelstring | nullnull

Camera model

modifyDatestring<date-time> | nullnull

Modification date/time

orientationstring | nullnull

Image orientation

projectionTypestring | nullnull

Projection type

ratinginteger | null[1, 5]null

Rating

statestring | nullnull

State/province name

timeZonestring | nullnull

Time zone

fileCreatedAtstring<date-time>required

The 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>required

The 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.

hasMetadatabooleanrequired

Whether asset has metadata

heightinteger | null[0, 9007199254740991]required

Asset height

idstring<uuid>required

Asset ID

isArchivedbooleanrequired

Is archived

isEditedbooleanrequired

Is edited

isFavoritebooleanrequired

Is favorite

isOfflinebooleanrequired

Is offline

isTrashedbooleanrequired

Is trashed

libraryIdstring<uuid> | null

Library ID

livePhotoVideoIdstring | null

Live photo video ID

localDateTimestring<date-time>required

The 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.

originalFileNamestringrequired

Original file name

originalMimeTypestring

Original MIME type

originalPathstringrequired

Original file path

ownerUserResponseDto
Show child attributes
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

emailstring<email>required

User email

idstring<uuid>required

User ID

namestringrequired

User name

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

ownerIdstring<uuid>required

Owner user ID

peopleArray<PersonResponseDto>
Show child attributes
birthDatestring<date> | nullrequired

Person date of birth

colorstring

Person color (hex)

idstring<uuid>required

Person ID

isFavoriteboolean

Is favorite

isHiddenbooleanrequired

Is hidden

namestringrequired

Person name

thumbnailPathstringrequired

Thumbnail path

updatedAtstring<date-time>

Last update date

resizedboolean

Is resized

stackAssetStackResponseDto | null
tagsArray<TagResponseDto>
Show child attributes
colorstring

Tag color (hex)

createdAtstring<date-time>required

Creation date

idstring<uuid>required

Tag ID

namestringrequired

Tag name

parentIdstring

Parent tag ID

updatedAtstring<date-time>required

Last update date

valuestringrequired

Tag value (full path)

thumbhashstring | nullrequired

Thumbhash for thumbnail generation (base64) also used as the c query param for thumbnail cache busting.

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERrequired

Asset type

updatedAtstring<date-time>required

The 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.

visibilityAssetVisibilityarchivetimelinehiddenlockedrequired

Asset visibility

widthinteger | null[0, 9007199254740991]required

Asset width

idstring<uuid>required

Stack ID

primaryAssetIdstring<uuid>required

Primary asset ID

Example
{
  "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

object
primaryAssetIdstring<uuid>

Primary asset ID

Example
{
  "primaryAssetId": "550e8400-e29b-41d4-a716-446655440000"
}

StatisticsSearchDto

object
albumIdsArray<string>

Filter by album IDs

citystring | null

Filter by city name

countrystring | null

Filter by country name

createdAfterstring<date-time>

Filter by creation date (after)

createdBeforestring<date-time>

Filter by creation date (before)

descriptionstring

Filter by description text

isEncodedboolean

Filter by encoded status

isFavoriteboolean

Filter by favorite status

isMotionboolean

Filter by motion photo status

isNotInAlbumboolean

Filter assets not in any album

isOfflineboolean

Filter by offline status

lensModelstring | null

Filter by lens model

libraryIdstring<uuid> | null

Library ID to filter by

makestring | null

Filter by camera make

modelstring | null

Filter by camera model

ocrstring

Filter by OCR text content

personIdsArray<string>

Filter by person IDs

ratinginteger | null[1, 5]

Filter by rating [1-5], or null for unrated

statestring | null

Filter by state/province name

tagIdsArray<string> | null

Filter 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)

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHER

Asset type

updatedAfterstring<date-time>

Filter by update date (after)

updatedBeforestring<date-time>

Filter by update date (before)

visibilityAssetVisibilityarchivetimelinehiddenlocked

Asset visibility

Example
{
  "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

string

Storage folder

StorageFolderencoded-videolibraryuploadprofilethumbsbackups
Example
"encoded-video"

SyncAckDeleteDto

object
typesArray<SyncEntityType>AuthUserV1UserV1UserDeleteV1AssetV1AssetV2AssetDeleteV1AssetExifV1AssetEditV1AssetEditDeleteV1AssetMetadataV1AssetMetadataDeleteV1AssetOcrV1AssetOcrDeleteV1PartnerV1PartnerDeleteV1PartnerAssetV1PartnerAssetV2PartnerAssetBackfillV1PartnerAssetBackfillV2PartnerAssetDeleteV1PartnerAssetExifV1PartnerAssetExifBackfillV1PartnerStackBackfillV1PartnerStackDeleteV1PartnerStackV1AlbumV1AlbumV2AlbumDeleteV1AlbumUserV1AlbumUserBackfillV1AlbumUserDeleteV1AlbumAssetCreateV1AlbumAssetCreateV2AlbumAssetUpdateV1AlbumAssetUpdateV2AlbumAssetBackfillV1AlbumAssetBackfillV2AlbumAssetExifCreateV1AlbumAssetExifUpdateV1AlbumAssetExifBackfillV1AlbumToAssetV1AlbumToAssetDeleteV1AlbumToAssetBackfillV1MemoryV1MemoryDeleteV1MemoryToAssetV1MemoryToAssetDeleteV1StackV1StackDeleteV1PersonV1PersonDeleteV1AssetFaceV1AssetFaceV2AssetFaceDeleteV1UserMetadataV1UserMetadataDeleteV1SyncAckV1SyncResetV1SyncCompleteV1

Sync entity types to delete acks for

Example
{
  "types": [
    "AuthUserV1"
  ]
}

SyncAckDto

object
ackstringrequired

Acknowledgment ID

typeSyncEntityTypeAuthUserV1UserV1UserDeleteV1AssetV1AssetV2AssetDeleteV1AssetExifV1AssetEditV1AssetEditDeleteV1AssetMetadataV1AssetMetadataDeleteV1AssetOcrV1AssetOcrDeleteV1PartnerV1PartnerDeleteV1PartnerAssetV1PartnerAssetV2PartnerAssetBackfillV1PartnerAssetBackfillV2PartnerAssetDeleteV1PartnerAssetExifV1PartnerAssetExifBackfillV1PartnerStackBackfillV1PartnerStackDeleteV1PartnerStackV1AlbumV1AlbumV2AlbumDeleteV1AlbumUserV1AlbumUserBackfillV1AlbumUserDeleteV1AlbumAssetCreateV1AlbumAssetCreateV2AlbumAssetUpdateV1AlbumAssetUpdateV2AlbumAssetBackfillV1AlbumAssetBackfillV2AlbumAssetExifCreateV1AlbumAssetExifUpdateV1AlbumAssetExifBackfillV1AlbumToAssetV1AlbumToAssetDeleteV1AlbumToAssetBackfillV1MemoryV1MemoryDeleteV1MemoryToAssetV1MemoryToAssetDeleteV1StackV1StackDeleteV1PersonV1PersonDeleteV1AssetFaceV1AssetFaceV2AssetFaceDeleteV1UserMetadataV1UserMetadataDeleteV1SyncAckV1SyncResetV1SyncCompleteV1required

Sync entity type

Example
{
  "ack": "string",
  "type": "AuthUserV1"
}

SyncAckSetDto

object
acksArray<string>required

Acknowledgment IDs (max 1000)

Example
{
  "acks": [
    "string"
  ]
}

SyncAckV1

object
Example
{}

SyncAlbumDeleteV1

object
albumIdstring<uuid>required

Album ID

Example
{
  "albumId": "550e8400-e29b-41d4-a716-446655440000"
}

SyncAlbumToAssetDeleteV1

object
albumIdstring<uuid>required

Album ID

assetIdstring<uuid>required

Asset ID

Example
{
  "albumId": "550e8400-e29b-41d4-a716-446655440000",
  "assetId": "550e8400-e29b-41d4-a716-446655440000"
}

SyncAlbumToAssetV1

object
albumIdstring<uuid>required

Album ID

assetIdstring<uuid>required

Asset ID

Example
{
  "albumId": "550e8400-e29b-41d4-a716-446655440000",
  "assetId": "550e8400-e29b-41d4-a716-446655440000"
}

SyncAlbumUserDeleteV1

object
albumIdstring<uuid>required

Album ID

userIdstring<uuid>required

User ID

Example
{
  "albumId": "550e8400-e29b-41d4-a716-446655440000",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

SyncAlbumUserV1

object
albumIdstring<uuid>required

Album ID

roleAlbumUserRoleeditorownerviewerrequired

Album user role

userIdstring<uuid>required

User ID

Example
{
  "albumId": "550e8400-e29b-41d4-a716-446655440000",
  "role": "editor",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

SyncAlbumV1

object
createdAtstring<date-time>required

Created at

descriptionstringrequired

Album description

idstring<uuid>required

Album ID

isActivityEnabledbooleanrequired

Is activity enabled

namestringrequired

Album name

orderAssetOrderascdescrequired

Asset sort order

ownerIdstring<uuid>required

Owner ID

thumbnailAssetIdstring | nullrequired

Thumbnail asset ID

updatedAtstring<date-time>required

Updated at

Example
{
  "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

object
createdAtstring<date-time>required

Created at

descriptionstringrequired

Album description

idstring<uuid>required

Album ID

isActivityEnabledbooleanrequired

Is activity enabled

namestringrequired

Album name

orderAssetOrderascdescrequired

Asset sort order

thumbnailAssetIdstring | nullrequired

Thumbnail asset ID

updatedAtstring<date-time>required

Updated at

Example
{
  "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

object
assetIdstring<uuid>required

Asset ID

Example
{
  "assetId": "550e8400-e29b-41d4-a716-446655440000"
}

SyncAssetEditDeleteV1

object
editIdstring<uuid>required

Edit ID

Example
{
  "editId": "550e8400-e29b-41d4-a716-446655440000"
}

SyncAssetEditV1

object
actionAssetEditActioncroprotatemirrorrequired

Type of edit action to perform

assetIdstring<uuid>required

Asset ID

idstring<uuid>required

Edit ID

parametersobjectrequired

Edit parameters

sequenceinteger[-9007199254740991, 9007199254740991]required

Edit sequence

Example
{
  "action": "crop",
  "assetId": "550e8400-e29b-41d4-a716-446655440000",
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "parameters": {},
  "sequence": -9007199254740991
}

SyncAssetExifV1

object
assetIdstring<uuid>required

Asset ID

citystring | nullrequired

City

countrystring | nullrequired

Country

dateTimeOriginalstring<date-time> | nullrequired

Date time original

descriptionstring | nullrequired

Description

exifImageHeightinteger | null[-9007199254740991, 9007199254740991]required

Exif image height

exifImageWidthinteger | null[-9007199254740991, 9007199254740991]required

Exif image width

exposureTimestring | nullrequired

Exposure time

fNumbernumber<double> | nullrequired

F number

fileSizeInByteinteger | null[-9007199254740991, 9007199254740991]required

File size in byte

focalLengthnumber<double> | nullrequired

Focal length

fpsnumber<double> | nullrequired

FPS

isointeger | null[-9007199254740991, 9007199254740991]required

ISO

latitudenumber<double> | nullrequired

Latitude

lensModelstring | nullrequired

Lens model

longitudenumber<double> | nullrequired

Longitude

makestring | nullrequired

Make

modelstring | nullrequired

Model

modifyDatestring<date-time> | nullrequired

Modify date

orientationstring | nullrequired

Orientation

profileDescriptionstring | nullrequired

Profile description

projectionTypestring | nullrequired

Projection type

ratinginteger | null[-9007199254740991, 9007199254740991]required

Rating

statestring | nullrequired

State

timeZonestring | nullrequired

Time zone

Example
{
  "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

object
assetFaceIdstring<uuid>required

Asset face ID

Example
{
  "assetFaceId": "550e8400-e29b-41d4-a716-446655440000"
}

SyncAssetFaceV1

object
assetIdstring<uuid>required

Asset ID

boundingBoxX1integer[-9007199254740991, 9007199254740991]required

Bounding box X1

boundingBoxX2integer[-9007199254740991, 9007199254740991]required

Bounding box X2

boundingBoxY1integer[-9007199254740991, 9007199254740991]required

Bounding box Y1

boundingBoxY2integer[-9007199254740991, 9007199254740991]required

Bounding box Y2

idstring<uuid>required

Asset face ID

imageHeightinteger[-9007199254740991, 9007199254740991]required

Image height

imageWidthinteger[-9007199254740991, 9007199254740991]required

Image width

personIdstring | nullrequired

Person ID

sourceTypestringrequired

Source type

Example
{
  "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

object
assetIdstring<uuid>required

Asset ID

boundingBoxX1integer[-9007199254740991, 9007199254740991]required

Bounding box X1

boundingBoxX2integer[-9007199254740991, 9007199254740991]required

Bounding box X2

boundingBoxY1integer[-9007199254740991, 9007199254740991]required

Bounding box Y1

boundingBoxY2integer[-9007199254740991, 9007199254740991]required

Bounding box Y2

deletedAtstring<date-time> | nullrequired

Face deleted at

idstring<uuid>required

Asset face ID

imageHeightinteger[-9007199254740991, 9007199254740991]required

Image height

imageWidthinteger[-9007199254740991, 9007199254740991]required

Image width

isVisiblebooleanrequired

Is the face visible in the asset

personIdstring | nullrequired

Person ID

sourceTypestringrequired

Source type

Example
{
  "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

object
assetIdstring<uuid>required

Asset ID

keystringrequired

Key

Example
{
  "assetId": "550e8400-e29b-41d4-a716-446655440000",
  "key": "string"
}

SyncAssetMetadataV1

object
assetIdstring<uuid>required

Asset ID

keystringrequired

Key

valueobjectrequired

Value

Example
{
  "assetId": "550e8400-e29b-41d4-a716-446655440000",
  "key": "string",
  "value": {}
}

SyncAssetOcrDeleteV1

object
assetIdstringrequired

Original asset ID of the deleted OCR entry

deletedAtstring<date-time>required

Timestamp when the OCR entry was deleted

idstringrequired

Audit row ID of the deleted OCR entry

Example
{
  "assetId": "string",
  "deletedAt": "2024-01-01T00:00:00.000Z",
  "id": "string"
}

SyncAssetOcrV1

object
assetIdstring<uuid>required

Asset ID

boxScorenumber<double>required

Confidence score of the bounding box

idstring<uuid>required

OCR entry ID

isVisiblebooleanrequired

Whether the OCR entry is visible

textstringrequired

Recognized text content

textScorenumber<double>required

Confidence score of the recognized text

x1number<double>required

Top-left X coordinate (normalized 0–1)

x2number<double>required

Top-right X coordinate (normalized 0–1)

x3number<double>required

Bottom-right X coordinate (normalized 0–1)

x4number<double>required

Bottom-left X coordinate (normalized 0–1)

y1number<double>required

Top-left Y coordinate (normalized 0–1)

y2number<double>required

Top-right Y coordinate (normalized 0–1)

y3number<double>required

Bottom-right Y coordinate (normalized 0–1)

y4number<double>required

Bottom-left Y coordinate (normalized 0–1)

Example
{
  "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

object
checksumstringrequired

Checksum

createdAtstring<date-time> | nullrequired

Uploaded to Immich at

deletedAtstring<date-time> | nullrequired

Deleted at

durationstring | nullrequired

Duration

fileCreatedAtstring<date-time> | nullrequired

File created at

fileModifiedAtstring<date-time> | nullrequired

File modified at

heightinteger | null[-9007199254740991, 9007199254740991]required

Asset height

idstring<uuid>required

Asset ID

isEditedbooleanrequired

Is edited

isFavoritebooleanrequired

Is favorite

libraryIdstring | nullrequired

Library ID

livePhotoVideoIdstring | nullrequired

Live photo video ID

localDateTimestring<date-time> | nullrequired

Local date time

originalFileNamestringrequired

Original file name

ownerIdstring<uuid>required

Owner ID

stackIdstring | nullrequired

Stack ID

thumbhashstring | nullrequired

Thumbhash

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERrequired

Asset type

visibilityAssetVisibilityarchivetimelinehiddenlockedrequired

Asset visibility

widthinteger | null[-9007199254740991, 9007199254740991]required

Asset width

Example
{
  "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

object
checksumstringrequired

Checksum

createdAtstring<date-time> | nullrequired

Uploaded to Immich at

deletedAtstring<date-time> | nullrequired

Deleted at

durationinteger | null[0, 2147483647]required

Duration

fileCreatedAtstring<date-time> | nullrequired

File created at

fileModifiedAtstring<date-time> | nullrequired

File modified at

heightinteger | null[-9007199254740991, 9007199254740991]required

Asset height

idstring<uuid>required

Asset ID

isEditedbooleanrequired

Is edited

isFavoritebooleanrequired

Is favorite

libraryIdstring | nullrequired

Library ID

livePhotoVideoIdstring | nullrequired

Live photo video ID

localDateTimestring<date-time> | nullrequired

Local date time

originalFileNamestringrequired

Original file name

ownerIdstring<uuid>required

Owner ID

stackIdstring | nullrequired

Stack ID

thumbhashstring | nullrequired

Thumbhash

typeAssetTypeEnumIMAGEVIDEOAUDIOOTHERrequired

Asset type

visibilityAssetVisibilityarchivetimelinehiddenlockedrequired

Asset visibility

widthinteger | null[-9007199254740991, 9007199254740991]required

Asset width

Example
{
  "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

object
avatarColorUserAvatarColor | null
deletedAtstring<date-time> | nullrequired

User deleted at

emailstringrequired

User email

hasProfileImagebooleanrequired

User has profile image

idstring<uuid>required

User ID

isAdminbooleanrequired

User is admin

namestringrequired

User name

oauthIdstringrequired

User OAuth ID

pinCodestring | nullrequired

User pin code

profileChangedAtstring<date-time>required

User profile changed at

quotaSizeInBytesinteger | null[-9007199254740991, 9007199254740991]required

Quota size in bytes

quotaUsageInBytesinteger[-9007199254740991, 9007199254740991]required

Quota usage in bytes

storageLabelstring | nullrequired

User storage label

Example
{
  "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"
}

SyncCompleteV1

object
Example
{}

SyncEntityType

string

Sync entity type

SyncEntityTypeAuthUserV1UserV1UserDeleteV1AssetV1AssetV2AssetDeleteV1AssetExifV1AssetEditV1AssetEditDeleteV1AssetMetadataV1AssetMetadataDeleteV1AssetOcrV1AssetOcrDeleteV1PartnerV1PartnerDeleteV1PartnerAssetV1PartnerAssetV2PartnerAssetBackfillV1PartnerAssetBackfillV2PartnerAssetDeleteV1PartnerAssetExifV1PartnerAssetExifBackfillV1PartnerStackBackfillV1PartnerStackDeleteV1PartnerStackV1AlbumV1AlbumV2AlbumDeleteV1AlbumUserV1AlbumUserBackfillV1AlbumUserDeleteV1AlbumAssetCreateV1AlbumAssetCreateV2AlbumAssetUpdateV1AlbumAssetUpdateV2AlbumAssetBackfillV1AlbumAssetBackfillV2AlbumAssetExifCreateV1AlbumAssetExifUpdateV1AlbumAssetExifBackfillV1AlbumToAssetV1AlbumToAssetDeleteV1AlbumToAssetBackfillV1MemoryV1MemoryDeleteV1MemoryToAssetV1MemoryToAssetDeleteV1StackV1StackDeleteV1PersonV1PersonDeleteV1AssetFaceV1AssetFaceV2AssetFaceDeleteV1UserMetadataV1UserMetadataDeleteV1SyncAckV1SyncResetV1SyncCompleteV1
Example
"AuthUserV1"

SyncMemoryAssetDeleteV1

object
assetIdstring<uuid>required

Asset ID

memoryIdstring<uuid>required

Memory ID

Example
{
  "assetId": "550e8400-e29b-41d4-a716-446655440000",
  "memoryId": "550e8400-e29b-41d4-a716-446655440000"
}

SyncMemoryAssetV1

object
assetIdstring<uuid>required

Asset ID

memoryIdstring<uuid>required

Memory ID

Example
{
  "assetId": "550e8400-e29b-41d4-a716-446655440000",
  "memoryId": "550e8400-e29b-41d4-a716-446655440000"
}

SyncMemoryDeleteV1

object
memoryIdstring<uuid>required

Memory ID

Example
{
  "memoryId": "550e8400-e29b-41d4-a716-446655440000"
}

SyncMemoryV1

object
createdAtstring<date-time>required

Created at

dataobjectrequired

Data

deletedAtstring<date-time> | nullrequired

Deleted at

hideAtstring<date-time> | nullrequired

Hide at

idstring<uuid>required

Memory ID

isSavedbooleanrequired

Is saved

memoryAtstring<date-time>required

Memory at

ownerIdstring<uuid>required

Owner ID

seenAtstring<date-time> | nullrequired

Seen at

showAtstring<date-time> | nullrequired

Show at

typeMemoryTypeon_this_dayrequired

Memory type

updatedAtstring<date-time>required

Updated at

Example
{
  "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

object
sharedByIdstring<uuid>required

Shared by ID

sharedWithIdstring<uuid>required

Shared with ID

Example
{
  "sharedById": "550e8400-e29b-41d4-a716-446655440000",
  "sharedWithId": "550e8400-e29b-41d4-a716-446655440000"
}

SyncPartnerV1

object
inTimelinebooleanrequired

In timeline

sharedByIdstring<uuid>required

Shared by ID

sharedWithIdstring<uuid>required

Shared with ID

Example
{
  "inTimeline": true,
  "sharedById": "550e8400-e29b-41d4-a716-446655440000",
  "sharedWithId": "550e8400-e29b-41d4-a716-446655440000"
}

SyncPersonDeleteV1

object
personIdstring<uuid>required

Person ID

Example
{
  "personId": "550e8400-e29b-41d4-a716-446655440000"
}

SyncPersonV1

object
birthDatestring<date-time> | nullrequired

Birth date

colorstring | nullrequired

Color

createdAtstring<date-time>required

Created at

faceAssetIdstring | nullrequired

Face asset ID

idstring<uuid>required

Person ID

isFavoritebooleanrequired

Is favorite

isHiddenbooleanrequired

Is hidden

namestringrequired

Person name

ownerIdstring<uuid>required

Owner ID

updatedAtstring<date-time>required

Updated at

Example
{
  "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

string

Sync request type

SyncRequestTypeAlbumsV1AlbumsV2AlbumUsersV1AlbumToAssetsV1AlbumAssetsV1AlbumAssetsV2AlbumAssetExifsV1AssetsV1AssetsV2AssetExifsV1AssetEditsV1AssetMetadataV1AssetOcrV1AuthUsersV1MemoriesV1MemoryToAssetsV1PartnersV1PartnerAssetsV1PartnerAssetsV2PartnerAssetExifsV1PartnerStacksV1StacksV1UsersV1PeopleV1AssetFacesV1AssetFacesV2UserMetadataV1
Example
"AlbumsV1"

SyncResetV1

object
Example
{}

SyncStackDeleteV1

object
stackIdstring<uuid>required

Stack ID

Example
{
  "stackId": "550e8400-e29b-41d4-a716-446655440000"
}

SyncStackV1

object
createdAtstring<date-time>required

Created at

idstring<uuid>required

Stack ID

ownerIdstring<uuid>required

Owner ID

primaryAssetIdstring<uuid>required

Primary asset ID

updatedAtstring<date-time>required

Updated at

Example
{
  "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

object
resetboolean

Reset sync state

typesArray<SyncRequestType>AlbumsV1AlbumsV2AlbumUsersV1AlbumToAssetsV1AlbumAssetsV1AlbumAssetsV2AlbumAssetExifsV1AssetsV1AssetsV2AssetExifsV1AssetEditsV1AssetMetadataV1AssetOcrV1AuthUsersV1MemoriesV1MemoryToAssetsV1PartnersV1PartnerAssetsV1PartnerAssetsV2PartnerAssetExifsV1PartnerStacksV1StacksV1UsersV1PeopleV1AssetFacesV1AssetFacesV2UserMetadataV1required

Sync request types

Example
{
  "reset": true,
  "types": [
    "AlbumsV1"
  ]
}

SyncUserDeleteV1

object
userIdstring<uuid>required

User ID

Example
{
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

SyncUserMetadataDeleteV1

object
keyUserMetadataKeypreferenceslicenseonboardingrequired

User metadata key

userIdstring<uuid>required

User ID

Example
{
  "key": "preferences",
  "userId": "550e8400-e29b-41d4-a716-446655440000"
}

SyncUserMetadataV1

object
keyUserMetadataKeypreferenceslicenseonboardingrequired

User metadata key

userIdstring<uuid>required

User ID

valueobjectrequired

User metadata value

Example
{
  "key": "preferences",
  "userId": "550e8400-e29b-41d4-a716-446655440000",
  "value": {}
}

SyncUserV1

object
avatarColorUserAvatarColor | null
deletedAtstring<date-time> | nullrequired

User deleted at

emailstringrequired

User email

hasProfileImagebooleanrequired

User has profile image

idstring<uuid>required

User ID

namestringrequired

User name

profileChangedAtstring<date-time>required

User profile changed at

Example
{
  "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

object
databaseDatabaseBackupConfigrequired
Show child attributes
cronExpressionstringrequired

Cron expression

enabledbooleanrequired

Enabled

keepLastAmountinteger[1, 9007199254740991]required

Keep last amount

Example
{
  "database": {
    "cronExpression": "string",
    "enabled": true,
    "keepLastAmount": 1
  }
}

SystemConfigDto

object

System configuration

backupSystemConfigBackupsDtorequired
Show child attributes
databaseDatabaseBackupConfigrequired
Show child attributes
cronExpressionstringrequired

Cron expression

enabledbooleanrequired

Enabled

keepLastAmountinteger[1, 9007199254740991]required

Keep last amount

ffmpegSystemConfigFFmpegDtorequired
Show child attributes
accelTranscodeHWAccelnvencqsvvaapirkmppdisabledrequired

Transcode hardware acceleration

accelDecodebooleanrequired

Accelerated decode

acceptedAudioCodecsArray<AudioCodec>mp3aacopuspcm_s16lerequired

Accepted audio codecs

acceptedContainersArray<VideoContainer>movmp4oggwebmrequired

Accepted containers

acceptedVideoCodecsArray<VideoCodec>h264hevcvp9av1required

Accepted video codecs

bframesinteger[-1, 16]required

B-frames

cqModeCQModeautocqpicqrequired

CQ mode

crfinteger[0, 51]required

CRF

gopSizeinteger[0, 9007199254740991]required

GOP size

maxBitratestringrequired

Max bitrate

preferredHwDevicestringrequired

Preferred hardware device

presetstringrequired

Preset

realtimeSystemConfigFFmpegRealtimeDtorequired
Show child attributes
enabledbooleanrequired

Enable real-time HLS transcoding (alpha)

refsinteger[0, 6]required

References

targetAudioCodecAudioCodecmp3aacopuspcm_s16lerequired

Target audio codec

targetResolutionstringrequired

Target resolution

targetVideoCodecVideoCodech264hevcvp9av1required

Target video codec

temporalAQbooleanrequired

Temporal AQ

threadsinteger[0, 9007199254740991]required

Threads

tonemapToneMappinghablemobiusreinharddisabledrequired

Tone mapping

transcodeTranscodePolicyalloptimalbitraterequireddisabledrequired

Transcode policy

twoPassbooleanrequired

Two pass

imageSystemConfigImageDtorequired
Show child attributes
colorspaceColorspacesrgbp3required

Colorspace

extractEmbeddedbooleanrequired

Extract embedded

fullsizeSystemConfigGeneratedFullsizeImageDtorequired
Show child attributes
enabledbooleanrequired

Enabled

formatImageFormatjpegwebprequired

Image format

progressiveboolean

Progressive

qualityinteger[1, 100]required

Quality

previewSystemConfigGeneratedImageDtorequired
Show child attributes
formatImageFormatjpegwebprequired

Image format

progressiveboolean

Progressive

qualityinteger[1, 100]required

Quality

sizeinteger[1, 9007199254740991]required

Size

thumbnailSystemConfigGeneratedImageDtorequired
Show child attributes
formatImageFormatjpegwebprequired

Image format

progressiveboolean

Progressive

qualityinteger[1, 100]required

Quality

sizeinteger[1, 9007199254740991]required

Size

integrityChecksSystemConfigIntegrityChecksrequired

Integrity checks config

Show child attributes
checksumFilesSystemConfigIntegrityChecksumJobrequired

Integrity checksum job config

Show child attributes
cronExpressionstringrequired

Cron expression for when the integrity check should run

enabledbooleanrequired

Enabled

percentageLimitinteger[0, 9007199254740991]required

Percentage limit of the integrity checksum job

timeLimitinteger[0, 9007199254740991]required

How long the integrity checksum job may run for

missingFilesSystemConfigIntegrityJobrequired

Integrity job config

Show child attributes
cronExpressionstringrequired

Cron expression for when the integrity check should run

enabledbooleanrequired

Enabled

untrackedFilesSystemConfigIntegrityJobrequired

Integrity job config

Show child attributes
cronExpressionstringrequired

Cron expression for when the integrity check should run

enabledbooleanrequired

Enabled

jobSystemConfigJobDtorequired
Show child attributes
backgroundTaskJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

editorJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

faceDetectionJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

integrityCheckJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

libraryJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

metadataExtractionJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

migrationJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

notificationsJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

ocrJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

searchJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

sidecarJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

smartSearchJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

thumbnailGenerationJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

videoConversionJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

workflowJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

librarySystemConfigLibraryDtorequired
Show child attributes
scanSystemConfigLibraryScanDtorequired
Show child attributes
cronExpressionstringrequired

Cron expression

enabledbooleanrequired

Enabled

watchSystemConfigLibraryWatchDtorequired
Show child attributes
enabledbooleanrequired

Enabled

loggingSystemConfigLoggingDtorequired
Show child attributes
enabledbooleanrequired

Enabled

levelLogLevelverbosedebuglogwarnerrorfatalrequired

Log level

machineLearningSystemConfigMachineLearningDtorequired
Show child attributes
availabilityChecksMachineLearningAvailabilityChecksDtorequired
Show child attributes
enabledbooleanrequired

Enabled

intervalinteger[-9007199254740991, 9007199254740991]required
timeoutinteger[-9007199254740991, 9007199254740991]required
clipCLIPConfigrequired
Show child attributes
enabledbooleanrequired

Whether the task is enabled

modelNamestringrequired

Name of the model to use

duplicateDetectionDuplicateDetectionConfigrequired
Show child attributes
enabledbooleanrequired

Whether the task is enabled

maxDistancenumber<double>[0.001, 0.1]required

Maximum distance threshold for duplicate detection

enabledbooleanrequired

Enabled

facialRecognitionFacialRecognitionConfigrequired
Show child attributes
enabledbooleanrequired

Whether the task is enabled

maxDistancenumber<double>[0.1, 2]required

Maximum distance threshold for face recognition

minFacesinteger[1, 9007199254740991]required

Minimum number of faces required for recognition

minScorenumber<double>[0.1, 1]required

Minimum confidence score for face detection

modelNamestringrequired

Name of the model to use

ocrOcrConfigrequired
Show child attributes
enabledbooleanrequired

Whether the task is enabled

maxResolutioninteger[1, 9007199254740991]required

Maximum resolution for OCR processing

minDetectionScorenumber<double>[0.1, 1]required

Minimum confidence score for text detection

minRecognitionScorenumber<double>[0.1, 1]required

Minimum confidence score for text recognition

modelNamestringrequired

Name of the model to use

urlsArray<string>required

ML service URLs

mapSystemConfigMapDtorequired
Show child attributes
darkStylestring<uri>required

Dark map style URL

enabledbooleanrequired

Enabled

lightStylestring<uri>required

Light map style URL

metadataSystemConfigMetadataDtorequired
Show child attributes
facesSystemConfigFacesDtorequired
Show child attributes
importbooleanrequired

Import

newVersionCheckSystemConfigNewVersionCheckDtorequired
Show child attributes
channelReleaseChannelstablereleaseCandidaterequired

Release channel

enabledbooleanrequired

Enabled

nightlyTasksSystemConfigNightlyTasksDtorequired
Show child attributes
clusterNewFacesbooleanrequired

Cluster new faces

databaseCleanupbooleanrequired

Database cleanup

generateMemoriesbooleanrequired

Generate memories

missingThumbnailsbooleanrequired

Missing thumbnails

startTimestringrequired

Start time (HH:MM)

syncQuotaUsagebooleanrequired

Sync quota usage

notificationsSystemConfigNotificationsDtorequired
Show child attributes
smtpSystemConfigSmtpDtorequired
Show child attributes
enabledbooleanrequired

Whether SMTP email notifications are enabled

fromstringrequired

Email address to send from

replyTostringrequired

Email address for replies

transportSystemConfigSmtpTransportDtorequired
Show child attributes
hoststringrequired

SMTP server hostname

ignoreCertbooleanrequired

Whether to ignore SSL certificate errors

passwordstringrequired

SMTP password

portinteger[0, 65535]required

SMTP server port

securebooleanrequired

Whether to use secure connection (TLS/SSL)

usernamestringrequired

SMTP username

oauthSystemConfigOAuthDtorequired
Show child attributes
allowInsecureRequestsbooleanrequired

Allow insecure requests

autoLaunchbooleanrequired

Auto launch

autoRegisterbooleanrequired

Auto register

buttonTextstringrequired

Button text

clientIdstringrequired

Client ID

clientSecretstringrequired

Client secret

defaultStorageQuotainteger | null[0, 9007199254740991]required

Default storage quota

enabledbooleanrequired

Enabled

endSessionEndpointstringrequired

End session endpoint

issuerUrlstringrequired

Issuer URL

mobileOverrideEnabledbooleanrequired

Mobile override enabled

mobileRedirectUristringrequired

Mobile redirect URI (set to empty string to disable)

profileSigningAlgorithmstringrequired

Profile signing algorithm

promptstringrequired

OAuth prompt parameter (e.g. select_account, login, consent)

roleClaimstringrequired

Role claim

scopestringrequired

Scope

signingAlgorithmstringrequired

Signing algorithm

storageLabelClaimstringrequired

Storage label claim

storageQuotaClaimstringrequired

Storage quota claim

timeoutinteger[1, 9007199254740991]required

Timeout

tokenEndpointAuthMethodOAuthTokenEndpointAuthMethodclient_secret_postclient_secret_basicrequired

OAuth token endpoint auth method

passwordLoginSystemConfigPasswordLoginDtorequired
Show child attributes
enabledbooleanrequired

Enabled

reverseGeocodingSystemConfigReverseGeocodingDtorequired
Show child attributes
enabledbooleanrequired

Enabled

serverSystemConfigServerDtorequired
Show child attributes
externalDomainstringrequired

External domain

loginPageMessagestringrequired

Login page message

publicUsersbooleanrequired

Public users

storageTemplateSystemConfigStorageTemplateDtorequired
Show child attributes
enabledbooleanrequired

Enabled

hashVerificationEnabledbooleanrequired

Hash verification enabled

templatestringrequired

Template

templatesSystemConfigTemplatesDtorequired
Show child attributes
emailSystemConfigTemplateEmailsDtorequired
Show child attributes
albumInviteTemplatestringrequired

Album invite template

albumUpdateTemplatestringrequired

Album update template

welcomeTemplatestringrequired

Welcome template

themeSystemConfigThemeDtorequired
Show child attributes
customCssstringrequired

Custom CSS for theming

trashSystemConfigTrashDtorequired
Show child attributes
daysinteger[0, 9007199254740991]required

Days

enabledbooleanrequired

Enabled

userSystemConfigUserDtorequired
Show child attributes
deleteDelayinteger[1, 9007199254740991]required

Delete delay

Example
{
  "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

object
accelTranscodeHWAccelnvencqsvvaapirkmppdisabledrequired

Transcode hardware acceleration

accelDecodebooleanrequired

Accelerated decode

acceptedAudioCodecsArray<AudioCodec>mp3aacopuspcm_s16lerequired

Accepted audio codecs

acceptedContainersArray<VideoContainer>movmp4oggwebmrequired

Accepted containers

acceptedVideoCodecsArray<VideoCodec>h264hevcvp9av1required

Accepted video codecs

bframesinteger[-1, 16]required

B-frames

cqModeCQModeautocqpicqrequired

CQ mode

crfinteger[0, 51]required

CRF

gopSizeinteger[0, 9007199254740991]required

GOP size

maxBitratestringrequired

Max bitrate

preferredHwDevicestringrequired

Preferred hardware device

presetstringrequired

Preset

realtimeSystemConfigFFmpegRealtimeDtorequired
Show child attributes
enabledbooleanrequired

Enable real-time HLS transcoding (alpha)

refsinteger[0, 6]required

References

targetAudioCodecAudioCodecmp3aacopuspcm_s16lerequired

Target audio codec

targetResolutionstringrequired

Target resolution

targetVideoCodecVideoCodech264hevcvp9av1required

Target video codec

temporalAQbooleanrequired

Temporal AQ

threadsinteger[0, 9007199254740991]required

Threads

tonemapToneMappinghablemobiusreinharddisabledrequired

Tone mapping

transcodeTranscodePolicyalloptimalbitraterequireddisabledrequired

Transcode policy

twoPassbooleanrequired

Two pass

Example
{
  "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

object
enabledbooleanrequired

Enable real-time HLS transcoding (alpha)

Example
{
  "enabled": true
}

SystemConfigFacesDto

object
importbooleanrequired

Import

Example
{
  "import": true
}

SystemConfigGeneratedFullsizeImageDto

object
enabledbooleanrequired

Enabled

formatImageFormatjpegwebprequired

Image format

progressiveboolean

Progressive

qualityinteger[1, 100]required

Quality

Example
{
  "enabled": true,
  "format": "jpeg",
  "progressive": true,
  "quality": 1
}

SystemConfigGeneratedImageDto

object
formatImageFormatjpegwebprequired

Image format

progressiveboolean

Progressive

qualityinteger[1, 100]required

Quality

sizeinteger[1, 9007199254740991]required

Size

Example
{
  "format": "jpeg",
  "progressive": true,
  "quality": 1,
  "size": 1
}

SystemConfigImageDto

object
colorspaceColorspacesrgbp3required

Colorspace

extractEmbeddedbooleanrequired

Extract embedded

fullsizeSystemConfigGeneratedFullsizeImageDtorequired
Show child attributes
enabledbooleanrequired

Enabled

formatImageFormatjpegwebprequired

Image format

progressiveboolean

Progressive

qualityinteger[1, 100]required

Quality

previewSystemConfigGeneratedImageDtorequired
Show child attributes
formatImageFormatjpegwebprequired

Image format

progressiveboolean

Progressive

qualityinteger[1, 100]required

Quality

sizeinteger[1, 9007199254740991]required

Size

thumbnailSystemConfigGeneratedImageDtorequired
Show child attributes
formatImageFormatjpegwebprequired

Image format

progressiveboolean

Progressive

qualityinteger[1, 100]required

Quality

sizeinteger[1, 9007199254740991]required

Size

Example
{
  "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

object

Integrity checks config

checksumFilesSystemConfigIntegrityChecksumJobrequired

Integrity checksum job config

Show child attributes
cronExpressionstringrequired

Cron expression for when the integrity check should run

enabledbooleanrequired

Enabled

percentageLimitinteger[0, 9007199254740991]required

Percentage limit of the integrity checksum job

timeLimitinteger[0, 9007199254740991]required

How long the integrity checksum job may run for

missingFilesSystemConfigIntegrityJobrequired

Integrity job config

Show child attributes
cronExpressionstringrequired

Cron expression for when the integrity check should run

enabledbooleanrequired

Enabled

untrackedFilesSystemConfigIntegrityJobrequired

Integrity job config

Show child attributes
cronExpressionstringrequired

Cron expression for when the integrity check should run

enabledbooleanrequired

Enabled

Example
{
  "checksumFiles": {
    "cronExpression": "string",
    "enabled": true,
    "percentageLimit": 0,
    "timeLimit": 0
  },
  "missingFiles": {
    "cronExpression": "string",
    "enabled": true
  },
  "untrackedFiles": {
    "cronExpression": "string",
    "enabled": true
  }
}

SystemConfigIntegrityChecksumJob

object

Integrity checksum job config

cronExpressionstringrequired

Cron expression for when the integrity check should run

enabledbooleanrequired

Enabled

percentageLimitinteger[0, 9007199254740991]required

Percentage limit of the integrity checksum job

timeLimitinteger[0, 9007199254740991]required

How long the integrity checksum job may run for

Example
{
  "cronExpression": "string",
  "enabled": true,
  "percentageLimit": 0,
  "timeLimit": 0
}

SystemConfigIntegrityJob

object

Integrity job config

cronExpressionstringrequired

Cron expression for when the integrity check should run

enabledbooleanrequired

Enabled

Example
{
  "cronExpression": "string",
  "enabled": true
}

SystemConfigJobDto

object
backgroundTaskJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

editorJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

faceDetectionJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

integrityCheckJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

libraryJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

metadataExtractionJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

migrationJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

notificationsJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

ocrJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

searchJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

sidecarJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

smartSearchJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

thumbnailGenerationJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

videoConversionJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

workflowJobSettingsDtorequired
Show child attributes
concurrencyinteger[1, 9007199254740991]required

Concurrency

Example
{
  "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

object
scanSystemConfigLibraryScanDtorequired
Show child attributes
cronExpressionstringrequired

Cron expression

enabledbooleanrequired

Enabled

watchSystemConfigLibraryWatchDtorequired
Show child attributes
enabledbooleanrequired

Enabled

Example
{
  "scan": {
    "cronExpression": "string",
    "enabled": true
  },
  "watch": {
    "enabled": true
  }
}

SystemConfigLibraryScanDto

object
cronExpressionstringrequired

Cron expression

enabledbooleanrequired

Enabled

Example
{
  "cronExpression": "string",
  "enabled": true
}

SystemConfigLibraryWatchDto

object
enabledbooleanrequired

Enabled

Example
{
  "enabled": true
}

SystemConfigLoggingDto

object
enabledbooleanrequired

Enabled

levelLogLevelverbosedebuglogwarnerrorfatalrequired

Log level

Example
{
  "enabled": true,
  "level": "verbose"
}

SystemConfigMachineLearningDto

object
availabilityChecksMachineLearningAvailabilityChecksDtorequired
Show child attributes
enabledbooleanrequired

Enabled

intervalinteger[-9007199254740991, 9007199254740991]required
timeoutinteger[-9007199254740991, 9007199254740991]required
clipCLIPConfigrequired
Show child attributes
enabledbooleanrequired

Whether the task is enabled

modelNamestringrequired

Name of the model to use

duplicateDetectionDuplicateDetectionConfigrequired
Show child attributes
enabledbooleanrequired

Whether the task is enabled

maxDistancenumber<double>[0.001, 0.1]required

Maximum distance threshold for duplicate detection

enabledbooleanrequired

Enabled

facialRecognitionFacialRecognitionConfigrequired
Show child attributes
enabledbooleanrequired

Whether the task is enabled

maxDistancenumber<double>[0.1, 2]required

Maximum distance threshold for face recognition

minFacesinteger[1, 9007199254740991]required

Minimum number of faces required for recognition

minScorenumber<double>[0.1, 1]required

Minimum confidence score for face detection

modelNamestringrequired

Name of the model to use

ocrOcrConfigrequired
Show child attributes
enabledbooleanrequired

Whether the task is enabled

maxResolutioninteger[1, 9007199254740991]required

Maximum resolution for OCR processing

minDetectionScorenumber<double>[0.1, 1]required

Minimum confidence score for text detection

minRecognitionScorenumber<double>[0.1, 1]required

Minimum confidence score for text recognition

modelNamestringrequired

Name of the model to use

urlsArray<string>required

ML service URLs

Example
{
  "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

object
darkStylestring<uri>required

Dark map style URL

enabledbooleanrequired

Enabled

lightStylestring<uri>required

Light map style URL

Example
{
  "darkStyle": "https://example.com",
  "enabled": true,
  "lightStyle": "https://example.com"
}

SystemConfigMetadataDto

object
facesSystemConfigFacesDtorequired
Show child attributes
importbooleanrequired

Import

Example
{
  "faces": {
    "import": true
  }
}

SystemConfigNewVersionCheckDto

object
channelReleaseChannelstablereleaseCandidaterequired

Release channel

enabledbooleanrequired

Enabled

Example
{
  "channel": "stable",
  "enabled": true
}

SystemConfigNightlyTasksDto

object
clusterNewFacesbooleanrequired

Cluster new faces

databaseCleanupbooleanrequired

Database cleanup

generateMemoriesbooleanrequired

Generate memories

missingThumbnailsbooleanrequired

Missing thumbnails

startTimestringrequired

Start time (HH:MM)

syncQuotaUsagebooleanrequired

Sync quota usage

Example
{
  "clusterNewFaces": true,
  "databaseCleanup": true,
  "generateMemories": true,
  "missingThumbnails": true,
  "startTime": "string",
  "syncQuotaUsage": true
}

SystemConfigNotificationsDto

object
smtpSystemConfigSmtpDtorequired
Show child attributes
enabledbooleanrequired

Whether SMTP email notifications are enabled

fromstringrequired

Email address to send from

replyTostringrequired

Email address for replies

transportSystemConfigSmtpTransportDtorequired
Show child attributes
hoststringrequired

SMTP server hostname

ignoreCertbooleanrequired

Whether to ignore SSL certificate errors

passwordstringrequired

SMTP password

portinteger[0, 65535]required

SMTP server port

securebooleanrequired

Whether to use secure connection (TLS/SSL)

usernamestringrequired

SMTP username

Example
{
  "smtp": {
    "enabled": true,
    "from": "string",
    "replyTo": "string",
    "transport": {
      "host": "string",
      "ignoreCert": true,
      "password": "string",
      "port": 0,
      "secure": true,
      "username": "string"
    }
  }
}

SystemConfigOAuthDto

object
allowInsecureRequestsbooleanrequired

Allow insecure requests

autoLaunchbooleanrequired

Auto launch

autoRegisterbooleanrequired

Auto register

buttonTextstringrequired

Button text

clientIdstringrequired

Client ID

clientSecretstringrequired

Client secret

defaultStorageQuotainteger | null[0, 9007199254740991]required

Default storage quota

enabledbooleanrequired

Enabled

endSessionEndpointstringrequired

End session endpoint

issuerUrlstringrequired

Issuer URL

mobileOverrideEnabledbooleanrequired

Mobile override enabled

mobileRedirectUristringrequired

Mobile redirect URI (set to empty string to disable)

profileSigningAlgorithmstringrequired

Profile signing algorithm

promptstringrequired

OAuth prompt parameter (e.g. select_account, login, consent)

roleClaimstringrequired

Role claim

scopestringrequired

Scope

signingAlgorithmstringrequired

Signing algorithm

storageLabelClaimstringrequired

Storage label claim

storageQuotaClaimstringrequired

Storage quota claim

timeoutinteger[1, 9007199254740991]required

Timeout

tokenEndpointAuthMethodOAuthTokenEndpointAuthMethodclient_secret_postclient_secret_basicrequired

OAuth token endpoint auth method

Example
{
  "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"
}

SystemConfigPasswordLoginDto

object
enabledbooleanrequired

Enabled

Example
{
  "enabled": true
}

SystemConfigReverseGeocodingDto

object
enabledbooleanrequired

Enabled

Example
{
  "enabled": true
}

SystemConfigServerDto

object
externalDomainstringrequired

External domain

loginPageMessagestringrequired

Login page message

publicUsersbooleanrequired

Public users

Example
{
  "externalDomain": "string",
  "loginPageMessage": "string",
  "publicUsers": true
}

SystemConfigSmtpDto

object
enabledbooleanrequired

Whether SMTP email notifications are enabled

fromstringrequired

Email address to send from

replyTostringrequired

Email address for replies

transportSystemConfigSmtpTransportDtorequired
Show child attributes
hoststringrequired

SMTP server hostname

ignoreCertbooleanrequired

Whether to ignore SSL certificate errors

passwordstringrequired

SMTP password

portinteger[0, 65535]required

SMTP server port

securebooleanrequired

Whether to use secure connection (TLS/SSL)

usernamestringrequired

SMTP username

Example
{
  "enabled": true,
  "from": "string",
  "replyTo": "string",
  "transport": {
    "host": "string",
    "ignoreCert": true,
    "password": "string",
    "port": 0,
    "secure": true,
    "username": "string"
  }
}

SystemConfigSmtpTransportDto

object
hoststringrequired

SMTP server hostname

ignoreCertbooleanrequired

Whether to ignore SSL certificate errors

passwordstringrequired

SMTP password

portinteger[0, 65535]required

SMTP server port

securebooleanrequired

Whether to use secure connection (TLS/SSL)

usernamestringrequired

SMTP username

Example
{
  "host": "string",
  "ignoreCert": true,
  "password": "string",
  "port": 0,
  "secure": true,
  "username": "string"
}

SystemConfigStorageTemplateDto

object
enabledbooleanrequired

Enabled

hashVerificationEnabledbooleanrequired

Hash verification enabled

templatestringrequired

Template

Example
{
  "enabled": true,
  "hashVerificationEnabled": true,
  "template": "string"
}

SystemConfigTemplateEmailsDto

object
albumInviteTemplatestringrequired

Album invite template

albumUpdateTemplatestringrequired

Album update template

welcomeTemplatestringrequired

Welcome template

Example
{
  "albumInviteTemplate": "string",
  "albumUpdateTemplate": "string",
  "welcomeTemplate": "string"
}

SystemConfigTemplateStorageOptionDto

object
dayOptionsArray<string>required

Available day format options for storage template

hourOptionsArray<string>required

Available hour format options for storage template

minuteOptionsArray<string>required

Available minute format options for storage template

monthOptionsArray<string>required

Available month format options for storage template

presetOptionsArray<string>required

Available preset template options

secondOptionsArray<string>required

Available second format options for storage template

weekOptionsArray<string>required

Available week format options for storage template

yearOptionsArray<string>required

Available year format options for storage template

Example
{
  "dayOptions": [
    "string"
  ],
  "hourOptions": [
    "string"
  ],
  "minuteOptions": [
    "string"
  ],
  "monthOptions": [
    "string"
  ],
  "presetOptions": [
    "string"
  ],
  "secondOptions": [
    "string"
  ],
  "weekOptions": [
    "string"
  ],
  "yearOptions": [
    "string"
  ]
}

SystemConfigTemplatesDto

object
emailSystemConfigTemplateEmailsDtorequired
Show child attributes
albumInviteTemplatestringrequired

Album invite template

albumUpdateTemplatestringrequired

Album update template

welcomeTemplatestringrequired

Welcome template

Example
{
  "email": {
    "albumInviteTemplate": "string",
    "albumUpdateTemplate": "string",
    "welcomeTemplate": "string"
  }
}

SystemConfigThemeDto

object
customCssstringrequired

Custom CSS for theming

Example
{
  "customCss": "string"
}

SystemConfigTrashDto

object
daysinteger[0, 9007199254740991]required

Days

enabledbooleanrequired

Enabled

Example
{
  "days": 0,
  "enabled": true
}

SystemConfigUserDto

object
deleteDelayinteger[1, 9007199254740991]required

Delete delay

Example
{
  "deleteDelay": 1
}

TagBulkAssetsDto

object
assetIdsArray<string>required

Asset IDs

tagIdsArray<string>required

Tag IDs

Example
{
  "assetIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ],
  "tagIds": [
    "550e8400-e29b-41d4-a716-446655440000"
  ]
}

TagBulkAssetsResponseDto

object
countinteger[-9007199254740991, 9007199254740991]required

Number of assets tagged

Example
{
  "count": -9007199254740991
}

TagCreateDto

object
colorstring | null

Tag color (hex)

namestringrequired

Tag name

parentIdstring<uuid> | null

Parent tag ID

Example
{
  "color": "string",
  "name": "string",
  "parentId": "550e8400-e29b-41d4-a716-446655440000"
}

TagResponseDto

object
colorstring

Tag color (hex)

createdAtstring<date-time>required

Creation date

idstring<uuid>required

Tag ID

namestringrequired

Tag name

parentIdstring

Parent tag ID

updatedAtstring<date-time>required

Last update date

valuestringrequired

Tag value (full path)

Example
{
  "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"
}

TagUpdateDto

object
colorstring | null

Tag color (hex)

Example
{
  "color": "string"
}

TagUpsertDto

object
tagsArray<string>required

Tag names to upsert

Example
{
  "tags": [
    "string"
  ]
}

TagsResponse

object
enabledbooleanrequired

Whether tags are enabled

sidebarWebbooleanrequired

Whether tags appear in web sidebar

Example
{
  "enabled": true,
  "sidebarWeb": true
}

TagsUpdate

object
enabledboolean

Whether tags are enabled

sidebarWebboolean

Whether tags appear in web sidebar

Example
{
  "enabled": true,
  "sidebarWeb": true
}

TemplateDto

object
templatestringrequired

Template name

Example
{
  "template": "string"
}

TemplateResponseDto

object
htmlstringrequired

Template HTML content

namestringrequired

Template name

Example
{
  "html": "string",
  "name": "string"
}

TestEmailResponseDto

object
messageIdstringrequired

Email message ID

Example
{
  "messageId": "string"
}

TimeBucketAssetResponseDto

object
cityArray<string>

Array of city names extracted from EXIF GPS data

countryArray<string>

Array of country names extracted from EXIF GPS data

createdAtArray<string>required

Array of UTC timestamps when each asset was originally uploaded to Immich

durationArray<integer>required

Array of video/gif durations in milliseconds (null for static images)

fileCreatedAtArray<string>required

Array of file creation timestamps in UTC

idArray<string>required

Array of asset IDs in the time bucket

isFavoriteArray<boolean>required

Array indicating whether each asset is favorited

isImageArray<boolean>required

Array indicating whether each asset is an image (false for videos)

isTrashedArray<boolean>required

Array indicating whether each asset is in the trash

latitudeArray<number>

Array of latitude coordinates extracted from EXIF GPS data

livePhotoVideoIdArray<string>required

Array of live photo video asset IDs (null for non-live photos)

localOffsetHoursArray<number>required

Array 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>required

Array of owner IDs for each asset

projectionTypeArray<string>required

Array of projection types for 360° content (e.g., "EQUIRECTANGULAR", "CUBEFACE", "CYLINDRICAL")

ratioArray<number>required

Array 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>required

Array of BlurHash strings for generating asset previews (base64 encoded)

visibilityArray<AssetVisibility>archivetimelinehiddenlockedrequired

Array of visibility statuses for each asset (e.g., ARCHIVE, TIMELINE, HIDDEN, LOCKED)

Example
{
  "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

object
countinteger[-9007199254740991, 9007199254740991]required

Number of assets in this time bucket

timeBucketstringrequired

Time bucket identifier in YYYY-MM-DD format representing the start of the time period

Example
{
  "count": 42,
  "timeBucket": "2024-01-01"
}

ToneMapping

string

Tone mapping

ToneMappinghablemobiusreinharddisabled
Example
"hable"

TranscodeHWAccel

string

Transcode hardware acceleration

TranscodeHWAccelnvencqsvvaapirkmppdisabled
Example
"nvenc"

TranscodePolicy

string

Transcode policy

TranscodePolicyalloptimalbitraterequireddisabled
Example
"all"

TrashResponseDto

object
countinteger[-9007199254740991, 9007199254740991]required

Number of items in trash

Example
{
  "count": -9007199254740991
}

UpdateAlbumDto

object
albumNamestring

Album name

albumThumbnailAssetIdstring<uuid>

Album thumbnail asset ID

descriptionstring

Album description

isActivityEnabledboolean

Enable activity feed

orderAssetOrderascdesc

Asset sort order

Example
{
  "albumName": "string",
  "albumThumbnailAssetId": "550e8400-e29b-41d4-a716-446655440000",
  "description": "string",
  "isActivityEnabled": true,
  "order": "asc"
}

UpdateAlbumUserDto

object
roleAlbumUserRoleeditorownerviewerrequired

Album user role

Example
{
  "role": "editor"
}

UpdateAssetDto

object
dateTimeOriginalstring

Original date and time

descriptionstring

Asset description

isFavoriteboolean

Mark as favorite

latitudenumber[-90, 90]

Latitude coordinate

livePhotoVideoIdstring<uuid> | null

Live photo video ID

longitudenumber[-180, 180]

Longitude coordinate

ratinginteger | null[-1, 5]

Rating in range [1-5] (starred), -1 (rejected), or null (unrated)

visibilityAssetVisibilityarchivetimelinehiddenlocked

Asset visibility

Example
{
  "dateTimeOriginal": "string",
  "description": "string",
  "isFavorite": true,
  "latitude": -90,
  "livePhotoVideoId": "550e8400-e29b-41d4-a716-446655440000",
  "longitude": -180,
  "rating": -1,
  "visibility": "archive"
}

UpdateLibraryDto

object
exclusionPatternsArray<string>

Exclusion patterns (max 128)

importPathsArray<string>

Import paths (max 128)

namestring

Library name

Example
{
  "exclusionPatterns": [
    "string"
  ],
  "importPaths": [
    "string"
  ],
  "name": "string"
}

UsageByUserDto

object
photosinteger[-9007199254740991, 9007199254740991]required

Number of photos

quotaSizeInBytesinteger | null[-9007199254740991, 9007199254740991]required

User quota size in bytes (null if unlimited)

usageinteger[-9007199254740991, 9007199254740991]required

Total storage usage in bytes

usagePhotosinteger[-9007199254740991, 9007199254740991]required

Storage usage for photos in bytes

usageVideosinteger[-9007199254740991, 9007199254740991]required

Storage usage for videos in bytes

userIdstring<uuid>required

User ID

userNamestringrequired

User name

videosinteger[-9007199254740991, 9007199254740991]required

Number of videos

Example
{
  "photos": -9007199254740991,
  "quotaSizeInBytes": -9007199254740991,
  "usage": -9007199254740991,
  "usagePhotos": -9007199254740991,
  "usageVideos": -9007199254740991,
  "userId": "550e8400-e29b-41d4-a716-446655440000",
  "userName": "string",
  "videos": -9007199254740991
}

UserAdminCreateDto

object
avatarColorUserAvatarColor | null
emailstring<email>required

User email

isAdminboolean

Grant admin privileges

namestringrequired

User name

notifyboolean

Send notification email

passwordstringrequired

User password

pinCodestring | null

PIN code

quotaSizeInBytesinteger | null[0, 9007199254740991]

Storage quota in bytes

shouldChangePasswordboolean

Require password change on next login

storageLabelstring | null

Storage label

Example
{
  "email": "user@example.com",
  "isAdmin": true,
  "name": "string",
  "notify": true,
  "password": "string",
  "pinCode": "123456",
  "quotaSizeInBytes": 0,
  "shouldChangePassword": true,
  "storageLabel": "string"
}

UserAdminDeleteDto

object
forceboolean

Force delete even if user has assets

Example
{
  "force": true
}

UserAdminResponseDto

object
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

createdAtstring<date-time>required

Creation date

deletedAtstring<date-time> | nullrequired

Deletion date

emailstring<email>required

User email

idstring<uuid>required

User ID

isAdminbooleanrequired

Is admin user

licenseUserLicense | nullrequired
namestringrequired

User name

oauthIdstringrequired

OAuth ID

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

quotaSizeInBytesinteger | null[0, 9007199254740991]required

Storage quota in bytes

quotaUsageInBytesinteger | null[0, 9007199254740991]required

Storage usage in bytes

shouldChangePasswordbooleanrequired

Require password change on next login

statusUserStatusactiveremovingdeletedrequired

User status

storageLabelstring | nullrequired

Storage label

updatedAtstring<date-time>required

Last update date

Example
{
  "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

object
avatarColorUserAvatarColor | null
emailstring<email>

User email

isAdminboolean

Grant admin privileges

namestring

User name

passwordstring

User password

pinCodestring | null

PIN code

quotaSizeInBytesinteger | null[0, 9007199254740991]

Storage quota in bytes

shouldChangePasswordboolean

Require password change on next login

storageLabelstring | null

Storage label

Example
{
  "email": "user@example.com",
  "isAdmin": true,
  "name": "string",
  "password": "string",
  "pinCode": "123456",
  "quotaSizeInBytes": 0,
  "shouldChangePassword": true,
  "storageLabel": "string"
}

UserAvatarColor

string

User avatar color

UserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamber
Example
"primary"

UserLicense

object
activatedAtstring<date-time>required

Activation date

activationKeystringrequired

Activation key

licenseKeystringrequired

License key (format: /^IM(SV|CL)(-[\dA-Za-z]{4}){8}$/)

Example
{
  "activatedAt": "2024-01-01T00:00:00.000Z",
  "activationKey": "string",
  "licenseKey": "string"
}

UserMetadataKey

string

User metadata key

UserMetadataKeypreferenceslicenseonboarding
Example
"preferences"

UserPreferencesResponseDto

object
albumsAlbumsResponserequired
Show child attributes
defaultAssetOrderAssetOrderascdescrequired

Asset sort order

castCastResponserequired
Show child attributes
gCastEnabledbooleanrequired

Whether Google Cast is enabled

downloadDownloadResponserequired
Show child attributes
archiveSizeinteger[-9007199254740991, 9007199254740991]required

Maximum archive size in bytes

includeEmbeddedVideosbooleanrequired

Whether to include embedded videos in downloads

emailNotificationsEmailNotificationsResponserequired
Show child attributes
albumInvitebooleanrequired

Whether to receive email notifications for album invites

albumUpdatebooleanrequired

Whether to receive email notifications for album updates

enabledbooleanrequired

Whether email notifications are enabled

foldersFoldersResponserequired
Show child attributes
enabledbooleanrequired

Whether folders are enabled

sidebarWebbooleanrequired

Whether folders appear in web sidebar

memoriesMemoriesResponserequired
Show child attributes
durationinteger[-9007199254740991, 9007199254740991]required

Memory duration in seconds

enabledbooleanrequired

Whether memories are enabled

peoplePeopleResponserequired
Show child attributes
enabledbooleanrequired

Whether people are enabled

minimumFacesinteger[1, 9007199254740991]

People face threshold

sidebarWebbooleanrequired

Whether people appear in web sidebar

purchasePurchaseResponserequired
Show child attributes
hideBuyButtonUntilstringrequired

Date until which to hide buy button

showSupportBadgebooleanrequired

Whether to show support badge

ratingsRatingsResponserequired
Show child attributes
enabledbooleanrequired

Whether ratings are enabled

sharedLinksSharedLinksResponserequired
Show child attributes
enabledbooleanrequired

Whether shared links are enabled

sidebarWebbooleanrequired

Whether shared links appear in web sidebar

tagsTagsResponserequired
Show child attributes
enabledbooleanrequired

Whether tags are enabled

sidebarWebbooleanrequired

Whether tags appear in web sidebar

Example
{
  "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

object
albumsAlbumsUpdate

Album preferences

Show child attributes
defaultAssetOrderAssetOrderascdesc

Asset sort order

avatarAvatarUpdate
Show child attributes
colorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamber

User avatar color

castCastUpdate
Show child attributes
gCastEnabledboolean

Whether Google Cast is enabled

downloadDownloadUpdate
Show child attributes
archiveSizeinteger[1, 9007199254740991]

Maximum archive size in bytes

includeEmbeddedVideosboolean

Whether to include embedded videos in downloads

emailNotificationsEmailNotificationsUpdate
Show child attributes
albumInviteboolean

Whether to receive email notifications for album invites

albumUpdateboolean

Whether to receive email notifications for album updates

enabledboolean

Whether email notifications are enabled

foldersFoldersUpdate
Show child attributes
enabledboolean

Whether folders are enabled

sidebarWebboolean

Whether folders appear in web sidebar

memoriesMemoriesUpdate
Show child attributes
durationinteger[1, 9007199254740991]

Memory duration in seconds

enabledboolean

Whether memories are enabled

peoplePeopleUpdate
Show child attributes
enabledboolean

Whether people are enabled

minimumFacesinteger[1, 9007199254740991]

People face threshold

sidebarWebboolean

Whether people appear in web sidebar

purchasePurchaseUpdate
Show child attributes
hideBuyButtonUntilstring

Date until which to hide buy button

showSupportBadgeboolean

Whether to show support badge

ratingsRatingsUpdate
Show child attributes
enabledboolean

Whether ratings are enabled

sharedLinksSharedLinksUpdate
Show child attributes
enabledboolean

Whether shared links are enabled

sidebarWebboolean

Whether shared links appear in web sidebar

tagsTagsUpdate
Show child attributes
enabledboolean

Whether tags are enabled

sidebarWebboolean

Whether tags appear in web sidebar

Example
{
  "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

object
avatarColorUserAvatarColorprimarypinkredyellowbluegreenpurpleorangegrayamberrequired

User avatar color

emailstring<email>required

User email

idstring<uuid>required

User ID

namestringrequired

User name

profileChangedAtstring<date-time>required

Profile change date

profileImagePathstringrequired

Profile image path

Example
{
  "avatarColor": "primary",
  "email": "user@example.com",
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "string",
  "profileChangedAt": "2024-01-15T09:30:00Z",
  "profileImagePath": "string"
}

UserStatus

string

User status

UserStatusactiveremovingdeleted
Example
"active"

UserUpdateMeDto

object
avatarColorUserAvatarColor | null
emailstring<email>

User email

namestring

User name

passwordstringdeprecated

User password (deprecated, use change password endpoint)

Example
{
  "email": "user@example.com",
  "name": "string",
  "password": "string"
}

ValidateAccessTokenResponseDto

object
authStatusbooleanrequired

Authentication status

Example
{
  "authStatus": true
}

ValidateLibraryDto

object
exclusionPatternsArray<string>

Exclusion patterns (max 128)

importPathsArray<string>

Import paths to validate (max 128)

Example
{
  "exclusionPatterns": [
    "string"
  ],
  "importPaths": [
    "string"
  ]
}

ValidateLibraryImportPathResponseDto

object
importPathstringrequired

Import path

isValidbooleanrequired

Is valid

messagestring

Validation message

Example
{
  "importPath": "string",
  "isValid": true,
  "message": "string"
}

ValidateLibraryResponseDto

object
importPathsArray<ValidateLibraryImportPathResponseDto>

Validation results for import paths

Show child attributes
importPathstringrequired

Import path

isValidbooleanrequired

Is valid

messagestring

Validation message

Example
{
  "importPaths": [
    {
      "importPath": "string",
      "isValid": true,
      "message": "string"
    }
  ]
}

VersionCheckStateResponseDto

object
checkedAtstring | nullrequired

Last check timestamp

releaseVersionstring | nullrequired

Release version

Example
{
  "checkedAt": "string",
  "releaseVersion": "string"
}

VideoCodec

string

Target video codec

VideoCodech264hevcvp9av1
Example
"h264"

VideoContainer

string

Accepted video containers

VideoContainermovmp4oggwebm
Example
"mov"

WorkflowCreateDto

object
descriptionstring | null

Workflow description

enabledboolean

Workflow enabled

namestring | null

Workflow name

stepsArray<WorkflowStepDto>
Show child attributes
configobject | nullrequired

Step configuration

enabledboolean

Step is enabled

methodstringrequired

Step plugin method

triggerWorkflowTriggerAssetCreateAssetMetadataExtractionrequired

Plugin trigger type

Example
{
  "description": "string",
  "enabled": true,
  "name": "string",
  "steps": [
    {
      "config": {},
      "enabled": true,
      "method": "string"
    }
  ],
  "trigger": "AssetCreate"
}

WorkflowResponseDto

object
createdAtstringrequired

Creation date

descriptionstring | nullrequired

Workflow description

enabledbooleanrequired

Workflow enabled

idstring<uuid>required

Workflow ID

namestring | nullrequired

Workflow name

stepsArray<WorkflowStepDto>required

Workflow steps

Show child attributes
configobject | nullrequired

Step configuration

enabledboolean

Step is enabled

methodstringrequired

Step plugin method

triggerWorkflowTriggerAssetCreateAssetMetadataExtractionrequired

Plugin trigger type

updatedAtstringrequired

Update date

Example
{
  "createdAt": "string",
  "description": "string",
  "enabled": true,
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "string",
  "steps": [
    {
      "config": {},
      "enabled": true,
      "method": "string"
    }
  ],
  "trigger": "AssetCreate",
  "updatedAt": "string"
}

WorkflowShareResponseDto

object
descriptionstring | nullrequired

Workflow description

namestring | nullrequired

Workflow name

stepsArray<WorkflowShareStepDto>required

Workflow steps

Show child attributes
configobject | nullrequired

Step configuration

enabledboolean

Step is enabled

methodstringrequired

Step plugin method

triggerWorkflowTriggerAssetCreateAssetMetadataExtractionrequired

Plugin trigger type

Example
{
  "description": "string",
  "name": "string",
  "steps": [
    {
      "config": {},
      "enabled": true,
      "method": "string"
    }
  ],
  "trigger": "AssetCreate"
}

WorkflowShareStepDto

object
configobject | nullrequired

Step configuration

enabledboolean

Step is enabled

methodstringrequired

Step plugin method

Example
{
  "config": {},
  "enabled": true,
  "method": "string"
}

WorkflowStepDto

object
configobject | nullrequired

Step configuration

enabledboolean

Step is enabled

methodstringrequired

Step plugin method

Example
{
  "config": {},
  "enabled": true,
  "method": "string"
}

WorkflowTrigger

string

Plugin trigger type

WorkflowTriggerAssetCreateAssetMetadataExtraction
Example
"AssetCreate"

WorkflowTriggerResponseDto

object
triggerWorkflowTriggerAssetCreateAssetMetadataExtractionrequired

Plugin trigger type

typesArray<WorkflowType>AssetV1required

Workflow types

Example
{
  "trigger": "AssetCreate",
  "types": [
    "AssetV1"
  ]
}

WorkflowType

string

Workflow type

WorkflowTypeAssetV1
Example
"AssetV1"

WorkflowUpdateDto

object
descriptionstring | null

Workflow description

enabledboolean

Workflow enabled

namestring | null

Workflow name

stepsArray<WorkflowStepDto>
Show child attributes
configobject | nullrequired

Step configuration

enabledboolean

Step is enabled

methodstringrequired

Step plugin method

triggerWorkflowTriggerAssetCreateAssetMetadataExtraction

Plugin trigger type

Example
{
  "description": "string",
  "enabled": true,
  "name": "string",
  "steps": [
    {
      "config": {},
      "enabled": true,
      "method": "string"
    }
  ],
  "trigger": "AssetCreate"
}