PhotoPrism Users API

The Users API from PhotoPrism — 11 operation(s) for users.

Operations 12

PUT /api/v1/users/{uid} update user profile information #
POST /api/v1/users/{uid}/avatar upload a new avatar image for a user #
GET /api/v1/users/{uid}/grants list the apps connected to a user account #
DELETE /api/v1/users/{uid}/grants/{grant} disconnect an app from a user account #
POST /api/v1/users/{uid}/passcode create a new 2FA passcode for a user #
POST /api/v1/users/{uid}/passcode/activate activate 2FA with a verified passcode #
POST /api/v1/users/{uid}/passcode/confirm verify a new 2FA passcode #
POST /api/v1/users/{uid}/passcode/deactivate deactivate 2FA and remove the passcode #
PUT /api/v1/users/{uid}/password change a user's password #
GET /api/v1/users/{uid}/sessions list sessions for a user #
POST /api/v1/users/{uid}/upload/{token} upload files to a user's upload folder #
PUT /api/v1/users/{uid}/upload/{token} process previously uploaded files for a user #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • 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.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/photoprism:photoprism-users-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

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 Specification

photoprism-users-api-openapi.yml Raw ↑
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/