photoprism/internal/api/swagger.json
Michael Mayer 50976f427e Auth: Add RP-initiated OIDC logout via PHOTOPRISM_OIDC_LOGOUT #5684 #5433
Sign-out of an OIDC session redirects the browser to the provider's
discovered end_session_endpoint (id_token_hint + absolute
post_logout_redirect_uri) when PHOTOPRISM_OIDC_LOGOUT is enabled, so the
provider SSO session ends and the next login re-prompts. Opt-in (default
off); local/LDAP logout and providers without an end-session endpoint fall
back to local logout.

Adds the shared CE /api/v1/oauth/logout route and OAuthLogoutHandler hook
plus the Portal OP end_session_endpoint advertised in the Portal discovery
document, for Portal builds to serve via the override hook.
2026-06-24 17:21:00 +02:00

13799 lines
No EOL
455 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"definitions": {
"api.FoldersResponse": {
"properties": {
"cached": {
"type": "boolean"
},
"files": {
"items": {
"$ref": "#/definitions/entity.File"
},
"type": "array"
},
"folders": {
"items": {
"$ref": "#/definitions/entity.Folder"
},
"type": "array"
},
"recursive": {
"type": "boolean"
},
"root": {
"type": "string"
}
},
"type": "object"
},
"api.HealthResponse": {
"properties": {
"status": {
"type": "string"
},
"time": {
"type": "string"
}
},
"type": "object"
},
"authn.GrantType": {
"enum": [
"",
"cli",
"implicit",
"token",
"session",
"password",
"client_credentials",
"share_token",
"refresh_token",
"authorization_code",
"urn:ietf:params:oauth:grant-type:jwt-bearer",
"urn:ietf:params:oauth:grant-type:saml2-bearer",
"urn:ietf:params:oauth:grant-type:token-exchange"
],
"type": "string",
"x-enum-varnames": [
"GrantUndefined",
"GrantCLI",
"GrantImplicit",
"GrantToken",
"GrantSession",
"GrantPassword",
"GrantClientCredentials",
"GrantShareToken",
"GrantRefreshToken",
"GrantAuthorizationCode",
"GrantJwtBearer",
"GrantSamlBearer",
"GrantTokenExchange"
]
},
"batch.Action": {
"enum": [
"none",
"update",
"add",
"remove"
],
"type": "string",
"x-enum-varnames": [
"ActionNone",
"ActionUpdate",
"ActionAdd",
"ActionRemove"
]
},
"batch.Bool": {
"properties": {
"action": {
"$ref": "#/definitions/batch.Action"
},
"mixed": {
"type": "boolean"
},
"value": {
"type": "boolean"
}
},
"type": "object"
},
"batch.Float32": {
"properties": {
"action": {
"$ref": "#/definitions/batch.Action"
},
"mixed": {
"type": "boolean"
},
"value": {
"type": "number"
}
},
"type": "object"
},
"batch.Float64": {
"properties": {
"action": {
"$ref": "#/definitions/batch.Action"
},
"mixed": {
"type": "boolean"
},
"value": {
"type": "number"
}
},
"type": "object"
},
"batch.Int": {
"properties": {
"action": {
"$ref": "#/definitions/batch.Action"
},
"mixed": {
"type": "boolean"
},
"value": {
"type": "integer"
}
},
"type": "object"
},
"batch.Item": {
"properties": {
"action": {
"$ref": "#/definitions/batch.Action"
},
"mixed": {
"type": "boolean"
},
"title": {
"type": "string"
},
"value": {
"type": "string"
}
},
"type": "object"
},
"batch.Items": {
"properties": {
"action": {
"$ref": "#/definitions/batch.Action"
},
"items": {
"items": {
"$ref": "#/definitions/batch.Item"
},
"type": "array"
},
"mixed": {
"type": "boolean"
}
},
"type": "object"
},
"batch.PhotosForm": {
"properties": {
"Albums": {
"$ref": "#/definitions/batch.Items"
},
"Altitude": {
"$ref": "#/definitions/batch.Int"
},
"CameraID": {
"$ref": "#/definitions/batch.Int"
},
"Caption": {
"$ref": "#/definitions/batch.String"
},
"Country": {
"$ref": "#/definitions/batch.String"
},
"Day": {
"$ref": "#/definitions/batch.Int"
},
"DetailsArtist": {
"$ref": "#/definitions/batch.String"
},
"DetailsCopyright": {
"$ref": "#/definitions/batch.String"
},
"DetailsKeywords": {
"$ref": "#/definitions/batch.String"
},
"DetailsLicense": {
"$ref": "#/definitions/batch.String"
},
"DetailsSubject": {
"$ref": "#/definitions/batch.String"
},
"Exposure": {
"$ref": "#/definitions/batch.String"
},
"FNumber": {
"$ref": "#/definitions/batch.Float32"
},
"Favorite": {
"$ref": "#/definitions/batch.Bool"
},
"FocalLength": {
"$ref": "#/definitions/batch.Int"
},
"Iso": {
"$ref": "#/definitions/batch.Int"
},
"Labels": {
"$ref": "#/definitions/batch.Items"
},
"Lat": {
"$ref": "#/definitions/batch.Float64"
},
"LensID": {
"$ref": "#/definitions/batch.Int"
},
"Lng": {
"$ref": "#/definitions/batch.Float64"
},
"Month": {
"$ref": "#/definitions/batch.Int"
},
"Panorama": {
"$ref": "#/definitions/batch.Bool"
},
"Private": {
"$ref": "#/definitions/batch.Bool"
},
"Scan": {
"$ref": "#/definitions/batch.Bool"
},
"TakenAt": {
"type": "string"
},
"TakenAtLocal": {
"type": "string"
},
"TimeZone": {
"$ref": "#/definitions/batch.String"
},
"Title": {
"$ref": "#/definitions/batch.String"
},
"Type": {
"$ref": "#/definitions/batch.String"
},
"Year": {
"$ref": "#/definitions/batch.Int"
}
},
"type": "object"
},
"batch.PhotosRequest": {
"properties": {
"photos": {
"items": {
"type": "string"
},
"type": "array"
},
"values": {
"$ref": "#/definitions/batch.PhotosForm"
}
},
"type": "object"
},
"batch.PhotosResponse": {
"properties": {
"models": {
"items": {
"$ref": "#/definitions/search.Photo"
},
"type": "array"
},
"values": {
"$ref": "#/definitions/batch.PhotosForm"
}
},
"type": "object"
},
"batch.String": {
"properties": {
"action": {
"$ref": "#/definitions/batch.Action"
},
"mixed": {
"type": "boolean"
},
"value": {
"type": "string"
}
},
"type": "object"
},
"cluster.DatabaseInfo": {
"properties": {
"Driver": {
"type": "string"
},
"Host": {
"type": "string"
},
"Port": {
"type": "integer"
}
},
"type": "object"
},
"cluster.MetricsResponse": {
"properties": {
"ClusterCIDR": {
"type": "string"
},
"Nodes": {
"additionalProperties": {
"type": "integer"
},
"type": "object"
},
"Time": {
"type": "string"
},
"UUID": {
"type": "string"
}
},
"type": "object"
},
"cluster.Node": {
"properties": {
"AdvertiseUrl": {
"type": "string"
},
"AllowGroupRoles": {
"additionalProperties": {
"type": "string"
},
"type": "object"
},
"AllowGroups": {
"description": "Group-based admission config (redacted for non-admin sessions):\nAllowGroups admits matching login-time groups, AllowGroupRoles\noptionally overrides the default role per group, GroupsFullView opts the\nnode into receiving the user's full group set, and GroupsSrc is the\nAllowGroups provenance (\"node\" = instance-declared via env, \"manual\" =\nadmin-pinned; empty = unmanaged).",
"items": {
"type": "string"
},
"type": "array"
},
"AppName": {
"type": "string"
},
"AppVersion": {
"type": "string"
},
"ClientID": {
"type": "string"
},
"CreatedAt": {
"type": "string"
},
"Database": {
"$ref": "#/definitions/cluster.NodeDatabase"
},
"DisplayName": {
"type": "string"
},
"GroupsFullView": {
"type": "boolean"
},
"GroupsSrc": {
"type": "string"
},
"Labels": {
"additionalProperties": {
"type": "string"
},
"type": "object"
},
"Name": {
"description": "NodeName",
"type": "string"
},
"RedirectURIs": {
"items": {
"type": "string"
},
"type": "array"
},
"Role": {
"description": "NodeRole",
"type": "string"
},
"SiteUrl": {
"type": "string"
},
"Theme": {
"type": "string"
},
"UUID": {
"description": "NodeUUID",
"type": "string"
},
"UpdatedAt": {
"type": "string"
}
},
"type": "object"
},
"cluster.NodeDatabase": {
"properties": {
"Driver": {
"type": "string"
},
"Name": {
"type": "string"
},
"RotatedAt": {
"type": "string"
},
"User": {
"type": "string"
}
},
"type": "object"
},
"cluster.RegisterDatabase": {
"properties": {
"DSN": {
"type": "string"
},
"Driver": {
"type": "string"
},
"Host": {
"type": "string"
},
"Name": {
"type": "string"
},
"Password": {
"type": "string"
},
"Port": {
"type": "integer"
},
"RotatedAt": {
"type": "string"
},
"User": {
"type": "string"
}
},
"type": "object"
},
"cluster.RegisterResponse": {
"properties": {
"AlreadyProvisioned": {
"type": "boolean"
},
"AlreadyRegistered": {
"type": "boolean"
},
"ClusterCIDR": {
"type": "string"
},
"Database": {
"$ref": "#/definitions/cluster.RegisterDatabase"
},
"JWKSUrl": {
"type": "string"
},
"Node": {
"$ref": "#/definitions/cluster.Node"
},
"PortalLoginUrl": {
"type": "string"
},
"Secrets": {
"$ref": "#/definitions/cluster.RegisterSecrets"
},
"Theme": {
"type": "string"
},
"UUID": {
"description": "ClusterUUID",
"type": "string"
}
},
"type": "object"
},
"cluster.RegisterSecrets": {
"properties": {
"ClientSecret": {
"type": "string"
},
"RotatedAt": {
"type": "string"
}
},
"type": "object"
},
"cluster.StatusResponse": {
"properties": {
"Status": {
"type": "string"
}
},
"type": "object"
},
"cluster.SummaryResponse": {
"properties": {
"ClusterCIDR": {
"type": "string"
},
"Database": {
"$ref": "#/definitions/cluster.DatabaseInfo"
},
"Nodes": {
"type": "integer"
},
"Theme": {
"type": "string"
},
"Time": {
"type": "string"
},
"UUID": {
"description": "ClusterUUID",
"type": "string"
}
},
"type": "object"
},
"config.Options": {
"properties": {
"AppColor": {
"type": "string"
},
"AppIcon": {
"type": "string"
},
"AppMode": {
"type": "string"
},
"AppName": {
"type": "string"
},
"AutoImport": {
"type": "integer"
},
"AutoIndex": {
"type": "integer"
},
"BackupAlbums": {
"default": true,
"type": "boolean"
},
"BackupDatabase": {
"default": true,
"type": "boolean"
},
"BackupRetain": {
"type": "integer"
},
"BackupSchedule": {
"type": "string"
},
"CdnUrl": {
"type": "string"
},
"CdnVideo": {
"type": "boolean"
},
"Debug": {
"type": "boolean"
},
"DefaultLocale": {
"type": "string"
},
"DefaultTLS": {
"type": "boolean"
},
"DefaultTheme": {
"type": "string"
},
"DefaultTimezone": {
"type": "string"
},
"DetectNSFW": {
"type": "boolean"
},
"DisableBackups": {
"type": "boolean"
},
"DisableClassification": {
"type": "boolean"
},
"DisableDarktable": {
"type": "boolean"
},
"DisableExifTool": {
"type": "boolean"
},
"DisableFFmpeg": {
"type": "boolean"
},
"DisableFaces": {
"type": "boolean"
},
"DisableHeifConvert": {
"type": "boolean"
},
"DisableImageMagick": {
"type": "boolean"
},
"DisableJpegXL": {
"type": "boolean"
},
"DisableMCP": {
"type": "boolean"
},
"DisableOIDC": {
"type": "boolean"
},
"DisablePlaces": {
"type": "boolean"
},
"DisableRaw": {
"type": "boolean"
},
"DisableRawTherapee": {
"type": "boolean"
},
"DisableSips": {
"type": "boolean"
},
"DisableTLS": {
"type": "boolean"
},
"DisableTensorFlow": {
"type": "boolean"
},
"DisableVectors": {
"type": "boolean"
},
"DisableWebDAV": {
"type": "boolean"
},
"ExifBruteForce": {
"type": "boolean"
},
"Experimental": {
"type": "boolean"
},
"FFmpegBitrate": {
"type": "integer"
},
"FFmpegEncoder": {
"type": "string"
},
"FFmpegMapAudio": {
"type": "string"
},
"FFmpegMapVideo": {
"type": "string"
},
"FFmpegPreset": {
"type": "string"
},
"FFmpegQuality": {
"type": "integer"
},
"FFmpegSize": {
"type": "integer"
},
"HttpCacheMaxAge": {
"type": "integer"
},
"HttpCachePublic": {
"type": "boolean"
},
"HttpVideoMaxAge": {
"type": "integer"
},
"HttpsProxy": {
"type": "string"
},
"HttpsProxyInsecure": {
"type": "boolean"
},
"ImportAllow": {
"type": "string"
},
"IndexSchedule": {
"type": "string"
},
"IndexWorkers": {
"type": "string"
},
"JpegQuality": {
"type": "integer"
},
"JpegSize": {
"type": "integer"
},
"LegalInfo": {
"type": "string"
},
"LegalUrl": {
"type": "string"
},
"OIDCIcon": {
"type": "string"
},
"OIDCLogout": {
"type": "boolean"
},
"OIDCProvider": {
"type": "string"
},
"OIDCRedirect": {
"type": "boolean"
},
"OIDCRegister": {
"type": "boolean"
},
"OriginalsLimit": {
"type": "integer"
},
"PlacesLocale": {
"type": "string"
},
"PngSize": {
"type": "integer"
},
"Prod": {
"type": "boolean"
},
"RawPresets": {
"type": "boolean"
},
"ReadOnly": {
"type": "boolean"
},
"ResolutionLimit": {
"type": "integer"
},
"SidecarYaml": {
"default": true,
"type": "boolean"
},
"SiteAuthor": {
"type": "string"
},
"SiteCaption": {
"type": "string"
},
"SiteDescription": {
"type": "string"
},
"SiteFavicon": {
"type": "string"
},
"SiteName": {
"type": "string"
},
"SitePreview": {
"type": "string"
},
"SiteTitle": {
"type": "string"
},
"SiteUrl": {
"type": "string"
},
"TLSCert": {
"type": "string"
},
"TLSEmail": {
"type": "string"
},
"TLSKey": {
"type": "string"
},
"Test": {
"type": "boolean"
},
"ThumbColor": {
"type": "string"
},
"ThumbLibrary": {
"type": "string"
},
"ThumbSize": {
"type": "integer"
},
"ThumbSizeUncached": {
"type": "integer"
},
"ThumbUncached": {
"type": "boolean"
},
"Trace": {
"type": "boolean"
},
"UsageInfo": {
"type": "boolean"
},
"VisionFilter": {
"type": "string"
},
"VisionSchedule": {
"type": "string"
},
"WakeupInterval": {
"$ref": "#/definitions/time.Duration"
},
"WallpaperUri": {
"type": "string"
}
},
"type": "object"
},
"customize.AlbumsOrder": {
"properties": {
"album": {
"type": "string"
},
"folder": {
"type": "string"
},
"moment": {
"type": "string"
},
"month": {
"type": "string"
},
"state": {
"type": "string"
}
},
"type": "object"
},
"customize.AlbumsSettings": {
"properties": {
"download": {
"$ref": "#/definitions/customize.DownloadSettings"
},
"order": {
"$ref": "#/definitions/customize.AlbumsOrder"
}
},
"type": "object"
},
"customize.DownloadName": {
"enum": [
"file",
"original",
"share"
],
"type": "string",
"x-enum-varnames": [
"DownloadNameFile",
"DownloadNameOriginal",
"DownloadNameShare"
]
},
"customize.DownloadSettings": {
"properties": {
"disabled": {
"type": "boolean"
},
"mediaRaw": {
"type": "boolean"
},
"mediaSidecar": {
"type": "boolean"
},
"name": {
"$ref": "#/definitions/customize.DownloadName"
},
"originals": {
"type": "boolean"
}
},
"type": "object"
},
"customize.FeatureSettings": {
"properties": {
"account": {
"type": "boolean"
},
"albums": {
"type": "boolean"
},
"appPasswords": {
"type": "boolean"
},
"archive": {
"type": "boolean"
},
"batchEdit": {
"type": "boolean"
},
"calendar": {
"type": "boolean"
},
"cameras": {
"type": "boolean"
},
"delete": {
"type": "boolean"
},
"download": {
"type": "boolean"
},
"edit": {
"type": "boolean"
},
"estimates": {
"type": "boolean"
},
"favorites": {
"type": "boolean"
},
"files": {
"type": "boolean"
},
"folders": {
"type": "boolean"
},
"import": {
"type": "boolean"
},
"labels": {
"type": "boolean"
},
"lenses": {
"type": "boolean"
},
"library": {
"type": "boolean"
},
"logs": {
"type": "boolean"
},
"moments": {
"type": "boolean"
},
"people": {
"type": "boolean"
},
"places": {
"type": "boolean"
},
"private": {
"type": "boolean"
},
"ratings": {
"type": "boolean"
},
"reactions": {
"type": "boolean"
},
"review": {
"type": "boolean"
},
"search": {
"type": "boolean"
},
"services": {
"type": "boolean"
},
"settings": {
"type": "boolean"
},
"share": {
"type": "boolean"
},
"upload": {
"type": "boolean"
},
"videos": {
"type": "boolean"
}
},
"type": "object"
},
"customize.ImportSettings": {
"properties": {
"dest": {
"type": "string"
},
"move": {
"type": "boolean"
},
"path": {
"type": "string"
}
},
"type": "object"
},
"customize.IndexSettings": {
"properties": {
"convert": {
"type": "boolean"
},
"path": {
"type": "string"
},
"rescan": {
"type": "boolean"
},
"skipArchived": {
"type": "boolean"
}
},
"type": "object"
},
"customize.MapsSettings": {
"properties": {
"animate": {
"type": "integer"
},
"style": {
"type": "string"
}
},
"type": "object"
},
"customize.SearchSettings": {
"properties": {
"batchSize": {
"type": "integer"
},
"listView": {
"type": "boolean"
},
"showCaptions": {
"type": "boolean"
},
"showTitles": {
"type": "boolean"
}
},
"type": "object"
},
"customize.Settings": {
"properties": {
"albums": {
"$ref": "#/definitions/customize.AlbumsSettings"
},
"download": {
"$ref": "#/definitions/customize.DownloadSettings"
},
"features": {
"$ref": "#/definitions/customize.FeatureSettings"
},
"import": {
"$ref": "#/definitions/customize.ImportSettings"
},
"index": {
"$ref": "#/definitions/customize.IndexSettings"
},
"maps": {
"$ref": "#/definitions/customize.MapsSettings"
},
"search": {
"$ref": "#/definitions/customize.SearchSettings"
},
"share": {
"$ref": "#/definitions/customize.ShareSettings"
},
"stack": {
"$ref": "#/definitions/customize.StackSettings"
},
"templates": {
"$ref": "#/definitions/customize.TemplateSettings"
},
"ui": {
"$ref": "#/definitions/customize.UISettings"
}
},
"type": "object"
},
"customize.ShareSettings": {
"properties": {
"title": {
"type": "string"
}
},
"type": "object"
},
"customize.StackSettings": {
"properties": {
"meta": {
"type": "boolean"
},
"name": {
"type": "boolean"
},
"uuid": {
"type": "boolean"
}
},
"type": "object"
},
"customize.TemplateSettings": {
"properties": {
"default": {
"type": "string"
}
},
"type": "object"
},
"customize.UISettings": {
"properties": {
"language": {
"type": "string"
},
"openOnHover": {
"type": "boolean"
},
"scrollbar": {
"type": "boolean"
},
"startPage": {
"type": "string"
},
"theme": {
"type": "string"
},
"timeZone": {
"type": "string"
},
"zoom": {
"type": "boolean"
}
},
"type": "object"
},
"entity.Album": {
"properties": {
"Caption": {
"type": "string"
},
"Category": {
"type": "string"
},
"Country": {
"type": "string"
},
"CreatedAt": {
"type": "string"
},
"CreatedBy": {
"type": "string"
},
"Day": {
"type": "integer"
},
"DeletedAt": {
"type": "string"
},
"Description": {
"type": "string"
},
"Favorite": {
"type": "boolean"
},
"Filter": {
"type": "string"
},
"ID": {
"type": "integer"
},
"Location": {
"type": "string"
},
"Month": {
"type": "integer"
},
"Notes": {
"type": "string"
},
"Order": {
"type": "string"
},
"ParentUID": {
"type": "string"
},
"Path": {
"type": "string"
},
"Private": {
"type": "boolean"
},
"PublishedAt": {
"type": "string"
},
"Slug": {
"type": "string"
},
"State": {
"type": "string"
},
"Template": {
"type": "string"
},
"Thumb": {
"type": "string"
},
"ThumbSrc": {
"type": "string"
},
"Title": {
"type": "string"
},
"Type": {
"type": "string"
},
"UID": {
"type": "string"
},
"UpdatedAt": {
"type": "string"
},
"Year": {
"type": "integer"
}
},
"type": "object"
},
"entity.Camera": {
"properties": {
"Description": {
"type": "string"
},
"ID": {
"type": "integer"
},
"Make": {
"type": "string"
},
"Model": {
"type": "string"
},
"Name": {
"type": "string"
},
"Notes": {
"type": "string"
},
"Slug": {
"type": "string"
},
"Type": {
"type": "string"
}
},
"type": "object"
},
"entity.Cell": {
"properties": {
"Category": {
"type": "string"
},
"CreatedAt": {
"type": "string"
},
"ID": {
"type": "string"
},
"Name": {
"type": "string"
},
"Place": {
"$ref": "#/definitions/entity.Place"
},
"Postcode": {
"type": "string"
},
"Street": {
"type": "string"
},
"UpdatedAt": {
"type": "string"
}
},
"type": "object"
},
"entity.Details": {
"properties": {
"Artist": {
"type": "string"
},
"ArtistSrc": {
"type": "string"
},
"Copyright": {
"type": "string"
},
"CopyrightSrc": {
"type": "string"
},
"CreatedAt": {
"type": "string"
},
"Keywords": {
"type": "string"
},
"KeywordsSrc": {
"type": "string"
},
"License": {
"type": "string"
},
"LicenseSrc": {
"type": "string"
},
"Notes": {
"type": "string"
},
"NotesSrc": {
"type": "string"
},
"PhotoID": {
"type": "integer"
},
"Software": {
"type": "string"
},
"SoftwareSrc": {
"type": "string"
},
"Subject": {
"type": "string"
},
"SubjectSrc": {
"type": "string"
},
"UpdatedAt": {
"type": "string"
}
},
"type": "object"
},
"entity.Error": {
"properties": {
"ID": {
"type": "integer"
},
"Level": {
"type": "string"
},
"Message": {
"type": "string"
},
"Time": {
"type": "string"
}
},
"type": "object"
},
"entity.Face": {
"properties": {
"CollisionRadius": {
"type": "number"
},
"Collisions": {
"type": "integer"
},
"CreatedAt": {
"type": "string"
},
"Hidden": {
"type": "boolean"
},
"ID": {
"type": "string"
},
"Kind": {
"type": "integer"
},
"MatchedAt": {
"type": "string"
},
"SampleRadius": {
"type": "number"
},
"Samples": {
"type": "integer"
},
"Src": {
"type": "string"
},
"SubjUID": {
"type": "string"
},
"UpdatedAt": {
"type": "string"
}
},
"type": "object"
},
"entity.File": {
"properties": {
"AspectRatio": {
"type": "number"
},
"Chroma": {
"type": "integer"
},
"Codec": {
"type": "string"
},
"ColorProfile": {
"type": "string"
},
"Colors": {
"type": "string"
},
"CreatedAt": {
"type": "string"
},
"CreatedIn": {
"type": "integer"
},
"DeletedAt": {
"type": "string"
},
"Diff": {
"type": "integer"
},
"Duration": {
"$ref": "#/definitions/time.Duration"
},
"Error": {
"type": "string"
},
"FPS": {
"type": "number"
},
"FileType": {
"type": "string"
},
"Frames": {
"type": "integer"
},
"HDR": {
"type": "boolean"
},
"Hash": {
"type": "string"
},
"Height": {
"type": "integer"
},
"InstanceID": {
"type": "string"
},
"Luminance": {
"type": "string"
},
"MainColor": {
"type": "string"
},
"MediaID": {
"type": "string"
},
"MediaType": {
"type": "string"
},
"MediaUTC": {
"type": "integer"
},
"Mime": {
"type": "string"
},
"Missing": {
"type": "boolean"
},
"ModTime": {
"type": "integer"
},
"Name": {
"type": "string"
},
"Orientation": {
"type": "integer"
},
"OrientationSrc": {
"type": "string"
},
"OriginalName": {
"type": "string"
},
"Pages": {
"type": "integer"
},
"PhotoUID": {
"type": "string"
},
"Portrait": {
"type": "boolean"
},
"Primary": {
"type": "boolean"
},
"Projection": {
"type": "string"
},
"PublishedAt": {
"type": "string"
},
"Root": {
"type": "string"
},
"Sidecar": {
"type": "boolean"
},
"Size": {
"type": "integer"
},
"Software": {
"type": "string"
},
"TakenAt": {
"type": "string"
},
"TimeIndex": {
"type": "string"
},
"UID": {
"type": "string"
},
"UpdatedAt": {
"type": "string"
},
"UpdatedIn": {
"type": "integer"
},
"Video": {
"type": "boolean"
},
"Watermark": {
"type": "boolean"
},
"Width": {
"type": "integer"
}
},
"type": "object"
},
"entity.Folder": {
"properties": {
"Category": {
"type": "string"
},
"Country": {
"type": "string"
},
"Day": {
"type": "integer"
},
"Description": {
"type": "string"
},
"Favorite": {
"type": "boolean"
},
"FileCount": {
"type": "integer"
},
"Ignore": {
"type": "boolean"
},
"ModifiedAt": {
"type": "string"
},
"Month": {
"type": "integer"
},
"Order": {
"type": "string"
},
"Path": {
"type": "string"
},
"Private": {
"type": "boolean"
},
"PublishedAt": {
"type": "string"
},
"Root": {
"type": "string"
},
"Title": {
"type": "string"
},
"Type": {
"type": "string"
},
"UID": {
"type": "string"
},
"Watch": {
"type": "boolean"
},
"Year": {
"type": "integer"
}
},
"type": "object"
},
"entity.Label": {
"properties": {
"CreatedAt": {
"type": "string"
},
"CustomSlug": {
"type": "string"
},
"DeletedAt": {
"type": "string"
},
"Description": {
"type": "string"
},
"Favorite": {
"type": "boolean"
},
"ID": {
"type": "integer"
},
"NSFW": {
"type": "boolean"
},
"Name": {
"type": "string"
},
"Notes": {
"type": "string"
},
"PhotoCount": {
"type": "integer"
},
"Priority": {
"type": "integer"
},
"PublishedAt": {
"type": "string"
},
"Slug": {
"type": "string"
},
"Thumb": {
"type": "string"
},
"ThumbSrc": {
"type": "string"
},
"UID": {
"type": "string"
},
"UpdatedAt": {
"type": "string"
}
},
"type": "object"
},
"entity.Lens": {
"properties": {
"Description": {
"type": "string"
},
"ID": {
"type": "integer"
},
"Make": {
"type": "string"
},
"Model": {
"type": "string"
},
"Name": {
"type": "string"
},
"Notes": {
"type": "string"
},
"Slug": {
"type": "string"
},
"Type": {
"type": "string"
}
},
"type": "object"
},
"entity.Link": {
"properties": {
"Comment": {
"type": "string"
},
"CreatedAt": {
"type": "string"
},
"CreatedBy": {
"type": "string"
},
"Expires": {
"type": "integer"
},
"MaxViews": {
"type": "integer"
},
"ModifiedAt": {
"type": "string"
},
"Perm": {
"type": "integer"
},
"ShareUID": {
"type": "string"
},
"Slug": {
"type": "string"
},
"Token": {
"type": "string"
},
"UID": {
"type": "string"
},
"VerifyPassword": {
"type": "boolean"
},
"Views": {
"type": "integer"
}
},
"type": "object"
},
"entity.Marker": {
"properties": {
"FaceDist": {
"type": "number"
},
"FaceID": {
"type": "string"
},
"FileUID": {
"type": "string"
},
"H": {
"type": "number"
},
"Invalid": {
"type": "boolean"
},
"MatchedAt": {
"type": "string"
},
"Name": {
"type": "string"
},
"Q": {
"type": "integer"
},
"Review": {
"type": "boolean"
},
"Score": {
"type": "integer"
},
"Size": {
"type": "integer"
},
"Src": {
"type": "string"
},
"SubjSrc": {
"type": "string"
},
"SubjUID": {
"type": "string"
},
"Thumb": {
"type": "string"
},
"Type": {
"type": "string"
},
"UID": {
"type": "string"
},
"W": {
"type": "number"
},
"X": {
"type": "number"
},
"Y": {
"type": "number"
},
"createdAt": {
"type": "string"
},
"updatedAt": {
"type": "string"
}
},
"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"
},
"entity.Photo": {
"properties": {
"Albums": {
"items": {
"$ref": "#/definitions/entity.Album"
},
"type": "array"
},
"Altitude": {
"type": "integer"
},
"Camera": {
"$ref": "#/definitions/entity.Camera"
},
"CameraID": {
"type": "integer"
},
"CameraSerial": {
"type": "string"
},
"CameraSrc": {
"type": "string"
},
"Caption": {
"type": "string"
},
"CaptionSrc": {
"type": "string"
},
"Cell": {
"$ref": "#/definitions/entity.Cell"
},
"CellAccuracy": {
"type": "integer"
},
"CellID": {
"type": "string"
},
"CheckedAt": {
"type": "string"
},
"Color": {
"type": "integer"
},
"Country": {
"type": "string"
},
"CreatedAt": {
"type": "string"
},
"CreatedBy": {
"type": "string"
},
"Day": {
"type": "integer"
},
"DeletedAt": {
"type": "string"
},
"Description": {
"type": "string"
},
"DescriptionSrc": {
"type": "string"
},
"Details": {
"$ref": "#/definitions/entity.Details"
},
"DocumentID": {
"type": "string"
},
"Duration": {
"$ref": "#/definitions/time.Duration"
},
"EditedAt": {
"type": "string"
},
"EstimatedAt": {
"type": "string"
},
"Exposure": {
"type": "string"
},
"FNumber": {
"type": "number"
},
"Faces": {
"type": "integer"
},
"Favorite": {
"type": "boolean"
},
"FocalLength": {
"type": "integer"
},
"IndexedAt": {
"type": "string"
},
"Iso": {
"type": "integer"
},
"Lat": {
"type": "number"
},
"Lens": {
"$ref": "#/definitions/entity.Lens"
},
"LensID": {
"type": "integer"
},
"Lng": {
"type": "number"
},
"Month": {
"type": "integer"
},
"Name": {
"type": "string"
},
"OriginalName": {
"type": "string"
},
"Panorama": {
"type": "boolean"
},
"Path": {
"type": "string"
},
"Place": {
"$ref": "#/definitions/entity.Place"
},
"PlaceID": {
"type": "string"
},
"PlaceSrc": {
"type": "string"
},
"Private": {
"type": "boolean"
},
"PublishedAt": {
"type": "string"
},
"Quality": {
"type": "integer"
},
"Resolution": {
"type": "integer"
},
"Scan": {
"type": "boolean"
},
"Stack": {
"type": "integer"
},
"TakenAt": {
"type": "string"
},
"TakenAtLocal": {
"type": "string"
},
"TakenSrc": {
"type": "string"
},
"TimeZone": {
"type": "string"
},
"Title": {
"type": "string"
},
"TitleSrc": {
"type": "string"
},
"Type": {
"type": "string"
},
"TypeSrc": {
"type": "string"
},
"UID": {
"type": "string"
},
"UpdatedAt": {
"type": "string"
},
"Year": {
"type": "integer"
},
"files": {
"items": {
"$ref": "#/definitions/entity.File"
},
"type": "array"
},
"id": {
"type": "integer"
},
"labels": {
"items": {
"$ref": "#/definitions/entity.PhotoLabel"
},
"type": "array"
}
},
"type": "object"
},
"entity.PhotoLabel": {
"properties": {
"Label": {
"$ref": "#/definitions/entity.Label"
},
"LabelID": {
"type": "integer"
},
"LabelSrc": {
"type": "string"
},
"NSFW": {
"type": "integer"
},
"PhotoID": {
"type": "integer"
},
"Topicality": {
"type": "integer"
},
"Uncertainty": {
"type": "integer"
}
},
"type": "object"
},
"entity.Place": {
"properties": {
"City": {
"type": "string"
},
"Country": {
"type": "string"
},
"CreatedAt": {
"type": "string"
},
"District": {
"type": "string"
},
"Favorite": {
"type": "boolean"
},
"Keywords": {
"type": "string"
},
"Label": {
"type": "string"
},
"PhotoCount": {
"type": "integer"
},
"PlaceID": {
"type": "string"
},
"State": {
"type": "string"
},
"UpdatedAt": {
"type": "string"
}
},
"type": "object"
},
"entity.Service": {
"properties": {
"AccError": {
"type": "string"
},
"AccErrors": {
"type": "integer"
},
"AccName": {
"type": "string"
},
"AccOwner": {
"type": "string"
},
"AccShare": {
"type": "boolean"
},
"AccSync": {
"type": "boolean"
},
"AccTimeout": {
"type": "string"
},
"AccType": {
"type": "string"
},
"AccURL": {
"type": "string"
},
"AccUser": {
"type": "string"
},
"CreatedAt": {
"type": "string"
},
"DeletedAt": {
"type": "string"
},
"ID": {
"type": "integer"
},
"RetryLimit": {
"type": "integer"
},
"ShareExpires": {
"type": "integer"
},
"SharePath": {
"type": "string"
},
"ShareSize": {
"type": "string"
},
"SyncDate": {
"$ref": "#/definitions/sql.NullTime"
},
"SyncDownload": {
"type": "boolean"
},
"SyncFilenames": {
"type": "boolean"
},
"SyncInterval": {
"type": "integer"
},
"SyncPath": {
"type": "string"
},
"SyncRaw": {
"type": "boolean"
},
"SyncStatus": {
"type": "string"
},
"SyncUpload": {
"type": "boolean"
},
"UpdatedAt": {
"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.Subject": {
"properties": {
"About": {
"type": "string"
},
"Alias": {
"type": "string"
},
"Bio": {
"type": "string"
},
"CreatedAt": {
"type": "string"
},
"DeletedAt": {
"type": "string"
},
"Excluded": {
"type": "boolean"
},
"Favorite": {
"type": "boolean"
},
"FileCount": {
"type": "integer"
},
"Hidden": {
"type": "boolean"
},
"Name": {
"type": "string"
},
"Notes": {
"type": "string"
},
"PhotoCount": {
"type": "integer"
},
"Private": {
"type": "boolean"
},
"Slug": {
"type": "string"
},
"Src": {
"type": "string"
},
"Thumb": {
"type": "string"
},
"ThumbSrc": {
"type": "string"
},
"Type": {
"type": "string"
},
"UID": {
"type": "string"
},
"UpdatedAt": {
"type": "string"
}
},
"type": "object"
},
"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": "#/definitions/entity.UserDetails"
},
"DisplayName": {
"type": "string"
},
"Email": {
"type": "string"
},
"ExpiresAt": {
"type": "string"
},
"ID": {
"type": "integer"
},
"LoginAt": {
"type": "string"
},
"Name": {
"type": "string"
},
"Role": {
"type": "string"
},
"Scope": {
"type": "string"
},
"Settings": {
"$ref": "#/definitions/entity.UserSettings"
},
"Shares": {
"items": {
"$ref": "#/definitions/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"
},
"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"
},
"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.Album": {
"properties": {
"Caption": {
"type": "string"
},
"Category": {
"type": "string"
},
"Country": {
"type": "string"
},
"Description": {
"type": "string"
},
"Favorite": {
"type": "boolean"
},
"Filter": {
"type": "string"
},
"Location": {
"type": "string"
},
"Notes": {
"type": "string"
},
"Order": {
"type": "string"
},
"Private": {
"type": "boolean"
},
"Template": {
"type": "string"
},
"Thumb": {
"type": "string"
},
"ThumbSrc": {
"type": "string"
},
"Title": {
"type": "string"
},
"Type": {
"type": "string"
}
},
"type": "object"
},
"form.Camera": {
"properties": {
"Make": {
"type": "string"
},
"Model": {
"type": "string"
}
},
"type": "object"
},
"form.ChangePassword": {
"properties": {
"new": {
"type": "string"
},
"old": {
"type": "string"
}
},
"type": "object"
},
"form.Connect": {
"properties": {
"Token": {
"type": "string"
}
},
"type": "object"
},
"form.Details": {
"properties": {
"Artist": {
"type": "string"
},
"ArtistSrc": {
"type": "string"
},
"Copyright": {
"type": "string"
},
"CopyrightSrc": {
"type": "string"
},
"Keywords": {
"type": "string"
},
"KeywordsSrc": {
"type": "string"
},
"License": {
"type": "string"
},
"LicenseSrc": {
"type": "string"
},
"Notes": {
"type": "string"
},
"NotesSrc": {
"type": "string"
},
"PhotoID": {
"type": "integer"
},
"Subject": {
"type": "string"
},
"SubjectSrc": {
"type": "string"
}
},
"type": "object"
},
"form.Face": {
"properties": {
"Hidden": {
"type": "boolean"
},
"SubjUID": {
"type": "string"
}
},
"type": "object"
},
"form.File": {
"properties": {
"Orientation": {
"type": "integer"
}
},
"type": "object"
},
"form.ImportOptions": {
"properties": {
"albums": {
"items": {
"type": "string"
},
"type": "array"
},
"move": {
"type": "boolean"
},
"path": {
"type": "string"
}
},
"type": "object"
},
"form.IndexOptions": {
"properties": {
"cleanup": {
"type": "boolean"
},
"path": {
"type": "string"
},
"rescan": {
"type": "boolean"
}
},
"type": "object"
},
"form.Label": {
"properties": {
"Description": {
"type": "string"
},
"Favorite": {
"type": "boolean"
},
"Name": {
"type": "string"
},
"Notes": {
"type": "string"
},
"Priority": {
"type": "integer"
},
"Thumb": {
"type": "string"
},
"ThumbSrc": {
"type": "string"
},
"Uncertainty": {
"type": "integer"
}
},
"type": "object"
},
"form.Lens": {
"properties": {
"Make": {
"type": "string"
},
"Model": {
"type": "string"
}
},
"type": "object"
},
"form.Link": {
"properties": {
"CanComment": {
"type": "boolean"
},
"CanEdit": {
"type": "boolean"
},
"Expires": {
"type": "integer"
},
"MaxViews": {
"type": "integer"
},
"Password": {
"type": "string"
},
"Slug": {
"type": "string"
},
"Token": {
"type": "string"
}
},
"type": "object"
},
"form.Login": {
"properties": {
"code": {
"description": "2FA Verification Code (Passcodes).",
"type": "string"
},
"email": {
"description": "Reserved.",
"type": "string"
},
"password": {
"description": "The user's Password.",
"type": "string"
},
"token": {
"description": "Share Token.",
"type": "string"
},
"username": {
"description": "The local Username or LDAP user principal name (UPN).",
"type": "string"
}
},
"type": "object"
},
"form.Marker": {
"properties": {
"FileUID": {
"type": "string"
},
"H": {
"type": "number"
},
"Invalid": {
"type": "boolean"
},
"MarkerReview": {
"type": "boolean"
},
"Name": {
"type": "string"
},
"Src": {
"type": "string"
},
"SubjSrc": {
"type": "string"
},
"Type": {
"type": "string"
},
"W": {
"type": "number"
},
"X": {
"type": "number"
},
"Y": {
"type": "number"
}
},
"type": "object"
},
"form.OAuthCreateToken": {
"properties": {
"assertion": {
"type": "string"
},
"client_id": {
"type": "string"
},
"client_name": {
"type": "string"
},
"client_secret": {
"type": "string"
},
"code": {
"type": "string"
},
"code_verifier": {
"type": "string"
},
"expires_in": {
"type": "integer"
},
"grant_type": {
"$ref": "#/definitions/authn.GrantType"
},
"password": {
"type": "string"
},
"redirect_uri": {
"type": "string"
},
"refresh_token": {
"type": "string"
},
"scope": {
"type": "string"
},
"username": {
"type": "string"
}
},
"type": "object"
},
"form.OAuthRevokeToken": {
"properties": {
"token": {
"type": "string"
},
"token_type_hint": {
"type": "string"
}
},
"required": [
"token"
],
"type": "object"
},
"form.Passcode": {
"properties": {
"code": {
"type": "string"
},
"password": {
"type": "string"
},
"type": {
"type": "string"
}
},
"type": "object"
},
"form.Photo": {
"properties": {
"Altitude": {
"type": "integer"
},
"CameraID": {
"type": "integer"
},
"CameraSrc": {
"type": "string"
},
"Caption": {
"type": "string"
},
"CaptionSrc": {
"type": "string"
},
"CellAccuracy": {
"type": "integer"
},
"CellID": {
"type": "string"
},
"Country": {
"type": "string"
},
"Day": {
"type": "integer"
},
"Description": {
"type": "string"
},
"DescriptionSrc": {
"type": "string"
},
"Details": {
"$ref": "#/definitions/form.Details"
},
"Exposure": {
"type": "string"
},
"FNumber": {
"type": "number"
},
"Favorite": {
"type": "boolean"
},
"FocalLength": {
"type": "integer"
},
"Iso": {
"type": "integer"
},
"Lat": {
"type": "number"
},
"LensID": {
"type": "integer"
},
"Lng": {
"type": "number"
},
"Month": {
"type": "integer"
},
"OriginalName": {
"type": "string"
},
"Panorama": {
"type": "boolean"
},
"PlaceID": {
"type": "string"
},
"PlaceSrc": {
"type": "string"
},
"Private": {
"type": "boolean"
},
"Scan": {
"type": "boolean"
},
"Stack": {
"type": "integer"
},
"TakenAt": {
"type": "string"
},
"TakenAtLocal": {
"type": "string"
},
"TakenSrc": {
"type": "string"
},
"TimeZone": {
"type": "string"
},
"Title": {
"type": "string"
},
"TitleSrc": {
"type": "string"
},
"Type": {
"type": "string"
},
"TypeSrc": {
"type": "string"
},
"Year": {
"type": "integer"
}
},
"type": "object"
},
"form.Selection": {
"properties": {
"albums": {
"items": {
"type": "string"
},
"type": "array"
},
"all": {
"type": "boolean"
},
"files": {
"items": {
"type": "string"
},
"type": "array"
},
"labels": {
"items": {
"type": "string"
},
"type": "array"
},
"photos": {
"items": {
"type": "string"
},
"type": "array"
},
"places": {
"items": {
"type": "string"
},
"type": "array"
},
"subjects": {
"items": {
"type": "string"
},
"type": "array"
}
},
"type": "object"
},
"form.Service": {
"properties": {
"AccError": {
"type": "string"
},
"AccKey": {
"type": "string"
},
"AccName": {
"type": "string"
},
"AccOwner": {
"type": "string"
},
"AccPass": {
"type": "string"
},
"AccShare": {
"description": "Manual upload enabled, see SharePath, ShareSize, and ShareExpires.",
"type": "boolean"
},
"AccSync": {
"description": "Background sync enabled, see SyncDownload and SyncUpload.",
"type": "boolean"
},
"AccTimeout": {
"description": "Request timeout: default, high, medium, low, none",
"type": "string"
},
"AccType": {
"type": "string"
},
"AccURL": {
"type": "string"
},
"AccUser": {
"type": "string"
},
"RetryLimit": {
"description": "Maximum number of failed requests.",
"type": "integer"
},
"ShareExpires": {
"type": "integer"
},
"SharePath": {
"type": "string"
},
"ShareSize": {
"type": "string"
},
"SyncDownload": {
"type": "boolean"
},
"SyncFilenames": {
"type": "boolean"
},
"SyncInterval": {
"type": "integer"
},
"SyncPath": {
"type": "string"
},
"SyncRaw": {
"type": "boolean"
},
"SyncUpload": {
"type": "boolean"
}
},
"type": "object"
},
"form.Subject": {
"properties": {
"About": {
"type": "string"
},
"Alias": {
"type": "string"
},
"Bio": {
"type": "string"
},
"Excluded": {
"type": "boolean"
},
"Favorite": {
"type": "boolean"
},
"Hidden": {
"type": "boolean"
},
"Name": {
"type": "string"
},
"Notes": {
"type": "string"
},
"Private": {
"type": "boolean"
},
"Thumb": {
"type": "string"
},
"ThumbSrc": {
"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": "#/definitions/form.UserDetails"
},
"DisplayName": {
"type": "string"
},
"Email": {
"type": "string"
},
"Name": {
"type": "string"
},
"Password": {
"type": "string"
},
"Role": {
"type": "string"
},
"Scope": {
"type": "string"
},
"SuperAdmin": {
"type": "boolean"
},
"UploadPath": {
"type": "string"
},
"WebDAV": {
"type": "boolean"
}
},
"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"
},
"gin.H": {
"additionalProperties": {},
"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"
},
"io_prometheus_client.Bucket": {
"properties": {
"cumulative_count": {
"description": "Cumulative in increasing order.",
"type": "integer"
},
"cumulative_count_float": {
"description": "Overrides cumulative_count if \u003e 0.",
"type": "number"
},
"exemplar": {
"$ref": "#/definitions/io_prometheus_client.Exemplar"
},
"upper_bound": {
"description": "Inclusive.",
"type": "number"
}
},
"type": "object"
},
"io_prometheus_client.BucketSpan": {
"properties": {
"length": {
"description": "Length of consecutive buckets.",
"type": "integer"
},
"offset": {
"description": "Gap to previous span, or starting point for 1st span (which can be negative).",
"type": "integer"
}
},
"type": "object"
},
"io_prometheus_client.Counter": {
"properties": {
"created_timestamp": {
"$ref": "#/definitions/timestamppb.Timestamp"
},
"exemplar": {
"$ref": "#/definitions/io_prometheus_client.Exemplar"
},
"value": {
"type": "number"
}
},
"type": "object"
},
"io_prometheus_client.Exemplar": {
"properties": {
"label": {
"items": {
"$ref": "#/definitions/io_prometheus_client.LabelPair"
},
"type": "array"
},
"timestamp": {
"allOf": [
{
"$ref": "#/definitions/timestamppb.Timestamp"
}
],
"description": "OpenMetrics-style."
},
"value": {
"type": "number"
}
},
"type": "object"
},
"io_prometheus_client.Gauge": {
"properties": {
"value": {
"type": "number"
}
},
"type": "object"
},
"io_prometheus_client.Histogram": {
"properties": {
"bucket": {
"description": "Buckets for the conventional histogram.",
"items": {
"$ref": "#/definitions/io_prometheus_client.Bucket"
},
"type": "array"
},
"created_timestamp": {
"$ref": "#/definitions/timestamppb.Timestamp"
},
"exemplars": {
"description": "Only used for native histograms. These exemplars MUST have a timestamp.",
"items": {
"$ref": "#/definitions/io_prometheus_client.Exemplar"
},
"type": "array"
},
"negative_count": {
"description": "Absolute count of each bucket.",
"items": {
"type": "number"
},
"type": "array"
},
"negative_delta": {
"description": "Use either \"negative_delta\" or \"negative_count\", the former for\nregular histograms with integer counts, the latter for float\nhistograms.",
"items": {
"type": "integer"
},
"type": "array"
},
"negative_span": {
"description": "Negative buckets for the native histogram.",
"items": {
"$ref": "#/definitions/io_prometheus_client.BucketSpan"
},
"type": "array"
},
"positive_count": {
"description": "Absolute count of each bucket.",
"items": {
"type": "number"
},
"type": "array"
},
"positive_delta": {
"description": "Use either \"positive_delta\" or \"positive_count\", the former for\nregular histograms with integer counts, the latter for float\nhistograms.",
"items": {
"type": "integer"
},
"type": "array"
},
"positive_span": {
"description": "Positive buckets for the native histogram.\nUse a no-op span (offset 0, length 0) for a native histogram without any\nobservations yet and with a zero_threshold of 0. Otherwise, it would be\nindistinguishable from a classic histogram.",
"items": {
"$ref": "#/definitions/io_prometheus_client.BucketSpan"
},
"type": "array"
},
"sample_count": {
"type": "integer"
},
"sample_count_float": {
"description": "Overrides sample_count if \u003e 0.",
"type": "number"
},
"sample_sum": {
"type": "number"
},
"schema": {
"description": "schema defines the bucket schema. Currently, valid numbers are -4 \u003c= n \u003c= 8.\nThey are all for base-2 bucket schemas, where 1 is a bucket boundary in each case, and\nthen each power of two is divided into 2^n logarithmic buckets.\nOr in other words, each bucket boundary is the previous boundary times 2^(2^-n).\nIn the future, more bucket schemas may be added using numbers \u003c -4 or \u003e 8.",
"type": "integer"
},
"zero_count": {
"description": "Count in zero bucket.",
"type": "integer"
},
"zero_count_float": {
"description": "Overrides sb_zero_count if \u003e 0.",
"type": "number"
},
"zero_threshold": {
"description": "Breadth of the zero bucket.",
"type": "number"
}
},
"type": "object"
},
"io_prometheus_client.LabelPair": {
"properties": {
"name": {
"type": "string"
},
"value": {
"type": "string"
}
},
"type": "object"
},
"io_prometheus_client.Metric": {
"properties": {
"counter": {
"$ref": "#/definitions/io_prometheus_client.Counter"
},
"gauge": {
"$ref": "#/definitions/io_prometheus_client.Gauge"
},
"histogram": {
"$ref": "#/definitions/io_prometheus_client.Histogram"
},
"label": {
"items": {
"$ref": "#/definitions/io_prometheus_client.LabelPair"
},
"type": "array"
},
"summary": {
"$ref": "#/definitions/io_prometheus_client.Summary"
},
"timestamp_ms": {
"type": "integer"
},
"untyped": {
"$ref": "#/definitions/io_prometheus_client.Untyped"
}
},
"type": "object"
},
"io_prometheus_client.MetricFamily": {
"properties": {
"help": {
"type": "string"
},
"metric": {
"items": {
"$ref": "#/definitions/io_prometheus_client.Metric"
},
"type": "array"
},
"name": {
"type": "string"
},
"type": {
"$ref": "#/definitions/io_prometheus_client.MetricType"
},
"unit": {
"type": "string"
}
},
"type": "object"
},
"io_prometheus_client.MetricType": {
"enum": [
0,
1,
2,
3,
4,
5
],
"format": "int32",
"type": "integer",
"x-enum-varnames": [
"MetricType_COUNTER",
"MetricType_GAUGE",
"MetricType_SUMMARY",
"MetricType_UNTYPED",
"MetricType_HISTOGRAM",
"MetricType_GAUGE_HISTOGRAM"
]
},
"io_prometheus_client.Quantile": {
"properties": {
"quantile": {
"type": "number"
},
"value": {
"type": "number"
}
},
"type": "object"
},
"io_prometheus_client.Summary": {
"properties": {
"created_timestamp": {
"$ref": "#/definitions/timestamppb.Timestamp"
},
"quantile": {
"items": {
"$ref": "#/definitions/io_prometheus_client.Quantile"
},
"type": "array"
},
"sample_count": {
"type": "integer"
},
"sample_sum": {
"type": "number"
}
},
"type": "object"
},
"io_prometheus_client.Untyped": {
"properties": {
"value": {
"type": "number"
}
},
"type": "object"
},
"nsfw.Result": {
"properties": {
"drawing": {
"format": "float32",
"type": "number"
},
"hentai": {
"format": "float32",
"type": "number"
},
"neutral": {
"format": "float32",
"type": "number"
},
"porn": {
"format": "float32",
"type": "number"
},
"sexy": {
"format": "float32",
"type": "number"
}
},
"type": "object"
},
"places.Location": {
"properties": {
"category": {
"type": "string"
},
"country": {
"type": "string"
},
"id": {
"type": "string"
},
"lat": {
"type": "number"
},
"licence": {
"type": "string"
},
"lng": {
"type": "number"
},
"locale": {
"type": "string"
},
"name": {
"type": "string"
},
"place": {
"$ref": "#/definitions/places.Place"
},
"postcode": {
"type": "string"
},
"street": {
"type": "string"
},
"timezone": {
"type": "string"
}
},
"type": "object"
},
"places.Place": {
"properties": {
"city": {
"type": "string"
},
"country": {
"type": "string"
},
"district": {
"type": "string"
},
"id": {
"type": "string"
},
"keywords": {
"type": "string"
},
"label": {
"type": "string"
},
"state": {
"type": "string"
}
},
"type": "object"
},
"places.SearchResult": {
"properties": {
"bbox": {
"items": {
"type": "number"
},
"type": "array"
},
"city": {
"type": "string"
},
"country": {
"type": "string"
},
"id": {
"type": "string"
},
"importance": {
"type": "number"
},
"lat": {
"type": "number"
},
"licence": {
"type": "string"
},
"lng": {
"type": "number"
},
"name": {
"type": "string"
}
},
"type": "object"
},
"query.Moment": {
"properties": {
"Country": {
"type": "string"
},
"Label": {
"type": "string"
},
"Month": {
"type": "integer"
},
"PhotoCount": {
"type": "integer"
},
"State": {
"type": "string"
},
"Year": {
"type": "integer"
}
},
"type": "object"
},
"search.Album": {
"properties": {
"Caption": {
"type": "string"
},
"Category": {
"type": "string"
},
"Country": {
"type": "string"
},
"CreatedAt": {
"type": "string"
},
"Day": {
"type": "integer"
},
"DeletedAt": {
"type": "string"
},
"Description": {
"type": "string"
},
"Favorite": {
"type": "boolean"
},
"Filter": {
"type": "string"
},
"LinkCount": {
"type": "integer"
},
"Location": {
"type": "string"
},
"Month": {
"type": "integer"
},
"Notes": {
"type": "string"
},
"Order": {
"type": "string"
},
"ParentUID": {
"type": "string"
},
"Path": {
"type": "string"
},
"PhotoCount": {
"type": "integer"
},
"Private": {
"type": "boolean"
},
"Slug": {
"type": "string"
},
"State": {
"type": "string"
},
"Template": {
"type": "string"
},
"Thumb": {
"type": "string"
},
"ThumbSrc": {
"type": "string"
},
"Title": {
"type": "string"
},
"Type": {
"type": "string"
},
"UID": {
"type": "string"
},
"UpdatedAt": {
"type": "string"
},
"Year": {
"type": "integer"
}
},
"type": "object"
},
"search.Camera": {
"properties": {
"CreatedAt": {
"type": "string"
},
"DeletedAt": {
"type": "string"
},
"Description": {
"type": "string"
},
"ID": {
"type": "integer"
},
"Make": {
"type": "string"
},
"Model": {
"type": "string"
},
"Name": {
"type": "string"
},
"Notes": {
"type": "string"
},
"Slug": {
"type": "string"
},
"Type": {
"type": "string"
},
"UpdatedAt": {
"type": "string"
}
},
"type": "object"
},
"search.Face": {
"properties": {
"CollisionRadius": {
"type": "number"
},
"Collisions": {
"type": "integer"
},
"CreatedAt": {
"type": "string"
},
"FaceDist": {
"type": "number"
},
"FileUID": {
"type": "string"
},
"Hidden": {
"type": "boolean"
},
"ID": {
"type": "string"
},
"Invalid": {
"type": "boolean"
},
"MarkerUID": {
"type": "string"
},
"MatchedAt": {
"type": "string"
},
"Name": {
"type": "string"
},
"Review": {
"type": "boolean"
},
"SampleRadius": {
"type": "number"
},
"Samples": {
"type": "integer"
},
"Score": {
"type": "integer"
},
"Size": {
"type": "integer"
},
"Src": {
"type": "string"
},
"SubjSrc": {
"type": "string"
},
"SubjUID": {
"type": "string"
},
"Thumb": {
"type": "string"
},
"UpdatedAt": {
"type": "string"
}
},
"type": "object"
},
"search.GeoResult": {
"properties": {
"Caption": {
"type": "string"
},
"Duration": {
"$ref": "#/definitions/time.Duration"
},
"Favorite": {
"type": "boolean"
},
"Hash": {
"type": "string"
},
"Height": {
"type": "integer"
},
"Lat": {
"type": "number"
},
"Lng": {
"type": "number"
},
"Panorama": {
"type": "boolean"
},
"Projection": {
"type": "string"
},
"TakenAt": {
"type": "string"
},
"TakenAtLocal": {
"type": "string"
},
"TimeZone": {
"type": "string"
},
"Title": {
"type": "string"
},
"Type": {
"type": "string"
},
"UID": {
"type": "string"
},
"Width": {
"type": "integer"
}
},
"type": "object"
},
"search.Label": {
"properties": {
"CreatedAt": {
"type": "string"
},
"CustomSlug": {
"type": "string"
},
"DeletedAt": {
"type": "string"
},
"Description": {
"type": "string"
},
"Favorite": {
"type": "boolean"
},
"ID": {
"type": "integer"
},
"NSFW": {
"type": "boolean"
},
"Name": {
"type": "string"
},
"Notes": {
"type": "string"
},
"PhotoCount": {
"type": "integer"
},
"Priority": {
"type": "integer"
},
"Slug": {
"type": "string"
},
"Thumb": {
"type": "string"
},
"ThumbSrc": {
"type": "string"
},
"UID": {
"type": "string"
},
"UpdatedAt": {
"type": "string"
}
},
"type": "object"
},
"search.Lens": {
"properties": {
"CreatedAt": {
"type": "string"
},
"DeletedAt": {
"type": "string"
},
"Description": {
"type": "string"
},
"ID": {
"type": "integer"
},
"Make": {
"type": "string"
},
"Model": {
"type": "string"
},
"Name": {
"type": "string"
},
"Notes": {
"type": "string"
},
"Slug": {
"type": "string"
},
"Type": {
"type": "string"
},
"UpdatedAt": {
"type": "string"
}
},
"type": "object"
},
"search.Photo": {
"properties": {
"Altitude": {
"type": "integer"
},
"CameraID": {
"description": "Camera",
"type": "integer"
},
"CameraMake": {
"type": "string"
},
"CameraModel": {
"type": "string"
},
"CameraSerial": {
"type": "string"
},
"CameraSrc": {
"type": "string"
},
"CameraType": {
"type": "string"
},
"Caption": {
"type": "string"
},
"CellAccuracy": {
"type": "integer"
},
"CellID": {
"description": "Cell",
"type": "string"
},
"CheckedAt": {
"type": "string"
},
"Color": {
"type": "integer"
},
"Country": {
"type": "string"
},
"CreatedAt": {
"type": "string"
},
"Day": {
"type": "integer"
},
"DeletedAt": {
"type": "string"
},
"DetailsArtist": {
"type": "string"
},
"DetailsCopyright": {
"type": "string"
},
"DetailsKeywords": {
"description": "Additional information from the details table.",
"type": "string"
},
"DetailsLicense": {
"type": "string"
},
"DetailsSubject": {
"type": "string"
},
"DocumentID": {
"type": "string"
},
"Duration": {
"$ref": "#/definitions/time.Duration"
},
"EditedAt": {
"type": "string"
},
"Exposure": {
"type": "string"
},
"FNumber": {
"type": "number"
},
"Faces": {
"type": "integer"
},
"Favorite": {
"type": "boolean"
},
"FileError": {
"type": "string"
},
"FileName": {
"type": "string"
},
"FileRoot": {
"type": "string"
},
"FileUID": {
"type": "string"
},
"Files": {
"description": "List of files if search results are merged.",
"items": {
"$ref": "#/definitions/entity.File"
},
"type": "array"
},
"FocalLength": {
"type": "integer"
},
"Hash": {
"type": "string"
},
"Height": {
"type": "integer"
},
"ID": {
"type": "string"
},
"InstanceID": {
"type": "string"
},
"Iso": {
"type": "integer"
},
"Lat": {
"type": "number"
},
"LensID": {
"description": "Lens",
"type": "integer"
},
"LensMake": {
"type": "string"
},
"LensModel": {
"type": "string"
},
"Lng": {
"type": "number"
},
"Merged": {
"type": "boolean"
},
"Month": {
"type": "integer"
},
"Name": {
"type": "string"
},
"OriginalName": {
"type": "string"
},
"Panorama": {
"type": "boolean"
},
"Path": {
"type": "string"
},
"PlaceCity": {
"type": "string"
},
"PlaceCountry": {
"type": "string"
},
"PlaceID": {
"type": "string"
},
"PlaceLabel": {
"type": "string"
},
"PlaceSrc": {
"type": "string"
},
"PlaceState": {
"type": "string"
},
"Portrait": {
"type": "boolean"
},
"Private": {
"type": "boolean"
},
"Projection": {
"type": "string"
},
"Quality": {
"type": "integer"
},
"Resolution": {
"type": "integer"
},
"Scan": {
"type": "boolean"
},
"Stack": {
"type": "integer"
},
"TakenAt": {
"type": "string"
},
"TakenAtLocal": {
"type": "string"
},
"TakenSrc": {
"type": "string"
},
"TimeZone": {
"type": "string"
},
"Title": {
"type": "string"
},
"Type": {
"type": "string"
},
"TypeSrc": {
"type": "string"
},
"UID": {
"type": "string"
},
"UpdatedAt": {
"type": "string"
},
"Width": {
"type": "integer"
},
"Year": {
"type": "integer"
}
},
"type": "object"
},
"search.Subject": {
"properties": {
"Alias": {
"type": "string"
},
"Excluded": {
"type": "boolean"
},
"Favorite": {
"type": "boolean"
},
"FileCount": {
"type": "integer"
},
"Hidden": {
"type": "boolean"
},
"MarkerSrc": {
"type": "string"
},
"MarkerUID": {
"type": "string"
},
"Name": {
"type": "string"
},
"PhotoCount": {
"type": "integer"
},
"Private": {
"type": "boolean"
},
"Slug": {
"type": "string"
},
"Thumb": {
"type": "string"
},
"ThumbSrc": {
"type": "string"
},
"Type": {
"type": "string"
},
"UID": {
"type": "string"
}
},
"type": "object"
},
"sql.NullTime": {
"properties": {
"time": {
"type": "string"
},
"valid": {
"description": "Valid is true if Time is not NULL",
"type": "boolean"
}
},
"type": "object"
},
"tensorflow.ColorChannelOrder": {
"enum": [
0
],
"type": "integer",
"x-enum-varnames": [
"UndefinedOrder"
]
},
"tensorflow.Interval": {
"properties": {
"end": {
"type": "number"
},
"mean": {
"type": "number"
},
"start": {
"type": "number"
},
"stdDev": {
"type": "number"
}
},
"type": "object"
},
"tensorflow.ModelInfo": {
"properties": {
"input": {
"$ref": "#/definitions/tensorflow.PhotoInput"
},
"output": {
"$ref": "#/definitions/tensorflow.ModelOutput"
},
"tags": {
"items": {
"type": "string"
},
"type": "array"
}
},
"type": "object"
},
"tensorflow.ModelOutput": {
"properties": {
"index": {
"type": "integer"
},
"logits": {
"type": "boolean"
},
"name": {
"type": "string"
},
"outputs": {
"type": "integer"
}
},
"type": "object"
},
"tensorflow.PhotoInput": {
"properties": {
"height": {
"type": "integer"
},
"index": {
"type": "integer"
},
"inputOrder": {
"$ref": "#/definitions/tensorflow.ColorChannelOrder"
},
"intervals": {
"items": {
"$ref": "#/definitions/tensorflow.Interval"
},
"type": "array"
},
"name": {
"type": "string"
},
"resizeOperation": {
"$ref": "#/definitions/tensorflow.ResizeOperation"
},
"shape": {
"items": {
"$ref": "#/definitions/tensorflow.ShapeComponent"
},
"type": "array"
},
"width": {
"type": "integer"
}
},
"type": "object"
},
"tensorflow.ResizeOperation": {
"enum": [
0,
1,
2,
3
],
"type": "integer",
"x-enum-varnames": [
"UndefinedResizeOperation",
"ResizeBreakAspectRatio",
"CenterCrop",
"Padding"
]
},
"tensorflow.ShapeComponent": {
"enum": [
"Batch"
],
"type": "string",
"x-enum-varnames": [
"ShapeBatch"
]
},
"thumb.Thumb": {
"properties": {
"h": {
"type": "integer"
},
"src": {
"type": "string"
},
"w": {
"type": "integer"
}
},
"type": "object"
},
"thumb.Viewer": {
"properties": {
"fit_1280": {
"$ref": "#/definitions/thumb.Thumb"
},
"fit_15360": {
"$ref": "#/definitions/thumb.Thumb"
},
"fit_1920": {
"$ref": "#/definitions/thumb.Thumb"
},
"fit_2560": {
"$ref": "#/definitions/thumb.Thumb"
},
"fit_4096": {
"$ref": "#/definitions/thumb.Thumb"
},
"fit_5120": {
"$ref": "#/definitions/thumb.Thumb"
},
"fit_720": {
"$ref": "#/definitions/thumb.Thumb"
},
"fit_7680": {
"$ref": "#/definitions/thumb.Thumb"
}
},
"type": "object"
},
"time.Duration": {
"format": "int64",
"type": "integer"
},
"timestamppb.Timestamp": {
"properties": {
"nanos": {
"description": "Non-negative fractions of a second at nanosecond resolution. This field is\nthe nanosecond portion of the duration, not an alternative to seconds.\nNegative second values with fractions must still have non-negative nanos\nvalues that count forward in time. Must be between 0 and 999,999,999\ninclusive.",
"type": "integer"
},
"seconds": {
"description": "Represents seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z. Must\nbe between -315576000000 and 315576000000 inclusive (which corresponds to\n0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z).",
"type": "integer"
}
},
"type": "object"
},
"viewer.Result": {
"properties": {
"Caption": {
"type": "string"
},
"Codec": {
"type": "string"
},
"DownloadUrl": {
"type": "string"
},
"Duration": {
"$ref": "#/definitions/time.Duration"
},
"Favorite": {
"type": "boolean"
},
"Hash": {
"type": "string"
},
"Height": {
"type": "integer"
},
"Lat": {
"type": "number"
},
"Lng": {
"type": "number"
},
"Mime": {
"type": "string"
},
"Panorama": {
"type": "boolean"
},
"Playable": {
"type": "boolean"
},
"Projection": {
"type": "string"
},
"TakenAtLocal": {
"type": "string"
},
"Thumbs": {
"$ref": "#/definitions/thumb.Viewer"
},
"TimeZone": {
"type": "string"
},
"Title": {
"type": "string"
},
"Type": {
"type": "string"
},
"UID": {
"type": "string"
},
"Width": {
"type": "integer"
}
},
"type": "object"
},
"vision.ApiFormat": {
"enum": [
"url",
"images",
"vision",
"ollama",
"openai"
],
"type": "string",
"x-enum-varnames": [
"ApiFormatUrl",
"ApiFormatImages",
"ApiFormatVision",
"ApiFormatOllama",
"ApiFormatOpenAI"
]
},
"vision.ApiRequest": {
"properties": {
"context": {
"items": {
"type": "integer"
},
"type": "array"
},
"format": {
"type": "string"
},
"id": {
"type": "string"
},
"images": {
"items": {
"type": "string"
},
"type": "array"
},
"model": {
"type": "string"
},
"options": {
"$ref": "#/definitions/vision.ModelOptions"
},
"org": {
"type": "string"
},
"project": {
"type": "string"
},
"prompt": {
"type": "string"
},
"schema": {
"items": {
"type": "integer"
},
"type": "array"
},
"stream": {
"type": "boolean"
},
"suffix": {
"type": "string"
},
"system": {
"type": "string"
},
"think": {
"type": "string"
},
"url": {
"type": "string"
},
"version": {
"type": "string"
}
},
"type": "object"
},
"vision.ApiResponse": {
"properties": {
"code": {
"type": "integer"
},
"error": {
"type": "string"
},
"id": {
"type": "string"
},
"model": {
"$ref": "#/definitions/vision.Model"
},
"result": {
"$ref": "#/definitions/vision.ApiResult"
}
},
"type": "object"
},
"vision.ApiResult": {
"properties": {
"caption": {
"$ref": "#/definitions/vision.CaptionResult"
},
"embeddings": {
"items": {
"items": {
"items": {
"format": "float64",
"type": "number"
},
"type": "array"
},
"type": "array"
},
"type": "array"
},
"labels": {
"items": {
"$ref": "#/definitions/vision.LabelResult"
},
"type": "array"
},
"nsfw": {
"items": {
"$ref": "#/definitions/nsfw.Result"
},
"type": "array"
}
},
"type": "object"
},
"vision.CaptionResult": {
"properties": {
"confidence": {
"type": "number"
},
"source": {
"type": "string"
},
"text": {
"type": "string"
}
},
"type": "object"
},
"vision.LabelResult": {
"properties": {
"categories": {
"items": {
"type": "string"
},
"type": "array"
},
"confidence": {
"type": "number"
},
"name": {
"type": "string"
},
"nsfw": {
"type": "boolean"
},
"nsfw_confidence": {
"type": "number"
},
"priority": {
"type": "integer"
},
"source": {
"type": "string"
},
"topicality": {
"type": "number"
}
},
"type": "object"
},
"vision.Model": {
"properties": {
"Run": {
"allOf": [
{
"$ref": "#/definitions/vision.RunType"
}
],
"description": "\"auto\", \"never\", \"manual\", \"always\", \"newly-indexed\", \"on-schedule\""
},
"default": {
"type": "boolean"
},
"disabled": {
"type": "boolean"
},
"engine": {
"$ref": "#/definitions/vision.ModelEngine"
},
"format": {
"type": "string"
},
"model": {
"type": "string"
},
"name": {
"type": "string"
},
"options": {
"$ref": "#/definitions/vision.ModelOptions"
},
"prompt": {
"type": "string"
},
"resolution": {
"type": "integer"
},
"schema": {
"type": "string"
},
"schemaFile": {
"type": "string"
},
"service": {
"$ref": "#/definitions/vision.Service"
},
"system": {
"type": "string"
},
"tensorflow": {
"$ref": "#/definitions/tensorflow.ModelInfo"
},
"type": {
"$ref": "#/definitions/vision.ModelType"
},
"version": {
"type": "string"
}
},
"type": "object"
},
"vision.ModelEngine": {
"enum": [
"vision",
"tensorflow",
"local"
],
"type": "string",
"x-enum-varnames": [
"EngineVision",
"EngineTensorFlow",
"EngineLocal"
]
},
"vision.ModelOptions": {
"properties": {
"combine_outputs": {
"description": "OpenAI",
"type": "string"
},
"detail": {
"description": "OpenAI",
"type": "string"
},
"force_json": {
"description": "Ollama, OpenAI",
"type": "boolean"
},
"frequency_penalty": {
"description": "OpenAI",
"type": "number"
},
"low_vram": {
"description": "Ollama",
"type": "boolean"
},
"main_gpu": {
"description": "Ollama",
"type": "integer"
},
"max_output_tokens": {
"description": "Ollama, OpenAI",
"type": "integer"
},
"min_p": {
"description": "Ollama",
"type": "number"
},
"mirostat": {
"description": "Ollama",
"type": "integer"
},
"mirostat_eta": {
"description": "Ollama",
"type": "number"
},
"mirostat_tau": {
"description": "Ollama",
"type": "number"
},
"num_batch": {
"description": "Ollama",
"type": "integer"
},
"num_ctx": {
"description": "Ollama, OpenAI",
"type": "integer"
},
"num_gpu": {
"description": "Ollama",
"type": "integer"
},
"num_keep": {
"description": "Ollama",
"type": "integer"
},
"num_predict": {
"description": "Ollama",
"type": "integer"
},
"num_thread": {
"description": "Ollama",
"type": "integer"
},
"numa": {
"description": "Ollama",
"type": "boolean"
},
"penalize_newline": {
"description": "Ollama",
"type": "boolean"
},
"presence_penalty": {
"description": "OpenAI",
"type": "number"
},
"repeat_last_n": {
"description": "Ollama",
"type": "integer"
},
"repeat_penalty": {
"description": "Ollama",
"type": "number"
},
"schema_version": {
"description": "Ollama, OpenAI",
"type": "string"
},
"seed": {
"description": "Ollama",
"type": "integer"
},
"stop": {
"description": "Ollama, OpenAI",
"items": {
"type": "string"
},
"type": "array"
},
"temperature": {
"description": "Ollama, OpenAI",
"type": "number"
},
"tfs_z": {
"description": "Ollama",
"type": "number"
},
"top_k": {
"description": "Ollama",
"type": "integer"
},
"top_p": {
"description": "Ollama, OpenAI",
"type": "number"
},
"typical_p": {
"description": "Ollama",
"type": "number"
},
"use_mlock": {
"description": "Ollama",
"type": "boolean"
},
"use_mmap": {
"description": "Ollama",
"type": "boolean"
},
"vocab_only": {
"description": "Ollama",
"type": "boolean"
}
},
"type": "object"
},
"vision.ModelType": {
"enum": [
"labels",
"nsfw",
"face",
"caption",
"generate"
],
"type": "string",
"x-enum-varnames": [
"ModelTypeLabels",
"ModelTypeNsfw",
"ModelTypeFace",
"ModelTypeCaption",
"ModelTypeGenerate"
]
},
"vision.RunType": {
"enum": [
"",
"never",
"manual",
"always",
"newly-indexed",
"on-demand",
"on-schedule",
"on-index"
],
"type": "string",
"x-enum-varnames": [
"RunAuto",
"RunNever",
"RunManual",
"RunAlways",
"RunNewlyIndexed",
"RunOnDemand",
"RunOnSchedule",
"RunOnIndex"
]
},
"vision.Service": {
"properties": {
"disabled": {
"type": "boolean"
},
"fileScheme": {
"type": "string"
},
"method": {
"type": "string"
},
"model": {
"description": "Optional endpoint-specific model override.",
"type": "string"
},
"org": {
"description": "Optional organization header (e.g. OpenAI).",
"type": "string"
},
"project": {
"description": "Optional project header (e.g. OpenAI).",
"type": "string"
},
"requestFormat": {
"$ref": "#/definitions/vision.ApiFormat"
},
"responseFormat": {
"$ref": "#/definitions/vision.ApiFormat"
},
"think": {
"description": "Optional reasoning hint for compatible engines (e.g. Ollama, GPT-OSS).",
"type": "string"
},
"uri": {
"type": "string"
}
},
"type": "object"
}
},
"externalDocs": {
"description": "Learn more ",
"url": "https://docs.photoprism.app/developer-guide/api/"
},
"host": "demo.photoprism.app",
"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.\nWhen 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 API",
"version": "v1"
},
"paths": {
"/api/v1/albums": {
"get": {
"operationId": "SearchAlbums",
"parameters": [
{
"description": "maximum number of results",
"in": "query",
"maximum": 100000,
"minimum": 1,
"name": "count",
"required": true,
"type": "integer"
},
{
"description": "search result offset",
"in": "query",
"maximum": 100000,
"minimum": 0,
"name": "offset",
"type": "integer"
},
{
"description": "sort order",
"enum": [
"favorites",
"name",
"title",
"added",
"edited"
],
"in": "query",
"name": "order",
"type": "string"
},
{
"description": "search query",
"in": "query",
"name": "q",
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"headers": {
"X-Count": {
"description": "The actual number of albums returned",
"type": "number"
},
"X-Limit": {
"description": "The limit of the number of albums to be returned",
"type": "number"
},
"X-Offset": {
"description": "The offset that was used",
"type": "number"
}
},
"schema": {
"items": {
"$ref": "#/definitions/search.Album"
},
"type": "array"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "finds albums and returns them as JSON",
"tags": [
"Albums"
]
},
"post": {
"consumes": [
"application/json"
],
"description": "Posting a title that matches a soft-deleted manual album restores it (including existing photo assignments). Use DELETE with `force=true` to purge an album before recreating it from scratch.",
"operationId": "CreateAlbum",
"parameters": [
{
"description": "properties of the album to be created (currently supports Title and Favorite)",
"in": "body",
"name": "album",
"required": true,
"schema": {
"$ref": "#/definitions/form.Album"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Album"
}
},
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/entity.Album"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "creates a new album",
"tags": [
"Albums"
]
}
},
"/api/v1/albums/{uid}": {
"delete": {
"consumes": [
"application/json"
],
"operationId": "DeleteAlbum",
"parameters": [
{
"description": "Album UID",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "Set to true to permanently delete a manual album instead of archiving it.",
"in": "query",
"name": "force",
"type": "boolean"
}
],
"produces": [
"application/json"
],
"responses": {
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "deletes an existing album",
"tags": [
"Albums"
]
},
"get": {
"operationId": "GetAlbum",
"parameters": [
{
"description": "Album UID",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Album"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns album details as JSON",
"tags": [
"Albums"
]
},
"put": {
"consumes": [
"application/json"
],
"operationId": "UpdateAlbum",
"parameters": [
{
"description": "Album UID",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "properties to be updated",
"in": "body",
"name": "album",
"required": true,
"schema": {
"$ref": "#/definitions/form.Album"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Album"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "updates album metadata like title and description",
"tags": [
"Albums"
]
}
},
"/api/v1/albums/{uid}/clone": {
"post": {
"consumes": [
"application/json"
],
"operationId": "CloneAlbums",
"parameters": [
{
"description": "Album Selection",
"in": "body",
"name": "albums",
"required": true,
"schema": {
"$ref": "#/definitions/form.Selection"
}
},
{
"description": "UID of the album to which the pictures are to be added",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "creates a new album containing pictures from other albums",
"tags": [
"Albums"
]
}
},
"/api/v1/albums/{uid}/dl": {
"get": {
"operationId": "DownloadAlbum",
"parameters": [
{
"description": "Album UID",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/zip"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "file"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "streams the album contents as zip archive",
"tags": [
"Albums",
"Download"
]
}
},
"/api/v1/albums/{uid}/like": {
"delete": {
"consumes": [
"application/json"
],
"operationId": "DislikeAlbum",
"parameters": [
{
"description": "Album UID",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "removes the favorite flag from an album",
"tags": [
"Albums"
]
},
"post": {
"consumes": [
"application/json"
],
"operationId": "LikeAlbum",
"parameters": [
{
"description": "Album UID",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "sets the favorite flag for an album",
"tags": [
"Albums"
]
}
},
"/api/v1/albums/{uid}/links": {
"get": {
"operationId": "GetAlbumLinks",
"parameters": [
{
"description": "album uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"items": {
"$ref": "#/definitions/entity.Link"
},
"type": "array"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns all share links for the given UID as JSON",
"tags": [
"Links",
"Albums"
]
},
"post": {
"consumes": [
"application/json"
],
"operationId": "CreateAlbumLink",
"parameters": [
{
"description": "album uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "link properties (currently supported: slug, expires)",
"in": "body",
"name": "link",
"required": true,
"schema": {
"$ref": "#/definitions/form.Link"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Link"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"409": {
"description": "Conflict",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "adds a new album share link and return it as JSON",
"tags": [
"Links",
"Albums"
]
}
},
"/api/v1/albums/{uid}/links/{linkuid}": {
"delete": {
"consumes": [
"application/json"
],
"operationId": "DeleteAlbumLink",
"parameters": [
{
"description": "album",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "link uid",
"in": "path",
"name": "linkuid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Link"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"409": {
"description": "Conflict",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "deletes an album share link",
"tags": [
"Links",
"Albums"
]
},
"put": {
"consumes": [
"application/json"
],
"operationId": "UpdateAlbumLink",
"parameters": [
{
"description": "album uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "link uid",
"in": "path",
"name": "linkuid",
"required": true,
"type": "string"
},
{
"description": "properties to be updated (currently supported: slug, expires, token)",
"in": "body",
"name": "link",
"required": true,
"schema": {
"$ref": "#/definitions/form.Link"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Link"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"409": {
"description": "Conflict",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "updates an album share link and return it as JSON",
"tags": [
"Links",
"Albums"
]
}
},
"/api/v1/albums/{uid}/photos": {
"delete": {
"consumes": [
"application/json"
],
"operationId": "RemovePhotosFromAlbum",
"parameters": [
{
"description": "Photo Selection",
"in": "body",
"name": "photos",
"required": true,
"schema": {
"$ref": "#/definitions/form.Selection"
}
},
{
"description": "Album UID",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "removes photos from an album",
"tags": [
"Albums"
]
},
"post": {
"consumes": [
"application/json"
],
"operationId": "AddPhotosToAlbum",
"parameters": [
{
"description": "Photo Selection",
"in": "body",
"name": "photos",
"required": true,
"schema": {
"$ref": "#/definitions/form.Selection"
}
},
{
"description": "Album UID",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "adds photos to an album",
"tags": [
"Albums"
]
}
},
"/api/v1/albums/{uid}/t/{token}/{size}": {
"get": {
"operationId": "AlbumCover",
"parameters": [
{
"description": "Album UID",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "user-specific security token provided with session or 'public' when running PhotoPrism in public mode",
"in": "path",
"name": "token",
"required": true,
"type": "string"
},
{
"description": "thumbnail size",
"enum": [
"tile_50",
"tile_100",
"left_224",
"right_224",
"tile_224",
"tile_500",
"fit_720",
"tile_1080",
"fit_1280",
"fit_1600",
"fit_1920",
"fit_2048",
"fit_2560",
"fit_3840",
"fit_4096",
"fit_7680"
],
"in": "path",
"name": "size",
"required": true,
"type": "string"
}
],
"produces": [
"image/jpeg",
"image/svg+xml"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "file"
}
},
"403": {
"description": "Forbidden",
"schema": {
"type": "file"
}
}
},
"summary": "returns an album cover image",
"tags": [
"Images",
"Albums"
]
}
},
"/api/v1/batch/albums/delete": {
"post": {
"consumes": [
"application/json"
],
"operationId": "BatchAlbumsDelete",
"parameters": [
{
"description": "Album Selection",
"in": "body",
"name": "albums",
"required": true,
"schema": {
"$ref": "#/definitions/form.Selection"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "permanently removes multiple albums",
"tags": [
"Albums"
]
}
},
"/api/v1/batch/labels/delete": {
"post": {
"consumes": [
"application/json"
],
"operationId": "BatchLabelsDelete",
"parameters": [
{
"description": "Label Selection",
"in": "body",
"name": "labels",
"required": true,
"schema": {
"$ref": "#/definitions/form.Selection"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "deletes multiple labels",
"tags": [
"Labels"
]
}
},
"/api/v1/batch/photos/approve": {
"post": {
"consumes": [
"application/json"
],
"operationId": "BatchPhotosApprove",
"parameters": [
{
"description": "Photo Selection",
"in": "body",
"name": "photos",
"required": true,
"schema": {
"$ref": "#/definitions/form.Selection"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "approves multiple photos that are currently under review",
"tags": [
"Photos"
]
}
},
"/api/v1/batch/photos/archive": {
"post": {
"consumes": [
"application/json"
],
"operationId": "BatchPhotosArchive",
"parameters": [
{
"description": "Photo Selection",
"in": "body",
"name": "photos",
"required": true,
"schema": {
"$ref": "#/definitions/form.Selection"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "moves multiple photos to the archive",
"tags": [
"Photos"
]
}
},
"/api/v1/batch/photos/delete": {
"post": {
"consumes": [
"application/json"
],
"operationId": "BatchPhotosDelete",
"parameters": [
{
"description": "All or Photo Selection",
"in": "body",
"name": "photos",
"required": true,
"schema": {
"$ref": "#/definitions/form.Selection"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "permanently removes multiple or all photos from the archive",
"tags": [
"Photos"
]
}
},
"/api/v1/batch/photos/edit": {
"post": {
"consumes": [
"application/json"
],
"operationId": "BatchPhotosEdit",
"parameters": [
{
"description": "photos selection and values",
"in": "body",
"name": "Request",
"required": true,
"schema": {
"$ref": "#/definitions/batch.PhotosRequest"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/batch.PhotosResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns and updates the metadata of multiple photos",
"tags": [
"Photos"
]
}
},
"/api/v1/batch/photos/private": {
"post": {
"consumes": [
"application/json"
],
"operationId": "BatchPhotosPrivate",
"parameters": [
{
"description": "Photo Selection",
"in": "body",
"name": "photos",
"required": true,
"schema": {
"$ref": "#/definitions/form.Selection"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "toggles private state of multiple photos",
"tags": [
"Photos"
]
}
},
"/api/v1/batch/photos/restore": {
"post": {
"consumes": [
"application/json"
],
"operationId": "BatchPhotosRestore",
"parameters": [
{
"description": "Photo Selection",
"in": "body",
"name": "photos",
"required": true,
"schema": {
"$ref": "#/definitions/form.Selection"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "restores multiple photos from the archive",
"tags": [
"Photos"
]
}
},
"/api/v1/cameras": {
"get": {
"operationId": "SearchCameras",
"parameters": [
{
"description": "maximum number of results",
"in": "query",
"maximum": 100000,
"minimum": 1,
"name": "count",
"required": true,
"type": "integer"
},
{
"description": "search result offset",
"in": "query",
"maximum": 100000,
"minimum": 0,
"name": "offset",
"type": "integer"
},
{
"description": "show where make is blank",
"in": "query",
"name": "nomake",
"type": "boolean"
},
{
"description": "search query",
"in": "query",
"name": "q",
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"headers": {
"X-Count": {
"description": "The actual number of cameras returned",
"type": "number"
},
"X-Limit": {
"description": "The limit of the number of cameras to be returned",
"type": "number"
},
"X-Offset": {
"description": "The offset that was used",
"type": "number"
}
},
"schema": {
"items": {
"$ref": "#/definitions/search.Camera"
},
"type": "array"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "finds and returns cameras as JSON",
"tags": [
"Cameras"
]
}
},
"/api/v1/cameras/{id}": {
"put": {
"consumes": [
"application/json"
],
"operationId": "UpdateCamera",
"parameters": [
{
"description": "Camera ID",
"in": "path",
"name": "id",
"required": true,
"type": "string"
},
{
"description": "Properties to be updated, only Make and Model supported",
"in": "body",
"name": "camera",
"required": true,
"schema": {
"$ref": "#/definitions/form.Camera"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Camera"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "updates camera name",
"tags": [
"Cameras"
]
}
},
"/api/v1/cluster": {
"get": {
"operationId": "ClusterSummary",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/cluster.SummaryResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "cluster summary",
"tags": [
"Cluster"
]
}
},
"/api/v1/cluster/health": {
"get": {
"operationId": "ClusterHealth",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/api.HealthResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "cluster health",
"tags": [
"Cluster"
]
}
},
"/api/v1/cluster/metrics": {
"get": {
"operationId": "ClusterMetrics",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/cluster.MetricsResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "temporary cluster metrics (counts only)",
"tags": [
"Cluster"
]
}
},
"/api/v1/cluster/nodes": {
"get": {
"operationId": "ClusterListNodes",
"parameters": [
{
"description": "maximum number of results (default 100, max 1000)",
"in": "query",
"maximum": 1000,
"minimum": 1,
"name": "count",
"type": "integer"
},
{
"description": "result offset",
"in": "query",
"minimum": 0,
"name": "offset",
"type": "integer"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"items": {
"$ref": "#/definitions/cluster.Node"
},
"type": "array"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "lists registered nodes",
"tags": [
"Cluster"
]
}
},
"/api/v1/cluster/nodes/register": {
"post": {
"consumes": [
"application/json"
],
"operationId": "ClusterNodesRegister",
"parameters": [
{
"description": "registration payload (NodeName required; optional: NodeRole, Labels, AdvertiseUrl, SiteUrl, AppName, AppVersion, Theme, NodeUUID, RotateDatabase, RotateSecret). New-node joins require the Bearer join token. Existing-node mutations require a Bearer OAuth access token that belongs to the same node client.",
"in": "body",
"name": "request",
"required": true,
"schema": {
"type": "object"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/cluster.RegisterResponse"
}
},
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/cluster.RegisterResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"409": {
"description": "Conflict",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "registers a node, provisions DB credentials, and issues ClientSecret",
"tags": [
"Cluster"
]
}
},
"/api/v1/cluster/nodes/{uuid}": {
"delete": {
"operationId": "ClusterDeleteNode",
"parameters": [
{
"description": "node uuid",
"in": "path",
"name": "uuid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/cluster.StatusResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "delete node by uuid",
"tags": [
"Cluster"
]
},
"get": {
"operationId": "ClusterGetNode",
"parameters": [
{
"description": "node uuid",
"in": "path",
"name": "uuid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/cluster.Node"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "get node by uuid",
"tags": [
"Cluster"
]
},
"patch": {
"consumes": [
"application/json"
],
"operationId": "ClusterUpdateNode",
"parameters": [
{
"description": "node uuid",
"in": "path",
"name": "uuid",
"required": true,
"type": "string"
},
{
"description": "properties to update (Role, DisplayName, Labels, AdvertiseUrl, SiteUrl, RedirectURIs, AllowGroups, AllowGroupRoles, GroupsFullView)",
"in": "body",
"name": "node",
"required": true,
"schema": {
"type": "object"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/cluster.StatusResponse"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "update node fields",
"tags": [
"Cluster"
]
}
},
"/api/v1/cluster/theme": {
"get": {
"operationId": "ClusterGetTheme",
"produces": [
"application/zip"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "file"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns custom theme files as zip, if available",
"tags": [
"Cluster"
]
}
},
"/api/v1/config": {
"get": {
"operationId": "GetClientConfig",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "get client configuration",
"tags": [
"Config"
]
}
},
"/api/v1/config/options": {
"get": {
"operationId": "GetConfigOptions",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/config.Options"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns backend config options",
"tags": [
"Config",
"Settings"
]
},
"post": {
"consumes": [
"application/json"
],
"operationId": "SaveConfigOptions",
"parameters": [
{
"description": "properties to be updated (only submit values that should be changed)",
"in": "body",
"name": "options",
"required": true,
"schema": {
"$ref": "#/definitions/config.Options"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/config.Options"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "updates backend config options",
"tags": [
"Config",
"Settings"
]
}
},
"/api/v1/connect/{name}": {
"put": {
"consumes": [
"application/json"
],
"operationId": "ConnectService",
"parameters": [
{
"description": "service name (e.g., hub)",
"in": "path",
"name": "name",
"required": true,
"type": "string"
},
{
"description": "connection token",
"in": "body",
"name": "connect",
"required": true,
"schema": {
"$ref": "#/definitions/form.Connect"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "confirm external service accounts using a token",
"tags": [
"Config"
]
}
},
"/api/v1/dl/{file}": {
"get": {
"operationId": "GetDownload",
"parameters": [
{
"description": "file hash or unique download id",
"in": "path",
"name": "file",
"required": true,
"type": "string"
}
],
"produces": [
"application/octet-stream"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "file"
}
},
"403": {
"description": "Forbidden",
"schema": {
"type": "file"
}
},
"404": {
"description": "Not Found",
"schema": {
"type": "file"
}
}
},
"summary": "returns the raw file data",
"tags": [
"Images",
"Files"
]
}
},
"/api/v1/echo": {
"get": {
"operationId": "Echo",
"responses": {
"200": {
"description": "OK"
}
},
"summary": "returns the request and response headers as JSON if debug mode is enabled",
"tags": [
"Debug"
]
}
},
"/api/v1/errors": {
"delete": {
"consumes": [
"application/json"
],
"operationId": "DeleteErrors",
"produces": [
"application/json"
],
"responses": {
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "removes all entries from the error logs",
"tags": [
"Logs"
]
},
"get": {
"operationId": "GetErrors",
"parameters": [
{
"description": "maximum number of results",
"in": "query",
"maximum": 100000,
"minimum": 1,
"name": "count",
"required": true,
"type": "integer"
},
{
"description": "search result offset",
"in": "query",
"maximum": 100000,
"minimum": 0,
"name": "offset",
"type": "integer"
},
{
"description": "search query",
"in": "query",
"name": "q",
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"headers": {
"X-Count": {
"description": "The actual number of errors returned",
"type": "number"
},
"X-Limit": {
"description": "The limit of the number of errors to be returned",
"type": "number"
},
"X-Offset": {
"description": "The offset that was used",
"type": "number"
}
},
"schema": {
"$ref": "#/definitions/entity.Error"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "searches the error logs and returns the results as JSON",
"tags": [
"Logs"
]
}
},
"/api/v1/faces": {
"get": {
"operationId": "SearchFaces",
"parameters": [
{
"description": "maximum number of results",
"in": "query",
"maximum": 100000,
"minimum": 1,
"name": "count",
"required": true,
"type": "integer"
},
{
"description": "search result offset",
"in": "query",
"maximum": 100000,
"minimum": 0,
"name": "offset",
"type": "integer"
},
{
"description": "sort order",
"enum": [
"subject",
"added",
"samples"
],
"in": "query",
"name": "order",
"type": "string"
},
{
"description": "show hidden",
"enum": [
"yes",
"no"
],
"in": "query",
"name": "hidden",
"type": "string"
},
{
"description": "show unknown",
"enum": [
"yes",
"no"
],
"in": "query",
"name": "unknown",
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"headers": {
"X-Count": {
"description": "The actual number of faces returned",
"type": "number"
},
"X-Limit": {
"description": "The limit of the number of faces to be returned",
"type": "number"
},
"X-Offset": {
"description": "The offset that was used",
"type": "number"
}
},
"schema": {
"items": {
"$ref": "#/definitions/search.Face"
},
"type": "array"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "finds and returns faces as JSON",
"tags": [
"Faces"
]
}
},
"/api/v1/faces/{id}": {
"get": {
"operationId": "GetFace",
"parameters": [
{
"description": "face id",
"in": "path",
"name": "id",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Face"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns a face as JSON",
"tags": [
"Faces"
]
},
"put": {
"consumes": [
"application/json"
],
"operationId": "UpdateFace",
"parameters": [
{
"description": "face id",
"in": "path",
"name": "id",
"required": true,
"type": "string"
},
{
"description": "properties to be updated",
"in": "body",
"name": "face",
"required": true,
"schema": {
"$ref": "#/definitions/form.Face"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Face"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "updates face properties",
"tags": [
"Faces"
]
}
},
"/api/v1/files/{hash}": {
"get": {
"operationId": "GetFile",
"parameters": [
{
"description": "hash (string) SHA-1 hash of the file",
"in": "path",
"name": "hash",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.File"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns file details as JSON",
"tags": [
"Files"
]
}
},
"/api/v1/folders/import": {
"get": {
"operationId": "SearchFoldersImport",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"headers": {
"X-Count": {
"description": "The actual number of files and folders returned. Do not use for determining if all the results have been returned.",
"type": "number"
},
"X-Files": {
"description": "The actual number of files returned. Use this for comparing to X-Limit to determine if all the results have been returned.",
"type": "number"
},
"X-Folders": {
"description": "The actual number of folders returned. Do not use for determining if all the results have been returned.",
"type": "number"
},
"X-Limit": {
"description": "The limit of the number of files to be returned",
"type": "number"
},
"X-Offset": {
"description": "The offset that was used",
"type": "number"
}
},
"schema": {
"$ref": "#/definitions/api.FoldersResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "list folders in import",
"tags": [
"Folders"
]
}
},
"/api/v1/folders/originals": {
"get": {
"operationId": "SearchFoldersOriginals",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/api.FoldersResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "list folders in originals",
"tags": [
"Folders"
]
}
},
"/api/v1/folders/t/{uid}/{token}/{size}": {
"get": {
"operationId": "FolderCover",
"parameters": [
{
"description": "folder uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "user-specific security token provided with session or 'public' when running PhotoPrism in public mode",
"in": "path",
"name": "token",
"required": true,
"type": "string"
},
{
"description": "thumbnail size",
"enum": [
"tile_50",
"tile_100",
"left_224",
"right_224",
"tile_224",
"tile_500",
"fit_720",
"tile_1080",
"fit_1280",
"fit_1600",
"fit_1920",
"fit_2048",
"fit_2560",
"fit_3840",
"fit_4096",
"fit_7680"
],
"in": "path",
"name": "size",
"required": true,
"type": "string"
}
],
"produces": [
"image/jpeg",
"image/svg+xml"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "file"
}
},
"403": {
"description": "Forbidden",
"schema": {
"type": "file"
}
}
},
"summary": "returns a folder cover image",
"tags": [
"Images",
"Folders"
]
}
},
"/api/v1/geo": {
"get": {
"operationId": "SearchGeo",
"parameters": [
{
"description": "maximum number of files",
"in": "query",
"maximum": 100000,
"minimum": 1,
"name": "count",
"required": true,
"type": "integer"
},
{
"description": "file offset",
"in": "query",
"maximum": 100000,
"minimum": 0,
"name": "offset",
"type": "integer"
},
{
"description": "excludes private pictures",
"in": "query",
"name": "public",
"type": "boolean"
},
{
"description": "minimum quality score (1-7)",
"enum": [
0,
1,
2,
3,
4,
5,
6,
7
],
"in": "query",
"name": "quality",
"required": true,
"type": "integer"
},
{
"description": "search query",
"in": "query",
"name": "q",
"type": "string"
},
{
"description": "album uid",
"in": "query",
"name": "s",
"type": "string"
},
{
"description": "photo path",
"in": "query",
"name": "path",
"type": "string"
},
{
"description": "is type video",
"in": "query",
"name": "video",
"type": "boolean"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"headers": {
"X-Count": {
"description": "The actual number of files returned",
"type": "number"
},
"X-Limit": {
"description": "The limit of the number of files to be returned",
"type": "number"
},
"X-Offset": {
"description": "The offset that was used",
"type": "number"
}
},
"schema": {
"items": {
"$ref": "#/definitions/search.GeoResult"
},
"type": "array"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "finds photos and returns results as JSON, so they can be displayed on a map or in a viewer",
"tags": [
"Photos"
]
}
},
"/api/v1/import": {
"delete": {
"operationId": "CancelImport",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "cancels the active import job",
"tags": [
"Library"
]
}
},
"/api/v1/import/": {
"post": {
"consumes": [
"application/json"
],
"operationId": "StartImport",
"parameters": [
{
"description": "import options",
"in": "body",
"name": "options",
"required": true,
"schema": {
"$ref": "#/definitions/form.ImportOptions"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "start import",
"tags": [
"Library"
]
}
},
"/api/v1/index": {
"delete": {
"operationId": "CancelIndexing",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "cancels the active indexing job",
"tags": [
"Library"
]
},
"post": {
"consumes": [
"application/json"
],
"operationId": "StartIndexing",
"parameters": [
{
"description": "index options",
"in": "body",
"name": "options",
"required": true,
"schema": {
"$ref": "#/definitions/form.IndexOptions"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "start indexing",
"tags": [
"Library"
]
}
},
"/api/v1/labels": {
"get": {
"operationId": "SearchLabels",
"parameters": [
{
"description": "maximum number of results",
"in": "query",
"maximum": 100000,
"minimum": 1,
"name": "count",
"required": true,
"type": "integer"
},
{
"description": "search result offset",
"in": "query",
"maximum": 100000,
"minimum": 0,
"name": "offset",
"type": "integer"
},
{
"description": "show all",
"in": "query",
"name": "all",
"type": "boolean"
},
{
"description": "search query",
"in": "query",
"name": "q",
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"headers": {
"X-Count": {
"description": "The actual number of labels returned",
"type": "number"
},
"X-Limit": {
"description": "The limit of the number of labels to be returned",
"type": "number"
},
"X-Offset": {
"description": "The offset that was used",
"type": "number"
}
},
"schema": {
"items": {
"$ref": "#/definitions/search.Label"
},
"type": "array"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "finds and returns labels as JSON",
"tags": [
"Labels"
]
}
},
"/api/v1/labels/{uid}": {
"put": {
"consumes": [
"application/json"
],
"operationId": "UpdateLabel",
"parameters": [
{
"description": "Label UID",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "Label Name",
"in": "body",
"name": "label",
"required": true,
"schema": {
"$ref": "#/definitions/form.Label"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Label"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "updates label name",
"tags": [
"Labels"
]
}
},
"/api/v1/labels/{uid}/like": {
"delete": {
"consumes": [
"application/json"
],
"operationId": "DislikeLabel",
"parameters": [
{
"description": "Label UID",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "removes favorite flag from a label",
"tags": [
"Labels"
]
},
"post": {
"consumes": [
"application/json"
],
"operationId": "LikeLabel",
"parameters": [
{
"description": "Label UID",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "sets favorite flag for a label",
"tags": [
"Labels"
]
}
},
"/api/v1/labels/{uid}/t/{token}/{size}": {
"get": {
"operationId": "LabelCover",
"parameters": [
{
"description": "Label UID",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "user-specific security token provided with session or 'public' when running PhotoPrism in public mode",
"in": "path",
"name": "token",
"required": true,
"type": "string"
},
{
"description": "thumbnail size",
"enum": [
"tile_50",
"tile_100",
"left_224",
"right_224",
"tile_224",
"tile_500",
"fit_720",
"tile_1080",
"fit_1280",
"fit_1600",
"fit_1920",
"fit_2048",
"fit_2560",
"fit_3840",
"fit_4096",
"fit_7680"
],
"in": "path",
"name": "size",
"required": true,
"type": "string"
}
],
"produces": [
"image/jpeg",
"image/svg+xml"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "file"
}
},
"403": {
"description": "Forbidden",
"schema": {
"type": "file"
}
}
},
"summary": "returns a label cover image",
"tags": [
"Images",
"Labels"
]
}
},
"/api/v1/lenses": {
"get": {
"operationId": "SearchLenses",
"parameters": [
{
"description": "maximum number of results",
"in": "query",
"maximum": 100000,
"minimum": 1,
"name": "count",
"required": true,
"type": "integer"
},
{
"description": "search result offset",
"in": "query",
"maximum": 100000,
"minimum": 0,
"name": "offset",
"type": "integer"
},
{
"description": "show where make is blank",
"in": "query",
"name": "nomake",
"type": "boolean"
},
{
"description": "search query",
"in": "query",
"name": "q",
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"headers": {
"X-Count": {
"description": "The actual number of lenses returned",
"type": "number"
},
"X-Limit": {
"description": "The limit of the number of lenses to be returned",
"type": "number"
},
"X-Offset": {
"description": "The offset that was used",
"type": "number"
}
},
"schema": {
"items": {
"$ref": "#/definitions/search.Lens"
},
"type": "array"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "finds and returns lenses as JSON",
"tags": [
"Lenses"
]
}
},
"/api/v1/lenses/{id}": {
"put": {
"consumes": [
"application/json"
],
"operationId": "UpdateLens",
"parameters": [
{
"description": "Lens ID",
"in": "path",
"name": "id",
"required": true,
"type": "string"
},
{
"description": "Properties to be updated, only Make and Model supported",
"in": "body",
"name": "lens",
"required": true,
"schema": {
"$ref": "#/definitions/form.Lens"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Lens"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "updates lens name",
"tags": [
"Lenses"
]
}
},
"/api/v1/markers": {
"post": {
"produces": [
"application/json"
],
"responses": {
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/entity.Marker"
}
}
},
"tags": [
"Files"
]
}
},
"/api/v1/markers/{marker_uid}": {
"put": {
"consumes": [
"application/json"
],
"operationId": "UpdateMarker",
"parameters": [
{
"description": "marker uid",
"in": "path",
"name": "marker_uid",
"required": true,
"type": "string"
},
{
"description": "marker properties",
"in": "body",
"name": "marker",
"required": true,
"schema": {
"$ref": "#/definitions/form.Marker"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Marker"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "update a marker (face/subject region)",
"tags": [
"Files"
]
}
},
"/api/v1/markers/{marker_uid}/subject": {
"delete": {
"operationId": "ClearMarkerSubject",
"parameters": [
{
"description": "marker uid",
"in": "path",
"name": "marker_uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Marker"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "clear the subject of a marker",
"tags": [
"Files"
]
}
},
"/api/v1/mcp": {
"post": {
"consumes": [
"application/json"
],
"operationId": "ServeMCP",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "JSON-RPC 2.0 response",
"schema": {
"type": "string"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"413": {
"description": "Request Entity Too Large",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "model context protocol endpoint",
"tags": [
"MCP"
]
}
},
"/api/v1/metrics": {
"get": {
"operationId": "GetMetrics",
"produces": [
"text/plain"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"items": {
"$ref": "#/definitions/io_prometheus_client.MetricFamily"
},
"type": "array"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "a prometheus-compatible metrics endpoint for monitoring this instance",
"tags": [
"Metrics"
]
}
},
"/api/v1/moments/time": {
"get": {
"operationId": "GetMomentsTime",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"items": {
"$ref": "#/definitions/query.Moment"
},
"type": "array"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns monthly albums as JSON",
"tags": [
"Albums"
]
}
},
"/api/v1/oauth/authorize": {
"get": {
"operationId": "OAuthAuthorize",
"produces": [
"application/json"
],
"responses": {
"302": {
"description": "redirect to the client redirect_uri with an authorization code",
"schema": {
"type": "string"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"405": {
"description": "Method Not Allowed",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "OAuth2/OIDC authorization endpoint",
"tags": [
"Authentication"
]
}
},
"/api/v1/oauth/logout": {
"get": {
"operationId": "OAuthLogout",
"produces": [
"application/json"
],
"responses": {
"302": {
"description": "redirect to post_logout_redirect_uri",
"schema": {
"type": "string"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"405": {
"description": "Method Not Allowed",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "OAuth2/OIDC end-session endpoint (RP-initiated logout)",
"tags": [
"Authentication"
]
},
"post": {
"operationId": "OAuthLogout",
"produces": [
"application/json"
],
"responses": {
"302": {
"description": "redirect to post_logout_redirect_uri",
"schema": {
"type": "string"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"405": {
"description": "Method Not Allowed",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "OAuth2/OIDC end-session endpoint (RP-initiated logout)",
"tags": [
"Authentication"
]
}
},
"/api/v1/oauth/revoke": {
"post": {
"consumes": [
"application/json"
],
"operationId": "OAuthRevoke",
"parameters": [
{
"description": "revoke request",
"in": "body",
"name": "request",
"required": true,
"schema": {
"$ref": "#/definitions/form.OAuthRevokeToken"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "revoke an OAuth2 access token or session",
"tags": [
"Authentication"
]
}
},
"/api/v1/oauth/token": {
"post": {
"consumes": [
"application/json"
],
"operationId": "OAuthToken",
"parameters": [
{
"description": "token request (supports client_credentials, password, or session grant)",
"in": "body",
"name": "request",
"required": true,
"schema": {
"$ref": "#/definitions/form.OAuthCreateToken"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "create an OAuth2 access token",
"tags": [
"Authentication"
]
}
},
"/api/v1/oauth/userinfo": {
"get": {
"operationId": "OAuthUserinfo",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"405": {
"description": "Method Not Allowed",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "OAuth2/OIDC userinfo endpoint",
"tags": [
"Authentication"
]
},
"post": {
"operationId": "OAuthUserinfo",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"405": {
"description": "Method Not Allowed",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "OAuth2/OIDC userinfo endpoint",
"tags": [
"Authentication"
]
}
},
"/api/v1/oidc/login": {
"get": {
"operationId": "OIDCLogin",
"produces": [
"text/html"
],
"responses": {
"307": {
"description": "redirect to provider login page",
"schema": {
"type": "string"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "start OpenID Connect login (browser redirect)",
"tags": [
"Authentication"
]
}
},
"/api/v1/oidc/redirect": {
"get": {
"operationId": "OIDCRedirect",
"parameters": [
{
"description": "opaque OAuth2 state value",
"in": "query",
"name": "state",
"required": true,
"type": "string"
},
{
"description": "authorization code",
"in": "query",
"name": "code",
"required": true,
"type": "string"
}
],
"produces": [
"text/html"
],
"responses": {
"200": {
"description": "HTML page bootstrapping token storage",
"schema": {
"type": "string"
}
},
"401": {
"description": "rendered error page",
"schema": {
"type": "string"
}
},
"403": {
"description": "rendered error page",
"schema": {
"type": "string"
}
},
"429": {
"description": "rendered error page",
"schema": {
"type": "string"
}
}
},
"summary": "complete OIDC login (callback)",
"tags": [
"Authentication"
]
}
},
"/api/v1/photos": {
"get": {
"description": "For more information see:\n- https://docs.photoprism.app/developer-guide/api/search/#get-apiv1photos",
"operationId": "SearchPhotos",
"parameters": [
{
"description": "maximum number of files",
"in": "query",
"maximum": 100000,
"minimum": 1,
"name": "count",
"required": true,
"type": "integer"
},
{
"description": "file offset",
"in": "query",
"maximum": 100000,
"minimum": 0,
"name": "offset",
"type": "integer"
},
{
"description": "sort order",
"enum": [
"name",
"title",
"added",
"edited",
"newest",
"oldest",
"size",
"random",
"duration",
"relevance"
],
"in": "query",
"name": "order",
"type": "string"
},
{
"description": "groups consecutive files that belong to the same photo",
"in": "query",
"name": "merged",
"type": "boolean"
},
{
"description": "excludes private pictures",
"in": "query",
"name": "public",
"type": "boolean"
},
{
"description": "minimum quality score (1-7)",
"enum": [
0,
1,
2,
3,
4,
5,
6,
7
],
"in": "query",
"name": "quality",
"type": "integer"
},
{
"description": "search query",
"in": "query",
"name": "q",
"type": "string"
},
{
"description": "album uid",
"in": "query",
"name": "s",
"type": "string"
},
{
"description": "photo path",
"in": "query",
"name": "path",
"type": "string"
},
{
"description": "is type video",
"in": "query",
"name": "video",
"type": "boolean"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"headers": {
"X-Count": {
"description": "The actual number of files returned",
"type": "number"
},
"X-Limit": {
"description": "The limit of the number of files to be returned",
"type": "number"
},
"X-Offset": {
"description": "The offset that was used",
"type": "number"
}
},
"schema": {
"items": {
"$ref": "#/definitions/search.Photo"
},
"type": "array"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "finds pictures and returns them as JSON",
"tags": [
"Photos"
]
}
},
"/api/v1/photos/view": {
"get": {
"description": "Returns search results formatted for the photo viewer (lightbox) in the web UI,\nincluding resolved content URLs and preview/download tokens.\nFor more information see:\n- https://docs.photoprism.app/developer-guide/api/search/#get-apiv1photos",
"operationId": "SearchPhotosView",
"parameters": [
{
"description": "maximum number of files",
"in": "query",
"maximum": 100000,
"minimum": 1,
"name": "count",
"required": true,
"type": "integer"
},
{
"description": "file offset",
"in": "query",
"maximum": 100000,
"minimum": 0,
"name": "offset",
"type": "integer"
},
{
"description": "sort order",
"enum": [
"name",
"title",
"added",
"edited",
"newest",
"oldest",
"size",
"random",
"duration",
"relevance"
],
"in": "query",
"name": "order",
"type": "string"
},
{
"description": "groups consecutive files that belong to the same photo",
"in": "query",
"name": "merged",
"type": "boolean"
},
{
"description": "excludes private pictures",
"in": "query",
"name": "public",
"type": "boolean"
},
{
"description": "minimum quality score (1-7)",
"enum": [
0,
1,
2,
3,
4,
5,
6,
7
],
"in": "query",
"name": "quality",
"type": "integer"
},
{
"description": "search query",
"in": "query",
"name": "q",
"type": "string"
},
{
"description": "album uid",
"in": "query",
"name": "s",
"type": "string"
},
{
"description": "photo path",
"in": "query",
"name": "path",
"type": "string"
},
{
"description": "is type video",
"in": "query",
"name": "video",
"type": "boolean"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"headers": {
"X-Count": {
"description": "The actual number of files returned",
"type": "number"
},
"X-Limit": {
"description": "The limit of the number of files to be returned",
"type": "number"
},
"X-Offset": {
"description": "The offset that was used",
"type": "number"
}
},
"schema": {
"items": {
"$ref": "#/definitions/viewer.Result"
},
"type": "array"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "finds pictures and returns a viewer-formatted JSON result for the lightbox",
"tags": [
"Photos"
]
}
},
"/api/v1/photos/{uid}": {
"get": {
"operationId": "GetPhoto",
"parameters": [
{
"description": "Photo UID",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Photo"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns picture details as JSON",
"tags": [
"Photos"
]
},
"put": {
"consumes": [
"application/json"
],
"operationId": "UpdatePhoto",
"parameters": [
{
"description": "Photo UID",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "properties to be updated (only submit values that should be changed)",
"in": "body",
"name": "photo",
"required": true,
"schema": {
"$ref": "#/definitions/form.Photo"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Photo"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "updates picture details and returns them as JSON",
"tags": [
"Photos"
]
}
},
"/api/v1/photos/{uid}/approve": {
"post": {
"consumes": [
"application/json"
],
"operationId": "ApprovePhoto",
"parameters": [
{
"description": "photo uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "marks a photo in review as approved",
"tags": [
"Photos"
]
}
},
"/api/v1/photos/{uid}/dl": {
"get": {
"operationId": "GetPhotoDownload",
"parameters": [
{
"description": "photo uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/octet-stream"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "file"
}
},
"403": {
"description": "Forbidden",
"schema": {
"type": "file"
}
},
"404": {
"description": "Not Found",
"schema": {
"type": "file"
}
}
},
"summary": "returns the primary file matching that belongs to the photo",
"tags": [
"Images",
"Files"
]
}
},
"/api/v1/photos/{uid}/files/{fileuid}": {
"delete": {
"consumes": [
"application/json"
],
"operationId": "DeleteFile",
"parameters": [
{
"description": "photo uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "file uid",
"in": "path",
"name": "fileuid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Photo"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "removes a file from storage",
"tags": [
"Files"
]
}
},
"/api/v1/photos/{uid}/files/{fileuid}/orientation": {
"put": {
"consumes": [
"application/json"
],
"operationId": "ChangeFileOrientation",
"parameters": [
{
"description": "photo uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "file uid",
"in": "path",
"name": "fileuid",
"required": true,
"type": "string"
},
{
"description": "file orientation",
"in": "body",
"name": "file",
"required": true,
"schema": {
"$ref": "#/definitions/form.File"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Photo"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "changes the orientation of a file",
"tags": [
"Files"
]
}
},
"/api/v1/photos/{uid}/files/{fileuid}/primary": {
"post": {
"consumes": [
"application/json"
],
"operationId": "PhotoPrimary",
"parameters": [
{
"description": "photo uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "file uid",
"in": "path",
"name": "fileuid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Photo"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "sets the primary file for a photo",
"tags": [
"Photos",
"Stacks"
]
}
},
"/api/v1/photos/{uid}/files/{fileuid}/unstack": {
"post": {
"consumes": [
"application/json"
],
"operationId": "PhotoUnstack",
"parameters": [
{
"description": "photo uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "file uid",
"in": "path",
"name": "fileuid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Photo"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "removes a file from an existing photo stack",
"tags": [
"Photos",
"Stacks"
]
}
},
"/api/v1/photos/{uid}/label": {
"post": {
"consumes": [
"application/json"
],
"operationId": "AddPhotoLabel",
"parameters": [
{
"description": "label properties",
"in": "body",
"name": "label",
"required": true,
"schema": {
"$ref": "#/definitions/form.Label"
}
},
{
"description": "photo uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Photo"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "adds a label to a photo",
"tags": [
"Labels",
"Photos"
]
}
},
"/api/v1/photos/{uid}/label/{id}": {
"delete": {
"consumes": [
"application/json"
],
"operationId": "RemovePhotoLabel",
"parameters": [
{
"description": "photo uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "label id",
"in": "path",
"name": "id",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Photo"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "removes a label from a photo",
"tags": [
"Labels",
"Photos"
]
},
"put": {
"consumes": [
"application/json"
],
"operationId": "UpdatePhotoLabel",
"parameters": [
{
"description": "photo uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "label id",
"in": "path",
"name": "id",
"required": true,
"type": "string"
},
{
"description": "properties to be updated (currently supports: uncertainty)",
"in": "body",
"name": "label",
"required": true,
"schema": {
"$ref": "#/definitions/form.Label"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Photo"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "changes a photo label",
"tags": [
"Labels",
"Photos"
]
}
},
"/api/v1/photos/{uid}/like": {
"delete": {
"consumes": [
"application/json"
],
"operationId": "DislikePhoto",
"parameters": [
{
"description": "photo uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "removes the favorite flags from a photo",
"tags": [
"Photos"
]
},
"post": {
"consumes": [
"application/json"
],
"operationId": "LikePhoto",
"parameters": [
{
"description": "photo uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "flags a photo as favorite",
"tags": [
"Photos"
]
}
},
"/api/v1/photos/{uid}/yaml": {
"get": {
"operationId": "GetPhotoYaml",
"parameters": [
{
"description": "photo uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"text/x-yaml"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "file"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns picture details as YAML",
"tags": [
"Photos"
]
}
},
"/api/v1/places/reverse": {
"get": {
"operationId": "GetPlacesReverse",
"parameters": [
{
"description": "Latitude",
"in": "query",
"name": "lat",
"required": true,
"type": "string"
},
{
"description": "Longitude",
"in": "query",
"name": "lng",
"required": true,
"type": "string"
},
{
"description": "Locale",
"in": "query",
"name": "locale",
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/places.Location"
}
},
"400": {
"description": "Missing latitude or longitude",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Geocoding service error",
"schema": {
"$ref": "#/definitions/gin.H"
}
}
},
"summary": "returns location details for the specified coordinates",
"tags": [
"Places"
]
}
},
"/api/v1/places/search": {
"get": {
"operationId": "GetPlacesSearch",
"parameters": [
{
"description": "Search query",
"in": "query",
"name": "q",
"required": true,
"type": "string"
},
{
"description": "Locale for results (default: en)",
"in": "query",
"name": "locale",
"type": "string"
},
{
"description": "Maximum number of results (default: 10, max: 50)",
"in": "query",
"name": "count",
"type": "integer"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"items": {
"$ref": "#/definitions/places.SearchResult"
},
"type": "array"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Search service error",
"schema": {
"$ref": "#/definitions/gin.H"
}
}
},
"summary": "returns locations that match the specified search query",
"tags": [
"Places"
]
}
},
"/api/v1/server/stop": {
"post": {
"operationId": "StopServer",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/config.Options"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "allows authorized admins to restart the server",
"tags": [
"Internal"
]
}
},
"/api/v1/services": {
"get": {
"operationId": "SearchServices",
"parameters": [
{
"description": "maximum number of results",
"in": "query",
"maximum": 100000,
"minimum": 1,
"name": "count",
"required": true,
"type": "integer"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"headers": {
"X-Count": {
"description": "The actual number of services returned",
"type": "number"
},
"X-Limit": {
"description": "The limit of the number of services to be returned",
"type": "number"
},
"X-Offset": {
"description": "The offset that was used",
"type": "number"
}
},
"schema": {
"items": {
"$ref": "#/definitions/entity.Service"
},
"type": "array"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "finds services and returns them as JSON",
"tags": [
"Services"
]
},
"post": {
"consumes": [
"application/json"
],
"operationId": "AddService",
"parameters": [
{
"description": "properties of the service to be created",
"in": "body",
"name": "service",
"required": true,
"schema": {
"$ref": "#/definitions/form.Service"
}
}
],
"produces": [
"application/json"
],
"responses": {
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/entity.Service"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "creates a new remote service account configuration",
"tags": [
"Services"
]
}
},
"/api/v1/services/{id}": {
"delete": {
"consumes": [
"application/json"
],
"operationId": "DeleteService",
"parameters": [
{
"description": "service id",
"in": "path",
"name": "id",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Service"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "removes a remote service account configuration",
"tags": [
"Services"
]
},
"get": {
"operationId": "GetService",
"parameters": [
{
"description": "service id",
"in": "path",
"name": "id",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Service"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns the specified remote service account configuration as JSON",
"tags": [
"Services"
]
},
"put": {
"consumes": [
"application/json"
],
"operationId": "UpdateService",
"parameters": [
{
"description": "service id",
"in": "path",
"name": "id",
"required": true,
"type": "string"
},
{
"description": "properties to be updated (only submit values that should be changed)",
"in": "body",
"name": "service",
"required": true,
"schema": {
"$ref": "#/definitions/form.Service"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Service"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "updates a remote account configuration",
"tags": [
"Services"
]
}
},
"/api/v1/services/{id}/folders": {
"get": {
"operationId": "GetServiceFolders",
"parameters": [
{
"description": "service id",
"in": "path",
"name": "id",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"items": {
"type": "object"
},
"type": "array"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns folders that belong to a remote service account",
"tags": [
"Services"
]
}
},
"/api/v1/services/{id}/upload": {
"post": {
"consumes": [
"application/json"
],
"operationId": "UploadToService",
"parameters": [
{
"description": "service id",
"in": "path",
"name": "id",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"items": {
"$ref": "#/definitions/entity.File"
},
"type": "array"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "uploads files to the selected service account",
"tags": [
"Services"
]
}
},
"/api/v1/session": {
"delete": {
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "delete a session (logout)",
"tags": [
"Authentication"
]
},
"get": {
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "get the current session or a session by id",
"tags": [
"Authentication"
]
},
"post": {
"consumes": [
"application/json"
],
"parameters": [
{
"description": "login credentials",
"in": "body",
"name": "credentials",
"required": true,
"schema": {
"$ref": "#/definitions/form.Login"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "create a session (login)",
"tags": [
"Authentication"
]
}
},
"/api/v1/session/{id}": {
"delete": {
"parameters": [
{
"description": "session id or ref id",
"in": "path",
"name": "id",
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "delete a session (logout)",
"tags": [
"Authentication"
]
},
"get": {
"parameters": [
{
"description": "session id",
"in": "path",
"name": "id",
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "get the current session or a session by id",
"tags": [
"Authentication"
]
}
},
"/api/v1/sessions": {
"post": {
"consumes": [
"application/json"
],
"parameters": [
{
"description": "login credentials",
"in": "body",
"name": "credentials",
"required": true,
"schema": {
"$ref": "#/definitions/form.Login"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "create a session (login)",
"tags": [
"Authentication"
]
}
},
"/api/v1/sessions/{id}": {
"delete": {
"parameters": [
{
"description": "session id or ref id",
"in": "path",
"name": "id",
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "delete a session (logout)",
"tags": [
"Authentication"
]
},
"get": {
"parameters": [
{
"description": "session id",
"in": "path",
"name": "id",
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "get the current session or a session by id",
"tags": [
"Authentication"
]
}
},
"/api/v1/settings": {
"get": {
"operationId": "GetSettings",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/customize.Settings"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns the user app settings as JSON",
"tags": [
"Settings"
]
},
"post": {
"consumes": [
"application/json"
],
"operationId": "SaveSettings",
"parameters": [
{
"description": "user settings",
"in": "body",
"name": "settings",
"required": true,
"schema": {
"$ref": "#/definitions/customize.Settings"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/customize.Settings"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "saves the user app settings",
"tags": [
"Settings"
]
}
},
"/api/v1/status": {
"get": {
"operationId": "GetStatus",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/gin.H"
}
}
},
"summary": "responds with status code 200 if the server is operational",
"tags": [
"Debug"
]
}
},
"/api/v1/subjects": {
"get": {
"operationId": "SearchSubjects",
"parameters": [
{
"description": "maximum number of results",
"in": "query",
"maximum": 100000,
"minimum": 1,
"name": "count",
"required": true,
"type": "integer"
},
{
"description": "search result offset",
"in": "query",
"maximum": 100000,
"minimum": 0,
"name": "offset",
"type": "integer"
},
{
"description": "sort order",
"enum": [
"name",
"count",
"added",
"relevance"
],
"in": "query",
"name": "order",
"type": "string"
},
{
"description": "show hidden",
"enum": [
"yes",
"no"
],
"in": "query",
"name": "hidden",
"type": "string"
},
{
"description": "minimum number of files",
"in": "query",
"name": "files",
"type": "integer"
},
{
"description": "search query",
"in": "query",
"name": "q",
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"headers": {
"X-Count": {
"description": "The actual number of subjects returned",
"type": "number"
},
"X-Limit": {
"description": "The limit of the number of subjects to be returned",
"type": "number"
},
"X-Offset": {
"description": "The offset that was used",
"type": "number"
}
},
"schema": {
"items": {
"$ref": "#/definitions/search.Subject"
},
"type": "array"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "finds and returns subjects as JSON",
"tags": [
"Subjects"
]
}
},
"/api/v1/subjects/{uid}": {
"get": {
"operationId": "GetSubject",
"parameters": [
{
"description": "subject uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Subject"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns a subject as JSON",
"tags": [
"Subjects"
]
},
"put": {
"consumes": [
"application/json"
],
"operationId": "UpdateSubject",
"parameters": [
{
"description": "subject uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "properties to be updated (only submit values that should be changed)",
"in": "body",
"name": "subject",
"required": true,
"schema": {
"$ref": "#/definitions/form.Subject"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Subject"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "updates subject properties",
"tags": [
"Subjects"
]
}
},
"/api/v1/subjects/{uid}/like": {
"delete": {
"consumes": [
"application/json"
],
"operationId": "DislikeSubject",
"parameters": [
{
"description": "subject uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "removes the favorite flag from a subject",
"tags": [
"Subjects"
]
},
"post": {
"consumes": [
"application/json"
],
"operationId": "LikeSubject",
"parameters": [
{
"description": "subject uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "flags a subject as favorite",
"tags": [
"Subjects"
]
}
},
"/api/v1/svg/{icon}": {
"get": {
"operationId": "GetSvg",
"parameters": [
{
"description": "SVG icon name",
"enum": [
"user",
"face",
"camera",
"photo",
"raw",
"file",
"video",
"label",
"portrait",
"folder",
"album",
"broken",
"uncached"
],
"in": "path",
"name": "icon",
"required": true,
"type": "string"
}
],
"produces": [
"image/svg+xml"
],
"responses": {
"200": {
"description": "SVG icon",
"schema": {
"type": "string"
}
},
"404": {
"description": "Icon not found",
"schema": {
"$ref": "#/definitions/gin.H"
}
}
},
"summary": "returns SVG placeholder symbols for UI fallbacks",
"tags": [
"Assets"
]
}
},
"/api/v1/t/{thumb}/{token}/{size}": {
"get": {
"description": "For more information see:\n- https://docs.photoprism.app/developer-guide/api/thumbnails/#image-endpoint-uri",
"operationId": "GetThumb",
"parameters": [
{
"description": "SHA1 file hash, optionally with a crop area suffixed, e.g. '-016014058037'",
"in": "path",
"name": "thumb",
"required": true,
"type": "string"
},
{
"description": "user-specific security token provided with session or 'public' when running PhotoPrism in public mode",
"in": "path",
"name": "token",
"required": true,
"type": "string"
},
{
"description": "thumbnail size",
"enum": [
"tile_50",
"tile_100",
"left_224",
"right_224",
"tile_224",
"tile_500",
"fit_720",
"tile_1080",
"fit_1280",
"fit_1600",
"fit_1920",
"fit_2048",
"fit_2560",
"fit_3840",
"fit_4096",
"fit_7680"
],
"in": "path",
"name": "size",
"required": true,
"type": "string"
}
],
"produces": [
"image/jpeg",
" image/svg+xml"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "file"
}
},
"403": {
"description": "Forbidden",
"schema": {
"type": "file"
}
}
},
"summary": "returns a thumbnail image with the requested size",
"tags": [
"Images",
"Files"
]
}
},
"/api/v1/users/{uid}": {
"put": {
"consumes": [
"application/json"
],
"operationId": "UpdateUser",
"parameters": [
{
"description": "user uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "properties to be updated",
"in": "body",
"name": "user",
"required": true,
"schema": {
"$ref": "#/definitions/form.User"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.User"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"409": {
"description": "Conflict",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "update user profile information",
"tags": [
"Users"
]
}
},
"/api/v1/users/{uid}/avatar": {
"post": {
"consumes": [
"multipart/form-data"
],
"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,
"type": "string"
},
{
"description": "avatar image (png or jpeg, \u003c= 20 MB)",
"in": "formData",
"name": "files",
"required": true,
"type": "file"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.User"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "upload a new avatar image for a user",
"tags": [
"Users"
]
}
},
"/api/v1/users/{uid}/passcode": {
"post": {
"consumes": [
"application/json"
],
"operationId": "CreateUserPasscode",
"parameters": [
{
"description": "user uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "passcode setup (password required)",
"in": "body",
"name": "request",
"required": true,
"schema": {
"$ref": "#/definitions/form.Passcode"
}
}
],
"produces": [
"application/json"
],
"responses": {
"201": {
"description": "Created",
"schema": {
"$ref": "#/definitions/entity.Passcode"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "create a new 2FA passcode for a user",
"tags": [
"Users"
]
}
},
"/api/v1/users/{uid}/passcode/activate": {
"post": {
"operationId": "ActivateUserPasscode",
"parameters": [
{
"description": "user uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Passcode"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "activate 2FA with a verified passcode",
"tags": [
"Users"
]
}
},
"/api/v1/users/{uid}/passcode/confirm": {
"post": {
"consumes": [
"application/json"
],
"operationId": "ConfirmUserPasscode",
"parameters": [
{
"description": "user uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "verification code",
"in": "body",
"name": "request",
"required": true,
"schema": {
"$ref": "#/definitions/form.Passcode"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Passcode"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "verify a new 2FA passcode",
"tags": [
"Users"
]
}
},
"/api/v1/users/{uid}/passcode/deactivate": {
"post": {
"consumes": [
"application/json"
],
"operationId": "DeactivateUserPasscode",
"parameters": [
{
"description": "user uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "password for confirmation",
"in": "body",
"name": "request",
"required": true,
"schema": {
"$ref": "#/definitions/form.Passcode"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "deactivate 2FA and remove the passcode",
"tags": [
"Users"
]
}
},
"/api/v1/users/{uid}/password": {
"put": {
"consumes": [
"application/json"
],
"operationId": "UpdateUserPassword",
"parameters": [
{
"description": "user uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "old and new password",
"in": "body",
"name": "request",
"required": true,
"schema": {
"$ref": "#/definitions/form.ChangePassword"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "change a user's password",
"tags": [
"Users",
"Authentication"
]
}
},
"/api/v1/users/{uid}/sessions": {
"get": {
"operationId": "FindUserSessions",
"parameters": [
{
"description": "user uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "maximum number of results",
"in": "query",
"maximum": 100000,
"minimum": 1,
"name": "count",
"required": true,
"type": "integer"
},
{
"description": "result offset",
"in": "query",
"minimum": 0,
"name": "offset",
"type": "integer"
},
{
"description": "filter by username or client name",
"in": "query",
"name": "q",
"type": "string"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"items": {
"$ref": "#/definitions/entity.Session"
},
"type": "array"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "list sessions for a user",
"tags": [
"Users",
"Authentication"
]
}
},
"/api/v1/users/{uid}/upload/{token}": {
"post": {
"consumes": [
"multipart/form-data"
],
"operationId": "UploadUserFiles",
"parameters": [
{
"description": "user uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "upload token",
"in": "path",
"name": "token",
"required": true,
"type": "string"
},
{
"description": "one or more files to upload (repeat the field for multiple files)",
"in": "formData",
"name": "files",
"required": true,
"type": "file"
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"413": {
"description": "Request Entity Too Large",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"507": {
"description": "Insufficient Storage",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "upload files to a user's upload folder",
"tags": [
"Users",
"Files"
]
},
"put": {
"consumes": [
"application/json"
],
"operationId": "ProcessUserUpload",
"parameters": [
{
"description": "user uid",
"in": "path",
"name": "uid",
"required": true,
"type": "string"
},
{
"description": "upload token",
"in": "path",
"name": "token",
"required": true,
"type": "string"
},
{
"description": "processing options",
"in": "body",
"name": "options",
"required": true,
"schema": {
"$ref": "#/definitions/form.UploadOptions"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"409": {
"description": "Conflict",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "process previously uploaded files for a user",
"tags": [
"Users",
"Files"
]
}
},
"/api/v1/videos/{hash}/{token}/{format}": {
"get": {
"description": "For more information see:\n- https://docs.photoprism.app/developer-guide/api/thumbnails/#video-endpoint-uri",
"operationId": "GetVideo",
"parameters": [
{
"description": "SHA1 video file hash",
"in": "path",
"name": "hash",
"required": true,
"type": "string"
},
{
"description": "user-specific security token provided with session",
"in": "path",
"name": "token",
"required": true,
"type": "string"
},
{
"description": "video format, e.g. mp4",
"in": "path",
"name": "format",
"required": true,
"type": "string"
}
],
"produces": [
"video/mp4"
],
"responses": {
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns a video, optionally limited to a byte range for streaming",
"tags": [
"Files",
"Videos"
]
}
},
"/api/v1/vision/caption": {
"post": {
"operationId": "PostVisionCaption",
"parameters": [
{
"description": "list of image file urls",
"in": "body",
"name": "images",
"required": true,
"schema": {
"$ref": "#/definitions/vision.ApiRequest"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/vision.ApiResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"501": {
"description": "Not Implemented",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns a suitable caption for an image",
"tags": [
"Vision"
]
}
},
"/api/v1/vision/face": {
"post": {
"operationId": "PostVisionFace",
"parameters": [
{
"description": "list of image file urls",
"in": "body",
"name": "images",
"required": true,
"schema": {
"$ref": "#/definitions/vision.ApiRequest"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/vision.ApiResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"501": {
"description": "Not Implemented",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns the embeddings of a face image",
"tags": [
"Vision"
]
}
},
"/api/v1/vision/labels": {
"post": {
"consumes": [
"application/json"
],
"operationId": "PostVisionLabels",
"parameters": [
{
"description": "list of image file urls",
"in": "body",
"name": "images",
"required": true,
"schema": {
"$ref": "#/definitions/vision.ApiRequest"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/vision.ApiResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns suitable labels for an image",
"tags": [
"Vision"
]
}
},
"/api/v1/vision/nsfw": {
"post": {
"consumes": [
"application/json"
],
"operationId": "PostVisionNsfw",
"parameters": [
{
"description": "list of image file urls",
"in": "body",
"name": "images",
"required": true,
"schema": {
"$ref": "#/definitions/vision.ApiRequest"
}
}
],
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/vision.ApiResponse"
}
},
"401": {
"description": "Unauthorized",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"429": {
"description": "Too Many Requests",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "checks the specified images for inappropriate content",
"tags": [
"Vision"
]
}
},
"/api/v1/zip": {
"post": {
"operationId": "ZipCreate",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "file"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "creates a zip file archive for download",
"tags": [
"Download"
]
}
},
"/api/v1/zip/{filename}": {
"get": {
"operationId": "ZipDownload",
"parameters": [
{
"description": "zip archive filename returned by the POST /api/v1/zip endpoint",
"in": "path",
"name": "filename",
"required": true,
"type": "string"
}
],
"produces": [
"application/zip"
],
"responses": {
"200": {
"description": "OK",
"schema": {
"type": "file"
}
},
"403": {
"description": "Forbidden",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"404": {
"description": "Not Found",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/i18n.Response"
}
}
},
"summary": "returns a zip file archive after it has been created",
"tags": [
"Download"
]
}
},
"/api/v1/{any}": {
"options": {
"description": "A preflight request is automatically issued by a browser and in normal cases, front-end developers don't need to craft such requests themselves. It appears when request is qualified as \"to be preflighted\" and omitted for simple requests.",
"operationId": "Options",
"responses": {
"204": {
"description": "No Content"
}
},
"summary": "returns CORS headers with an empty response body",
"tags": [
"CORS"
]
}
},
"/s/{token}": {
"get": {
"operationId": "ShareToken",
"parameters": [
{
"description": "Share token",
"in": "path",
"name": "token",
"required": true,
"type": "string"
}
],
"produces": [
"text/html"
],
"responses": {
"200": {
"description": "Rendered HTML page",
"schema": {
"type": "string"
}
},
"302": {
"description": "Redirect to the base site when the token is invalid",
"schema": {
"type": "string"
}
}
},
"summary": "creates a session using the specified share token and renders the generic sharing bootstrap page",
"tags": [
"Sharing"
]
}
},
"/s/{token}/{shared}": {
"get": {
"operationId": "ShareTokenShared",
"parameters": [
{
"description": "Share token",
"in": "path",
"name": "token",
"required": true,
"type": "string"
},
{
"description": "Shared resource UID",
"in": "path",
"name": "shared",
"required": true,
"type": "string"
}
],
"produces": [
"text/html"
],
"responses": {
"200": {
"description": "Rendered HTML page",
"schema": {
"type": "string"
}
},
"302": {
"description": "Redirect to the base site when the token is invalid",
"schema": {
"type": "string"
}
}
},
"summary": "creates a session with the specified share token and redirects to the shared content",
"tags": [
"Sharing"
]
}
},
"/s/{token}/{shared}/preview": {
"get": {
"operationId": "SharePreview",
"parameters": [
{
"description": "Share token",
"in": "path",
"name": "token",
"required": true,
"type": "string"
},
{
"description": "Shared resource UID",
"in": "path",
"name": "shared",
"required": true,
"type": "string"
}
],
"produces": [
"image/jpeg"
],
"responses": {
"200": {
"description": "Preview image",
"schema": {
"type": "file"
}
},
"302": {
"description": "Redirect to the default preview page",
"schema": {
"type": "string"
}
}
},
"summary": "returns a share preview image when the token is valid",
"tags": [
"Sharing"
]
}
},
"/swagger.json": {
"get": {
"operationId": "GetDocs",
"produces": [
"application/json"
],
"responses": {
"200": {
"description": "Swagger JSON",
"schema": {
"$ref": "#/definitions/gin.H"
}
}
},
"summary": "serves embedded Swagger documentation (debug builds only)",
"tags": [
"Debug"
]
}
},
"/ws": {
"get": {
"operationId": "WebSocket",
"responses": {
"101": {
"description": "Switching Protocols",
"schema": {
"type": "string"
}
},
"403": {
"description": "Forbidden",
"schema": {
"type": "string"
}
}
},
"summary": "opens a WebSocket connection for real-time events",
"tags": [
"WebSocket"
]
}
}
},
"security": [
{
"BearerAuth": []
}
],
"securityDefinitions": {
"BearerAuth": {
"in": "header",
"name": "Authorization",
"type": "apiKey"
}
},
"swagger": "2.0"
}