{"paths":{"\/api\/meta.json":{"get":{"description":"GET \/api\/meta.json","tags":["api"]}},"\/app\/login\/verify":{"get":{"summary":"Redirects to external authentication provider (Keycloak).","description":"","operationId":"getAppLoginVerify","tags":["app"]}},"\/app\/login":{"get":{"tags":["app"],"description":"","operationId":"getAppLogin","summary":"Redirects to external authentication provider (Keycloak)."}},"\/api\/v0.20\/health\/readiness":{"get":{"description":"See https:\/\/kubernetes.io\/docs\/concepts\/configuration\/liveness-readiness-startup-probes\/#readiness-probe","tags":["Health"],"operationId":"getApiV0.20HealthReadiness","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Readiness check used to determine if webserver is ready to accept traffic"}},"\/api\/v0.19\/graphqlSubscribe":{"get":{"summary":"GraphQL API over websocket.","tags":["GraphQL"],"description":"Serves the GraphQL API over websockets to support streaming results like subscriptions.\n\nThe following sub-protocols are supported:\n- [graphql-transport-ws](https:\/\/github.com\/enisdenjo\/graphql-ws\/blob\/master\/PROTOCOL.md)\n- [graphql-ws](https:\/\/github.com\/apollographql\/subscriptions-transport-ws\/blob\/master\/PROTOCOL.md)","operationId":"getApiV0.19GraphqlSubscribe","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/v0.20\/auth\/api-key\/generate":{"get":{"operationId":"getApiV0.20AuthApi-keyGenerate","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Generates an API key for the current user","parameters":[{"schema":{"type":"integer","format":"int64","nullable":true},"required":false,"example":2678400,"name":"expireSeconds","description":"Number of seconds until the key expires.","in":"query"},{"schema":{"nullable":true,"type":"string"},"required":false,"example":"ReadOnlyUser","name":"role","description":"Role of the new key.","in":"query"}],"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"},"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}}}},"description":"OK"}},"description":"Generates, stores, and returns a new API key with the default expiration period for the user currently logged in.\n\nOnce created, you can then provide this API key in an\n`Authorization: PL-API-KEY <Key>` header in replacement of an `X-PL-AUTH` header.","tags":["Authentication"]}},"\/api\/v0.20\/datasync":{"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"operationId":"getApiV0.20Datasync","summary":"QuantumSync API Legacy Route. Use \/api\/v0.20\/quantumsync instead.","tags":["Quantum Sync"],"deprecated":true,"description":"Refer to the \/api\/v0.20\/quantumsync route documentation for full details. This route will be removed in the next major version."}},"\/api\/quantumsync":{"get":{"description":"# Custom QuantumSync\/ShadowClient API:\n\n## QuantumSync QuantumSyncRequestTypes:\n### `start`: authenticates and specifies an initial context. note: the id for start and updateContext is used to key a Dictionary[String:AnyRootedQuantumGraph]\nex)\n```json\n{\n    \"type\": \"start\",\n    \"id\": \"site\",\n    \"appType\":\"BuildingStudio\"\n    \"payload\": {\n        \"authToken\": \"REDACTED\",\n        \"ID\": \"ACAF9E07-5031-4BC2-A8C5-D2C6598D83DE\",\n        \"from\": \"Site\",\n        \"include\": [\n            \"Site\",\n            \"Building\",\n            \"Floor\",\n            \"Zone\"\n    ]\n    }\n}\n```\n\n### `updateContext`: change the current context \/ graph in memory.\nnote: the previous graph\/context can be returned from memory by using updateContext id: <previous id used in start or updateContext>.\nUp to 5 contexts can be loaded before prevention (error) or deleteContext message needed to free up loaded count to load a new context.\n\nex)\n```json\n{\n    \"type\": \"updateContext\",\n    \"id\": \"building\",\n    \"payload\": {\n        \"ID\": \"ACAF9E07-5031-4BC2-A8C5-D2C6598D83DE\",\n        \"from\": \"Building\",\n        \"include\": [\n            \"Site\",\n            \"Floor\",\n            \"Zone\",\n            \"Image\",\n            \"Surface\",\n            \"Adjacency\",\n            \"System\",\n            \"Quanta\",\n            \"Manufacturer\",\n            \"Equipment\",\n            \"Property\",\n            \"Location\"\n        ]\n    }\n}\n```\n\n### `deleteContext`: delete\/clear the context out of memory.\nex)\n```json\n{\n    \"type\": \"deleteContext\",\n    \"id\": \"building\",\n    \"payload\": {}\n}\n```\n\n### `sync`: create\/update\/delete QuantumObjects via a FlatGraphDiff as the payload.\n\nExecuting concurrent sync's is not allowed. If there is a sync already processing and another sync is requested before the response of the first sync is sent, then the 2nd symc will return an error saying there is a sync currently processing, and to wait until its finished before requesting another sync.\n\nex)\n```json\n{\n    \"type\": \"sync\",\n    \"id\": \"F5B6BC51-B991-440C-8ACB-B55C65FD7C24\",\n    \"payload\": {\n        \"added\": [],\n        \"updated\": [\n            {\n                \"description\": null,\n                \"ID\": \"80187B0B-CEEB-488A-A9B7-06784CFB0464\",\n                \"longitude\": null,\n                \"locationPropertyID\": null,\n                \"elevation\": null,\n                \"latitude\": null,\n                \"address\": null,\n                \"timeZone\": null,\n                \"siteIDs\": [\n                    \"7E7E04B4-8F32-4585-839D-E0EFC7BB3544\"\n                ],\n                \"weatherSourceIDs\": [],\n                \"locked\": false,\n                \"authGroupID\": \"A1EBEC59-D887-473F-A5C5-7CBD4ADB2556\",\n                \"__typename\": \"Location\",\n                \"name\": \"foo\"\n            }\n        ],\n        \"removed\": []\n    }\n}\n```\n\n### `syncEphemeral`: create\/update\/delete QuantumObjects via a FlatGraphDiff as the payload, do not write them to the database,\nand discard them at the end of the websocket session.\nex)\n```json\n{\n    \"type\": \"syncEphemeral\",\n    \"id\": \"F5B6BC51-B991-440C-8ACB-B55C65FD7C24\",\n    \"payload\": {\n        \"added\": [],\n        \"updated\": [\n            {\n                \"description\": null,\n                \"ID\": \"80187B0B-CEEB-488A-A9B7-06784CFB0464\",\n                \"longitude\": null,\n                \"locationPropertyID\": null,\n                \"elevation\": null,\n                \"latitude\": null,\n                \"address\": null,\n                \"timeZone\": null,\n                \"siteIDs\": [\n                    \"7E7E04B4-8F32-4585-839D-E0EFC7BB3544\"\n                ],\n                \"weatherSourceIDs\": [],\n                \"locked\": false,\n                \"authGroupID\": \"A1EBEC59-D887-473F-A5C5-7CBD4ADB2556\",\n                \"__typename\": \"Location\",\n                \"name\": \"foo\"\n            }\n        ],\n        \"removed\": []\n    }\n}\n```\n\n### `propertyHistory`: Get history data for a property & listen for updates.\nex)\n```json\n{\n    \"type\": \"propertyHistory\",\n    \"id\": \"propertyHistory1\",\n    \"payload\": {\n        \"propertyIDs\": [\"E585C3B8-F1E5-40D0-83A7-658B248DF103\"],\n        \"startAt\": \"2024-01-01T00:00:00Z\",\n        \"endAt\": \"2024-01-01T01:00:00Z\",\n        \"resample\": {\n            \"interval\": {\n                \"to\": \"minutely\",\n                \"reduceUsing\": \"avg\",\n                \"fillUsing\": \"interpolate\"\n        },\n        \"pollIntervalSec\": 60\n    }\n}\n\n### `propertyHistoryStop`: Stop listening for property history updates\nex)\n```json\n{\n    \"type\": \"propertyHistoryStop\",\n    \"id\": \"propertyHistory1\"\n}\n```\n\n### `writeHistory`: Write historical data to a property\nex)\n```json\n{\n    \"type\": \"writeHistory\",\n    \"id\": \"writeHistory\",\n    \"payload\": {\n        \"histories\": [\n            {\n                \"propertyID\": \"E585C3B8-F1E5-40D0-83A7-658B248DF103\",\n                \"time\": \"2024-01-01T00:00:00Z\",\n                \"value\": 5.0\n            }\n        ]\n    }\n}\n```","summary":"QuantumSync API over websockets","tags":["Quantum Sync"],"operationId":"getApiQuantumsync","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/app\/az\/**":{"get":{"description":"GET \/app\/az\/**","tags":["app"]}},"\/api\/v0.19\/organization\/update-image":{"post":{"operationId":"postApiV0.19OrganizationUpdate-image","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Updates the organization's image","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"},"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}}}}}},"description":"Verifies that the user making the request has sufficient permissions to change the image for the organization.\nTakes in a new image as the new organization image. Creates or replaces the previously stored image.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/OrganizationImageData"},"examples":{"OrganizationImageData":{"$ref":"#\/components\/examples\/OrganizationImageData"}}}},"required":true},"tags":["Organization"]}},"\/api\/v0.19\/account\/user\/delete":{"delete":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"operationId":"deleteApiV0.19AccountUserDelete","summary":"Deletes the user making this request.","description":"Deletes the requesting user if they are not a SuperUser within any organizations.\nOtherwise prompts them to transfer ownership or delete the org before making this request.","tags":["Account"]}},"\/api\/v0.19\/account\/credentials":{"get":{"description":"Retrieves the list of credentials enabled for the current user as reported by Keycloak. Credential types include password,\nTOPT, and passkeys. Note that `createdDate` will be sent as an ISO 8601 formatted string (e.g. 2025-10-10T16:32:11Z). Also note\nthat this API must be called with a properly authenticated JWT.","operationId":"getApiV0.19AccountCredentials","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"responses":{"200":{"content":{"application\/json":{"schema":{"type":"array","items":{"$ref":"#\/components\/schemas\/KeycloakCredentialInfo"}}}},"description":"OK"}},"tags":["Account"],"summary":"Retrieves a list of the credentials the current user has enabled."}},"\/api\/v0.19\/auth\/whoami":{"get":{"responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"WhoAmIResponse":{"$ref":"#\/components\/examples\/WhoAmIResponse"}},"schema":{"$ref":"#\/components\/schemas\/WhoAmIResponse"}}}}},"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"operationId":"getApiV0.19AuthWhoami","description":"Useful to check if a user is authenticated.","summary":"Returns information about the currently logged in user."}},"\/api\/v0.19\/organization\/update-logo":{"post":{"operationId":"postApiV0.19OrganizationUpdate-logo","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Updates the organization's logo","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"},"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}}}}}},"description":"Verifies that the user making the request has sufficient permissions to change the logo for the organization.\nTakes in a new image as the organization's logo. Creates or replaces the previous stored logo.","requestBody":{"content":{"application\/json":{"examples":{"OrganizationImageData":{"$ref":"#\/components\/examples\/OrganizationImageData"}},"schema":{"$ref":"#\/components\/schemas\/OrganizationImageData"}}},"required":true},"tags":["Organization"]}},"\/app\/qe\/*":{"get":{"tags":["app"],"description":"GET \/app\/qe\/*"}},"\/api\/organization\/update-logo":{"post":{"operationId":"postApiOrganizationUpdate-logo","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Updates the organization's logo","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"},"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}}}},"description":"OK"}},"description":"Verifies that the user making the request has sufficient permissions to change the logo for the organization.\nTakes in a new image as the organization's logo. Creates or replaces the previous stored logo.","requestBody":{"required":true,"content":{"application\/json":{"examples":{"OrganizationImageData":{"$ref":"#\/components\/examples\/OrganizationImageData"}},"schema":{"$ref":"#\/components\/schemas\/OrganizationImageData"}}}},"tags":["Organization"]}},"\/api\/account\/user\/delete":{"delete":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"description":"Deletes the requesting user if they are not a SuperUser within any organizations.\nOtherwise prompts them to transfer ownership or delete the org before making this request.","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"tags":["Account"],"operationId":"deleteApiAccountUserDelete","summary":"Deletes the user making this request."}},"\/api\/authgroup\/join":{"post":{"deprecated":true,"operationId":"postApiAuthgroupJoin","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Accepts an AuthGroup Invitation","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"description":"Used by the front end `\/app\/login\/post-auth` route to accept project (auth group) invitations. The role the user receives in the\nreferenced AuthGroup is determined through AuthGroup invite role; if no role is defined, we default to read-only user.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/AcceptOrganizationInvite"},"examples":{"AcceptOrganizationInvite":{"$ref":"#\/components\/examples\/AcceptOrganizationInvite"}}}},"required":true},"tags":["Auth Groups"]},"get":{"operationId":"getApiAuthgroupJoin","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Accepts an AuthGroup Invitation","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"description":"DEPRECATED: GET \/api\/authgroup\/join was used to accept a project (auth group) invitation by clicking directly in an email.\nAccepting invitations is now handled by the \/app\/login\/post-auth route provided by the front end, which calls POST\n\/api\/authgroup\/join. This can be removed when any invitations linked to in this way have expired.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/AcceptOrganizationInvite"},"examples":{"AcceptOrganizationInvite":{"$ref":"#\/components\/examples\/AcceptOrganizationInvite"}}}},"required":true},"tags":["Auth Groups"]}},"\/app\/al\/**":{"get":{"tags":["app"],"description":"GET \/app\/al\/**"}},"\/api\/v0.19\/auth\/keys":{"get":{"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/JWKS"}}},"description":"OK"}},"tags":["Authentication"],"summary":"Returns the public keys used to sign PassiveLogic JSON web tokens.","description":"Returns the public keys used to sign the JSON web tokens so their authenticity can be verified. These are served in the\nstandard JSON Web Key format: https:\/\/www.rfc-editor.org\/rfc\/rfc7517","operationId":"getApiV0.19AuthKeys"}},"\/api\/metrics":{"get":{"description":"GET \/api\/metrics","tags":["api"]}},"\/api\/util\/version":{"get":{"operationId":"getApiUtilVersion","description":"Returns commit hashes & build times for the running build of the webserver and all apps.","responses":{"200":{"description":"OK","content":{"text\/plain":{"examples":{"String":{"$ref":"#\/components\/examples\/String"}},"schema":{"type":"string"}}}}},"tags":["Utility"],"summary":"Returns version information","deprecated":true}},"\/api\/v0.20\/image\/user-avatar":{"post":{"operationId":"postApiV0.20ImageUser-avatar","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Update user avatar image","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}},"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"}}}}},"description":"Uploads and updates the avatar image URL with the new image URL.","requestBody":{"required":true,"content":{"application\/json":{"examples":{"ImageData":{"$ref":"#\/components\/examples\/ImageData"}},"schema":{"$ref":"#\/components\/schemas\/ImageData"}}}},"tags":["Images"]}},"\/api\/v0.20\/auth\/magic-link-login":{"get":{"deprecated":true,"operationId":"getApiV0.20AuthMagic-link-login","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Logs in a user using Magic Link generated by POST magic-link-generate","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nRequires a magic login link containing containing `?token=<signed JWT with user email contained>`.\nThis is the secure mode and MUST be used in production.","tags":["Authentication"]}},"\/api\/tunnel\/{serialNumber}\/**":{"put":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"description":"PUT \/tunnel\/:serialNumber\/**","tags":["tunnel"]},"delete":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"description":"DELETE \/tunnel\/:serialNumber\/**","tags":["tunnel"]},"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"description":"GET \/tunnel\/:serialNumber\/**","tags":["tunnel"]},"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"description":"POST \/tunnel\/:serialNumber\/**","tags":["tunnel"]}},"\/api\/v0.20\/device\/tailscale\/authToken":{"get":{"tags":["PassiveLogic Device"],"summary":"Generates an OAuth token for Tailscale","description":"AutToken generated allowing hive's to enroll in our tailnet.\n\nmTLS authentication required.","operationId":"getApiV0.20DeviceTailscaleAuthToken","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/TailscalePostTailnetKeyResponse"}}},"description":"OK"}},"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/v0.20\/authgroup\/decline":{"post":{"operationId":"postApiV0.20AuthgroupDecline","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Declines an AuthGroup invitation","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"description":"Rejects an invitation based on AuthGroup invite ID.\nInvitation is deleted.","requestBody":{"required":true,"content":{"application\/json":{"examples":{"DeclineOrganizationInvite":{"$ref":"#\/components\/examples\/DeclineOrganizationInvite"}},"schema":{"$ref":"#\/components\/schemas\/DeclineOrganizationInvite"}}}},"tags":["Auth Groups"]}},"\/api\/auth\/register\/initiate":{"post":{"deprecated":true,"operationId":"postApiAuthRegisterInitiate","summary":"Sends an email to begin email verification and registration.","responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nInitiates the PassiveLogic registration process by sending an email to the given user. A user is not stored in the system\nat this point in the process - instead this serves as the initial step proving that a uer has access to the email they\nare signing up with.\n\nEmail will contain a link that holds a signed JWT from us. That JWT is later used to validate and complete registration.\n\nNo authentication required.","requestBody":{"required":true,"content":{"application\/json":{"examples":{"UserRegistrationInitiation":{"$ref":"#\/components\/examples\/UserRegistrationInitiation"}},"schema":{"$ref":"#\/components\/schemas\/UserRegistrationInitiation"}}}},"tags":["Authentication"]}},"\/api\/v0.19\/util\/version":{"get":{"description":"Returns commit hashes & build times for the running build of the webserver and all apps.","responses":{"200":{"content":{"text\/plain":{"examples":{"String":{"$ref":"#\/components\/examples\/String"}},"schema":{"type":"string"}}},"description":"OK"}},"operationId":"getApiV0.19UtilVersion","deprecated":true,"tags":["Utility"],"summary":"Returns version information"}},"\/api\/v0.20\/auth\/zendesk":{"get":{"operationId":"getApiV0.20AuthZendesk","tags":["Authentication"],"description":"Redirects a user to the PassiveLogic Zendesk portal.\nIf they are already authenticated with their PL account when making this request,\nthey will be automatically logged in to Zendesk as well. Otherwise they will be redirected to the Zendesk login page.\nA `returnTo` query parameter can be used to support deep linking to, for example, specific support articles.","summary":"Logs a user in to Zendesk using their PL Account"}},"\/api\/datasync":{"get":{"summary":"QuantumSync API Legacy Route. Use \/api\/quantumsync instead.","tags":["Quantum Sync"],"operationId":"getApiDatasync","deprecated":true,"description":"Refer to the \/api\/quantumsync route documentation for full details. This route will be removed in the next major version.","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/v0.20\/site\/copy":{"post":{"operationId":"postApiV0.20SiteCopy","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Copy Project from one organization to another","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ObjectIdentifiers"}}},"description":"OK"}},"description":"Copies Project from one organization to a target organization given a project Identifier.\nAll UUID's are created new for the copied project.\nReturns a mapping of old identifiers and new identifiers of the given project.\nHistory data is NOT copied unless startDate and endDate are provided.\nHistory copy will take time to complete in the background and there will be no indication of success.","parameters":[{"in":"query","name":"targetOrganizationID","description":"Organization to copy the given site into.","required":true,"schema":{"type":"string","format":"uuid"}},{"in":"query","name":"siteID","description":"Site to copy.","required":true,"schema":{"type":"string","format":"uuid"}},{"in":"query","name":"siteName","description":"Optionally change the copied site name.","required":false,"schema":{"type":"string","nullable":true}},{"in":"query","name":"siteDirectory","description":"Optionally change the copied site directory.","required":false,"schema":{"type":"string","nullable":true}},{"in":"query","name":"startDate","description":"Date to start copying history from. Required to export all history.","required":false,"schema":{"nullable":true,"type":"string"}},{"in":"query","name":"endDate","description":"Date to end copying history at. Required to export all history.","required":false,"schema":{"nullable":true,"type":"string"}}],"tags":["Site"]}},"\/app\/as\/**":{"get":{"tags":["app"],"description":"GET \/app\/as\/**"}},"\/api\/v0.19\/auth\/login":{"get":{"deprecated":true,"operationId":"getApiV0.19AuthLogin","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Logs in a user","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/LoginResponse"},"examples":{"LoginResponse":{"$ref":"#\/components\/examples\/LoginResponse"}}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nLogs in a user. If multi-factor authentication is enabled, returns a multi-factor token that can be used to\nsend a multi-factor code to the user. Otherwise, sets auth & refresh tokens as cookies and returns a whoami for the\nlogged in user.\n\nBasic authentication required.","tags":["Authentication"]}},"\/api\/v0.20\/auth\/email\/change":{"post":{"deprecated":true,"operationId":"postApiV0.20AuthEmailChange","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Initiates an email change for the current user.","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nSends an update email request to the provided new email address.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/UpdatedUserEmail"},"examples":{"UpdatedUserEmail":{"$ref":"#\/components\/examples\/UpdatedUserEmail"}}}}},"tags":["Authentication"]}},"\/api\/v0.20\/export\/property\/history":{"get":{"responses":{"200":{"description":"OK","content":{"text\/plain":{"schema":{"type":"string"},"examples":{"String":{"$ref":"#\/components\/examples\/String"}}}}}},"summary":"Exports CSV formatted property history data","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Export"],"description":"Returns a string representation of property history values in CSV format from the given properties.\nreturns in the following headers:\nTime,Equipment name,Property name,Unit,Value\n\nTime returned in ISO8601 string format","operationId":"getApiV0.20ExportPropertyHistory"}},"\/api\/auth\/password\/reset":{"post":{"deprecated":true,"operationId":"postApiAuthPasswordReset","summary":"Initiates a password reset.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nInitiates a password reset for the given user, sending them an email with a password reset link authenticated to their\naccount only.","requestBody":{"content":{"application\/json":{"examples":{"RequestResetPasswordData":{"$ref":"#\/components\/examples\/RequestResetPasswordData"}},"schema":{"$ref":"#\/components\/schemas\/RequestResetPasswordData"}}},"required":true},"tags":["Authentication"]}},"\/api\/v0.20\/auth\/api-key\/remove":{"post":{"deprecated":true,"operationId":"postApiV0.20AuthApi-keyRemove","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Removes a given API key for the user. This route has been deprecated in favor of: DELETE \/api\/v0.20\/auth\/api-key.","responses":{"200":{"content":{"application\/json":{"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"}}},"description":"OK"}},"description":"Validates that the given token is linked to the currently authenticated user and removes it if so.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RemoveApiKeyRequest"},"examples":{"RemoveApiKeyRequest":{"$ref":"#\/components\/examples\/RemoveApiKeyRequest"}}}},"required":true},"tags":["Authentication"]},"delete":{"deprecated":true,"operationId":"deleteApiV0.20AuthApi-keyRemove","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Removes a given API key for the user. This route has been deprecated in favor of: DELETE \/api\/v0.20\/auth\/api-key.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"},"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}}}}}},"description":"Validates that the given token is linked to the currently authenticated user and removes it if so.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RemoveApiKeyRequest"},"examples":{"RemoveApiKeyRequest":{"$ref":"#\/components\/examples\/RemoveApiKeyRequest"}}}},"required":true},"tags":["Authentication"]}},"\/api\/v0.19\/auth\/api-key":{"delete":{"operationId":"deleteApiV0.19AuthApi-key","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Removes a given API key for the user","responses":{"200":{"content":{"application\/json":{"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"}}},"description":"OK"}},"description":"Validates that the given token is linked to the currently authenticated user and removes it if so.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RemoveApiKeyRequest"},"examples":{"RemoveApiKeyRequest":{"$ref":"#\/components\/examples\/RemoveApiKeyRequest"}}}},"required":true},"tags":["Authentication"]}},"\/api\/v0.20\/util\/quantumlens":{"post":{"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/QuantumLensResponse"}}},"description":"OK"}},"summary":"QuantumLens (iOS) update & compatibility check","description":"Returns the status of the QuantumLens application for the current user.\n\n- `appUpdate`: indicates if a new app version is required (true = forced, false = soft, nil = no update)\n- `osUpdate`: indicates if an iOS update is required (true = update required, nil = compatible)\n- `user`: information about the current user\n\nThis response helps the client determine whether the app or iOS requires an update before continuing.","operationId":"postApiV0.20UtilQuantumlens","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Utility"]}},"\/api\/auth\/keys":{"get":{"tags":["Authentication"],"summary":"Returns the public keys used to sign PassiveLogic JSON web tokens.","description":"Returns the public keys used to sign the JSON web tokens so their authenticity can be verified. These are served in the\nstandard JSON Web Key format: https:\/\/www.rfc-editor.org\/rfc\/rfc7517","operationId":"getApiAuthKeys","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/JWKS"}}}}}}},"\/api\/v0.19\/auth\/password\/change":{"post":{"deprecated":true,"operationId":"postApiV0.19AuthPasswordChange","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Changes a user's password for an already authenticated user.","responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nChanges an authenticated user's password to the specified value.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ChangeUserPassword"},"examples":{"ChangeUserPassword":{"$ref":"#\/components\/examples\/ChangeUserPassword"}}}}},"tags":["Authentication"]},"get":{"summary":"Redirects the user to the change password flow in the external auth provider (Keycloak).","operationId":"getApiV0.19AuthPasswordChange","description":"","tags":["Authentication"],"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/organization\/update-image":{"post":{"operationId":"postApiOrganizationUpdate-image","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Updates the organization's image","responses":{"200":{"content":{"application\/json":{"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}},"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"}}},"description":"OK"}},"description":"Verifies that the user making the request has sufficient permissions to change the image for the organization.\nTakes in a new image as the new organization image. Creates or replaces the previously stored image.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/OrganizationImageData"},"examples":{"OrganizationImageData":{"$ref":"#\/components\/examples\/OrganizationImageData"}}}}},"tags":["Organization"]}},"\/api\/v0.19\/auth\/magic-link-login":{"get":{"deprecated":true,"operationId":"getApiV0.19AuthMagic-link-login","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Logs in a user using Magic Link generated by POST magic-link-generate","responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nRequires a magic login link containing containing `?token=<signed JWT with user email contained>`.\nThis is the secure mode and MUST be used in production.","tags":["Authentication"]}},"\/api\/organization\/invite":{"post":{"operationId":"postApiOrganizationInvite","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Sends an organization invite to the given email.","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"OrgInviteResponse":{"$ref":"#\/components\/examples\/OrgInviteResponse"}},"schema":{"$ref":"#\/components\/schemas\/OrgInviteResponse"}}}}},"description":"Generates and sends an invitation link for the given organization to the given user email.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/InviteUserToOrganizationData"},"examples":{"InviteUserToOrganizationData":{"$ref":"#\/components\/examples\/InviteUserToOrganizationData"}}}},"required":true},"tags":["Organization"]}},"\/api\/v0.20\/binding":{"post":{"operationId":"postApiV0.20Binding","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Uploads a file associated with a binding.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/BindingUploadResponse"},"examples":{"BindingUploadResponse":{"$ref":"#\/components\/examples\/BindingUploadResponse"}}}}}},"description":"Uploads a file to the server and associates that file with a binding node, setting its new stored URL & checksum in the\ndatabase. The data may be sent in either multipart\/form-data or JSON format. If using JSON, the image file must be\nBase64-encoded. Using multipart\/form-data is recommended as it is a more efficient way to transmit binary data.","requestBody":{"content":{"multipart\/form-data":{"schema":{"$ref":"#\/components\/schemas\/UploadFileData"},"examples":{"UploadFileData":{"$ref":"#\/components\/examples\/UploadFileData"}}},"application\/json":{"schema":{"$ref":"#\/components\/schemas\/UploadFileData"},"examples":{"UploadFileData":{"$ref":"#\/components\/examples\/UploadFileData"}}}},"required":true},"tags":["Bindings"]}},"\/api\/v0.20\/auth\/password\/change":{"get":{"description":"","operationId":"getApiV0.20AuthPasswordChange","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Redirects the user to the change password flow in the external auth provider (Keycloak).","tags":["Authentication"]},"post":{"deprecated":true,"operationId":"postApiV0.20AuthPasswordChange","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Changes a user's password for an already authenticated user.","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nChanges an authenticated user's password to the specified value.","requestBody":{"required":true,"content":{"application\/json":{"examples":{"ChangeUserPassword":{"$ref":"#\/components\/examples\/ChangeUserPassword"}},"schema":{"$ref":"#\/components\/schemas\/ChangeUserPassword"}}}},"tags":["Authentication"]}},"\/api\/v0.19\/auth\/api-key\/remove":{"post":{"deprecated":true,"operationId":"postApiV0.19AuthApi-keyRemove","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Removes a given API key for the user. This route has been deprecated in favor of: DELETE \/api\/v0.19\/auth\/api-key.","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"},"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}}}},"description":"OK"}},"description":"Validates that the given token is linked to the currently authenticated user and removes it if so.","requestBody":{"required":true,"content":{"application\/json":{"examples":{"RemoveApiKeyRequest":{"$ref":"#\/components\/examples\/RemoveApiKeyRequest"}},"schema":{"$ref":"#\/components\/schemas\/RemoveApiKeyRequest"}}}},"tags":["Authentication"]},"delete":{"deprecated":true,"operationId":"deleteApiV0.19AuthApi-keyRemove","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Removes a given API key for the user. This route has been deprecated in favor of: DELETE \/api\/v0.19\/auth\/api-key.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"},"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}}}}}},"description":"Validates that the given token is linked to the currently authenticated user and removes it if so.","requestBody":{"required":true,"content":{"application\/json":{"examples":{"RemoveApiKeyRequest":{"$ref":"#\/components\/examples\/RemoveApiKeyRequest"}},"schema":{"$ref":"#\/components\/schemas\/RemoveApiKeyRequest"}}}},"tags":["Authentication"]}},"\/api\/v0.20\/health\/liveness":{"get":{"summary":"Liveness check used to determine when webserver should be restarted","description":"See https:\/\/kubernetes.io\/docs\/concepts\/configuration\/liveness-readiness-startup-probes\/#liveness-probe","operationId":"getApiV0.20HealthLiveness","tags":["Health"],"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/v0.20\/authgroup\/join":{"post":{"deprecated":true,"operationId":"postApiV0.20AuthgroupJoin","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Accepts an AuthGroup Invitation","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"description":"Used by the front end `\/app\/login\/post-auth` route to accept project (auth group) invitations. The role the user receives in the\nreferenced AuthGroup is determined through AuthGroup invite role; if no role is defined, we default to read-only user.","requestBody":{"content":{"application\/json":{"examples":{"AcceptOrganizationInvite":{"$ref":"#\/components\/examples\/AcceptOrganizationInvite"}},"schema":{"$ref":"#\/components\/schemas\/AcceptOrganizationInvite"}}},"required":true},"tags":["Auth Groups"]},"get":{"operationId":"getApiV0.20AuthgroupJoin","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Accepts an AuthGroup Invitation","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"description":"DEPRECATED: GET \/api\/authgroup\/join was used to accept a project (auth group) invitation by clicking directly in an email.\nAccepting invitations is now handled by the \/app\/login\/post-auth route provided by the front end, which calls POST\n\/api\/authgroup\/join. This can be removed when any invitations linked to in this way have expired.","requestBody":{"content":{"application\/json":{"examples":{"AcceptOrganizationInvite":{"$ref":"#\/components\/examples\/AcceptOrganizationInvite"}},"schema":{"$ref":"#\/components\/schemas\/AcceptOrganizationInvite"}}},"required":true},"tags":["Auth Groups"]}},"\/app\/login\/eula":{"get":{"operationId":"getAppLoginEula","tags":["app"],"description":"","summary":"Redirects to external authentication provider (Keycloak)."}},"\/api\/v0.20\/organization\/invite":{"post":{"operationId":"postApiV0.20OrganizationInvite","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Sends an organization invite to the given email.","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"OrgInviteResponse":{"$ref":"#\/components\/examples\/OrgInviteResponse"}},"schema":{"$ref":"#\/components\/schemas\/OrgInviteResponse"}}}}},"description":"Generates and sends an invitation link for the given organization to the given user email.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/InviteUserToOrganizationData"},"examples":{"InviteUserToOrganizationData":{"$ref":"#\/components\/examples\/InviteUserToOrganizationData"}}}},"required":true},"tags":["Organization"]}},"\/api\/v0.20\/account\/credentials":{"get":{"operationId":"getApiV0.20AccountCredentials","summary":"Retrieves a list of the credentials the current user has enabled.","description":"Retrieves the list of credentials enabled for the current user as reported by Keycloak. Credential types include password,\nTOPT, and passkeys. Note that `createdDate` will be sent as an ISO 8601 formatted string (e.g. 2025-10-10T16:32:11Z). Also note\nthat this API must be called with a properly authenticated JWT.","responses":{"200":{"content":{"application\/json":{"schema":{"items":{"$ref":"#\/components\/schemas\/KeycloakCredentialInfo"},"type":"array"}}},"description":"OK"}},"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Account"]}},"\/api\/account\/eula\/accept":{"post":{"deprecated":true,"operationId":"postApiAccountEulaAccept","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Accepts EULA for the current user","responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\nDenotes that the current user has accepted the EULA.\nReturns updated access and refresh tokens.","tags":["Account"]}},"\/app\/login\/**":{"get":{"description":"GET \/app\/login\/**","tags":["app"]}},"\/api\/v0.19\/auth\/register":{"post":{"deprecated":true,"operationId":"postApiV0.19AuthRegister","summary":"Registers a new user","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"RegisterUserResponse":{"$ref":"#\/components\/examples\/RegisterUserResponse"}},"schema":{"$ref":"#\/components\/schemas\/RegisterUserResponse"}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nCreates a new user based on the provided information. Requires jwt obtained via email from\n`\/api\/v0.19\/auth\/register\/initiate`. The user status is set to `Active` and immediately logged in.\n\n\n\nRegistration token is required when email verification is enforced, as indicated by a failed response to this endpoint","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RegisterUserData"},"examples":{"RegisterUserData":{"$ref":"#\/components\/examples\/RegisterUserData"}}}}},"tags":["Authentication"]}},"\/api\/v0.20\/graphqlSubscribe":{"get":{"operationId":"getApiV0.20GraphqlSubscribe","description":"Serves the GraphQL API over websockets to support streaming results like subscriptions.\n\nThe following sub-protocols are supported:\n- [graphql-transport-ws](https:\/\/github.com\/enisdenjo\/graphql-ws\/blob\/master\/PROTOCOL.md)\n- [graphql-ws](https:\/\/github.com\/apollographql\/subscriptions-transport-ws\/blob\/master\/PROTOCOL.md)","tags":["GraphQL"],"summary":"GraphQL API over websocket.","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/auth\/zendesk":{"get":{"summary":"Logs a user in to Zendesk using their PL Account","description":"Redirects a user to the PassiveLogic Zendesk portal.\nIf they are already authenticated with their PL account when making this request,\nthey will be automatically logged in to Zendesk as well. Otherwise they will be redirected to the Zendesk login page.\nA `returnTo` query parameter can be used to support deep linking to, for example, specific support articles.","operationId":"getApiAuthZendesk","tags":["Authentication"]}},"\/api\/organization\/decline":{"post":{"operationId":"postApiOrganizationDecline","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Declines an organization invitation","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"description":"Rejects an invitation based on Organization invite ID.\nInvitation is deleted.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/DeclineOrganizationInvite"},"examples":{"DeclineOrganizationInvite":{"$ref":"#\/components\/examples\/DeclineOrganizationInvite"}}}},"required":true},"tags":["Organization"]}},"\/api\/v0.20\/auth\/logout":{"post":{"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"tags":["Authentication"],"description":"If external auth (Keycloak) is enabled, this initiates the external logout process.\n\nOtherwise, if a cookie keyed by pl-refresh-token is provided in the logout request, that refresh token is revoked.\n\nThe response sets the auth & refresh cookies to empty values & marks them as expired.\nNew tokens must then be generated by the login endpoint.","summary":"Logs out a user","operationId":"postApiV0.20AuthLogout","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/v0.20\/tunnel\/{serialNumber}\/**":{"put":{"description":"PUT \/tunnel\/:serialNumber\/**","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["tunnel"]},"get":{"description":"GET \/tunnel\/:serialNumber\/**","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["tunnel"]},"post":{"description":"POST \/tunnel\/:serialNumber\/**","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["tunnel"]},"delete":{"description":"DELETE \/tunnel\/:serialNumber\/**","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["tunnel"]}},"\/api\/auth\/whoami":{"get":{"operationId":"getApiAuthWhoami","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/WhoAmIResponse"},"examples":{"WhoAmIResponse":{"$ref":"#\/components\/examples\/WhoAmIResponse"}}}}}},"tags":["Authentication"],"summary":"Returns information about the currently logged in user.","description":"Useful to check if a user is authenticated.","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/auth\/password\/change":{"post":{"deprecated":true,"operationId":"postApiAuthPasswordChange","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Changes a user's password for an already authenticated user.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nChanges an authenticated user's password to the specified value.","requestBody":{"required":true,"content":{"application\/json":{"examples":{"ChangeUserPassword":{"$ref":"#\/components\/examples\/ChangeUserPassword"}},"schema":{"$ref":"#\/components\/schemas\/ChangeUserPassword"}}}},"tags":["Authentication"]},"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Redirects the user to the change password flow in the external auth provider (Keycloak).","operationId":"getApiAuthPasswordChange","description":"","tags":["Authentication"]}},"\/api\/binding":{"post":{"operationId":"postApiBinding","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Uploads a file associated with a binding.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/BindingUploadResponse"},"examples":{"BindingUploadResponse":{"$ref":"#\/components\/examples\/BindingUploadResponse"}}}}}},"description":"Uploads a file to the server and associates that file with a binding node, setting its new stored URL & checksum in the\ndatabase. The data may be sent in either multipart\/form-data or JSON format. If using JSON, the image file must be\nBase64-encoded. Using multipart\/form-data is recommended as it is a more efficient way to transmit binary data.","requestBody":{"content":{"multipart\/form-data":{"examples":{"UploadFileData":{"$ref":"#\/components\/examples\/UploadFileData"}},"schema":{"$ref":"#\/components\/schemas\/UploadFileData"}},"application\/json":{"examples":{"UploadFileData":{"$ref":"#\/components\/examples\/UploadFileData"}},"schema":{"$ref":"#\/components\/schemas\/UploadFileData"}}},"required":true},"tags":["Bindings"]}},"\/api\/v0.19\/auth\/magic-link-generate":{"post":{"deprecated":true,"operationId":"postApiV0.19AuthMagic-link-generate","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Generates a Magic Link to be used to login.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/MagicLinkResponse"}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nGenerates magic link containing `?token=<signed JWT with user email contained>` and sends it in an email to the user.\nThis is the secure mode and MUST be used in production.\nThis will not return a link to the client.\n\nIf User does not exist in Database, will throw 400 bad request. If user exists, will return 200 ok.\nThese links can then be used to login from GET magic-link-login.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/UserRegistrationInitiation"},"examples":{"UserRegistrationInitiation":{"$ref":"#\/components\/examples\/UserRegistrationInitiation"}}}}},"tags":["Authentication"]}},"\/api\/auth\/logout":{"post":{"summary":"Logs out a user","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"tags":["Authentication"],"description":"If external auth (Keycloak) is enabled, this initiates the external logout process.\n\nOtherwise, if a cookie keyed by pl-refresh-token is provided in the logout request, that refresh token is revoked.\n\nThe response sets the auth & refresh cookies to empty values & marks them as expired.\nNew tokens must then be generated by the login endpoint.","operationId":"postApiAuthLogout"}},"\/api\/v0.19\/auth\/password\/reset":{"post":{"deprecated":true,"operationId":"postApiV0.19AuthPasswordReset","summary":"Initiates a password reset.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nInitiates a password reset for the given user, sending them an email with a password reset link authenticated to their\naccount only.","requestBody":{"content":{"application\/json":{"examples":{"RequestResetPasswordData":{"$ref":"#\/components\/examples\/RequestResetPasswordData"}},"schema":{"$ref":"#\/components\/schemas\/RequestResetPasswordData"}}},"required":true},"tags":["Authentication"]}},"\/api\/auth\/verify":{"get":{"operationId":"getApiAuthVerify","parameters":[{"description":"User's email to confirm as verified","required":true,"in":"query","schema":{"type":"string"},"example":"darthvader@galactic-empire.com","name":"email"}],"description":"Redirects user to `\/api\/auth\/login`, passing along the provided valid jwt and email.\n\nExists in this form for backward compatibility.","tags":["Authentication"],"summary":"Redirects user to login"}},"\/api\/v0.19\/organization\/join":{"post":{"operationId":"postApiV0.19OrganizationJoin","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Adds a user to an organization","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"description":"Adds user to organization based on Organization invite ID.\nRole in organization is determined through Organization invite role, if no role is defined, we default to read-only user.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/AcceptOrganizationInvite"},"examples":{"AcceptOrganizationInvite":{"$ref":"#\/components\/examples\/AcceptOrganizationInvite"}}}},"required":true},"tags":["Organization"]}},"\/api\/auth\/profile\/change":{"get":{"tags":["Authentication"],"summary":"Redirects the user the change profile flow in the external auth provider (Keycloak).","description":"","operationId":"getApiAuthProfileChange","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/device\/login":{"get":{"summary":"Logs in a PassiveLogic device","description":"Logs in a PassiveLogic device, responding with the authentication token.\n\nmTLS authentication required.","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["PassiveLogic Device"],"operationId":"getApiDeviceLogin","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/DeviceLoginResponse"},"examples":{"DeviceLoginResponse":{"$ref":"#\/components\/examples\/DeviceLoginResponse"}}}}}}}},"\/api\/auth\/password\/reset\/change":{"post":{"deprecated":true,"operationId":"postApiAuthPasswordResetChange","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Changes a user's password from the password reset flow.","responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nChanges a user's password to the specified value, reached from password reset flow.\n\nToken authentication required, only using the authentication JWT decoded from the password reset URL sent to a user\nfrom a reset initiation.","requestBody":{"content":{"application\/json":{"examples":{"ChangePasswordData":{"$ref":"#\/components\/examples\/ChangePasswordData"}},"schema":{"$ref":"#\/components\/schemas\/ChangePasswordData"}}},"required":true},"tags":["Authentication"]}},"\/api\/v0.19\/util\/ping":{"get":{"responses":{"200":{"content":{"text\/plain":{"schema":{"type":"string"},"examples":{"String":{"$ref":"#\/components\/examples\/String"}}}},"description":"OK"}},"description":"Use to check webserver health or keep connection alive. Returns pong message.","tags":["Utility"],"summary":"Keep-alive ping\/pong route","operationId":"getApiV0.19UtilPing"}},"\/api\/auth\/kc\/{user}":{"post":{"operationId":"postApiAuthKcByUser","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Validates a user's password","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"description":"Allows the Keycloak migration plugin to validate a user's password. Once validated, the password is saved\nto Keycloak's database and is subsequently no longer validated using this API.","parameters":[{"in":"path","required":true,"schema":{"type":"string"},"name":"user"}],"tags":["Authentication"]},"get":{"operationId":"getApiAuthKcByUser","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Retrieves user information for Keycloak","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/KeycloakUserInfo"},"examples":{"KeycloakUserInfo":{"$ref":"#\/components\/examples\/KeycloakUserInfo"}}}},"description":"OK"}},"description":"Enables migrating users to Keycloak by providing an API endpoint for retrieving user information. This\ninformation is then saved to Keycloak's own database.","parameters":[{"in":"path","required":true,"schema":{"type":"string"},"name":"user"}],"tags":["Authentication"]}},"\/api\/auth\/api-key":{"delete":{"operationId":"deleteApiAuthApi-key","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Removes a given API key for the user","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"}}}}},"description":"Validates that the given token is linked to the currently authenticated user and removes it if so.","requestBody":{"content":{"application\/json":{"examples":{"RemoveApiKeyRequest":{"$ref":"#\/components\/examples\/RemoveApiKeyRequest"}},"schema":{"$ref":"#\/components\/schemas\/RemoveApiKeyRequest"}}},"required":true},"tags":["Authentication"]}},"\/api\/v0.20\/organization\/update-image":{"post":{"operationId":"postApiV0.20OrganizationUpdate-image","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Updates the organization's image","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"},"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}}}}}},"description":"Verifies that the user making the request has sufficient permissions to change the image for the organization.\nTakes in a new image as the new organization image. Creates or replaces the previously stored image.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/OrganizationImageData"},"examples":{"OrganizationImageData":{"$ref":"#\/components\/examples\/OrganizationImageData"}}}},"required":true},"tags":["Organization"]}},"\/api\/auth\/api-key\/generate":{"get":{"operationId":"getApiAuthApi-keyGenerate","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Generates an API key for the current user","parameters":[{"description":"Number of seconds until the key expires.","example":2678400,"required":false,"name":"expireSeconds","in":"query","schema":{"format":"int64","nullable":true,"type":"integer"}},{"description":"Role of the new key.","example":"ReadOnlyUser","required":false,"name":"role","in":"query","schema":{"nullable":true,"type":"string"}}],"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"},"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}}}},"description":"OK"}},"description":"Generates, stores, and returns a new API key with the default expiration period for the user currently logged in.\n\nOnce created, you can then provide this API key in an\n`Authorization: PL-API-KEY <Key>` header in replacement of an `X-PL-AUTH` header.","tags":["Authentication"]}},"\/api\/v0.20\/auth\/password\/reset":{"post":{"deprecated":true,"operationId":"postApiV0.20AuthPasswordReset","summary":"Initiates a password reset.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nInitiates a password reset for the given user, sending them an email with a password reset link authenticated to their\naccount only.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RequestResetPasswordData"},"examples":{"RequestResetPasswordData":{"$ref":"#\/components\/examples\/RequestResetPasswordData"}}}},"required":true},"tags":["Authentication"]}},"\/api\/v0.20\/auth\/register":{"post":{"deprecated":true,"operationId":"postApiV0.20AuthRegister","summary":"Registers a new user","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"RegisterUserResponse":{"$ref":"#\/components\/examples\/RegisterUserResponse"}},"schema":{"$ref":"#\/components\/schemas\/RegisterUserResponse"}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nCreates a new user based on the provided information. Requires jwt obtained via email from\n`\/api\/v0.20\/auth\/register\/initiate`. The user status is set to `Active` and immediately logged in.\n\n\n\nRegistration token is required when email verification is enforced, as indicated by a failed response to this endpoint","requestBody":{"content":{"application\/json":{"examples":{"RegisterUserData":{"$ref":"#\/components\/examples\/RegisterUserData"}},"schema":{"$ref":"#\/components\/schemas\/RegisterUserData"}}},"required":true},"tags":["Authentication"]}},"\/api\/v0.19\/auth\/profile\/change":{"get":{"description":"","tags":["Authentication"],"operationId":"getApiV0.19AuthProfileChange","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Redirects the user the change profile flow in the external auth provider (Keycloak)."}},"\/api\/auth\/magic-link-login":{"get":{"deprecated":true,"operationId":"getApiAuthMagic-link-login","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Logs in a user using Magic Link generated by POST magic-link-generate","responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nRequires a magic login link containing containing `?token=<signed JWT with user email contained>`.\nThis is the secure mode and MUST be used in production.","tags":["Authentication"]}},"\/api\/v0.20\/account\/eula\/accept":{"post":{"deprecated":true,"operationId":"postApiV0.20AccountEulaAccept","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Accepts EULA for the current user","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\nDenotes that the current user has accepted the EULA.\nReturns updated access and refresh tokens.","tags":["Account"]}},"\/app\/qs\/**":{"get":{"tags":["app"],"description":"GET \/app\/qs\/**"}},"\/api\/v0.20\/util\/pl-hardware-info":{"get":{"tags":["Utility"],"summary":"Indicates to clients whether or not they are hives serving a webserver.","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/DeployedOnHiveResponse"}}},"description":"OK"}},"description":"Returns a JSON object where the field 'runningOnHive' will be true if, on the server, the PL_HIVE_REVISION environment variable\nis set to a number greater than or equal to zero.","operationId":"getApiV0.20UtilPl-hardware-info"}},"\/api\/v0.20\/organization\/decline":{"post":{"operationId":"postApiV0.20OrganizationDecline","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Declines an organization invitation","responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}},"description":"Rejects an invitation based on Organization invite ID.\nInvitation is deleted.","requestBody":{"content":{"application\/json":{"examples":{"DeclineOrganizationInvite":{"$ref":"#\/components\/examples\/DeclineOrganizationInvite"}},"schema":{"$ref":"#\/components\/schemas\/DeclineOrganizationInvite"}}},"required":true},"tags":["Organization"]}},"\/api\/organization\/delete":{"post":{"operationId":"postApiOrganizationDelete","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Deletes specified organization.","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"description":"Completely deletes an organization, after verifying that the user making this request has permission to do so.\nSends an email to all other members of the organization informing them that it has been deleted.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/DeleteOrganizationData"},"examples":{"DeleteOrganizationData":{"$ref":"#\/components\/examples\/DeleteOrganizationData"}}}}},"tags":["Organization"]}},"\/api\/auth\/email\/change":{"post":{"deprecated":true,"operationId":"postApiAuthEmailChange","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Initiates an email change for the current user.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nSends an update email request to the provided new email address.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/UpdatedUserEmail"},"examples":{"UpdatedUserEmail":{"$ref":"#\/components\/examples\/UpdatedUserEmail"}}}},"required":true},"tags":["Authentication"]}},"\/api\/v0.19\/auth\/offline":{"get":{"description":"GET \/auth\/offline","tags":["Authentication"],"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/export\/property\/history":{"get":{"operationId":"getApiExportPropertyHistory","summary":"Exports CSV formatted property history data","tags":["Export"],"description":"Returns a string representation of property history values in CSV format from the given properties.\nreturns in the following headers:\nTime,Equipment name,Property name,Unit,Value\n\nTime returned in ISO8601 string format","responses":{"200":{"description":"OK","content":{"text\/plain":{"examples":{"String":{"$ref":"#\/components\/examples\/String"}},"schema":{"type":"string"}}}}},"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/v0.19\/health\/readiness":{"get":{"summary":"Readiness check used to determine if webserver is ready to accept traffic","tags":["Health"],"operationId":"getApiV0.19HealthReadiness","description":"See https:\/\/kubernetes.io\/docs\/concepts\/configuration\/liveness-readiness-startup-probes\/#readiness-probe","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/app\/**":{"get":{"description":"GET \/app\/**","tags":["app"]}},"\/app\/bs\/**":{"get":{"description":"GET \/app\/bs\/**","tags":["app"]}},"\/api\/auth\/api-key\/remove":{"post":{"deprecated":true,"operationId":"postApiAuthApi-keyRemove","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Removes a given API key for the user. This route has been deprecated in favor of: DELETE \/api\/auth\/api-key.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"},"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}}}}}},"description":"Validates that the given token is linked to the currently authenticated user and removes it if so.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RemoveApiKeyRequest"},"examples":{"RemoveApiKeyRequest":{"$ref":"#\/components\/examples\/RemoveApiKeyRequest"}}}},"required":true},"tags":["Authentication"]},"delete":{"deprecated":true,"operationId":"deleteApiAuthApi-keyRemove","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Removes a given API key for the user. This route has been deprecated in favor of: DELETE \/api\/auth\/api-key.","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"}}}}},"description":"Validates that the given token is linked to the currently authenticated user and removes it if so.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RemoveApiKeyRequest"},"examples":{"RemoveApiKeyRequest":{"$ref":"#\/components\/examples\/RemoveApiKeyRequest"}}}},"required":true},"tags":["Authentication"]}},"\/app\/login\/signUp":{"get":{"tags":["app"],"description":"","summary":"Redirects to external authentication provider (Keycloak).","operationId":"getAppLoginSignUp"}},"\/api\/image":{"post":{"operationId":"postApiImage","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Uploads an image.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"},"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}}}}}},"description":"Uploads an image to the server, setting its new stored url & checksum in the database. If an existing ID is given, this will\nattempt an update of the image data. The data may be sent in either multipart\/form-data or JSON format. If using JSON, the\nimage file must be Base64-encoded. Using multipart\/form-data is recommended as it is a more efficient way to transmit binary\ndata.\n\nThis endpoint is intended for associating image file data with an existing `Image` node in the Quantum schema.","requestBody":{"content":{"multipart\/form-data":{"examples":{"UploadImageData":{"$ref":"#\/components\/examples\/UploadImageData"}},"schema":{"$ref":"#\/components\/schemas\/UploadImageData"}},"application\/json":{"examples":{"UploadImageData":{"$ref":"#\/components\/examples\/UploadImageData"}},"schema":{"$ref":"#\/components\/schemas\/UploadImageData"}}},"required":true},"tags":["Images"]}},"\/api\/v0.20\/auth\/password\/reset\/change":{"post":{"deprecated":true,"operationId":"postApiV0.20AuthPasswordResetChange","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Changes a user's password from the password reset flow.","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nChanges a user's password to the specified value, reached from password reset flow.\n\nToken authentication required, only using the authentication JWT decoded from the password reset URL sent to a user\nfrom a reset initiation.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ChangePasswordData"},"examples":{"ChangePasswordData":{"$ref":"#\/components\/examples\/ChangePasswordData"}}}}},"tags":["Authentication"]}},"\/app\/qc\/**":{"get":{"tags":["app"],"description":"GET \/app\/qc\/**"}},"\/api\/v0.20\/auth\/api-key":{"delete":{"operationId":"deleteApiV0.20AuthApi-key","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Removes a given API key for the user","responses":{"200":{"content":{"application\/json":{"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"}}},"description":"OK"}},"description":"Validates that the given token is linked to the currently authenticated user and removes it if so.","requestBody":{"required":true,"content":{"application\/json":{"examples":{"RemoveApiKeyRequest":{"$ref":"#\/components\/examples\/RemoveApiKeyRequest"}},"schema":{"$ref":"#\/components\/schemas\/RemoveApiKeyRequest"}}}},"tags":["Authentication"]}},"\/api\/v0.20\/auth\/register\/initiate":{"post":{"deprecated":true,"operationId":"postApiV0.20AuthRegisterInitiate","summary":"Sends an email to begin email verification and registration.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nInitiates the PassiveLogic registration process by sending an email to the given user. A user is not stored in the system\nat this point in the process - instead this serves as the initial step proving that a uer has access to the email they\nare signing up with.\n\nEmail will contain a link that holds a signed JWT from us. That JWT is later used to validate and complete registration.\n\nNo authentication required.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/UserRegistrationInitiation"},"examples":{"UserRegistrationInitiation":{"$ref":"#\/components\/examples\/UserRegistrationInitiation"}}}}},"tags":["Authentication"]}},"\/api\/v0.20\/authgroup\/remove\/{authGroupID}\/{userID}":{"post":{"operationId":"postApiV0.20AuthgroupRemoveByAuthGroupIDByUserID","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Removes user from Auth Group","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/AuthGroupRemovalResponse"},"examples":{"AuthGroupRemovalResponse":{"$ref":"#\/components\/examples\/AuthGroupRemovalResponse"}}}}}},"description":"Remove a User from an AuthGroup. Users must have PrivilegedUser or greater permissions to remove another user.\nUser can only remove other users with permissions less than or equal to their own permissions. For example: PrivilegedUsers\ncannot remove SuperUsers.","parameters":[{"in":"path","required":true,"name":"authGroupID","schema":{"type":"string"}},{"in":"path","required":true,"name":"userID","schema":{"type":"string"}}],"tags":["Auth Groups"]}},"\/api\/health\/readiness":{"get":{"summary":"Readiness check used to determine if webserver is ready to accept traffic","description":"See https:\/\/kubernetes.io\/docs\/concepts\/configuration\/liveness-readiness-startup-probes\/#readiness-probe","tags":["Health"],"operationId":"getApiHealthReadiness","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/v0.20\/util\/externalauthconfig":{"get":{"description":"Use to check whether or not external auth (i.e. Keycloak) is enabled, and if so what the public settings are.","operationId":"getApiV0.20UtilExternalauthconfig","responses":{"200":{"content":{"text\/plain":{"schema":{"type":"string"},"examples":{"String":{"$ref":"#\/components\/examples\/String"}}}},"description":"OK"}},"tags":["Utility"],"summary":"Provides information about the external auth configuration"}},"\/api\/auth\/magic-link-generate":{"post":{"deprecated":true,"operationId":"postApiAuthMagic-link-generate","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Generates a Magic Link to be used to login.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/MagicLinkResponse"}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nGenerates magic link containing `?token=<signed JWT with user email contained>` and sends it in an email to the user.\nThis is the secure mode and MUST be used in production.\nThis will not return a link to the client.\n\nIf User does not exist in Database, will throw 400 bad request. If user exists, will return 200 ok.\nThese links can then be used to login from GET magic-link-login.","requestBody":{"content":{"application\/json":{"examples":{"UserRegistrationInitiation":{"$ref":"#\/components\/examples\/UserRegistrationInitiation"}},"schema":{"$ref":"#\/components\/schemas\/UserRegistrationInitiation"}}},"required":true},"tags":["Authentication"]}},"\/api\/v0.20\/graphql":{"post":{"operationId":"postApiV0.20Graphql","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"GraphQL API","externalDocs":{"url":"https:\/\/graphql.org\/learn\/serving-over-http\/#post-request","description":"GraphQL documentation."},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GraphQLResult"}}}}},"description":"Serves the GraphQL API. For more details, see [graphql.org](https:\/\/graphql.org\/learn\/serving-over-http\/#post-request)","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GraphQLRequest"}}},"required":true},"tags":["GraphQL"]},"get":{"operationId":"getApiV0.20Graphql","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"GraphQL API","externalDocs":{"description":"GraphQL documentation.","url":"https:\/\/graphql.org\/learn\/serving-over-http\/#get-request"},"parameters":[{"in":"query","schema":{"type":"string"},"name":"query","required":true},{"in":"query","schema":{"nullable":true,"type":"string"},"name":"operationName","required":false},{"in":"query","example":{},"schema":{"nullable":true,"additionalProperties":{"type":"boolean"},"type":"object"},"name":"variables","required":false}],"description":"Serves the GraphQL API. For more details, see [graphql.org](https:\/\/graphql.org\/learn\/serving-over-http\/#get-request)","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GraphQLResult"}}},"description":"OK"}},"tags":["GraphQL"]}},"\/api\/device\/tailscale\/authToken":{"get":{"description":"AutToken generated allowing hive's to enroll in our tailnet.\n\nmTLS authentication required.","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"operationId":"getApiDeviceTailscaleAuthToken","summary":"Generates an OAuth token for Tailscale","tags":["PassiveLogic Device"],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/TailscalePostTailnetKeyResponse"}}}}}}},"\/api\/auth\/register":{"post":{"deprecated":true,"operationId":"postApiAuthRegister","summary":"Registers a new user","responses":{"200":{"content":{"application\/json":{"examples":{"RegisterUserResponse":{"$ref":"#\/components\/examples\/RegisterUserResponse"}},"schema":{"$ref":"#\/components\/schemas\/RegisterUserResponse"}}},"description":"OK"}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nCreates a new user based on the provided information. Requires jwt obtained via email from\n`\/api\/auth\/register\/initiate`. The user status is set to `Active` and immediately logged in.\n\n\n\nRegistration token is required when email verification is enforced, as indicated by a failed response to this endpoint","requestBody":{"required":true,"content":{"application\/json":{"examples":{"RegisterUserData":{"$ref":"#\/components\/examples\/RegisterUserData"}},"schema":{"$ref":"#\/components\/schemas\/RegisterUserData"}}}},"tags":["Authentication"]}},"\/api\/graphql":{"get":{"operationId":"getApiGraphql","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"externalDocs":{"url":"https:\/\/graphql.org\/learn\/serving-over-http\/#get-request","description":"GraphQL documentation."},"summary":"GraphQL API","parameters":[{"schema":{"type":"string"},"required":true,"in":"query","name":"query"},{"schema":{"nullable":true,"type":"string"},"required":false,"in":"query","name":"operationName"},{"schema":{"type":"object","nullable":true,"additionalProperties":{"type":"boolean"}},"required":false,"in":"query","example":{},"name":"variables"}],"description":"Serves the GraphQL API. For more details, see [graphql.org](https:\/\/graphql.org\/learn\/serving-over-http\/#get-request)","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GraphQLResult"}}},"description":"OK"}},"tags":["GraphQL"]},"post":{"operationId":"postApiGraphql","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"externalDocs":{"description":"GraphQL documentation.","url":"https:\/\/graphql.org\/learn\/serving-over-http\/#post-request"},"summary":"GraphQL API","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GraphQLResult"}}},"description":"OK"}},"description":"Serves the GraphQL API. For more details, see [graphql.org](https:\/\/graphql.org\/learn\/serving-over-http\/#post-request)","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GraphQLRequest"}}},"required":true},"tags":["GraphQL"]}},"\/api\/v0.19\/quantumsync":{"get":{"tags":["Quantum Sync"],"description":"# Custom QuantumSync\/ShadowClient API:\n\n## QuantumSync QuantumSyncRequestTypes:\n### `start`: authenticates and specifies an initial context. note: the id for start and updateContext is used to key a Dictionary[String:AnyRootedQuantumGraph]\nex)\n```json\n{\n    \"type\": \"start\",\n    \"id\": \"site\",\n    \"appType\":\"BuildingStudio\"\n    \"payload\": {\n        \"authToken\": \"REDACTED\",\n        \"ID\": \"ACAF9E07-5031-4BC2-A8C5-D2C6598D83DE\",\n        \"from\": \"Site\",\n        \"include\": [\n            \"Site\",\n            \"Building\",\n            \"Floor\",\n            \"Zone\"\n    ]\n    }\n}\n```\n\n### `updateContext`: change the current context \/ graph in memory.\nnote: the previous graph\/context can be returned from memory by using updateContext id: <previous id used in start or updateContext>.\nUp to 5 contexts can be loaded before prevention (error) or deleteContext message needed to free up loaded count to load a new context.\n\nex)\n```json\n{\n    \"type\": \"updateContext\",\n    \"id\": \"building\",\n    \"payload\": {\n        \"ID\": \"ACAF9E07-5031-4BC2-A8C5-D2C6598D83DE\",\n        \"from\": \"Building\",\n        \"include\": [\n            \"Site\",\n            \"Floor\",\n            \"Zone\",\n            \"Image\",\n            \"Surface\",\n            \"Adjacency\",\n            \"System\",\n            \"Quanta\",\n            \"Manufacturer\",\n            \"Equipment\",\n            \"Property\",\n            \"Location\"\n        ]\n    }\n}\n```\n\n### `deleteContext`: delete\/clear the context out of memory.\nex)\n```json\n{\n    \"type\": \"deleteContext\",\n    \"id\": \"building\",\n    \"payload\": {}\n}\n```\n\n### `sync`: create\/update\/delete QuantumObjects via a FlatGraphDiff as the payload.\n\nExecuting concurrent sync's is not allowed. If there is a sync already processing and another sync is requested before the response of the first sync is sent, then the 2nd symc will return an error saying there is a sync currently processing, and to wait until its finished before requesting another sync.\n\nex)\n```json\n{\n    \"type\": \"sync\",\n    \"id\": \"F5B6BC51-B991-440C-8ACB-B55C65FD7C24\",\n    \"payload\": {\n        \"added\": [],\n        \"updated\": [\n            {\n                \"description\": null,\n                \"ID\": \"80187B0B-CEEB-488A-A9B7-06784CFB0464\",\n                \"longitude\": null,\n                \"locationPropertyID\": null,\n                \"elevation\": null,\n                \"latitude\": null,\n                \"address\": null,\n                \"timeZone\": null,\n                \"siteIDs\": [\n                    \"7E7E04B4-8F32-4585-839D-E0EFC7BB3544\"\n                ],\n                \"weatherSourceIDs\": [],\n                \"locked\": false,\n                \"authGroupID\": \"A1EBEC59-D887-473F-A5C5-7CBD4ADB2556\",\n                \"__typename\": \"Location\",\n                \"name\": \"foo\"\n            }\n        ],\n        \"removed\": []\n    }\n}\n```\n\n### `syncEphemeral`: create\/update\/delete QuantumObjects via a FlatGraphDiff as the payload, do not write them to the database,\nand discard them at the end of the websocket session.\nex)\n```json\n{\n    \"type\": \"syncEphemeral\",\n    \"id\": \"F5B6BC51-B991-440C-8ACB-B55C65FD7C24\",\n    \"payload\": {\n        \"added\": [],\n        \"updated\": [\n            {\n                \"description\": null,\n                \"ID\": \"80187B0B-CEEB-488A-A9B7-06784CFB0464\",\n                \"longitude\": null,\n                \"locationPropertyID\": null,\n                \"elevation\": null,\n                \"latitude\": null,\n                \"address\": null,\n                \"timeZone\": null,\n                \"siteIDs\": [\n                    \"7E7E04B4-8F32-4585-839D-E0EFC7BB3544\"\n                ],\n                \"weatherSourceIDs\": [],\n                \"locked\": false,\n                \"authGroupID\": \"A1EBEC59-D887-473F-A5C5-7CBD4ADB2556\",\n                \"__typename\": \"Location\",\n                \"name\": \"foo\"\n            }\n        ],\n        \"removed\": []\n    }\n}\n```\n\n### `propertyHistory`: Get history data for a property & listen for updates.\nex)\n```json\n{\n    \"type\": \"propertyHistory\",\n    \"id\": \"propertyHistory1\",\n    \"payload\": {\n        \"propertyIDs\": [\"E585C3B8-F1E5-40D0-83A7-658B248DF103\"],\n        \"startAt\": \"2024-01-01T00:00:00Z\",\n        \"endAt\": \"2024-01-01T01:00:00Z\",\n        \"resample\": {\n            \"interval\": {\n                \"to\": \"minutely\",\n                \"reduceUsing\": \"avg\",\n                \"fillUsing\": \"interpolate\"\n        },\n        \"pollIntervalSec\": 60\n    }\n}\n\n### `propertyHistoryStop`: Stop listening for property history updates\nex)\n```json\n{\n    \"type\": \"propertyHistoryStop\",\n    \"id\": \"propertyHistory1\"\n}\n```\n\n### `writeHistory`: Write historical data to a property\nex)\n```json\n{\n    \"type\": \"writeHistory\",\n    \"id\": \"writeHistory\",\n    \"payload\": {\n        \"histories\": [\n            {\n                \"propertyID\": \"E585C3B8-F1E5-40D0-83A7-658B248DF103\",\n                \"time\": \"2024-01-01T00:00:00Z\",\n                \"value\": 5.0\n            }\n        ]\n    }\n}\n```","summary":"QuantumSync API over websockets","operationId":"getApiV0.19Quantumsync","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/v0.20\/organization\/join":{"post":{"operationId":"postApiV0.20OrganizationJoin","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Adds a user to an organization","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"description":"Adds user to organization based on Organization invite ID.\nRole in organization is determined through Organization invite role, if no role is defined, we default to read-only user.","requestBody":{"content":{"application\/json":{"examples":{"AcceptOrganizationInvite":{"$ref":"#\/components\/examples\/AcceptOrganizationInvite"}},"schema":{"$ref":"#\/components\/schemas\/AcceptOrganizationInvite"}}},"required":true},"tags":["Organization"]}},"\/api\/v0.19\/util\/quantumlens":{"post":{"description":"Returns the status of the QuantumLens application for the current user.\n\n- `appUpdate`: indicates if a new app version is required (true = forced, false = soft, nil = no update)\n- `osUpdate`: indicates if an iOS update is required (true = update required, nil = compatible)\n- `user`: information about the current user\n\nThis response helps the client determine whether the app or iOS requires an update before continuing.","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Utility"],"operationId":"postApiV0.19UtilQuantumlens","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/QuantumLensResponse"}}},"description":"OK"}},"summary":"QuantumLens (iOS) update & compatibility check"}},"\/api\/v0.19\/util\/externalauthconfig":{"get":{"summary":"Provides information about the external auth configuration","tags":["Utility"],"operationId":"getApiV0.19UtilExternalauthconfig","responses":{"200":{"content":{"text\/plain":{"examples":{"String":{"$ref":"#\/components\/examples\/String"}},"schema":{"type":"string"}}},"description":"OK"}},"description":"Use to check whether or not external auth (i.e. Keycloak) is enabled, and if so what the public settings are."}},"\/api\/v0.19\/datasync":{"get":{"deprecated":true,"tags":["Quantum Sync"],"description":"Refer to the \/api\/v0.19\/quantumsync route documentation for full details. This route will be removed in the next major version.","summary":"QuantumSync API Legacy Route. Use \/api\/v0.19\/quantumsync instead.","operationId":"getApiV0.19Datasync","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/v0.20\/organization\/update-logo":{"post":{"operationId":"postApiV0.20OrganizationUpdate-logo","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Updates the organization's logo","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"},"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}}}},"description":"OK"}},"description":"Verifies that the user making the request has sufficient permissions to change the logo for the organization.\nTakes in a new image as the organization's logo. Creates or replaces the previous stored logo.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/OrganizationImageData"},"examples":{"OrganizationImageData":{"$ref":"#\/components\/examples\/OrganizationImageData"}}}}},"tags":["Organization"]}},"\/api\/util\/externalauthconfig":{"get":{"operationId":"getApiUtilExternalauthconfig","tags":["Utility"],"summary":"Provides information about the external auth configuration","description":"Use to check whether or not external auth (i.e. Keycloak) is enabled, and if so what the public settings are.","responses":{"200":{"content":{"text\/plain":{"examples":{"String":{"$ref":"#\/components\/examples\/String"}},"schema":{"type":"string"}}},"description":"OK"}}}},"\/api\/v0.20\/quantumsync":{"get":{"description":"# Custom QuantumSync\/ShadowClient API:\n\n## QuantumSync QuantumSyncRequestTypes:\n### `start`: authenticates and specifies an initial context. note: the id for start and updateContext is used to key a Dictionary[String:AnyRootedQuantumGraph]\nex)\n```json\n{\n    \"type\": \"start\",\n    \"id\": \"site\",\n    \"appType\":\"BuildingStudio\"\n    \"payload\": {\n        \"authToken\": \"REDACTED\",\n        \"ID\": \"ACAF9E07-5031-4BC2-A8C5-D2C6598D83DE\",\n        \"from\": \"Site\",\n        \"include\": [\n            \"Site\",\n            \"Building\",\n            \"Floor\",\n            \"Zone\"\n    ]\n    }\n}\n```\n\n### `updateContext`: change the current context \/ graph in memory.\nnote: the previous graph\/context can be returned from memory by using updateContext id: <previous id used in start or updateContext>.\nUp to 5 contexts can be loaded before prevention (error) or deleteContext message needed to free up loaded count to load a new context.\n\nex)\n```json\n{\n    \"type\": \"updateContext\",\n    \"id\": \"building\",\n    \"payload\": {\n        \"ID\": \"ACAF9E07-5031-4BC2-A8C5-D2C6598D83DE\",\n        \"from\": \"Building\",\n        \"include\": [\n            \"Site\",\n            \"Floor\",\n            \"Zone\",\n            \"Image\",\n            \"Surface\",\n            \"Adjacency\",\n            \"System\",\n            \"Quanta\",\n            \"Manufacturer\",\n            \"Equipment\",\n            \"Property\",\n            \"Location\"\n        ]\n    }\n}\n```\n\n### `deleteContext`: delete\/clear the context out of memory.\nex)\n```json\n{\n    \"type\": \"deleteContext\",\n    \"id\": \"building\",\n    \"payload\": {}\n}\n```\n\n### `sync`: create\/update\/delete QuantumObjects via a FlatGraphDiff as the payload.\n\nExecuting concurrent sync's is not allowed. If there is a sync already processing and another sync is requested before the response of the first sync is sent, then the 2nd symc will return an error saying there is a sync currently processing, and to wait until its finished before requesting another sync.\n\nex)\n```json\n{\n    \"type\": \"sync\",\n    \"id\": \"F5B6BC51-B991-440C-8ACB-B55C65FD7C24\",\n    \"payload\": {\n        \"added\": [],\n        \"updated\": [\n            {\n                \"description\": null,\n                \"ID\": \"80187B0B-CEEB-488A-A9B7-06784CFB0464\",\n                \"longitude\": null,\n                \"locationPropertyID\": null,\n                \"elevation\": null,\n                \"latitude\": null,\n                \"address\": null,\n                \"timeZone\": null,\n                \"siteIDs\": [\n                    \"7E7E04B4-8F32-4585-839D-E0EFC7BB3544\"\n                ],\n                \"weatherSourceIDs\": [],\n                \"locked\": false,\n                \"authGroupID\": \"A1EBEC59-D887-473F-A5C5-7CBD4ADB2556\",\n                \"__typename\": \"Location\",\n                \"name\": \"foo\"\n            }\n        ],\n        \"removed\": []\n    }\n}\n```\n\n### `syncEphemeral`: create\/update\/delete QuantumObjects via a FlatGraphDiff as the payload, do not write them to the database,\nand discard them at the end of the websocket session.\nex)\n```json\n{\n    \"type\": \"syncEphemeral\",\n    \"id\": \"F5B6BC51-B991-440C-8ACB-B55C65FD7C24\",\n    \"payload\": {\n        \"added\": [],\n        \"updated\": [\n            {\n                \"description\": null,\n                \"ID\": \"80187B0B-CEEB-488A-A9B7-06784CFB0464\",\n                \"longitude\": null,\n                \"locationPropertyID\": null,\n                \"elevation\": null,\n                \"latitude\": null,\n                \"address\": null,\n                \"timeZone\": null,\n                \"siteIDs\": [\n                    \"7E7E04B4-8F32-4585-839D-E0EFC7BB3544\"\n                ],\n                \"weatherSourceIDs\": [],\n                \"locked\": false,\n                \"authGroupID\": \"A1EBEC59-D887-473F-A5C5-7CBD4ADB2556\",\n                \"__typename\": \"Location\",\n                \"name\": \"foo\"\n            }\n        ],\n        \"removed\": []\n    }\n}\n```\n\n### `propertyHistory`: Get history data for a property & listen for updates.\nex)\n```json\n{\n    \"type\": \"propertyHistory\",\n    \"id\": \"propertyHistory1\",\n    \"payload\": {\n        \"propertyIDs\": [\"E585C3B8-F1E5-40D0-83A7-658B248DF103\"],\n        \"startAt\": \"2024-01-01T00:00:00Z\",\n        \"endAt\": \"2024-01-01T01:00:00Z\",\n        \"resample\": {\n            \"interval\": {\n                \"to\": \"minutely\",\n                \"reduceUsing\": \"avg\",\n                \"fillUsing\": \"interpolate\"\n        },\n        \"pollIntervalSec\": 60\n    }\n}\n\n### `propertyHistoryStop`: Stop listening for property history updates\nex)\n```json\n{\n    \"type\": \"propertyHistoryStop\",\n    \"id\": \"propertyHistory1\"\n}\n```\n\n### `writeHistory`: Write historical data to a property\nex)\n```json\n{\n    \"type\": \"writeHistory\",\n    \"id\": \"writeHistory\",\n    \"payload\": {\n        \"histories\": [\n            {\n                \"propertyID\": \"E585C3B8-F1E5-40D0-83A7-658B248DF103\",\n                \"time\": \"2024-01-01T00:00:00Z\",\n                \"value\": 5.0\n            }\n        ]\n    }\n}\n```","summary":"QuantumSync API over websockets","tags":["Quantum Sync"],"operationId":"getApiV0.20Quantumsync","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/util\/quantumlens":{"post":{"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/QuantumLensResponse"}}},"description":"OK"}},"operationId":"postApiUtilQuantumlens","description":"Returns the status of the QuantumLens application for the current user.\n\n- `appUpdate`: indicates if a new app version is required (true = forced, false = soft, nil = no update)\n- `osUpdate`: indicates if an iOS update is required (true = update required, nil = compatible)\n- `user`: information about the current user\n\nThis response helps the client determine whether the app or iOS requires an update before continuing.","tags":["Utility"],"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"QuantumLens (iOS) update & compatibility check"}},"\/app\/login\/finish":{"get":{"summary":"Redirects to external authentication provider (Keycloak).","operationId":"getAppLoginFinish","description":"","tags":["app"]}},"\/app\/lp\/**":{"get":{"description":"GET \/app\/lp\/**","tags":["app"]}},"\/api\/account\/credentials":{"get":{"operationId":"getApiAccountCredentials","responses":{"200":{"content":{"application\/json":{"schema":{"items":{"$ref":"#\/components\/schemas\/KeycloakCredentialInfo"},"type":"array"}}},"description":"OK"}},"summary":"Retrieves a list of the credentials the current user has enabled.","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Account"],"description":"Retrieves the list of credentials enabled for the current user as reported by Keycloak. Credential types include password,\nTOPT, and passkeys. Note that `createdDate` will be sent as an ISO 8601 formatted string (e.g. 2025-10-10T16:32:11Z). Also note\nthat this API must be called with a properly authenticated JWT."}},"\/api\/v0.19\/auth\/logout":{"post":{"tags":["Authentication"],"summary":"Logs out a user","description":"If external auth (Keycloak) is enabled, this initiates the external logout process.\n\nOtherwise, if a cookie keyed by pl-refresh-token is provided in the logout request, that refresh token is revoked.\n\nThe response sets the auth & refresh cookies to empty values & marks them as expired.\nNew tokens must then be generated by the login endpoint.","operationId":"postApiV0.19AuthLogout","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/v0.19\/auth\/email\/change\/verify":{"get":{"deprecated":true,"operationId":"getApiV0.19AuthEmailChangeVerify","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Verifies and updates new user email","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nVerifies the new email is valid. Updates the user email with the newly validated one.\n\nToken authentication required. Provided by \/api\/v0.19\/auth\/email\/change.","requestBody":{"required":true,"content":{"application\/json":{"examples":{"UpdatedUserEmail":{"$ref":"#\/components\/examples\/UpdatedUserEmail"}},"schema":{"$ref":"#\/components\/schemas\/UpdatedUserEmail"}}}},"tags":["Authentication"]}},"\/api\/v0.19\/auth\/zendesk":{"get":{"summary":"Logs a user in to Zendesk using their PL Account","tags":["Authentication"],"operationId":"getApiV0.19AuthZendesk","description":"Redirects a user to the PassiveLogic Zendesk portal.\nIf they are already authenticated with their PL account when making this request,\nthey will be automatically logged in to Zendesk as well. Otherwise they will be redirected to the Zendesk login page.\nA `returnTo` query parameter can be used to support deep linking to, for example, specific support articles."}},"\/api\/image\/user-avatar":{"post":{"operationId":"postApiImageUser-avatar","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Update user avatar image","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"},"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}}}}}},"description":"Uploads and updates the avatar image URL with the new image URL.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ImageData"},"examples":{"ImageData":{"$ref":"#\/components\/examples\/ImageData"}}}},"required":true},"tags":["Images"]}},"\/api\/v0.20\/auth\/keys":{"get":{"summary":"Returns the public keys used to sign PassiveLogic JSON web tokens.","tags":["Authentication"],"operationId":"getApiV0.20AuthKeys","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/JWKS"}}}}},"description":"Returns the public keys used to sign the JSON web tokens so their authenticity can be verified. These are served in the\nstandard JSON Web Key format: https:\/\/www.rfc-editor.org\/rfc\/rfc7517"}},"\/api\/v0.20\/image":{"post":{"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"},"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}}}},"description":"OK"}},"description":"Uploads an image to the server, setting its new stored url & checksum in the database. If an existing ID is given, this will\nattempt an update of the image data. The data may be sent in either multipart\/form-data or JSON format. If using JSON, the\nimage file must be Base64-encoded. Using multipart\/form-data is recommended as it is a more efficient way to transmit binary\ndata.\n\nThis endpoint is intended for associating image file data with an existing `Image` node in the Quantum schema.","requestBody":{"required":true,"content":{"multipart\/form-data":{"schema":{"$ref":"#\/components\/schemas\/UploadImageData"},"examples":{"UploadImageData":{"$ref":"#\/components\/examples\/UploadImageData"}}},"application\/json":{"schema":{"$ref":"#\/components\/schemas\/UploadImageData"},"examples":{"UploadImageData":{"$ref":"#\/components\/examples\/UploadImageData"}}}}},"operationId":"postApiV0.20Image","tags":["Images"],"summary":"Uploads an image.","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/app\/login\/signIn":{"get":{"description":"","summary":"Redirects to external authentication provider (Keycloak).","operationId":"getAppLoginSignIn","tags":["app"]}},"\/api\/authgroup\/decline":{"post":{"operationId":"postApiAuthgroupDecline","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Declines an AuthGroup invitation","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"description":"Rejects an invitation based on AuthGroup invite ID.\nInvitation is deleted.","requestBody":{"required":true,"content":{"application\/json":{"examples":{"DeclineOrganizationInvite":{"$ref":"#\/components\/examples\/DeclineOrganizationInvite"}},"schema":{"$ref":"#\/components\/schemas\/DeclineOrganizationInvite"}}}},"tags":["Auth Groups"]}},"\/app\/login\/reset":{"get":{"description":"","tags":["app"],"operationId":"getAppLoginReset","summary":"Redirects to external authentication provider (Keycloak)."}},"\/api\/v0.19\/auth\/kc\/{user}":{"get":{"operationId":"getApiV0.19AuthKcByUser","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Retrieves user information for Keycloak","parameters":[{"name":"user","required":true,"schema":{"type":"string"},"in":"path"}],"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/KeycloakUserInfo"},"examples":{"KeycloakUserInfo":{"$ref":"#\/components\/examples\/KeycloakUserInfo"}}}},"description":"OK"}},"description":"Enables migrating users to Keycloak by providing an API endpoint for retrieving user information. This\ninformation is then saved to Keycloak's own database.","tags":["Authentication"]},"post":{"operationId":"postApiV0.19AuthKcByUser","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Validates a user's password","parameters":[{"name":"user","required":true,"schema":{"type":"string"},"in":"path"}],"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"description":"Allows the Keycloak migration plugin to validate a user's password. Once validated, the password is saved\nto Keycloak's database and is subsequently no longer validated using this API.","tags":["Authentication"]}},"\/api\/v0.20\/authgroup\/invite":{"post":{"operationId":"postApiV0.20AuthgroupInvite","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Sends an AuthGroup invite to the given email.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/AuthGroupInviteResponse"},"examples":{"AuthGroupInviteResponse":{"$ref":"#\/components\/examples\/AuthGroupInviteResponse"}}}}}},"description":"Generates and sends an invitation link for the given Site or View (AuthGroup) to the given user email.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/InviteUserToAuthGroupData"},"examples":{"InviteUserToAuthGroupData":{"$ref":"#\/components\/examples\/InviteUserToAuthGroupData"}}}},"required":true},"tags":["Auth Groups"]}},"\/api\/v0.19\/auth\/register\/initiate":{"post":{"deprecated":true,"operationId":"postApiV0.19AuthRegisterInitiate","summary":"Sends an email to begin email verification and registration.","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nInitiates the PassiveLogic registration process by sending an email to the given user. A user is not stored in the system\nat this point in the process - instead this serves as the initial step proving that a uer has access to the email they\nare signing up with.\n\nEmail will contain a link that holds a signed JWT from us. That JWT is later used to validate and complete registration.\n\nNo authentication required.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/UserRegistrationInitiation"},"examples":{"UserRegistrationInitiation":{"$ref":"#\/components\/examples\/UserRegistrationInitiation"}}}},"required":true},"tags":["Authentication"]}},"\/api\/v0.20\/account\/user\/delete":{"delete":{"operationId":"deleteApiV0.20AccountUserDelete","summary":"Deletes the user making this request.","description":"Deletes the requesting user if they are not a SuperUser within any organizations.\nOtherwise prompts them to transfer ownership or delete the org before making this request.","tags":["Account"],"responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/organization\/join":{"post":{"operationId":"postApiOrganizationJoin","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Adds a user to an organization","responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}},"description":"Adds user to organization based on Organization invite ID.\nRole in organization is determined through Organization invite role, if no role is defined, we default to read-only user.","requestBody":{"required":true,"content":{"application\/json":{"examples":{"AcceptOrganizationInvite":{"$ref":"#\/components\/examples\/AcceptOrganizationInvite"}},"schema":{"$ref":"#\/components\/schemas\/AcceptOrganizationInvite"}}}},"tags":["Organization"]}},"\/api\/v0.20\/util\/version":{"get":{"summary":"Returns version information","deprecated":true,"description":"Returns commit hashes & build times for the running build of the webserver and all apps.","responses":{"200":{"description":"OK","content":{"text\/plain":{"examples":{"String":{"$ref":"#\/components\/examples\/String"}},"schema":{"type":"string"}}}}},"operationId":"getApiV0.20UtilVersion","tags":["Utility"]}},"\/api\/v0.20\/device\/register":{"post":{"description":"POST \/device\/register","tags":["PassiveLogic Device"],"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/v0.20\/organization\/delete":{"post":{"operationId":"postApiV0.20OrganizationDelete","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Deletes specified organization.","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"description":"Completely deletes an organization, after verifying that the user making this request has permission to do so.\nSends an email to all other members of the organization informing them that it has been deleted.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/DeleteOrganizationData"},"examples":{"DeleteOrganizationData":{"$ref":"#\/components\/examples\/DeleteOrganizationData"}}}}},"tags":["Organization"]}},"\/api\/auth\/email\/change\/verify":{"get":{"deprecated":true,"operationId":"getApiAuthEmailChangeVerify","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Verifies and updates new user email","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nVerifies the new email is valid. Updates the user email with the newly validated one.\n\nToken authentication required. Provided by \/api\/auth\/email\/change.","requestBody":{"content":{"application\/json":{"examples":{"UpdatedUserEmail":{"$ref":"#\/components\/examples\/UpdatedUserEmail"}},"schema":{"$ref":"#\/components\/schemas\/UpdatedUserEmail"}}},"required":true},"tags":["Authentication"]}},"\/api\/v0.19\/auth\/email\/change":{"post":{"deprecated":true,"operationId":"postApiV0.19AuthEmailChange","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Initiates an email change for the current user.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nSends an update email request to the provided new email address.","requestBody":{"required":true,"content":{"application\/json":{"examples":{"UpdatedUserEmail":{"$ref":"#\/components\/examples\/UpdatedUserEmail"}},"schema":{"$ref":"#\/components\/schemas\/UpdatedUserEmail"}}}},"tags":["Authentication"]}},"\/api\/util\/pl-hardware-info":{"get":{"tags":["Utility"],"operationId":"getApiUtilPl-hardware-info","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/DeployedOnHiveResponse"}}},"description":"OK"}},"summary":"Indicates to clients whether or not they are hives serving a webserver.","description":"Returns a JSON object where the field 'runningOnHive' will be true if, on the server, the PL_HIVE_REVISION environment variable\nis set to a number greater than or equal to zero."}},"\/api\/v0.19\/auth\/password\/reset\/change":{"post":{"deprecated":true,"operationId":"postApiV0.19AuthPasswordResetChange","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Changes a user's password from the password reset flow.","responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nChanges a user's password to the specified value, reached from password reset flow.\n\nToken authentication required, only using the authentication JWT decoded from the password reset URL sent to a user\nfrom a reset initiation.","requestBody":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ChangePasswordData"},"examples":{"ChangePasswordData":{"$ref":"#\/components\/examples\/ChangePasswordData"}}}},"required":true},"tags":["Authentication"]}},"\/app\/login\/password":{"get":{"summary":"Redirects to external authentication provider (Keycloak).","description":"","operationId":"getAppLoginPassword","tags":["app"]}},"\/api\/v0.19\/util\/quantumversion":{"get":{"operationId":"getApiV0.19UtilQuantumversion","responses":{"200":{"content":{"text\/plain":{"examples":{"String":{"$ref":"#\/components\/examples\/String"}},"schema":{"type":"string"}}},"description":"OK"}},"summary":"Returns the Quantum Schema version","description":"Returns the current version of the Quantum schema in use by this webserver as a semantic version.","tags":["Utility"]}},"\/api\/v0.20\/auth\/kc\/{user}":{"get":{"operationId":"getApiV0.20AuthKcByUser","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Retrieves user information for Keycloak","parameters":[{"in":"path","schema":{"type":"string"},"required":true,"name":"user"}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/KeycloakUserInfo"},"examples":{"KeycloakUserInfo":{"$ref":"#\/components\/examples\/KeycloakUserInfo"}}}}}},"description":"Enables migrating users to Keycloak by providing an API endpoint for retrieving user information. This\ninformation is then saved to Keycloak's own database.","tags":["Authentication"]},"post":{"operationId":"postApiV0.20AuthKcByUser","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Validates a user's password","parameters":[{"in":"path","schema":{"type":"string"},"required":true,"name":"user"}],"responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"description":"Allows the Keycloak migration plugin to validate a user's password. Once validated, the password is saved\nto Keycloak's database and is subsequently no longer validated using this API.","tags":["Authentication"]}},"\/api\/v0.20\/auth\/whoami":{"get":{"summary":"Returns information about the currently logged in user.","responses":{"200":{"content":{"application\/json":{"examples":{"WhoAmIResponse":{"$ref":"#\/components\/examples\/WhoAmIResponse"}},"schema":{"$ref":"#\/components\/schemas\/WhoAmIResponse"}}},"description":"OK"}},"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"description":"Useful to check if a user is authenticated.","operationId":"getApiV0.20AuthWhoami"}},"\/api\/v0.19\/organization\/decline":{"post":{"operationId":"postApiV0.19OrganizationDecline","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Declines an organization invitation","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"description":"Rejects an invitation based on Organization invite ID.\nInvitation is deleted.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/DeclineOrganizationInvite"},"examples":{"DeclineOrganizationInvite":{"$ref":"#\/components\/examples\/DeclineOrganizationInvite"}}}}},"tags":["Organization"]}},"\/api\/auth\/login":{"get":{"deprecated":true,"operationId":"getApiAuthLogin","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Logs in a user","responses":{"200":{"content":{"application\/json":{"examples":{"LoginResponse":{"$ref":"#\/components\/examples\/LoginResponse"}},"schema":{"$ref":"#\/components\/schemas\/LoginResponse"}}},"description":"OK"}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nLogs in a user. If multi-factor authentication is enabled, returns a multi-factor token that can be used to\nsend a multi-factor code to the user. Otherwise, sets auth & refresh tokens as cookies and returns a whoami for the\nlogged in user.\n\nBasic authentication required.","tags":["Authentication"]}},"\/api\/v0.19\/organization\/delete":{"post":{"operationId":"postApiV0.19OrganizationDelete","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Deletes specified organization.","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"description":"Completely deletes an organization, after verifying that the user making this request has permission to do so.\nSends an email to all other members of the organization informing them that it has been deleted.","requestBody":{"required":true,"content":{"application\/json":{"examples":{"DeleteOrganizationData":{"$ref":"#\/components\/examples\/DeleteOrganizationData"}},"schema":{"$ref":"#\/components\/schemas\/DeleteOrganizationData"}}}},"tags":["Organization"]}},"\/api\/util\/ping":{"get":{"description":"Use to check webserver health or keep connection alive. Returns pong message.","summary":"Keep-alive ping\/pong route","responses":{"200":{"content":{"text\/plain":{"schema":{"type":"string"},"examples":{"String":{"$ref":"#\/components\/examples\/String"}}}},"description":"OK"}},"tags":["Utility"],"operationId":"getApiUtilPing"}},"\/api\/v0.20\/auth\/verify":{"get":{"description":"Redirects user to `\/api\/v0.20\/auth\/login`, passing along the provided valid jwt and email.\n\nExists in this form for backward compatibility.","parameters":[{"in":"query","required":true,"description":"User's email to confirm as verified","schema":{"type":"string"},"example":"darthvader@galactic-empire.com","name":"email"}],"summary":"Redirects user to login","operationId":"getApiV0.20AuthVerify","tags":["Authentication"]}},"\/api\/v0.20\/auth\/offline":{"get":{"description":"GET \/auth\/offline","tags":["Authentication"],"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/auth\/offline":{"get":{"description":"GET \/auth\/offline","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"]}},"\/api\/v0.19\/account\/eula\/accept":{"post":{"deprecated":true,"operationId":"postApiV0.19AccountEulaAccept","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Accepts EULA for the current user","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\nDenotes that the current user has accepted the EULA.\nReturns updated access and refresh tokens.","tags":["Account"]}},"\/api\/v0.19\/auth\/verify":{"get":{"tags":["Authentication"],"operationId":"getApiV0.19AuthVerify","parameters":[{"in":"query","schema":{"type":"string"},"description":"User's email to confirm as verified","required":true,"example":"darthvader@galactic-empire.com","name":"email"}],"summary":"Redirects user to login","description":"Redirects user to `\/api\/v0.19\/auth\/login`, passing along the provided valid jwt and email.\n\nExists in this form for backward compatibility."}},"\/api\/v0.20\/util\/ping":{"get":{"responses":{"200":{"content":{"text\/plain":{"schema":{"type":"string"},"examples":{"String":{"$ref":"#\/components\/examples\/String"}}}},"description":"OK"}},"operationId":"getApiV0.20UtilPing","tags":["Utility"],"summary":"Keep-alive ping\/pong route","description":"Use to check webserver health or keep connection alive. Returns pong message."}},"\/api\/graphqlSubscribe":{"get":{"operationId":"getApiGraphqlSubscribe","summary":"GraphQL API over websocket.","description":"Serves the GraphQL API over websockets to support streaming results like subscriptions.\n\nThe following sub-protocols are supported:\n- [graphql-transport-ws](https:\/\/github.com\/enisdenjo\/graphql-ws\/blob\/master\/PROTOCOL.md)\n- [graphql-ws](https:\/\/github.com\/apollographql\/subscriptions-transport-ws\/blob\/master\/PROTOCOL.md)","tags":["GraphQL"],"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/v0.19\/graphql":{"get":{"operationId":"getApiV0.19Graphql","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"GraphQL API","externalDocs":{"description":"GraphQL documentation.","url":"https:\/\/graphql.org\/learn\/serving-over-http\/#get-request"},"parameters":[{"in":"query","name":"query","schema":{"type":"string"},"required":true},{"in":"query","name":"operationName","schema":{"type":"string","nullable":true},"required":false},{"in":"query","name":"variables","schema":{"type":"object","additionalProperties":{"type":"boolean"},"nullable":true},"example":{},"required":false}],"description":"Serves the GraphQL API. For more details, see [graphql.org](https:\/\/graphql.org\/learn\/serving-over-http\/#get-request)","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GraphQLResult"}}},"description":"OK"}},"tags":["GraphQL"]},"post":{"operationId":"postApiV0.19Graphql","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"GraphQL API","externalDocs":{"description":"GraphQL documentation.","url":"https:\/\/graphql.org\/learn\/serving-over-http\/#post-request"},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GraphQLResult"}}}}},"description":"Serves the GraphQL API. For more details, see [graphql.org](https:\/\/graphql.org\/learn\/serving-over-http\/#post-request)","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GraphQLRequest"}}}},"tags":["GraphQL"]}},"\/api\/v0.20\/auth\/profile\/change":{"get":{"operationId":"getApiV0.20AuthProfileChange","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"summary":"Redirects the user the change profile flow in the external auth provider (Keycloak).","description":""}},"\/api\/v0.19\/organization\/invite":{"post":{"operationId":"postApiV0.19OrganizationInvite","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Sends an organization invite to the given email.","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"OrgInviteResponse":{"$ref":"#\/components\/examples\/OrgInviteResponse"}},"schema":{"$ref":"#\/components\/schemas\/OrgInviteResponse"}}}}},"description":"Generates and sends an invitation link for the given organization to the given user email.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/InviteUserToOrganizationData"},"examples":{"InviteUserToOrganizationData":{"$ref":"#\/components\/examples\/InviteUserToOrganizationData"}}}}},"tags":["Organization"]}},"\/api\/v0.20\/image\/{imageID}":{"delete":{"deprecated":true,"operationId":"deleteApiV0.20ImageByImageID","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Delete an image. Deprecated: Delete an image node via the normal GraphQL endpoint or a QuantumSync operation. This route has been deprecated in favor of: POST \/api\/graphql.","parameters":[{"name":"imageID","required":true,"schema":{"type":"string"},"in":"path"}],"responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"description":"Delete the image with the given quantum node ID.\nIf authorized and the given image is found, it will be deleted from the file store and the database.\nThe ID provided must be the ID of the `Image` Quantum node, NOT the name of the image.","tags":["Images"]}},"\/api\/v0.20\/auth\/magic-link-generate":{"post":{"deprecated":true,"operationId":"postApiV0.20AuthMagic-link-generate","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Generates a Magic Link to be used to login.","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/MagicLinkResponse"}}},"description":"OK"}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nGenerates magic link containing `?token=<signed JWT with user email contained>` and sends it in an email to the user.\nThis is the secure mode and MUST be used in production.\nThis will not return a link to the client.\n\nIf User does not exist in Database, will throw 400 bad request. If user exists, will return 200 ok.\nThese links can then be used to login from GET magic-link-login.","requestBody":{"content":{"application\/json":{"examples":{"UserRegistrationInitiation":{"$ref":"#\/components\/examples\/UserRegistrationInitiation"}},"schema":{"$ref":"#\/components\/schemas\/UserRegistrationInitiation"}}},"required":true},"tags":["Authentication"]}},"\/api\/v0.20\/auth\/email\/change\/verify":{"get":{"deprecated":true,"operationId":"getApiV0.20AuthEmailChangeVerify","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Verifies and updates new user email","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nVerifies the new email is valid. Updates the user email with the newly validated one.\n\nToken authentication required. Provided by \/api\/v0.20\/auth\/email\/change.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/UpdatedUserEmail"},"examples":{"UpdatedUserEmail":{"$ref":"#\/components\/examples\/UpdatedUserEmail"}}}}},"tags":["Authentication"]}},"\/api\/site\/copy":{"post":{"operationId":"postApiSiteCopy","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Copy Project from one organization to another","parameters":[{"description":"Organization to copy the given site into.","name":"targetOrganizationID","in":"query","schema":{"type":"string","format":"uuid"},"required":true},{"description":"Site to copy.","name":"siteID","in":"query","schema":{"type":"string","format":"uuid"},"required":true},{"description":"Optionally change the copied site name.","name":"siteName","in":"query","schema":{"nullable":true,"type":"string"},"required":false},{"description":"Optionally change the copied site directory.","name":"siteDirectory","in":"query","schema":{"type":"string","nullable":true},"required":false},{"description":"Date to start copying history from. Required to export all history.","name":"startDate","in":"query","schema":{"nullable":true,"type":"string"},"required":false},{"description":"Date to end copying history at. Required to export all history.","name":"endDate","in":"query","schema":{"nullable":true,"type":"string"},"required":false}],"description":"Copies Project from one organization to a target organization given a project Identifier.\nAll UUID's are created new for the copied project.\nReturns a mapping of old identifiers and new identifiers of the given project.\nHistory data is NOT copied unless startDate and endDate are provided.\nHistory copy will take time to complete in the background and there will be no indication of success.","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ObjectIdentifiers"}}},"description":"OK"}},"tags":["Site"]}},"\/api\/authgroup\/remove\/{authGroupID}\/{userID}":{"post":{"operationId":"postApiAuthgroupRemoveByAuthGroupIDByUserID","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Removes user from Auth Group","parameters":[{"name":"authGroupID","required":true,"schema":{"type":"string"},"in":"path"},{"name":"userID","required":true,"schema":{"type":"string"},"in":"path"}],"responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"AuthGroupRemovalResponse":{"$ref":"#\/components\/examples\/AuthGroupRemovalResponse"}},"schema":{"$ref":"#\/components\/schemas\/AuthGroupRemovalResponse"}}}}},"description":"Remove a User from an AuthGroup. Users must have PrivilegedUser or greater permissions to remove another user.\nUser can only remove other users with permissions less than or equal to their own permissions. For example: PrivilegedUsers\ncannot remove SuperUsers.","tags":["Auth Groups"]}},"\/api\/health\/liveness":{"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Liveness check used to determine when webserver should be restarted","tags":["Health"],"description":"See https:\/\/kubernetes.io\/docs\/concepts\/configuration\/liveness-readiness-startup-probes\/#liveness-probe","operationId":"getApiHealthLiveness"}},"\/api\/v0.19\/util\/pl-hardware-info":{"get":{"summary":"Indicates to clients whether or not they are hives serving a webserver.","tags":["Utility"],"description":"Returns a JSON object where the field 'runningOnHive' will be true if, on the server, the PL_HIVE_REVISION environment variable\nis set to a number greater than or equal to zero.","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/DeployedOnHiveResponse"}}},"description":"OK"}},"operationId":"getApiV0.19UtilPl-hardware-info"}},"\/api\/v0.19\/auth\/api-key\/generate":{"get":{"operationId":"getApiV0.19AuthApi-keyGenerate","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Generates an API key for the current user","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"},"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}}}},"description":"OK"}},"description":"Generates, stores, and returns a new API key with the default expiration period for the user currently logged in.\n\nOnce created, you can then provide this API key in an\n`Authorization: PL-API-KEY <Key>` header in replacement of an `X-PL-AUTH` header.","parameters":[{"schema":{"type":"integer","format":"int64","nullable":true},"required":false,"in":"query","example":2678400,"name":"expireSeconds","description":"Number of seconds until the key expires."},{"schema":{"type":"string","nullable":true},"required":false,"in":"query","example":"ReadOnlyUser","name":"role","description":"Role of the new key."}],"tags":["Authentication"]}},"\/app\/devtools\/*":{"get":{"tags":["app"],"description":"GET \/app\/devtools\/*"}},"\/api\/v0.20\/device\/login":{"get":{"operationId":"getApiV0.20DeviceLogin","description":"Logs in a PassiveLogic device, responding with the authentication token.\n\nmTLS authentication required.","tags":["PassiveLogic Device"],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/DeviceLoginResponse"},"examples":{"DeviceLoginResponse":{"$ref":"#\/components\/examples\/DeviceLoginResponse"}}}}}},"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Logs in a PassiveLogic device"}},"\/api\/device\/register":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["PassiveLogic Device"],"description":"POST \/device\/register"}},"\/api\/v0.20\/util\/quantumversion":{"get":{"responses":{"200":{"content":{"text\/plain":{"schema":{"type":"string"},"examples":{"String":{"$ref":"#\/components\/examples\/String"}}}},"description":"OK"}},"tags":["Utility"],"operationId":"getApiV0.20UtilQuantumversion","description":"Returns the current version of the Quantum schema in use by this webserver as a semantic version.","summary":"Returns the Quantum Schema version"}},"\/api\/image\/{imageID}":{"delete":{"deprecated":true,"operationId":"deleteApiImageByImageID","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Delete an image. Deprecated: Delete an image node via the normal GraphQL endpoint or a QuantumSync operation. This route has been deprecated in favor of: POST \/api\/graphql.","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"description":"Delete the image with the given quantum node ID.\nIf authorized and the given image is found, it will be deleted from the file store and the database.\nThe ID provided must be the ID of the `Image` Quantum node, NOT the name of the image.","parameters":[{"required":true,"name":"imageID","schema":{"type":"string"},"in":"path"}],"tags":["Images"]}},"\/api\/util\/quantumversion":{"get":{"description":"Returns the current version of the Quantum schema in use by this webserver as a semantic version.","responses":{"200":{"content":{"text\/plain":{"schema":{"type":"string"},"examples":{"String":{"$ref":"#\/components\/examples\/String"}}}},"description":"OK"}},"tags":["Utility"],"operationId":"getApiUtilQuantumversion","summary":"Returns the Quantum Schema version"}},"\/app\/login\/userAuth":{"get":{"description":"","operationId":"getAppLoginUserAuth","tags":["app"],"summary":"Redirects to external authentication provider (Keycloak)."}},"\/api\/v0.20\/auth\/login":{"get":{"deprecated":true,"operationId":"getApiV0.20AuthLogin","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Logs in a user","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/LoginResponse"},"examples":{"LoginResponse":{"$ref":"#\/components\/examples\/LoginResponse"}}}},"description":"OK"}},"description":"DEPRECATED: This endpoint is not available when Keycloak authentication is turned on and will be removed in the future.\n\nLogs in a user. If multi-factor authentication is enabled, returns a multi-factor token that can be used to\nsend a multi-factor code to the user. Otherwise, sets auth & refresh tokens as cookies and returns a whoami for the\nlogged in user.\n\nBasic authentication required.","tags":["Authentication"]}},"\/api\/authgroup\/invite":{"post":{"operationId":"postApiAuthgroupInvite","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Sends an AuthGroup invite to the given email.","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/AuthGroupInviteResponse"},"examples":{"AuthGroupInviteResponse":{"$ref":"#\/components\/examples\/AuthGroupInviteResponse"}}}},"description":"OK"}},"description":"Generates and sends an invitation link for the given Site or View (AuthGroup) to the given user email.","requestBody":{"content":{"application\/json":{"examples":{"InviteUserToAuthGroupData":{"$ref":"#\/components\/examples\/InviteUserToAuthGroupData"}},"schema":{"$ref":"#\/components\/schemas\/InviteUserToAuthGroupData"}}},"required":true},"tags":["Auth Groups"]}},"\/":{"get":{"tags":[""],"description":"GET \/"}},"\/api\/v0.19\/health\/liveness":{"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"operationId":"getApiV0.19HealthLiveness","description":"See https:\/\/kubernetes.io\/docs\/concepts\/configuration\/liveness-readiness-startup-probes\/#liveness-probe","tags":["Health"],"summary":"Liveness check used to determine when webserver should be restarted"}}},"openapi":"3.0.1","info":{"title":"PassiveLogic REST API","description":"This page documents the operations supported by the PassiveLogic HTTP API, covering authentication, user management, and\nGraphQL API access.","version":"0.0.0"},"components":{"securitySchemes":{"Basic Auth - login":{"description":"Basic authentication used only at login.","type":"http","scheme":"basic"},"XSRF header":{"description":"Authentication using an XSRF protected JWT","in":"header","type":"apiKey","name":"X-PL-AUTH"},"DEPRECATED - PL API Key":{"description":"DEPRECATED - PL API Key in Bearer header","in":"header","type":"apiKey","name":"Authorization: PL-API-KEY"},"PL API Key":{"description":"PL API Key in header","in":"header","type":"apiKey","name":"PL-API-KEY"}},"schemas":{"LoginResponse":{"properties":{"whoAmI":{"$ref":"#\/components\/schemas\/WhoAmIResponse"},"token":{"type":"string","description":"Signed Authentication JWT"},"refresh":{"type":"string","description":"Signed refresh JWT"}},"description":"Generic response information","required":["refresh","token","whoAmI"],"type":"object"},"UpdatedUserEmail":{"properties":{"newEmail":{"description":"New user email","type":"string"},"password":{"description":"user's password to confirm identity","type":"string"},"oldEmail":{"description":"Previous user email","type":"string"}},"description":"Information for changing a user's email","type":"object","required":["newEmail","oldEmail","password"]},"KeycloakCredentialInfo":{"properties":{"type":{"type":"string"},"device":{"type":"string","nullable":true},"value":{"type":"string","nullable":true},"userLabel":{"type":"string","nullable":true},"priority":{"format":"int64","type":"integer","nullable":true},"temporary":{"type":"boolean","nullable":true},"id":{"format":"uuid","type":"string"},"createdDate":{"format":"int64","type":"integer","nullable":true}},"type":"object","required":["id","type"]},"DeployedOnHiveResponse":{"properties":{"runningOnHive":{"type":"boolean"}},"type":"object","required":["runningOnHive"]},"QuantumObjectType":{"enum":["Adjacency","AllowedQuanta","Analysis","Animation","ApiKey","Artifact","Asset","AuthGroup","Behavior","Binding","Building","Campus","CampusDirectory","CompatibleQuanta","ConnectionNet","ConnectionNode","ConstructionCategory","ControlKnot","Device","DisplayRule","EmailVerification","Equation","Equipment","EquipmentComponent","EquipmentComponentPropertyRouter","EscalationGroup","Event","EventClass","EventHistory","EventRelation","EventType","Floor","GraphVersion","History","Image","ImportedModel","InterfaceAlternate","Invite","Layer","LayerSet","LayerSetJoin","Library","Location","LocationProperty","Manufacturer","Media","MediaComponent","Model","MultifactorAuthentication","NodeSet","NodeSetConnectionNodeJoin","Organization","OrganizationAuthGroupPermission","Prediction","PredictionGroup","Preference","PreferenceGroup","PrivilegeJoin","Procedure","Property","PropertyTagRouter","Quanta","RefreshToken","Relationship","SelectedModel","SessionBinding","SessionEvent","Shape","Site","Subsystem","SubsystemCapability","SubsystemSet","Surface","System","Tag","TagFamily","TypicalConstruction","UnitLookup","UnitPreference","User","UserSession","UserSessionHistory","Vertex","View","WeatherSource","Zone","ZoneGroup","ZoneSubsystem","ZoneSubsystemSet"],"type":"string"},"TailscalePostTailnetKeyResponse":{"properties":{"keyType":{"type":"string"},"expires":{"type":"string","format":"date-time","nullable":true},"description":{"type":"string","nullable":true},"capabilities":{"$ref":"#\/components\/schemas\/TailscaleCapabilities"},"key":{"type":"string"},"invalid":{"type":"boolean","nullable":true},"scopes":{"items":{"type":"string"},"type":"array","nullable":true},"id":{"type":"string"},"tags":{"items":{"type":"string"},"type":"array","nullable":true},"revoked":{"type":"string","format":"date-time","nullable":true},"expirySeconds":{"type":"integer","format":"int64"},"userId":{"type":"string","nullable":true},"created":{"type":"string","format":"date-time","nullable":true}},"type":"object","required":["capabilities","expirySeconds","id","key","keyType"]},"OrgInviteResponse":{"properties":{"message":{"description":"Message with additional information","type":"string"},"inviteID":{"description":"ID of the invitation generated\/sent","format":"uuid","type":"string"}},"description":"Response indicating that an organization invitation was successfully sent.","type":"object","required":["inviteID","message"]},"JWKS":{"properties":{"keys":{"items":{"$ref":"#\/components\/schemas\/JWK"},"type":"array"}},"type":"object","required":["keys"]},"DeclineOrganizationInvite":{"properties":{"inviteID":{"type":"string","description":"ID of the invitation being declined.","format":"uuid"}},"description":"Parameters required to decline an organization invite","type":"object","required":["inviteID"]},"BindingUploadResponse":{"properties":{"url":{"nullable":true,"type":"string"},"message":{"description":"Informative message relating to binding upload. Updated binding url with cache bust.","type":"string"}},"description":"Binding response definition","type":"object","required":["message"]},"InviteUserToOrganizationData":{"properties":{"orgID":{"description":"ID of the organization to which this invite pertains","format":"uuid","type":"string"},"role":{"$ref":"#\/components\/schemas\/QuantumRole"},"expiration":{"nullable":true,"description":"Timestamp at which this invitation will no longer be valid","format":"date-time","type":"string"},"inviteEmail":{"description":"Email to send the invite to","type":"string"}},"description":"Parameters required to invite a user to an organization","type":"object","required":["inviteEmail","orgID"]},"ChangePasswordData":{"properties":{"newPassword":{"description":"New password for the user.","type":"string"},"confirmNewPassword":{"nullable":true,"type":"string"}},"description":"Information required to change a user's password from the reset password flow","type":"object","required":["newPassword"]},"QuantumLensResponse":{"properties":{"user":{"$ref":"#\/components\/schemas\/QuantumLensUser"},"status":{"$ref":"#\/components\/schemas\/QuantumLensAppStatusResponse"}},"type":"object","required":["status","user"]},"RegisterUserResponse":{"properties":{"userStatus":{"$ref":"#\/components\/schemas\/QuantumUserStatus"},"token":{"type":"string","nullable":true,"description":"New authentication JWT containing changed information"},"refresh":{"type":"string","nullable":true,"description":"New refresh JWT"},"message":{"type":"string","description":"Additional information about the response"},"newUserID":{"$ref":"#\/components\/schemas\/Identifier"}},"description":"Sent when a new user is successfully registered.","type":"object","required":["message"]},"QuantumLensUser":{"properties":{"userID":{"type":"string","format":"uuid"},"lastName":{"type":"string","nullable":true},"firstName":{"type":"string","nullable":true}},"type":"object","required":["userID"]},"InviteUserToAuthGroupData":{"properties":{"authGroupID":{"type":"string","description":"ID of the AuthGroup to which this invite pertains","format":"uuid"},"inviteEmail":{"type":"string","description":"Email to send the invite to"},"role":{"$ref":"#\/components\/schemas\/QuantumRole"},"expiration":{"type":"string","nullable":true,"description":"Timestamp at which this invitation will no longer be valid","format":"date-time"}},"description":"Parameters required to invite a user to an organization","type":"object","required":["authGroupID","inviteEmail"]},"RequestResetPasswordData":{"properties":{"usernameOrEmail":{"type":"string","description":"Email of the user requesting a reset."}},"description":"Information required to request a password reset.","type":"object","required":["usernameOrEmail"]},"GraphQLError":{"properties":{"path":{"items":{"items":{"format":"int64","type":"integer"},"type":"array"},"type":"array"},"locations":{"items":{"$ref":"#\/components\/schemas\/SourceLocation"},"type":"array"},"message":{"type":"string"},"extensions":{"type":"object","additionalProperties":{"type":"boolean"},"nullable":true}},"type":"object","required":["locations","message","path"]},"AuthGroupRemovalResponse":{"properties":{"authGroupID":{"type":"string","description":"ID of the Authgroup the user has been removed from.","format":"uuid"},"message":{"type":"string","description":"Message with additional information"},"userID":{"type":"string","description":"ID of the User who has been removed","format":"uuid"}},"description":"Response indicating that a User has been removed from an AuthGroup.","type":"object","required":["authGroupID","message","userID"]},"RemoveApiKeyRequest":{"properties":{"key":{"description":"API key to revoke.","type":"string"}},"description":"API key to revoke","type":"object","required":["key"]},"ObjectIdentifiers":{"properties":{"objectIdentifierMap":{"type":"array","items":{"$ref":"#\/components\/schemas\/ObjectPair"}}},"type":"object","required":["objectIdentifierMap"]},"TailscaleCapabilities":{"properties":{"devices":{"$ref":"#\/components\/schemas\/TailscaleCapabilitiesDevices"}},"type":"object","required":["devices"]},"ImageData":{"properties":{"image":{"format":"byte","description":"File data to write to the server. Must be Base64-encoded if sending as JSON.","type":"string"},"fileType":{"description":"The type of file the given data represents, from a list of allowed files.","type":"string"}},"description":"Data required to upload image without using an image model.","type":"object","required":["fileType","image"]},"TailscaleCapabilitiesDevices":{"properties":{"create":{"$ref":"#\/components\/schemas\/TailscaleCapabilitiesDevicesCreate"}},"type":"object","required":["create"]},"MagicLinkResponse":{"properties":{"message":{"nullable":true,"type":"string","description":"Message describing the response type."},"url":{"nullable":true,"type":"string","description":"Url to be used a magic link login."}},"description":"Email for use signing up with a magic link","type":"object"},"JWK":{"properties":{"kty":{"type":"string"}},"required":["kty"],"type":"object"},"DeviceLoginResponse":{"properties":{"token":{"type":"string","description":"Signed authentication JWT"}},"description":"Response to \/api\/device\/login","type":"object","required":["token"]},"AcceptOrganizationInvite":{"properties":{"inviteID":{"description":"ID of the invitation being accepted.","format":"uuid","type":"string"}},"description":"Parameters required to accept an organization invite","type":"object","required":["inviteID"]},"GenerateApiKeyResponse":{"properties":{"expiration":{"type":"integer","description":"Expiration of the new key.","format":"int64"},"key":{"type":"string","description":"New API key."}},"description":"New API key generated for a user.","type":"object","required":["expiration","key"]},"Identifier":{"properties":{"id":{"type":"string"},"type":{"$ref":"#\/components\/schemas\/QuantumObjectType"}},"type":"object","required":["id","type"]},"RegisterUserData":{"properties":{"username":{"type":"string","nullable":true},"firstName":{"type":"string","description":"User's first name"},"password":{"type":"string","description":"User's password"},"acceptedEULA":{"type":"boolean","description":"Flag to mark if the user has accepted the EULA"},"token":{"type":"string","nullable":true},"email":{"type":"string","description":"User's email"},"recaptchaToken":{"type":"string","nullable":true},"acceptMailingList":{"type":"boolean","description":"Flag to mark if the user wants marketing emails"},"lastName":{"type":"string","description":"User's last name"}},"description":"Data required for user registration","type":"object","required":["acceptMailingList","acceptedEULA","email","firstName","lastName","password"]},"DeleteOrganizationData":{"properties":{"orgID":{"type":"string","format":"uuid","description":"ID of the organization being deleted"}},"description":"Parameters require to delete an organization","type":"object","required":["orgID"]},"AuthGroupInviteResponse":{"properties":{"message":{"description":"Message with additional information","type":"string"},"inviteID":{"description":"ID of the invitation generated\/sent","type":"string","format":"uuid"}},"description":"Response indicating that an AuthGroup invitation was successfully sent.","type":"object","required":["inviteID","message"]},"ImageUploadResponse":{"properties":{"message":{"type":"string","description":"Informative message relating to image upload. Updated image url with cache bust."},"url":{"nullable":true,"type":"string"}},"description":"Image response definition","type":"object","required":["message"]},"WhoAmIResponse":{"properties":{"eulaAccepted":{"description":"Flag to mark if the user has acept the terms of the EULA","nullable":true,"type":"boolean"},"userID":{"description":"Unique ID for the user","format":"uuid","type":"string"},"firstName":{"description":"User's first name","nullable":true,"type":"string"},"lastName":{"description":"User's last name","nullable":true,"type":"string"},"emailVerified":{"description":"Flag to mark if the user's email is verified","nullable":true,"type":"boolean"}},"description":"Information about the authenticated user","required":["userID"],"type":"object"},"QuantumRole":{"enum":["PrivilegedUser","ReadOnlyUser","StandardUser","SuperUser"],"type":"string"},"GraphQLResult":{"properties":{"data":{"nullable":true,"type":"boolean"},"errors":{"nullable":true,"items":{"$ref":"#\/components\/schemas\/GraphQLError"},"type":"array"}},"type":"object"},"TailscaleCapabilitiesDevicesCreate":{"properties":{"ephemeral":{"type":"boolean"},"reusable":{"type":"boolean"},"preauthorized":{"type":"boolean"},"tags":{"type":"array","items":{"type":"string"}}},"type":"object","required":["ephemeral","preauthorized","reusable","tags"]},"KeycloakUserInfo":{"properties":{"requiredActions":{"description":"Actions the user will need to do on next login","type":"array","items":{"type":"string"},"nullable":true},"emailVerified":{"description":"Has the email address for this user been verified as valid","nullable":true,"type":"boolean"},"attributes":{"description":"Additional attributes of the user; each attribute can have multiple values","type":"object","additionalProperties":{"items":{"type":"string"},"type":"array"},"nullable":true},"email":{"description":"Email for the user, also used as the username","type":"string"},"firstName":{"description":"The user's first (given) name","nullable":true,"type":"string"},"lastName":{"description":"The user's last name (surname)","nullable":true,"type":"string"},"roles":{"description":"Roles for this user","type":"array","items":{"type":"string"},"nullable":true},"access":{"description":"Access rights for this user","type":"object","additionalProperties":{"type":"boolean"},"nullable":true},"id":{"description":"Unique ID for the user","nullable":true,"type":"string"},"enabled":{"description":"Active or inactive status for the user","nullable":true,"type":"boolean"},"groups":{"description":"Groups that this user belongs to","type":"array","items":{"type":"string"},"nullable":true},"username":{"description":"Unique username for the user","nullable":true,"type":"string"}},"description":"Information for Keycloak about the requested user.","required":["email"],"type":"object"},"UserRegistrationInitiation":{"properties":{"firstName":{"type":"string","nullable":true},"email":{"description":"Email that is registering for a new account.","type":"string"},"lastName":{"type":"string","nullable":true}},"description":"Information for intiating user registration","required":["email"],"type":"object"},"ObjectPair":{"properties":{"oldID":{"type":"string","format":"uuid"},"type":{"$ref":"#\/components\/schemas\/QuantumObjectType"},"newID":{"type":"string","format":"uuid"}},"type":"object","required":["newID","oldID","type"]},"GraphQLRequest":{"properties":{"variables":{"type":"object","additionalProperties":{"type":"boolean"},"nullable":true},"query":{"type":"string"},"operationName":{"type":"string","nullable":true}},"type":"object","required":["query"]},"UploadFileData":{"properties":{"ID":{"description":"UUID of the quantum binding node that you want to associate this file with.","type":"string","format":"uuid"},"file":{"description":"File data to write to the server.","type":"string","format":"byte"},"fileType":{"description":"The type of file the given data represents.","type":"string"},"filePath":{"type":"string","nullable":true}},"description":"Data required to upload a file binding.","type":"object","required":["ID","file","fileType"]},"QuantumUserStatus":{"enum":["Active","Blocked","Deleted","Locked","Pending","Reset"],"type":"string"},"OrganizationImageData":{"properties":{"image":{"format":"byte","description":"File data to write to the server. Must be Base64-encoded if sending as JSON.","type":"string"},"fileType":{"description":"The type of file the given data represents, from a list of allowed files","type":"string"},"organizationID":{"format":"uuid","description":"The organization that is associated with this image request.","type":"string"}},"description":"Data required to upload a organization image","type":"object","required":["fileType","image","organizationID"]},"SourceLocation":{"properties":{"line":{"type":"integer","format":"int64"},"column":{"type":"integer","format":"int64"}},"type":"object","required":["column","line"]},"GenericMessageResponse":{"properties":{"message":{"description":"Informative message relating to the specific response","type":"string"}},"description":"Generic response information","required":["message"],"type":"object"},"ChangeUserPassword":{"properties":{"newPassword":{"description":"New password for the user.","type":"string"},"oldPassword":{"description":"Old password for the user, used to confirm identity.","type":"string"}},"description":"Information required to change a user's password from the authenticated change password flow","type":"object","required":["newPassword","oldPassword"]},"UploadImageData":{"properties":{"fileType":{"description":"The type of file the given data represents, from a list of allowed files.","type":"string"},"filePath":{"nullable":true,"type":"string"},"image":{"description":"File data to write to the server. Must be Base64-encoded if sending as JSON.","format":"byte","type":"string"},"ID":{"description":"UUID of the quantum image node that you want to associate this image file with.","format":"uuid","type":"string"}},"description":"Data required to upload an image.","type":"object","required":["ID","fileType","image"]},"QuantumLensAppStatusResponse":{"properties":{"osUpdate":{"type":"boolean","nullable":true},"appUpdate":{"type":"boolean","nullable":true}},"type":"object"}},"examples":{"AcceptOrganizationInvite":{"value":{"inviteID":"8D18C776-3EC5-400A-850A-FE34D36071FD"}},"DeleteOrganizationData":{"value":{"orgID":"DD8A893A-6DDD-466F-BDA2-58E16F716137"}},"UploadImageData":{"value":{"ID":"3213DBE6-B8BE-4DE0-9713-78518183E8A6","image":"PHN2ZyBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjQwIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjMiIGZpbGw9ImJsdWUiIC8+PC9zdmc+","fileType":"svg"}},"UpdatedUserEmail":{"value":{"newEmail":"emperorpalps@gallactic-empire.com","password":"unlimitedP0wuh!!!","oldEmail":"sheevpalpatine@old-republic.net"}},"DeviceLoginResponse":{"value":{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzM4NCIsImtpZCI6InBsLUUwOTk2NzlGLTQyNDQtNDA4Ni05NTZBLTg4OUM4QkVCQzg2QSJ9.eyJpc3N1ZXIiOiJQYXNzaXZlTG9naWMiLCJoaXZlSUQiOiJEMjU3M0M2Qy0wQjVBLTRCMzItQjM1Ni00OEEyOTlFRDE0OTMiLCJleHBpcmF0aW9uIjoxNzE0NDA2OTA3LjcyODE1Mywic3ViamVjdCI6IkhpdmUgQXV0aGVudGljYXRpb24iLCJoaXZlU2VyaWFsTnVtYmVyIjoiUTBSWFQyUE1HWCJ9.11Awfpm7Uo1LWBtZTCNn1pxUuliE3lcMF4bIqbJzX87u5zJRFRKqfNWdULlU7mmEq_Fes7CzEvSFmn7wlNLlZxY-T8NKhFq35raskqDW-ZdpXUKRk8aHyWfrCVeFcCZU"}},"RegisterUserData":{"value":{"firstName":"Anakin","lastName":"Skywalker","password":"Ih8obi-wan!higrndSUXX","email":"darthvader@galactic-empire.com","token":"<JWT Token from registration email>","acceptedEULA":true,"acceptMailingList":false,"username":"C38BEA53-7153-437C-BF8A-C2489339375A"}},"InviteUserToAuthGroupData":{"value":{"expiration":"2027-09-30T00:34:13Z","authGroupID":"6828FE62-920E-4D27-BDEE-9775280CE31D","inviteEmail":"mithrawnuruodo@galactic-empire.com","role":"StandardUser"}},"OrgInviteResponse":{"value":{"message":"Invitation sent.","inviteID":"38E8FF61-FCDE-44D5-BD7C-7A4E5CB1144F"}},"GenerateApiKeyResponse":{"value":{"expiration":844043653038898,"key":"564d9054fb2cf06e3592c8c4fdc1f613822b0de6358d8580a78ae0b204be3f95"}},"UploadFileData":{"value":{"file":"PHN2ZyBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjQwIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjMiIGZpbGw9ImJsdWUiIC8+PC9zdmc+","ID":"F4CD9D8B-6ED5-4505-B8ED-7EFDE09F975A","fileType":"svg"}},"OrganizationImageData":{"value":{"fileType":"svg","organizationID":"7DC3A93C-CABC-47D1-B9FC-9655A32C34B6","image":"PHN2ZyBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjQwIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjMiIGZpbGw9ImJsdWUiIC8+PC9zdmc+"}},"GenericMessageResponse":{"value":{"message":"We will watch your career with great interest."}},"ChangePasswordData":{"value":{"newPassword":"SandSuxDest0ryAllSand"}},"AuthGroupInviteResponse":{"value":{"message":"Invitation sent.","inviteID":"9197944F-56A8-4D22-AFDB-5F99FE99F26E"}},"RegisterUserResponse":{"value":{"userStatus":"Active","newUserID":{"id":"95A1E009-19E8-4263-98B5-4F78106CF100","type":"User"},"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJQYXNzaXZlTG9naWMiLCJzdWIiOiJBUEkiLCJleHAiOjE1MTYyMzkwMjIsIklEIjoiMjAyZTI0MTEtNjQ5OS00YWJlLTk5MmYtMmZmODU1MWY5NmU5IiwibmFtZSI6ImRhcnRodmFkZXIiLCJzdGF0dXMiOiJBY3RpdmUifQ.KiI6-jHPAMsDHvyA7U-BaRZ8mZnByF9a1887lVb-1lY","message":"User registered successfully.","refresh":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJQYXNzaXZlTG9naWMiLCJzdWIiOiJBUEkiLCJleHAiOjE1MTYyMzkwMjIsIklEIjoiMjAyZTI0MTEtNjQ5OS00YWJlLTk5MmYtMmZmODU1MWY5NmU5IiwidXNlcklEIjoiMzMwYTFmMjktMTlkMC00Y2M5LWI3MjQtOWJmNDQxNWY4ODY1In0.hyyBxcHBXqYzwZehxqW7aCwfQTlngtCc7gRW31ijK50"}},"ImageData":{"value":{"image":"PHN2ZyBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjQwIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjMiIGZpbGw9ImJsdWUiIC8+PC9zdmc+","fileType":"svg"}},"WhoAmIResponse":{"value":{"eulaAccepted":true,"emailVerified":true,"lastName":"Skywalker","userID":"A4AB4B55-13E1-4D8F-A5C2-16246A3CE737","firstName":"Anakin"}},"RequestResetPasswordData":{"value":{"usernameOrEmail":"darthvader@galactic-empire.com"}},"DeclineOrganizationInvite":{"value":{"inviteID":"AE79BFB7-3355-475F-A5E1-496994931395"}},"LoginResponse":{"value":{"whoAmI":{"lastName":"Skywalker","emailVerified":true,"firstName":"Anakin","eulaAccepted":true,"userID":"E30D5795-4CE0-4337-9614-DC10F66F975A"},"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJQYXNzaXZlTG9naWMiLCJzdWIiOiJBUEkiLCJleHAiOjE1MTYyMzkwMjIsIklEIjoiMjAyZTI0MTEtNjQ5OS00YWJlLTk5MmYtMmZmODU1MWY5NmU5IiwibmFtZSI6ImRhcnRodmFkZXIiLCJzdGF0dXMiOiJBY3RpdmUifQ.KiI6-jHPAMsDHvyA7U-BaRZ8mZnByF9a1887lVb-1lY","refresh":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJQYXNzaXZlTG9naWMiLCJzdWIiOiJBUEkiLCJleHAiOjE1MTYyMzkwMjIsIklEIjoiMjAyZTI0MTEtNjQ5OS00YWJlLTk5MmYtMmZmODU1MWY5NmU5IiwidXNlcklEIjoiMzMwYTFmMjktMTlkMC00Y2M5LWI3MjQtOWJmNDQxNWY4ODY1In0.hyyBxcHBXqYzwZehxqW7aCwfQTlngtCc7gRW31ijK50"}},"String":{"value":"some string"},"AuthGroupRemovalResponse":{"value":{"userID":"18814387-21F3-4959-9A0A-643F50F54DE2","authGroupID":"DB236D13-5F80-422C-9982-7298EB62577A","message":"User has been successfully removed!"}},"ImageUploadResponse":{"value":{"url":"http:\/\/www.passivelogic.com\/image\/B16CDBD8-B533-4C66-BE27-4EC08552A761","message":"Image was succefully updated."}},"ChangeUserPassword":{"value":{"oldPassword":"Ih8obi-wan!higrndSUXX","newPassword":"SandSuxDest0ryAllSand"}},"KeycloakUserInfo":{"value":{"requiredActions":["UPDATE_PASSWORD","UPDATE_PROFILE"],"emailVerified":true,"attributes":{"position":["Dark Lord of the Sith"],"likes":["lightsabers","the Force"]},"lastName":"Skywalker","roles":["admin"],"email":"darthvader@galactic-empire.com","firstName":"Anakin","access":{"view":true,"manageGroupMembership":true},"id":"75B07AC1-FAB5-4862-B695-A0355DEDBDAE","enabled":true,"groups":["sith","empire"],"username":"darthvader"}},"RemoveApiKeyRequest":{"value":{"key":"564d9054fb2cf06e3592c8c4fdc1f613822b0de6358d8580a78ae0b204be3f95"}},"BindingUploadResponse":{"value":{"url":"https:\/\/passivelogic.com\/binding\/183C451F-C144-4A2D-9B28-27D9234594C2","message":"Binding object was successfully updated."}},"UserRegistrationInitiation":{"value":{"email":"darthvader@galactic-empire.com"}},"InviteUserToOrganizationData":{"value":{"role":"StandardUser","expiration":"2027-09-30T00:34:14Z","orgID":"EF7B573D-7535-46B2-8CC5-587897D6E169","inviteEmail":"mithrawnuruodo@galactic-empire.com"}}}},"tags":[{"name":"app"},{"description":"Routes related to user auth","name":"Authentication"},{"description":"Routes related to AuthGroup management.","name":"Auth Groups"},{"description":"Routes related to Binding management.","name":"Bindings"},{"description":"Routes related to exporting objects and history","name":"Export"},{"description":"Routes related to the GraphQL API","name":"GraphQL"},{"description":"Routes related to server health checks","name":"Health"},{"description":"Routes related to Image management","name":"Images"},{"description":"Routes related to quantum sync","name":"Quantum Sync"},{"description":"Routes related to site objects","name":"Site"},{"description":"Routes related to server metadata\/utility","name":"Utility"},{"description":"Routes related to user account management.","name":"Account"},{"description":"Routes related to organization management","name":"Organization"},{"description":"Routes related to PassiveLogic devices","name":"PassiveLogic Device"}]}