PhotoPrism Users API
The Users API from PhotoPrism — 11 operation(s) for users.
The Users API from PhotoPrism — 11 operation(s) for users.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/photoprism:photoprism-users-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
contact: {}
description: 'API request bodies and responses are usually JSON-encoded, except for binary data and some of the OAuth2 endpoints. Note that the `Content-Type` header must be set to `application/json` for this, as the request may otherwise fail with error 400.
When clients have a valid access token, e.g. obtained through the `POST /api/v1/session` or `POST /api/v1/oauth/token` endpoint, they can use a standard Bearer Authorization header to authenticate their requests. Submitting the access token with a custom `X-Auth-Token` header is supported as well.'
title: PhotoPrism Users API
version: v1
servers:
- url: https://demo.photoprism.app
security:
- BearerAuth: []
tags:
- name: Users
paths:
/api/v1/users/{uid}:
put:
operationId: UpdateUser
parameters:
- description: user uid
in: path
name: uid
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/entity.User'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'413':
description: Request Entity Too Large
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
summary: update user profile information
tags:
- Users
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/form.User'
description: properties to be updated
required: true
/api/v1/users/{uid}/avatar:
post:
description: Accepts a single PNG or JPEG file (max 20 MB) in a multipart form field named "files" and sets it as the user's avatar.
operationId: UploadUserAvatar
parameters:
- description: user uid
in: path
name: uid
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/entity.User'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'413':
description: Request Entity Too Large
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
summary: upload a new avatar image for a user
tags:
- Users
requestBody:
content:
multipart/form-data:
schema:
type: object
properties:
files:
type: string
description: avatar image (png or jpeg, <= 20 MB)
format: binary
required:
- files
/api/v1/users/{uid}/grants:
get:
operationId: FindUserGrants
parameters:
- description: user uid
in: path
name: uid
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
items:
$ref: '#/components/schemas/api.UserGrant'
type: array
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
summary: list the apps connected to a user account
tags:
- Users
/api/v1/users/{uid}/grants/{grant}:
delete:
operationId: DeleteUserGrant
parameters:
- description: user uid
in: path
name: uid
required: true
schema:
type: string
- description: grant uid
in: path
name: grant
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/api.UserGrant'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
summary: disconnect an app from a user account
tags:
- Users
/api/v1/users/{uid}/passcode:
post:
operationId: CreateUserPasscode
parameters:
- description: user uid
in: path
name: uid
required: true
schema:
type: string
responses:
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/entity.Passcode'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'413':
description: Request Entity Too Large
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
summary: create a new 2FA passcode for a user
tags:
- Users
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/form.Passcode'
description: passcode setup (password required)
required: true
/api/v1/users/{uid}/passcode/activate:
post:
operationId: ActivateUserPasscode
parameters:
- description: user uid
in: path
name: uid
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/entity.Passcode'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'413':
description: Request Entity Too Large
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
summary: activate 2FA with a verified passcode
tags:
- Users
/api/v1/users/{uid}/passcode/confirm:
post:
operationId: ConfirmUserPasscode
parameters:
- description: user uid
in: path
name: uid
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/entity.Passcode'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'413':
description: Request Entity Too Large
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
summary: verify a new 2FA passcode
tags:
- Users
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/form.Passcode'
description: verification code
required: true
/api/v1/users/{uid}/passcode/deactivate:
post:
operationId: DeactivateUserPasscode
parameters:
- description: user uid
in: path
name: uid
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'413':
description: Request Entity Too Large
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
summary: deactivate 2FA and remove the passcode
tags:
- Users
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/form.Passcode'
description: password for confirmation
required: true
/api/v1/users/{uid}/password:
put:
operationId: UpdateUserPassword
parameters:
- description: user uid
in: path
name: uid
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'413':
description: Request Entity Too Large
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
summary: change a user's password
tags:
- Users
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/form.ChangePassword'
description: old and new password
required: true
/api/v1/users/{uid}/sessions:
get:
operationId: FindUserSessions
parameters:
- description: user uid
in: path
name: uid
required: true
schema:
type: string
- description: maximum number of results
in: query
name: count
required: true
schema:
type: integer
maximum: 100000
minimum: 1
- description: result offset
in: query
name: offset
schema:
type: integer
minimum: 0
- description: filter by username or client name
in: query
name: q
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
items:
$ref: '#/components/schemas/entity.Session'
type: array
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
summary: list sessions for a user
tags:
- Users
/api/v1/users/{uid}/upload/{token}:
post:
operationId: UploadUserFiles
parameters:
- description: user uid
in: path
name: uid
required: true
schema:
type: string
- description: upload token
in: path
name: token
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'413':
description: Request Entity Too Large
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'507':
description: Insufficient Storage
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
summary: upload files to a user's upload folder
tags:
- Users
requestBody:
content:
multipart/form-data:
schema:
type: object
properties:
files:
type: string
description: one or more files to upload (repeat the field for multiple files)
format: binary
required:
- files
put:
operationId: ProcessUserUpload
parameters:
- description: user uid
in: path
name: uid
required: true
schema:
type: string
- description: upload token
in: path
name: token
required: true
schema:
type: string
responses:
'200':
description: OK
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'400':
description: Bad Request
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'401':
description: Unauthorized
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'403':
description: Forbidden
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'404':
description: Not Found
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'409':
description: Conflict
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'413':
description: Request Entity Too Large
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'429':
description: Too Many Requests
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'500':
description: Internal Server Error
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'503':
description: Service Unavailable
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
'507':
description: Insufficient Storage
content:
application/json:
schema:
$ref: '#/components/schemas/i18n.Response'
summary: process previously uploaded files for a user
tags:
- Users
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/form.UploadOptions'
description: processing options
required: true
components:
schemas:
entity.User:
properties:
Attr:
type: string
AuthID:
type: string
AuthIssuer:
type: string
AuthMethod:
type: string
AuthProvider:
type: string
BackupEmail:
type: string
BasePath:
type: string
BornAt:
type: string
CanInvite:
type: boolean
CanLogin:
type: boolean
ConsentAt:
type: string
CreatedAt:
type: string
DeletedAt:
type: string
Details:
$ref: '#/components/schemas/entity.UserDetails'
DisplayName:
type: string
Email:
type: string
ExpiresAt:
type: string
ID:
type: integer
LoginAt:
type: string
MCP:
type: integer
Name:
type: string
Role:
type: string
Scope:
type: string
Settings:
$ref: '#/components/schemas/entity.UserSettings'
Shares:
items:
$ref: '#/components/schemas/entity.UserShare'
type: array
SuperAdmin:
type: boolean
Thumb:
type: string
ThumbSrc:
type: string
UID:
type: string
UUID:
type: string
UpdatedAt:
type: string
UploadPath:
type: string
VerifiedAt:
type: string
WebDAV:
type: boolean
type: object
form.Passcode:
properties:
code:
type: string
password:
type: string
type:
type: string
type: object
entity.Session:
properties:
AuthID:
type: string
AuthIssuer:
type: string
AuthMethod:
type: string
AuthProvider:
type: string
AuthScope:
type: string
ClientIP:
type: string
ClientName:
type: string
ClientUID:
type: string
CreatedAt:
type: string
Expires:
type: integer
GrantType:
type: string
ID:
type: string
IdToken:
type: string
LastActive:
type: integer
LoginAt:
type: string
LoginIP:
type: string
Status:
type: integer
Timeout:
type: integer
UpdatedAt:
type: string
UserAgent:
type: string
UserName:
type: string
UserUID:
type: string
type: object
entity.UserSettings:
properties:
CreatedAt:
type: string
DownloadMediaRaw:
type: integer
DownloadMediaSidecar:
type: integer
DownloadOriginals:
type: integer
ImportMove:
type: integer
ImportPath:
type: string
IndexPath:
type: string
IndexRescan:
type: integer
MapsAnimate:
type: integer
MapsStyle:
type: string
SearchListView:
type: integer
SearchShowCaptions:
type: integer
SearchShowTitles:
type: integer
UILanguage:
type: string
UIStartPage:
type: string
UITheme:
type: string
UITimeZone:
type: string
UpdatedAt:
type: string
UploadPath:
type: string
type: object
entity.UserShare:
properties:
Comment:
type: string
CreatedAt:
type: string
ExpiresAt:
type: string
LinkUID:
type: string
Perm:
type: integer
ShareUID:
type: string
UpdatedAt:
type: string
type: object
form.UploadOptions:
properties:
albums:
items:
type: string
type: array
type: object
form.User:
properties:
Attr:
type: string
AuthID:
type: string
AuthIssuer:
type: string
AuthMethod:
type: string
AuthProvider:
type: string
BasePath:
type: string
CanLogin:
type: boolean
DeletedAt:
type: string
Details:
$ref: '#/components/schemas/form.UserDetails'
DisplayName:
type: string
Email:
type: string
MCP:
type: integer
Name:
type: string
Password:
type: string
Role:
type: string
Scope:
type: string
SuperAdmin:
type: boolean
UploadPath:
type: string
WebDAV:
type: boolean
type: object
i18n.Response:
properties:
code:
type: integer
details:
type: string
error:
type: string
message:
type: string
messageId:
type: string
messageParams:
items: {}
type: array
type: object
entity.Passcode:
properties:
ActivatedAt:
type: string
CreatedAt:
type: string
Type:
type: string
UID:
type: string
UpdatedAt:
type: string
VerifiedAt:
type: string
type: object
form.ChangePassword:
properties:
new:
type: string
old:
type: string
type: object
api.UserGrant:
properties:
ClientID:
type: string
ClientName:
type: string
CreatedAt:
type: string
Origin:
type: string
Scope:
type: string
UID:
type: string
UsedAt:
type: string
type: object
entity.UserDetails:
properties:
About:
type: string
AvatarURL:
type: string
Bio:
type: string
BirthDay:
type: integer
BirthMonth:
type: integer
BirthYear:
type: integer
Country:
type: string
CreatedAt:
type: string
FamilyName:
type: string
FeedURL:
type: string
Gender:
type: string
GivenName:
type: string
IdURL:
type: string
Location:
type: string
MiddleName:
type: string
NameSrc:
type: string
NameSuffix:
type: string
NameTitle:
type: string
NickName:
type: string
OrgEmail:
type: string
OrgName:
type: string
OrgPhone:
type: string
OrgTitle:
type: string
OrgURL:
type: string
Phone:
type: string
ProfileURL:
type: string
SiteURL:
type: string
SubjUID:
type: string
UpdatedAt:
type: string
type: object
form.UserDetails:
properties:
About:
type: string
Bio:
type: string
BirthDay:
type: integer
BirthMonth:
type: integer
BirthYear:
type: integer
Country:
type: string
FamilyName:
type: string
FeedURL:
type: string
Gender:
type: string
GivenName:
type: string
Location:
type: string
MiddleName:
type: string
NameSrc:
type: string
NameSuffix:
type: string
NameTitle:
type: string
NickName:
type: string
OrgEmail:
type: string
OrgName:
type: string
OrgPhone:
type: string
OrgTitle:
type: string
OrgURL:
type: string
Phone:
type: string
ProfileURL:
type: string
SiteURL:
type: string
type: object
securitySchemes:
BearerAuth:
in: header
name: Authorization
type: apiKey
externalDocs:
description: Learn more ›
url: https://docs.photoprism.app/developer-guide/api/