{"openapi":"3.0.1","paths":{"\/api\/v0.19\/util\/pl-hardware-info":{"get":{"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.","tags":["Utility"],"operationId":"getApiV0.19UtilPl-hardware-info","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/DeployedOnHiveResponse"}}},"description":"OK"}}}},"\/api\/tunnel\/{serialNumber}\/**":{"delete":{"tags":["tunnel"],"description":"DELETE \/tunnel\/:serialNumber\/**","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]},"get":{"tags":["tunnel"],"description":"GET \/tunnel\/:serialNumber\/**","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]},"put":{"tags":["tunnel"],"description":"PUT \/tunnel\/:serialNumber\/**","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]},"post":{"tags":["tunnel"],"description":"POST \/tunnel\/:serialNumber\/**","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/util\/quantumlens":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"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"],"summary":"QuantumLens (iOS) update & compatibility check","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/QuantumLensResponse"}}}}},"operationId":"postApiUtilQuantumlens"}},"\/api\/v0.20\/organization\/update-image":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Organization"],"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"}}}}},"responses":{"200":{"content":{"application\/json":{"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}},"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"}}},"description":"OK"}},"summary":"Updates the organization's image","operationId":"postApiV0.20OrganizationUpdate-image"}},"\/api\/v0.19\/auth\/password\/reset\/change":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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"}}}}},"deprecated":true,"summary":"Changes a user's password from the password reset flow.","operationId":"postApiV0.19AuthPasswordResetChange","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}}}},"\/api\/v0.20\/image\/{imageID}":{"delete":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"parameters":[{"in":"path","required":true,"name":"imageID","schema":{"type":"string"}}],"tags":["Images"],"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.","deprecated":true,"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.","operationId":"deleteApiV0.20ImageByImageID","responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}}}},"\/api\/v0.19\/auth\/register\/initiate":{"post":{"tags":["Authentication"],"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":{"examples":{"UserRegistrationInitiation":{"$ref":"#\/components\/examples\/UserRegistrationInitiation"}},"schema":{"$ref":"#\/components\/schemas\/UserRegistrationInitiation"}}},"required":true},"deprecated":true,"responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"operationId":"postApiV0.19AuthRegisterInitiate","summary":"Sends an email to begin email verification and registration."}},"\/api\/organization\/update-image":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Organization"],"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":{"examples":{"OrganizationImageData":{"$ref":"#\/components\/examples\/OrganizationImageData"}},"schema":{"$ref":"#\/components\/schemas\/OrganizationImageData"}}},"required":true},"summary":"Updates the organization's image","operationId":"postApiOrganizationUpdate-image","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}},"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"}}}}}}},"\/api\/auth\/zendesk":{"get":{"operationId":"getApiAuthZendesk","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\/v0.19\/organization\/delete":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Organization"],"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"}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"summary":"Deletes specified organization.","operationId":"postApiV0.19OrganizationDelete"}},"\/app\/qc\/**":{"get":{"tags":["app"],"description":"GET \/app\/qc\/**"}},"\/app\/login":{"get":{"tags":["app"],"summary":"Redirects to external authentication provider (Keycloak).","description":"","operationId":"getAppLogin"}},"\/api\/v0.20\/auth\/magic-link-login":{"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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.","deprecated":true,"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"operationId":"getApiV0.20AuthMagic-link-login","summary":"Logs in a user using Magic Link generated by POST magic-link-generate"}},"\/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.","tags":["Account"],"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"operationId":"getApiV0.19AccountCredentials","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"items":{"$ref":"#\/components\/schemas\/KeycloakCredentialInfo"},"type":"array"}}}}},"summary":"Retrieves a list of the credentials the current user has enabled."}},"\/api\/auth\/magic-link-generate":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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},"deprecated":true,"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/MagicLinkResponse"}}},"description":"OK"}},"operationId":"postApiAuthMagic-link-generate","summary":"Generates a Magic Link to be used to login."}},"\/api\/v0.19\/auth\/verify":{"get":{"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.","summary":"Redirects user to login","operationId":"getApiV0.19AuthVerify","tags":["Authentication"],"parameters":[{"example":"darthvader@galactic-empire.com","name":"email","required":true,"description":"User's email to confirm as verified","in":"query","schema":{"type":"string"}}]}},"\/app\/login\/**":{"get":{"tags":["app"],"description":"GET \/app\/login\/**"}},"\/api\/v0.19\/organization\/decline":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Organization"],"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},"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"operationId":"postApiV0.19OrganizationDecline","summary":"Declines an organization invitation"}},"\/api\/auth\/login":{"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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.","deprecated":true,"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/LoginResponse"},"examples":{"LoginResponse":{"$ref":"#\/components\/examples\/LoginResponse"}}}}}},"operationId":"getApiAuthLogin","summary":"Logs in a user"}},"\/api\/v0.19\/organization\/update-image":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Organization"],"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"}}}}},"summary":"Updates the organization's image","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}},"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"}}}}},"operationId":"postApiV0.19OrganizationUpdate-image"}},"\/api\/v0.20\/auth\/whoami":{"get":{"tags":["Authentication"],"description":"Useful to check if a user is authenticated.","operationId":"getApiV0.20AuthWhoami","summary":"Returns information about the currently logged in 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\/WhoAmIResponse"},"examples":{"WhoAmIResponse":{"$ref":"#\/components\/examples\/WhoAmIResponse"}}}}}}}},"\/api\/health\/readiness":{"get":{"operationId":"getApiHealthReadiness","tags":["Health"],"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":[]}],"summary":"Readiness check used to determine if webserver is ready to accept traffic"}},"\/api\/v0.20\/auth\/logout":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"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.20AuthLogout"}},"\/api\/v0.20\/export\/property\/history":{"get":{"operationId":"getApiV0.20ExportPropertyHistory","responses":{"200":{"content":{"text\/plain":{"examples":{"String":{"$ref":"#\/components\/examples\/String"}},"schema":{"type":"string"}}},"description":"OK"}},"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Exports CSV formatted property history data","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","tags":["Export"]}},"\/api\/v0.20\/auth\/login":{"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"deprecated":true,"tags":["Authentication"],"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.","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"LoginResponse":{"$ref":"#\/components\/examples\/LoginResponse"}},"schema":{"$ref":"#\/components\/schemas\/LoginResponse"}}}}},"summary":"Logs in a user","operationId":"getApiV0.20AuthLogin"}},"\/api\/v0.20\/util\/ping":{"get":{"tags":["Utility"],"summary":"Keep-alive ping\/pong route","operationId":"getApiV0.20UtilPing","description":"Use to check webserver health or keep connection alive. Returns pong message.","responses":{"200":{"content":{"text\/plain":{"schema":{"type":"string"},"examples":{"String":{"$ref":"#\/components\/examples\/String"}}}},"description":"OK"}}}},"\/api\/health\/liveness":{"get":{"summary":"Liveness check used to determine when webserver should be restarted","operationId":"getApiHealthLiveness","description":"See https:\/\/kubernetes.io\/docs\/concepts\/configuration\/liveness-readiness-startup-probes\/#liveness-probe","tags":["Health"],"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/authgroup\/remove\/{authGroupID}\/{userID}":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"parameters":[{"name":"authGroupID","in":"path","required":true,"schema":{"type":"string"}},{"name":"userID","in":"path","required":true,"schema":{"type":"string"}}],"tags":["Auth Groups"],"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.","responses":{"200":{"content":{"application\/json":{"examples":{"AuthGroupRemovalResponse":{"$ref":"#\/components\/examples\/AuthGroupRemovalResponse"}},"schema":{"$ref":"#\/components\/schemas\/AuthGroupRemovalResponse"}}},"description":"OK"}},"summary":"Removes user from Auth Group","operationId":"postApiAuthgroupRemoveByAuthGroupIDByUserID"}},"\/api\/v0.20\/organization\/delete":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Organization"],"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":{"content":{"application\/json":{"examples":{"DeleteOrganizationData":{"$ref":"#\/components\/examples\/DeleteOrganizationData"}},"schema":{"$ref":"#\/components\/schemas\/DeleteOrganizationData"}}},"required":true},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"summary":"Deletes specified organization.","operationId":"postApiV0.20OrganizationDelete"}},"\/api\/v0.20\/organization\/update-logo":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Organization"],"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"}}}},"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"},"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}}}},"description":"OK"}},"operationId":"postApiV0.20OrganizationUpdate-logo","summary":"Updates the organization's logo"}},"\/api\/v0.20\/authgroup\/join":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Auth Groups"],"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},"deprecated":true,"responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"operationId":"postApiV0.20AuthgroupJoin","summary":"Accepts an AuthGroup Invitation"},"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Auth Groups"],"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":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/AcceptOrganizationInvite"},"examples":{"AcceptOrganizationInvite":{"$ref":"#\/components\/examples\/AcceptOrganizationInvite"}}}}},"responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}},"operationId":"getApiV0.20AuthgroupJoin","summary":"Accepts an AuthGroup Invitation"}},"\/app\/qs\/**":{"get":{"tags":["app"],"description":"GET \/app\/qs\/**"}},"\/api\/device\/tailscale\/authToken":{"get":{"summary":"Generates an OAuth token for Tailscale","description":"AutToken generated allowing hive's to enroll in our tailnet.\n\nmTLS authentication required.","operationId":"getApiDeviceTailscaleAuthToken","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":[]}],"tags":["PassiveLogic Device"]}},"\/api\/account\/user\/delete":{"delete":{"tags":["Account"],"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Deletes the user making this request.","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"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.","operationId":"deleteApiAccountUserDelete"}},"\/api\/organization\/invite":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Organization"],"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"}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/OrgInviteResponse"},"examples":{"OrgInviteResponse":{"$ref":"#\/components\/examples\/OrgInviteResponse"}}}}}},"operationId":"postApiOrganizationInvite","summary":"Sends an organization invite to the given email."}},"\/api\/account\/eula\/accept":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Account"],"deprecated":true,"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.","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"operationId":"postApiAccountEulaAccept","summary":"Accepts EULA for the current user"}},"\/api\/v0.20\/auth\/email\/change":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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":{"examples":{"UpdatedUserEmail":{"$ref":"#\/components\/examples\/UpdatedUserEmail"}},"schema":{"$ref":"#\/components\/schemas\/UpdatedUserEmail"}}},"required":true},"deprecated":true,"summary":"Initiates an email change for the current user.","operationId":"postApiV0.20AuthEmailChange","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}}}},"\/api\/v0.19\/quantumsync":{"get":{"summary":"QuantumSync API over websockets","tags":["Quantum Sync"],"operationId":"getApiV0.19Quantumsync","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"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```"}},"\/api\/auth\/password\/reset":{"post":{"tags":["Authentication"],"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":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RequestResetPasswordData"},"examples":{"RequestResetPasswordData":{"$ref":"#\/components\/examples\/RequestResetPasswordData"}}}}},"deprecated":true,"summary":"Initiates a password reset.","operationId":"postApiAuthPasswordReset","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}}}},"\/app\/qe\/*":{"get":{"tags":["app"],"description":"GET \/app\/qe\/*"}},"\/app\/login\/password":{"get":{"tags":["app"],"description":"","operationId":"getAppLoginPassword","summary":"Redirects to external authentication provider (Keycloak)."}},"\/api\/v0.20\/auth\/kc\/{user}":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string"}}],"tags":["Authentication"],"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.","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"operationId":"postApiV0.20AuthKcByUser","summary":"Validates a user's password"},"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string"}}],"tags":["Authentication"],"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.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/KeycloakUserInfo"},"examples":{"KeycloakUserInfo":{"$ref":"#\/components\/examples\/KeycloakUserInfo"}}}}}},"operationId":"getApiV0.20AuthKcByUser","summary":"Retrieves user information for Keycloak"}},"\/api\/v0.19\/auth\/magic-link-generate":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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},"deprecated":true,"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/MagicLinkResponse"}}},"description":"OK"}},"operationId":"postApiV0.19AuthMagic-link-generate","summary":"Generates a Magic Link to be used to login."}},"\/api\/auth\/api-key":{"delete":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"description":"Validates that the given token is linked to the currently authenticated user and removes it if so.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RemoveApiKeyRequest"},"examples":{"RemoveApiKeyRequest":{"$ref":"#\/components\/examples\/RemoveApiKeyRequest"}}}}},"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"},"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}}}},"description":"OK"}},"operationId":"deleteApiAuthApi-key","summary":"Removes a given API key for the user"}},"\/api\/v0.19\/auth\/api-key":{"delete":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"description":"Validates that the given token is linked to the currently authenticated user and removes it if so.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RemoveApiKeyRequest"},"examples":{"RemoveApiKeyRequest":{"$ref":"#\/components\/examples\/RemoveApiKeyRequest"}}}}},"summary":"Removes a given API key for the user","operationId":"deleteApiV0.19AuthApi-key","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"},"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}}}}}}}},"\/api\/v0.20\/auth\/password\/reset":{"post":{"tags":["Authentication"],"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":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RequestResetPasswordData"},"examples":{"RequestResetPasswordData":{"$ref":"#\/components\/examples\/RequestResetPasswordData"}}}}},"deprecated":true,"responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}},"operationId":"postApiV0.20AuthPasswordReset","summary":"Initiates a password reset."}},"\/api\/v0.19\/auth\/api-key\/generate":{"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"parameters":[{"schema":{"format":"int64","nullable":true,"type":"integer"},"in":"query","name":"expireSeconds","required":false,"example":2678400,"description":"Number of seconds until the key expires."},{"schema":{"type":"string","nullable":true},"in":"query","name":"role","required":false,"example":"ReadOnlyUser","description":"Role of the new key."}],"tags":["Authentication"],"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.","summary":"Generates an API key for the current user","operationId":"getApiV0.19AuthApi-keyGenerate","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"},"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}}}}}}}},"\/api\/auth\/offline":{"get":{"description":"GET \/auth\/offline","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"]}},"\/api\/auth\/password\/change":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ChangeUserPassword"},"examples":{"ChangeUserPassword":{"$ref":"#\/components\/examples\/ChangeUserPassword"}}}},"required":true},"deprecated":true,"summary":"Changes a user's password for an already authenticated user.","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"operationId":"postApiAuthPasswordChange"},"get":{"summary":"Redirects the user to the change password flow in the external auth provider (Keycloak).","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"description":"","operationId":"getApiAuthPasswordChange","tags":["Authentication"]}},"\/app\/login\/eula":{"get":{"description":"","tags":["app"],"summary":"Redirects to external authentication provider (Keycloak).","operationId":"getAppLoginEula"}},"\/api\/v0.20\/auth\/api-key\/remove":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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"}}}},"deprecated":true,"responses":{"200":{"content":{"application\/json":{"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"}}},"description":"OK"}},"summary":"Removes a given API key for the user. This route has been deprecated in favor of: DELETE \/api\/v0.20\/auth\/api-key.","operationId":"postApiV0.20AuthApi-keyRemove"},"delete":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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},"deprecated":true,"responses":{"200":{"content":{"application\/json":{"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"}}},"description":"OK"}},"summary":"Removes a given API key for the user. This route has been deprecated in favor of: DELETE \/api\/v0.20\/auth\/api-key.","operationId":"deleteApiV0.20AuthApi-keyRemove"}},"\/api\/image\/user-avatar":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Images"],"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"}}}},"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"},"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}}}},"description":"OK"}},"operationId":"postApiImageUser-avatar","summary":"Update user avatar image"}},"\/api\/v0.19\/auth\/password\/change":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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":{"content":{"application\/json":{"examples":{"ChangeUserPassword":{"$ref":"#\/components\/examples\/ChangeUserPassword"}},"schema":{"$ref":"#\/components\/schemas\/ChangeUserPassword"}}},"required":true},"deprecated":true,"summary":"Changes a user's password for an already authenticated user.","operationId":"postApiV0.19AuthPasswordChange","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}}},"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"operationId":"getApiV0.19AuthPasswordChange","summary":"Redirects the user to the change password flow in the external auth provider (Keycloak).","description":""}},"\/api\/v0.19\/account\/eula\/accept":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"deprecated":true,"tags":["Account"],"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.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"summary":"Accepts EULA for the current user","operationId":"postApiV0.19AccountEulaAccept"}},"\/api\/v0.19\/health\/readiness":{"get":{"description":"See https:\/\/kubernetes.io\/docs\/concepts\/configuration\/liveness-readiness-startup-probes\/#readiness-probe","tags":["Health"],"operationId":"getApiV0.19HealthReadiness","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\/auth\/keys":{"get":{"operationId":"getApiAuthKeys","tags":["Authentication"],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/JWKS"}}}}},"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"}},"\/api\/binding":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Bindings"],"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":{"required":true,"content":{"application\/json":{"examples":{"UploadFileData":{"$ref":"#\/components\/examples\/UploadFileData"}},"schema":{"$ref":"#\/components\/schemas\/UploadFileData"}},"multipart\/form-data":{"examples":{"UploadFileData":{"$ref":"#\/components\/examples\/UploadFileData"}},"schema":{"$ref":"#\/components\/schemas\/UploadFileData"}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/BindingUploadResponse"},"examples":{"BindingUploadResponse":{"$ref":"#\/components\/examples\/BindingUploadResponse"}}}}}},"operationId":"postApiBinding","summary":"Uploads a file associated with a binding."}},"\/api\/v0.20\/auth\/profile\/change":{"get":{"description":"","tags":["Authentication"],"summary":"Redirects the user the change profile flow in the external auth provider (Keycloak).","operationId":"getApiV0.20AuthProfileChange","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/app\/az\/**":{"get":{"tags":["app"],"description":"GET \/app\/az\/**"}},"\/api\/v0.19\/auth\/keys":{"get":{"tags":["Authentication"],"operationId":"getApiV0.19AuthKeys","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","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/JWKS"}}},"description":"OK"}},"summary":"Returns the public keys used to sign PassiveLogic JSON web tokens."}},"\/api\/v0.19\/auth\/logout":{"post":{"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","summary":"Logs out a user","responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}},"tags":["Authentication"],"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/auth\/whoami":{"get":{"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/WhoAmIResponse"},"examples":{"WhoAmIResponse":{"$ref":"#\/components\/examples\/WhoAmIResponse"}}}}}},"summary":"Returns information about the currently logged in user.","tags":["Authentication"],"operationId":"getApiAuthWhoami","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"description":"Useful to check if a user is authenticated."}},"\/api\/v0.20\/auth\/api-key":{"delete":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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"}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"},"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}}}}}},"operationId":"deleteApiV0.20AuthApi-key","summary":"Removes a given API key for the user"}},"\/api\/v0.19\/auth\/login":{"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"deprecated":true,"tags":["Authentication"],"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.","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"LoginResponse":{"$ref":"#\/components\/examples\/LoginResponse"}},"schema":{"$ref":"#\/components\/schemas\/LoginResponse"}}}}},"operationId":"getApiV0.19AuthLogin","summary":"Logs in a user"}},"\/app\/login\/reset":{"get":{"tags":["app"],"operationId":"getAppLoginReset","summary":"Redirects to external authentication provider (Keycloak).","description":""}},"\/api\/v0.19\/auth\/email\/change":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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":{"examples":{"UpdatedUserEmail":{"$ref":"#\/components\/examples\/UpdatedUserEmail"}},"schema":{"$ref":"#\/components\/schemas\/UpdatedUserEmail"}}},"required":true},"deprecated":true,"responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}},"summary":"Initiates an email change for the current user.","operationId":"postApiV0.19AuthEmailChange"}},"\/api\/v0.19\/auth\/whoami":{"get":{"tags":["Authentication"],"description":"Useful to check if a user is authenticated.","operationId":"getApiV0.19AuthWhoami","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":[]}],"summary":"Returns information about the currently logged in user."}},"\/api\/auth\/register":{"post":{"tags":["Authentication"],"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":{"content":{"application\/json":{"examples":{"RegisterUserData":{"$ref":"#\/components\/examples\/RegisterUserData"}},"schema":{"$ref":"#\/components\/schemas\/RegisterUserData"}}},"required":true},"deprecated":true,"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RegisterUserResponse"},"examples":{"RegisterUserResponse":{"$ref":"#\/components\/examples\/RegisterUserResponse"}}}},"description":"OK"}},"operationId":"postApiAuthRegister","summary":"Registers a new user"}},"\/api\/v0.19\/organization\/invite":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Organization"],"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},"summary":"Sends an organization invite to the given email.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/OrgInviteResponse"},"examples":{"OrgInviteResponse":{"$ref":"#\/components\/examples\/OrgInviteResponse"}}}}}},"operationId":"postApiV0.19OrganizationInvite"}},"\/api\/auth\/verify":{"get":{"description":"Redirects user to `\/api\/auth\/login`, passing along the provided valid jwt and email.\n\nExists in this form for backward compatibility.","summary":"Redirects user to login","tags":["Authentication"],"operationId":"getApiAuthVerify","parameters":[{"schema":{"type":"string"},"name":"email","in":"query","description":"User's email to confirm as verified","required":true,"example":"darthvader@galactic-empire.com"}]}},"\/api\/meta.json":{"get":{"description":"GET \/api\/meta.json","tags":["api"]}},"\/api\/v0.20\/organization\/join":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Organization"],"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"}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"operationId":"postApiV0.20OrganizationJoin","summary":"Adds a user to an organization"}},"\/api\/quantumsync":{"get":{"summary":"QuantumSync API over websockets","tags":["Quantum Sync"],"operationId":"getApiQuantumsync","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"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```"}},"\/api\/auth\/profile\/change":{"get":{"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).","tags":["Authentication"],"operationId":"getApiAuthProfileChange","description":""}},"\/api\/v0.20\/auth\/password\/change":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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"}}}},"deprecated":true,"responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"operationId":"postApiV0.20AuthPasswordChange","summary":"Changes a user's password for an already authenticated user."},"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"operationId":"getApiV0.20AuthPasswordChange","tags":["Authentication"],"summary":"Redirects the user to the change password flow in the external auth provider (Keycloak).","description":""}},"\/api\/v0.20\/auth\/api-key\/generate":{"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"parameters":[{"description":"Number of seconds until the key expires.","schema":{"nullable":true,"format":"int64","type":"integer"},"example":2678400,"required":false,"name":"expireSeconds","in":"query"},{"description":"Role of the new key.","schema":{"nullable":true,"type":"string"},"example":"ReadOnlyUser","required":false,"name":"role","in":"query"}],"tags":["Authentication"],"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.","summary":"Generates an API key for the current user","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"},"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}}}}}},"operationId":"getApiV0.20AuthApi-keyGenerate"}},"\/api\/v0.20\/util\/quantumlens":{"post":{"tags":["Utility"],"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.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/QuantumLensResponse"}}}}},"operationId":"postApiV0.20UtilQuantumlens","summary":"QuantumLens (iOS) update & compatibility check","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/v0.19\/organization\/join":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Organization"],"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},"summary":"Adds a user to an organization","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"operationId":"postApiV0.19OrganizationJoin"}},"\/api\/v0.19\/util\/version":{"get":{"tags":["Utility"],"description":"Returns commit hashes & build times for the running build of the webserver and all apps.","summary":"Returns version information","operationId":"getApiV0.19UtilVersion","responses":{"200":{"content":{"text\/plain":{"schema":{"type":"string"},"examples":{"String":{"$ref":"#\/components\/examples\/String"}}}},"description":"OK"}},"deprecated":true}},"\/api\/organization\/decline":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Organization"],"description":"Rejects an invitation based on Organization invite ID.\nInvitation is deleted.","requestBody":{"required":true,"content":{"application\/json":{"examples":{"DeclineOrganizationInvite":{"$ref":"#\/components\/examples\/DeclineOrganizationInvite"}},"schema":{"$ref":"#\/components\/schemas\/DeclineOrganizationInvite"}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"operationId":"postApiOrganizationDecline","summary":"Declines an organization invitation"}},"\/api\/v0.19\/util\/quantumversion":{"get":{"summary":"Returns the Quantum Schema version","operationId":"getApiV0.19UtilQuantumversion","tags":["Utility"],"description":"Returns the current version of the Quantum schema in use by this webserver as a semantic version.","responses":{"200":{"description":"OK","content":{"text\/plain":{"schema":{"type":"string"},"examples":{"String":{"$ref":"#\/components\/examples\/String"}}}}}}}},"\/api\/auth\/api-key\/generate":{"get":{"operationId":"getApiAuthApi-keyGenerate","parameters":[{"required":false,"description":"Number of seconds until the key expires.","schema":{"type":"integer","nullable":true,"format":"int64"},"name":"expireSeconds","example":2678400,"in":"query"},{"required":false,"description":"Role of the new key.","schema":{"nullable":true,"type":"string"},"name":"role","example":"ReadOnlyUser","in":"query"}],"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"},"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}}}},"description":"OK"}},"summary":"Generates an API key for the current user","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\/image\/user-avatar":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Images"],"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"}}}},"summary":"Update user avatar image","responses":{"200":{"content":{"application\/json":{"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}},"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"}}},"description":"OK"}},"operationId":"postApiV0.20ImageUser-avatar"}},"\/api\/v0.19\/auth\/magic-link-login":{"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"deprecated":true,"tags":["Authentication"],"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.","summary":"Logs in a user using Magic Link generated by POST magic-link-generate","operationId":"getApiV0.19AuthMagic-link-login","responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}}}},"\/app\/login\/signIn":{"get":{"summary":"Redirects to external authentication provider (Keycloak).","description":"","operationId":"getAppLoginSignIn","tags":["app"]}},"\/api\/v0.20\/util\/pl-hardware-info":{"get":{"operationId":"getApiV0.20UtilPl-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.","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."}},"\/api\/v0.20\/image":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Images"],"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":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/UploadImageData"},"examples":{"UploadImageData":{"$ref":"#\/components\/examples\/UploadImageData"}}},"multipart\/form-data":{"schema":{"$ref":"#\/components\/schemas\/UploadImageData"},"examples":{"UploadImageData":{"$ref":"#\/components\/examples\/UploadImageData"}}}}},"summary":"Uploads an image.","responses":{"200":{"content":{"application\/json":{"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}},"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"}}},"description":"OK"}},"operationId":"postApiV0.20Image"}},"\/api\/account\/credentials":{"get":{"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.","operationId":"getApiAccountCredentials","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"type":"array","items":{"$ref":"#\/components\/schemas\/KeycloakCredentialInfo"}}}}}},"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Account"]}},"\/api\/util\/quantumversion":{"get":{"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","description":"Returns the current version of the Quantum schema in use by this webserver as a semantic version."}},"\/api\/v0.19\/datasync":{"get":{"summary":"QuantumSync API Legacy Route. Use \/api\/v0.19\/quantumsync instead.","operationId":"getApiV0.19Datasync","deprecated":true,"tags":["Quantum Sync"],"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"description":"Refer to the \/api\/v0.19\/quantumsync route documentation for full details. This route will be removed in the next major version."}},"\/api\/v0.19\/util\/ping":{"get":{"tags":["Utility"],"description":"Use to check webserver health or keep connection alive. Returns pong message.","responses":{"200":{"description":"OK","content":{"text\/plain":{"schema":{"type":"string"},"examples":{"String":{"$ref":"#\/components\/examples\/String"}}}}}},"summary":"Keep-alive ping\/pong route","operationId":"getApiV0.19UtilPing"}},"\/api\/v0.20\/datasync":{"get":{"tags":["Quantum Sync"],"description":"Refer to the \/api\/v0.20\/quantumsync route documentation for full details. This route will be removed in the next major version.","deprecated":true,"operationId":"getApiV0.20Datasync","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"QuantumSync API Legacy Route. Use \/api\/v0.20\/quantumsync instead."}},"\/api\/v0.20\/device\/register":{"post":{"tags":["PassiveLogic Device"],"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"description":"POST \/device\/register"}},"\/api\/v0.19\/graphql":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["GraphQL"],"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"}}}},"externalDocs":{"description":"GraphQL documentation.","url":"https:\/\/graphql.org\/learn\/serving-over-http\/#post-request"},"summary":"GraphQL API","operationId":"postApiV0.19Graphql","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GraphQLResult"}}},"description":"OK"}}},"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"parameters":[{"in":"query","name":"query","required":true,"schema":{"type":"string"}},{"in":"query","name":"operationName","required":false,"schema":{"nullable":true,"type":"string"}},{"example":{},"in":"query","name":"variables","required":false,"schema":{"additionalProperties":{"type":"boolean"},"type":"object","nullable":true}}],"tags":["GraphQL"],"description":"Serves the GraphQL API. For more details, see [graphql.org](https:\/\/graphql.org\/learn\/serving-over-http\/#get-request)","externalDocs":{"description":"GraphQL documentation.","url":"https:\/\/graphql.org\/learn\/serving-over-http\/#get-request"},"summary":"GraphQL API","operationId":"getApiV0.19Graphql","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GraphQLResult"}}}}}}},"\/api\/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.19\/auth\/email\/change\/verify":{"get":{"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/UpdatedUserEmail"},"examples":{"UpdatedUserEmail":{"$ref":"#\/components\/examples\/UpdatedUserEmail"}}}}},"operationId":"getApiV0.19AuthEmailChangeVerify","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"}}}}}},"summary":"Verifies and updates new user email","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.","deprecated":true,"tags":["Authentication"]}},"\/api\/auth\/register\/initiate":{"post":{"tags":["Authentication"],"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},"deprecated":true,"responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}},"summary":"Sends an email to begin email verification and registration.","operationId":"postApiAuthRegisterInitiate"}},"\/api\/v0.19\/util\/externalauthconfig":{"get":{"operationId":"getApiV0.19UtilExternalauthconfig","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"}},"tags":["Utility"]}},"\/api\/v0.19\/auth\/register":{"post":{"tags":["Authentication"],"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"}}}}},"deprecated":true,"summary":"Registers a new user","operationId":"postApiV0.19AuthRegister","responses":{"200":{"content":{"application\/json":{"examples":{"RegisterUserResponse":{"$ref":"#\/components\/examples\/RegisterUserResponse"}},"schema":{"$ref":"#\/components\/schemas\/RegisterUserResponse"}}},"description":"OK"}}}},"\/api\/v0.20\/account\/credentials":{"get":{"operationId":"getApiV0.20AccountCredentials","tags":["Account"],"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":{"description":"OK","content":{"application\/json":{"schema":{"type":"array","items":{"$ref":"#\/components\/schemas\/KeycloakCredentialInfo"}}}}}},"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/v0.20\/auth\/password\/reset\/change":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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":{"examples":{"ChangePasswordData":{"$ref":"#\/components\/examples\/ChangePasswordData"}},"schema":{"$ref":"#\/components\/schemas\/ChangePasswordData"}}}},"deprecated":true,"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"operationId":"postApiV0.20AuthPasswordResetChange","summary":"Changes a user's password from the password reset flow."}},"\/api\/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":"getApiUtilPl-hardware-info"}},"\/app\/lp\/**":{"get":{"description":"GET \/app\/lp\/**","tags":["app"]}},"\/api\/graphql":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["GraphQL"],"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},"externalDocs":{"description":"GraphQL documentation.","url":"https:\/\/graphql.org\/learn\/serving-over-http\/#post-request"},"summary":"GraphQL API","operationId":"postApiGraphql","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GraphQLResult"}}},"description":"OK"}}},"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"parameters":[{"name":"query","schema":{"type":"string"},"in":"query","required":true},{"name":"operationName","schema":{"type":"string","nullable":true},"in":"query","required":false},{"name":"variables","schema":{"type":"object","additionalProperties":{"type":"boolean"},"nullable":true},"example":{},"in":"query","required":false}],"tags":["GraphQL"],"description":"Serves the GraphQL API. For more details, see [graphql.org](https:\/\/graphql.org\/learn\/serving-over-http\/#get-request)","externalDocs":{"url":"https:\/\/graphql.org\/learn\/serving-over-http\/#get-request","description":"GraphQL documentation."},"summary":"GraphQL API","operationId":"getApiGraphql","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GraphQLResult"}}}}}}},"\/api\/image":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Images"],"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":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/UploadImageData"},"examples":{"UploadImageData":{"$ref":"#\/components\/examples\/UploadImageData"}}},"multipart\/form-data":{"schema":{"$ref":"#\/components\/schemas\/UploadImageData"},"examples":{"UploadImageData":{"$ref":"#\/components\/examples\/UploadImageData"}}}}},"summary":"Uploads an image.","operationId":"postApiImage","responses":{"200":{"content":{"application\/json":{"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}},"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"}}},"description":"OK"}}}},"\/api\/v0.19\/health\/liveness":{"get":{"tags":["Health"],"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"summary":"Liveness check used to determine when webserver should be restarted","operationId":"getApiV0.19HealthLiveness","description":"See https:\/\/kubernetes.io\/docs\/concepts\/configuration\/liveness-readiness-startup-probes\/#liveness-probe"}},"\/api\/auth\/kc\/{user}":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"parameters":[{"schema":{"type":"string"},"name":"user","required":true,"in":"path"}],"tags":["Authentication"],"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.","summary":"Validates a user's password","operationId":"postApiAuthKcByUser","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}}},"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"parameters":[{"schema":{"type":"string"},"name":"user","required":true,"in":"path"}],"tags":["Authentication"],"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.","summary":"Retrieves user information for Keycloak","operationId":"getApiAuthKcByUser","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/KeycloakUserInfo"},"examples":{"KeycloakUserInfo":{"$ref":"#\/components\/examples\/KeycloakUserInfo"}}}}}}}},"\/api\/v0.20\/health\/liveness":{"get":{"operationId":"getApiV0.20HealthLiveness","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Health"],"description":"See https:\/\/kubernetes.io\/docs\/concepts\/configuration\/liveness-readiness-startup-probes\/#liveness-probe","summary":"Liveness check used to determine when webserver should be restarted"}},"\/api\/organization\/update-logo":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Organization"],"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":{"schema":{"$ref":"#\/components\/schemas\/OrganizationImageData"},"examples":{"OrganizationImageData":{"$ref":"#\/components\/examples\/OrganizationImageData"}}}},"required":true},"responses":{"200":{"content":{"application\/json":{"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}},"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"}}},"description":"OK"}},"operationId":"postApiOrganizationUpdate-logo","summary":"Updates the organization's logo"}},"\/api\/v0.20\/site\/copy":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"parameters":[{"schema":{"format":"uuid","type":"string"},"name":"targetOrganizationID","in":"query","description":"Organization to copy the given site into.","required":true},{"schema":{"type":"string","format":"uuid"},"name":"siteID","in":"query","description":"Site to copy.","required":true},{"schema":{"type":"string","nullable":true},"name":"siteName","in":"query","description":"Optionally change the copied site name.","required":false},{"schema":{"type":"string","nullable":true},"name":"siteDirectory","in":"query","description":"Optionally change the copied site directory.","required":false},{"schema":{"nullable":true,"type":"string"},"name":"startDate","in":"query","description":"Date to start copying history from. Required to export all history.","required":false},{"schema":{"type":"string","nullable":true},"name":"endDate","in":"query","description":"Date to end copying history at. Required to export all history.","required":false}],"tags":["Site"],"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.","summary":"Copy Project from one organization to another","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ObjectIdentifiers"}}}}},"operationId":"postApiV0.20SiteCopy"}},"\/api\/v0.20\/graphql":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["GraphQL"],"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"}}}},"externalDocs":{"description":"GraphQL documentation.","url":"https:\/\/graphql.org\/learn\/serving-over-http\/#post-request"},"summary":"GraphQL API","operationId":"postApiV0.20Graphql","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GraphQLResult"}}},"description":"OK"}}},"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"parameters":[{"in":"query","name":"query","required":true,"schema":{"type":"string"}},{"in":"query","name":"operationName","required":false,"schema":{"type":"string","nullable":true}},{"in":"query","name":"variables","example":{},"required":false,"schema":{"type":"object","nullable":true,"additionalProperties":{"type":"boolean"}}}],"tags":["GraphQL"],"description":"Serves the GraphQL API. For more details, see [graphql.org](https:\/\/graphql.org\/learn\/serving-over-http\/#get-request)","externalDocs":{"description":"GraphQL documentation.","url":"https:\/\/graphql.org\/learn\/serving-over-http\/#get-request"},"summary":"GraphQL API","operationId":"getApiV0.20Graphql","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GraphQLResult"}}},"description":"OK"}}}},"\/api\/auth\/email\/change":{"post":{"tags":["Authentication"],"requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/UpdatedUserEmail"},"examples":{"UpdatedUserEmail":{"$ref":"#\/components\/examples\/UpdatedUserEmail"}}}}},"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"}}}}},"summary":"Initiates an email change for the current user.","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.","deprecated":true,"operationId":"postApiAuthEmailChange"}},"\/api\/auth\/logout":{"post":{"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.","tags":["Authentication"],"operationId":"postApiAuthLogout","summary":"Logs out a user","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.20\/util\/version":{"get":{"responses":{"200":{"description":"OK","content":{"text\/plain":{"examples":{"String":{"$ref":"#\/components\/examples\/String"}},"schema":{"type":"string"}}}}},"deprecated":true,"summary":"Returns version information","description":"Returns commit hashes & build times for the running build of the webserver and all apps.","operationId":"getApiV0.20UtilVersion","tags":["Utility"]}},"\/api\/authgroup\/decline":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Auth Groups"],"description":"Rejects an invitation based on AuthGroup invite ID.\nInvitation is deleted.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/DeclineOrganizationInvite"},"examples":{"DeclineOrganizationInvite":{"$ref":"#\/components\/examples\/DeclineOrganizationInvite"}}}}},"summary":"Declines an AuthGroup invitation","operationId":"postApiAuthgroupDecline","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}}}},"\/api\/v0.20\/device\/login":{"get":{"description":"Logs in a PassiveLogic device, responding with the authentication token.\n\nmTLS authentication required.","summary":"Logs in a PassiveLogic device","operationId":"getApiV0.20DeviceLogin","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/DeviceLoginResponse"},"examples":{"DeviceLoginResponse":{"$ref":"#\/components\/examples\/DeviceLoginResponse"}}}},"description":"OK"}},"tags":["PassiveLogic Device"]}},"\/api\/v0.19\/util\/quantumlens":{"post":{"operationId":"postApiV0.19UtilQuantumlens","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.","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/QuantumLensResponse"}}},"description":"OK"}},"tags":["Utility"],"summary":"QuantumLens (iOS) update & compatibility check","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.","operationId":"getApiDeviceLogin","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/DeviceLoginResponse"},"examples":{"DeviceLoginResponse":{"$ref":"#\/components\/examples\/DeviceLoginResponse"}}}},"description":"OK"}},"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["PassiveLogic Device"]}},"\/api\/v0.20\/auth\/register":{"post":{"tags":["Authentication"],"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":{"schema":{"$ref":"#\/components\/schemas\/RegisterUserData"},"examples":{"RegisterUserData":{"$ref":"#\/components\/examples\/RegisterUserData"}}}},"required":true},"deprecated":true,"summary":"Registers a new user","operationId":"postApiV0.20AuthRegister","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/RegisterUserResponse"},"examples":{"RegisterUserResponse":{"$ref":"#\/components\/examples\/RegisterUserResponse"}}}}}}}},"\/api\/auth\/api-key\/remove":{"delete":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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"}}}},"deprecated":true,"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"},"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}}}},"description":"OK"}},"operationId":"deleteApiAuthApi-keyRemove","summary":"Removes a given API key for the user. This route has been deprecated in favor of: DELETE \/api\/auth\/api-key."},"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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"}}}},"deprecated":true,"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"},"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}}}}}},"operationId":"postApiAuthApi-keyRemove","summary":"Removes a given API key for the user. This route has been deprecated in favor of: DELETE \/api\/auth\/api-key."}},"\/api\/v0.19\/auth\/profile\/change":{"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"description":"","summary":"Redirects the user the change profile flow in the external auth provider (Keycloak).","operationId":"getApiV0.19AuthProfileChange"}},"\/api\/v0.20\/auth\/magic-link-generate":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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":{"schema":{"$ref":"#\/components\/schemas\/UserRegistrationInitiation"},"examples":{"UserRegistrationInitiation":{"$ref":"#\/components\/examples\/UserRegistrationInitiation"}}}},"required":true},"deprecated":true,"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/MagicLinkResponse"}}},"description":"OK"}},"operationId":"postApiV0.20AuthMagic-link-generate","summary":"Generates a Magic Link to be used to login."}},"\/api\/v0.19\/account\/user\/delete":{"delete":{"responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}},"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"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.","operationId":"deleteApiV0.19AccountUserDelete","tags":["Account"]}},"\/app\/login\/signUp":{"get":{"summary":"Redirects to external authentication provider (Keycloak).","tags":["app"],"description":"","operationId":"getAppLoginSignUp"}},"\/api\/v0.20\/account\/eula\/accept":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"deprecated":true,"tags":["Account"],"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.","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}},"operationId":"postApiV0.20AccountEulaAccept","summary":"Accepts EULA for the current user"}},"\/api\/v0.20\/auth\/zendesk":{"get":{"tags":["Authentication"],"operationId":"getApiV0.20AuthZendesk","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\/v0.19\/auth\/kc\/{user}":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string"}}],"tags":["Authentication"],"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.","summary":"Validates a user's password","operationId":"postApiV0.19AuthKcByUser","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}}},"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"parameters":[{"name":"user","in":"path","required":true,"schema":{"type":"string"}}],"tags":["Authentication"],"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.","summary":"Retrieves user information for Keycloak","operationId":"getApiV0.19AuthKcByUser","responses":{"200":{"content":{"application\/json":{"examples":{"KeycloakUserInfo":{"$ref":"#\/components\/examples\/KeycloakUserInfo"}},"schema":{"$ref":"#\/components\/schemas\/KeycloakUserInfo"}}},"description":"OK"}}}},"\/api\/v0.20\/auth\/keys":{"get":{"summary":"Returns the public keys used to sign PassiveLogic JSON web tokens.","tags":["Authentication"],"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.20AuthKeys","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/JWKS"}}}}}}},"\/api\/image\/{imageID}":{"delete":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"parameters":[{"schema":{"type":"string"},"name":"imageID","in":"path","required":true}],"tags":["Images"],"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.","deprecated":true,"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":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"operationId":"deleteApiImageByImageID"}},"\/api\/v0.20\/authgroup\/invite":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Auth Groups"],"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},"responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"AuthGroupInviteResponse":{"$ref":"#\/components\/examples\/AuthGroupInviteResponse"}},"schema":{"$ref":"#\/components\/schemas\/AuthGroupInviteResponse"}}}}},"operationId":"postApiV0.20AuthgroupInvite","summary":"Sends an AuthGroup invite to the given email."}},"\/api\/v0.20\/auth\/email\/change\/verify":{"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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":{"content":{"application\/json":{"examples":{"UpdatedUserEmail":{"$ref":"#\/components\/examples\/UpdatedUserEmail"}},"schema":{"$ref":"#\/components\/schemas\/UpdatedUserEmail"}}},"required":true},"deprecated":true,"summary":"Verifies and updates new user email","operationId":"getApiV0.20AuthEmailChangeVerify","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}}}},"\/api\/v0.19\/auth\/password\/reset":{"post":{"tags":["Authentication"],"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},"deprecated":true,"summary":"Initiates a password reset.","operationId":"postApiV0.19AuthPasswordReset","responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}}}},"\/app\/login\/userAuth":{"get":{"tags":["app"],"description":"","summary":"Redirects to external authentication provider (Keycloak).","operationId":"getAppLoginUserAuth"}},"\/api\/datasync":{"get":{"summary":"QuantumSync API Legacy Route. Use \/api\/quantumsync instead.","operationId":"getApiDatasync","tags":["Quantum Sync"],"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"description":"Refer to the \/api\/quantumsync route documentation for full details. This route will be removed in the next major version.","deprecated":true}},"\/api\/organization\/delete":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Organization"],"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"}}}}},"responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}},"summary":"Deletes specified organization.","operationId":"postApiOrganizationDelete"}},"\/api\/v0.20\/graphqlSubscribe":{"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"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)","summary":"GraphQL API over websocket.","tags":["GraphQL"]}},"\/app\/as\/**":{"get":{"tags":["app"],"description":"GET \/app\/as\/**"}},"\/api\/v0.19\/auth\/api-key\/remove":{"delete":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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"}}}},"deprecated":true,"summary":"Removes a given API key for the user. This route has been deprecated in favor of: DELETE \/api\/v0.19\/auth\/api-key.","operationId":"deleteApiV0.19AuthApi-keyRemove","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"},"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}}}}}}},"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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"}}}},"deprecated":true,"summary":"Removes a given API key for the user. This route has been deprecated in favor of: DELETE \/api\/v0.19\/auth\/api-key.","operationId":"postApiV0.19AuthApi-keyRemove","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenerateApiKeyResponse"},"examples":{"GenerateApiKeyResponse":{"$ref":"#\/components\/examples\/GenerateApiKeyResponse"}}}}}}}},"\/api\/v0.20\/organization\/invite":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Organization"],"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},"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/OrgInviteResponse"},"examples":{"OrgInviteResponse":{"$ref":"#\/components\/examples\/OrgInviteResponse"}}}},"description":"OK"}},"operationId":"postApiV0.20OrganizationInvite","summary":"Sends an organization invite to the given email."}},"\/api\/util\/ping":{"get":{"operationId":"getApiUtilPing","responses":{"200":{"content":{"text\/plain":{"examples":{"String":{"$ref":"#\/components\/examples\/String"}},"schema":{"type":"string"}}},"description":"OK"}},"tags":["Utility"],"description":"Use to check webserver health or keep connection alive. Returns pong message.","summary":"Keep-alive ping\/pong route"}},"\/api\/auth\/email\/change\/verify":{"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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":{"schema":{"$ref":"#\/components\/schemas\/UpdatedUserEmail"},"examples":{"UpdatedUserEmail":{"$ref":"#\/components\/examples\/UpdatedUserEmail"}}}},"required":true},"deprecated":true,"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"}},"operationId":"getApiAuthEmailChangeVerify"}},"\/api\/v0.19\/auth\/offline":{"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"description":"GET \/auth\/offline"}},"\/api\/v0.19\/organization\/update-logo":{"post":{"operationId":"postApiV0.19OrganizationUpdate-logo","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/OrganizationImageData"},"examples":{"OrganizationImageData":{"$ref":"#\/components\/examples\/OrganizationImageData"}}}}},"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"responses":{"200":{"content":{"application\/json":{"examples":{"ImageUploadResponse":{"$ref":"#\/components\/examples\/ImageUploadResponse"}},"schema":{"$ref":"#\/components\/schemas\/ImageUploadResponse"}}},"description":"OK"}},"summary":"Updates the organization's logo","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.","tags":["Organization"]}},"\/app\/login\/finish":{"get":{"tags":["app"],"summary":"Redirects to external authentication provider (Keycloak).","operationId":"getAppLoginFinish","description":""}},"\/app\/bs\/**":{"get":{"tags":["app"],"description":"GET \/app\/bs\/**"}},"\/api\/v0.20\/auth\/register\/initiate":{"post":{"tags":["Authentication"],"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"}}}}},"deprecated":true,"responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}},"summary":"Sends an email to begin email verification and registration.","operationId":"postApiV0.20AuthRegisterInitiate"}},"\/api\/v0.20\/quantumsync":{"get":{"summary":"QuantumSync API over websockets","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"operationId":"getApiV0.20Quantumsync","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```"}},"\/api\/auth\/magic-link-login":{"get":{"operationId":"getApiAuthMagic-link-login","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"}}}}},"summary":"Logs in a user using Magic Link generated by POST magic-link-generate","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.","deprecated":true,"tags":["Authentication"]}},"\/api\/graphqlSubscribe":{"get":{"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":"getApiGraphqlSubscribe","tags":["GraphQL"],"summary":"GraphQL API over websocket.","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/v0.20\/util\/quantumversion":{"get":{"operationId":"getApiV0.20UtilQuantumversion","summary":"Returns the Quantum Schema version","responses":{"200":{"content":{"text\/plain":{"examples":{"String":{"$ref":"#\/components\/examples\/String"}},"schema":{"type":"string"}}},"description":"OK"}},"tags":["Utility"],"description":"Returns the current version of the Quantum schema in use by this webserver as a semantic version."}},"\/api\/authgroup\/join":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Auth Groups"],"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},"deprecated":true,"summary":"Accepts an AuthGroup Invitation","operationId":"postApiAuthgroupJoin","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}}},"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Auth Groups"],"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},"summary":"Accepts an AuthGroup Invitation","operationId":"getApiAuthgroupJoin","responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}}}},"\/api\/v0.20\/auth\/offline":{"get":{"tags":["Authentication"],"description":"GET \/auth\/offline","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/v0.19\/graphqlSubscribe":{"get":{"summary":"GraphQL API over websocket.","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"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"}},"\/api\/v0.20\/health\/readiness":{"get":{"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":[]}],"tags":["Health"],"operationId":"getApiV0.20HealthReadiness","summary":"Readiness check used to determine if webserver is ready to accept traffic"}},"\/api\/v0.19\/auth\/zendesk":{"get":{"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.","tags":["Authentication"],"summary":"Logs a user in to Zendesk using their PL Account"}},"\/api\/v0.20\/util\/externalauthconfig":{"get":{"responses":{"200":{"description":"OK","content":{"text\/plain":{"schema":{"type":"string"},"examples":{"String":{"$ref":"#\/components\/examples\/String"}}}}}},"description":"Use to check whether or not external auth (i.e. Keycloak) is enabled, and if so what the public settings are.","tags":["Utility"],"operationId":"getApiV0.20UtilExternalauthconfig","summary":"Provides information about the external auth configuration"}},"\/api\/v0.20\/authgroup\/remove\/{authGroupID}\/{userID}":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"parameters":[{"required":true,"in":"path","schema":{"type":"string"},"name":"authGroupID"},{"required":true,"in":"path","schema":{"type":"string"},"name":"userID"}],"tags":["Auth Groups"],"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.","responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/AuthGroupRemovalResponse"},"examples":{"AuthGroupRemovalResponse":{"$ref":"#\/components\/examples\/AuthGroupRemovalResponse"}}}},"description":"OK"}},"operationId":"postApiV0.20AuthgroupRemoveByAuthGroupIDByUserID","summary":"Removes user from Auth Group"}},"\/api\/v0.20\/binding":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Bindings"],"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":{"required":true,"content":{"application\/json":{"examples":{"UploadFileData":{"$ref":"#\/components\/examples\/UploadFileData"}},"schema":{"$ref":"#\/components\/schemas\/UploadFileData"}},"multipart\/form-data":{"examples":{"UploadFileData":{"$ref":"#\/components\/examples\/UploadFileData"}},"schema":{"$ref":"#\/components\/schemas\/UploadFileData"}}}},"responses":{"200":{"content":{"application\/json":{"examples":{"BindingUploadResponse":{"$ref":"#\/components\/examples\/BindingUploadResponse"}},"schema":{"$ref":"#\/components\/schemas\/BindingUploadResponse"}}},"description":"OK"}},"operationId":"postApiV0.20Binding","summary":"Uploads a file associated with a binding."}},"\/app\/**":{"get":{"description":"GET \/app\/**","tags":["app"]}},"\/api\/authgroup\/invite":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Auth Groups"],"description":"Generates and sends an invitation link for the given Site or View (AuthGroup) to the given user email.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/InviteUserToAuthGroupData"},"examples":{"InviteUserToAuthGroupData":{"$ref":"#\/components\/examples\/InviteUserToAuthGroupData"}}}}},"summary":"Sends an AuthGroup invite to the given email.","operationId":"postApiAuthgroupInvite","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"AuthGroupInviteResponse":{"$ref":"#\/components\/examples\/AuthGroupInviteResponse"}},"schema":{"$ref":"#\/components\/schemas\/AuthGroupInviteResponse"}}}}}}},"\/api\/site\/copy":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"parameters":[{"name":"targetOrganizationID","description":"Organization to copy the given site into.","required":true,"schema":{"format":"uuid","type":"string"},"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":{"nullable":true,"type":"string"},"in":"query"},{"name":"siteDirectory","description":"Optionally change the copied site directory.","required":false,"schema":{"nullable":true,"type":"string"},"in":"query"},{"name":"startDate","description":"Date to start copying history from. Required to export all history.","required":false,"schema":{"type":"string","nullable":true},"in":"query"},{"name":"endDate","description":"Date to end copying history at. Required to export all history.","required":false,"schema":{"type":"string","nullable":true},"in":"query"}],"tags":["Site"],"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.","summary":"Copy Project from one organization to another","operationId":"postApiSiteCopy","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/ObjectIdentifiers"}}}}}}},"\/api\/v0.20\/tunnel\/{serialNumber}\/**":{"get":{"tags":["tunnel"],"description":"GET \/tunnel\/:serialNumber\/**","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]},"put":{"tags":["tunnel"],"description":"PUT \/tunnel\/:serialNumber\/**","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]},"post":{"tags":["tunnel"],"description":"POST \/tunnel\/:serialNumber\/**","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]},"delete":{"tags":["tunnel"],"description":"DELETE \/tunnel\/:serialNumber\/**","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}]}},"\/api\/metrics":{"get":{"description":"GET \/api\/metrics","tags":["api"]}},"\/app\/login\/verify":{"get":{"description":"","summary":"Redirects to external authentication provider (Keycloak).","operationId":"getAppLoginVerify","tags":["app"]}},"\/api\/v0.20\/authgroup\/decline":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Auth Groups"],"description":"Rejects an invitation based on AuthGroup invite ID.\nInvitation is deleted.","requestBody":{"required":true,"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/DeclineOrganizationInvite"},"examples":{"DeclineOrganizationInvite":{"$ref":"#\/components\/examples\/DeclineOrganizationInvite"}}}}},"summary":"Declines an AuthGroup invitation","operationId":"postApiV0.20AuthgroupDecline","responses":{"200":{"description":"OK","content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}}}}}},"\/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.","tags":["Authentication"],"summary":"Redirects user to login","operationId":"getApiV0.20AuthVerify","parameters":[{"required":true,"name":"email","description":"User's email to confirm as verified","schema":{"type":"string"},"in":"query","example":"darthvader@galactic-empire.com"}]}},"\/":{"get":{"description":"GET \/","tags":[""]}},"\/api\/organization\/join":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Organization"],"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},"responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}},"operationId":"postApiOrganizationJoin","summary":"Adds a user to an organization"}},"\/app\/devtools\/*":{"get":{"tags":["app"],"description":"GET \/app\/devtools\/*"}},"\/app\/al\/**":{"get":{"description":"GET \/app\/al\/**","tags":["app"]}},"\/api\/util\/externalauthconfig":{"get":{"summary":"Provides information about the external auth configuration","responses":{"200":{"content":{"text\/plain":{"schema":{"type":"string"},"examples":{"String":{"$ref":"#\/components\/examples\/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.","tags":["Utility"],"operationId":"getApiUtilExternalauthconfig"}},"\/api\/export\/property\/history":{"get":{"tags":["Export"],"summary":"Exports CSV formatted property history data","responses":{"200":{"description":"OK","content":{"text\/plain":{"schema":{"type":"string"},"examples":{"String":{"$ref":"#\/components\/examples\/String"}}}}}},"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"operationId":"getApiExportPropertyHistory","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"}},"\/api\/v0.20\/device\/tailscale\/authToken":{"get":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/TailscalePostTailnetKeyResponse"}}}}},"operationId":"getApiV0.20DeviceTailscaleAuthToken","summary":"Generates an OAuth token for Tailscale","tags":["PassiveLogic Device"],"description":"AutToken generated allowing hive's to enroll in our tailnet.\n\nmTLS authentication required."}},"\/api\/auth\/password\/reset\/change":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Authentication"],"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},"deprecated":true,"responses":{"200":{"content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}},"description":"OK"}},"operationId":"postApiAuthPasswordResetChange","summary":"Changes a user's password from the password reset flow."}},"\/api\/v0.20\/organization\/decline":{"post":{"security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"tags":["Organization"],"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"}}}}},"summary":"Declines an organization invitation","operationId":"postApiV0.20OrganizationDecline","responses":{"200":{"content":{"application\/json":{"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}},"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"}}},"description":"OK"}}}},"\/api\/util\/version":{"get":{"responses":{"200":{"description":"OK","content":{"text\/plain":{"examples":{"String":{"$ref":"#\/components\/examples\/String"}},"schema":{"type":"string"}}}}},"deprecated":true,"description":"Returns commit hashes & build times for the running build of the webserver and all apps.","operationId":"getApiUtilVersion","tags":["Utility"],"summary":"Returns version information"}},"\/api\/v0.20\/account\/user\/delete":{"delete":{"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"],"summary":"Deletes the user making this request.","security":[{"Basic Auth - login":[]},{"XSRF header":[]},{"DEPRECATED - PL API Key":[]},{"PL API Key":[]}],"operationId":"deleteApiV0.20AccountUserDelete","responses":{"200":{"description":"OK","content":{"application\/json":{"schema":{"$ref":"#\/components\/schemas\/GenericMessageResponse"},"examples":{"GenericMessageResponse":{"$ref":"#\/components\/examples\/GenericMessageResponse"}}}}}}}}},"components":{"schemas":{"RemoveApiKeyRequest":{"required":["key"],"type":"object","description":"API key to revoke","properties":{"key":{"type":"string","description":"API key to revoke."}}},"RegisterUserData":{"required":["acceptMailingList","acceptedEULA","email","firstName","lastName","password"],"type":"object","description":"Data required for user registration","properties":{"email":{"type":"string","description":"User's email"},"acceptMailingList":{"type":"boolean","description":"Flag to mark if the user wants marketing emails"},"password":{"type":"string","description":"User's password"},"acceptedEULA":{"type":"boolean","description":"Flag to mark if the user has accepted the EULA"},"recaptchaToken":{"type":"string","nullable":true},"token":{"nullable":true,"type":"string"},"firstName":{"type":"string","description":"User's first name"},"username":{"type":"string","nullable":true},"lastName":{"type":"string","description":"User's last name"}}},"QuantumLensResponse":{"required":["status","user"],"type":"object","properties":{"user":{"$ref":"#\/components\/schemas\/QuantumLensUser"},"status":{"$ref":"#\/components\/schemas\/QuantumLensAppStatusResponse"}}},"InviteUserToOrganizationData":{"required":["inviteEmail","orgID"],"type":"object","description":"Parameters required to invite a user to an organization","properties":{"role":{"$ref":"#\/components\/schemas\/QuantumRole"},"inviteEmail":{"type":"string","description":"Email to send the invite to"},"orgID":{"type":"string","format":"uuid","description":"ID of the organization to which this invite pertains"},"expiration":{"type":"string","format":"date-time","description":"Timestamp at which this invitation will no longer be valid","nullable":true}}},"QuantumObjectType":{"type":"string","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"]},"KeycloakUserInfo":{"description":"Information for Keycloak about the requested user.","type":"object","properties":{"username":{"description":"Unique username for the user","nullable":true,"type":"string"},"attributes":{"nullable":true,"description":"Additional attributes of the user; each attribute can have multiple values","type":"object","additionalProperties":{"items":{"type":"string"},"type":"array"}},"email":{"description":"Email for the user, also used as the username","type":"string"},"access":{"nullable":true,"description":"Access rights for this user","type":"object","additionalProperties":{"type":"boolean"}},"groups":{"nullable":true,"description":"Groups that this user belongs to","items":{"type":"string"},"type":"array"},"requiredActions":{"nullable":true,"description":"Actions the user will need to do on next login","items":{"type":"string"},"type":"array"},"enabled":{"description":"Active or inactive status for the user","nullable":true,"type":"boolean"},"firstName":{"description":"The user's first (given) name","nullable":true,"type":"string"},"id":{"description":"Unique ID for the user","nullable":true,"type":"string"},"roles":{"nullable":true,"description":"Roles for this user","items":{"type":"string"},"type":"array"},"lastName":{"description":"The user's last name (surname)","nullable":true,"type":"string"},"emailVerified":{"description":"Has the email address for this user been verified as valid","nullable":true,"type":"boolean"}},"required":["email"]},"UploadFileData":{"required":["ID","file","fileType"],"type":"object","description":"Data required to upload a file binding.","properties":{"fileType":{"description":"The type of file the given data represents.","type":"string"},"ID":{"format":"uuid","description":"UUID of the quantum binding node that you want to associate this file with.","type":"string"},"filePath":{"nullable":true,"type":"string"},"file":{"format":"byte","description":"File data to write to the server.","type":"string"}}},"OrgInviteResponse":{"required":["inviteID","message"],"type":"object","description":"Response indicating that an organization invitation was successfully sent.","properties":{"message":{"description":"Message with additional information","type":"string"},"inviteID":{"description":"ID of the invitation generated\/sent","format":"uuid","type":"string"}}},"InviteUserToAuthGroupData":{"required":["authGroupID","inviteEmail"],"type":"object","description":"Parameters required to invite a user to an organization","properties":{"role":{"$ref":"#\/components\/schemas\/QuantumRole"},"expiration":{"format":"date-time","type":"string","description":"Timestamp at which this invitation will no longer be valid","nullable":true},"inviteEmail":{"type":"string","description":"Email to send the invite to"},"authGroupID":{"format":"uuid","type":"string","description":"ID of the AuthGroup to which this invite pertains"}}},"OrganizationImageData":{"required":["fileType","image","organizationID"],"type":"object","description":"Data required to upload a organization image","properties":{"organizationID":{"type":"string","description":"The organization that is associated with this image request.","format":"uuid"},"image":{"type":"string","description":"File data to write to the server. Must be Base64-encoded if sending as JSON.","format":"byte"},"fileType":{"type":"string","description":"The type of file the given data represents, from a list of allowed files"}}},"ChangeUserPassword":{"required":["newPassword","oldPassword"],"type":"object","description":"Information required to change a user's password from the authenticated change password flow","properties":{"oldPassword":{"description":"Old password for the user, used to confirm identity.","type":"string"},"newPassword":{"description":"New password for the user.","type":"string"}}},"GraphQLError":{"required":["locations","message","path"],"type":"object","properties":{"locations":{"items":{"$ref":"#\/components\/schemas\/SourceLocation"},"type":"array"},"path":{"items":{"type":"array","items":{"type":"integer","format":"int64"}},"type":"array"},"message":{"type":"string"},"extensions":{"nullable":true,"additionalProperties":{"type":"boolean"},"type":"object"}}},"SourceLocation":{"required":["column","line"],"type":"object","properties":{"column":{"format":"int64","type":"integer"},"line":{"format":"int64","type":"integer"}}},"KeycloakCredentialInfo":{"required":["id","type"],"type":"object","properties":{"value":{"type":"string","nullable":true},"priority":{"type":"integer","nullable":true,"format":"int64"},"device":{"type":"string","nullable":true},"temporary":{"type":"boolean","nullable":true},"userLabel":{"type":"string","nullable":true},"createdDate":{"type":"integer","format":"int64","nullable":true},"id":{"type":"string","format":"uuid"},"type":{"type":"string"}}},"ImageUploadResponse":{"required":["message"],"type":"object","description":"Image response definition","properties":{"message":{"type":"string","description":"Informative message relating to image upload. Updated image url with cache bust."},"url":{"type":"string","nullable":true}}},"QuantumRole":{"type":"string","enum":["PrivilegedUser","ReadOnlyUser","StandardUser","SuperUser"]},"GenerateApiKeyResponse":{"required":["expiration","key"],"type":"object","description":"New API key generated for a user.","properties":{"key":{"type":"string","description":"New API key."},"expiration":{"type":"integer","description":"Expiration of the new key.","format":"int64"}}},"AuthGroupRemovalResponse":{"required":["authGroupID","message","userID"],"type":"object","description":"Response indicating that a User has been removed from an AuthGroup.","properties":{"message":{"type":"string","description":"Message with additional information"},"userID":{"type":"string","description":"ID of the User who has been removed","format":"uuid"},"authGroupID":{"type":"string","description":"ID of the Authgroup the user has been removed from.","format":"uuid"}}},"WhoAmIResponse":{"description":"Information about the authenticated user","type":"object","properties":{"userID":{"description":"Unique ID for the user","type":"string","format":"uuid"},"emailVerified":{"nullable":true,"description":"Flag to mark if the user's email is verified","type":"boolean"},"lastName":{"nullable":true,"description":"User's last name","type":"string"},"firstName":{"nullable":true,"description":"User's first name","type":"string"},"eulaAccepted":{"nullable":true,"description":"Flag to mark if the user has acept the terms of the EULA","type":"boolean"}},"required":["userID"]},"Identifier":{"required":["id","type"],"type":"object","properties":{"id":{"type":"string"},"type":{"$ref":"#\/components\/schemas\/QuantumObjectType"}}},"DeviceLoginResponse":{"required":["token"],"type":"object","description":"Response to \/api\/device\/login","properties":{"token":{"type":"string","description":"Signed authentication JWT"}}},"ObjectPair":{"required":["newID","oldID","type"],"type":"object","properties":{"newID":{"type":"string","format":"uuid"},"type":{"$ref":"#\/components\/schemas\/QuantumObjectType"},"oldID":{"type":"string","format":"uuid"}}},"LoginResponse":{"description":"Generic response information","type":"object","properties":{"whoAmI":{"$ref":"#\/components\/schemas\/WhoAmIResponse"},"token":{"type":"string","description":"Signed Authentication JWT"},"refresh":{"type":"string","description":"Signed refresh JWT"}},"required":["refresh","token","whoAmI"]},"JWKS":{"required":["keys"],"type":"object","properties":{"keys":{"type":"array","items":{"$ref":"#\/components\/schemas\/JWK"}}}},"UploadImageData":{"required":["ID","fileType","image"],"type":"object","description":"Data required to upload an image.","properties":{"fileType":{"description":"The type of file the given data represents, from a list of allowed files.","type":"string"},"ID":{"description":"UUID of the quantum image node that you want to associate this image file with.","type":"string","format":"uuid"},"image":{"description":"File data to write to the server. Must be Base64-encoded if sending as JSON.","type":"string","format":"byte"},"filePath":{"nullable":true,"type":"string"}}},"AuthGroupInviteResponse":{"required":["inviteID","message"],"type":"object","description":"Response indicating that an AuthGroup invitation was successfully sent.","properties":{"message":{"type":"string","description":"Message with additional information"},"inviteID":{"format":"uuid","type":"string","description":"ID of the invitation generated\/sent"}}},"TailscaleCapabilitiesDevices":{"required":["create"],"type":"object","properties":{"create":{"$ref":"#\/components\/schemas\/TailscaleCapabilitiesDevicesCreate"}}},"JWK":{"type":"object","properties":{"kty":{"type":"string"}},"required":["kty"]},"RegisterUserResponse":{"required":["message"],"type":"object","description":"Sent when a new user is successfully registered.","properties":{"token":{"description":"New authentication JWT containing changed information","nullable":true,"type":"string"},"newUserID":{"$ref":"#\/components\/schemas\/Identifier"},"message":{"description":"Additional information about the response","type":"string"},"refresh":{"description":"New refresh JWT","nullable":true,"type":"string"},"userStatus":{"$ref":"#\/components\/schemas\/QuantumUserStatus"}}},"MagicLinkResponse":{"description":"Email for use signing up with a magic link","type":"object","properties":{"message":{"description":"Message describing the response type.","nullable":true,"type":"string"},"url":{"description":"Url to be used a magic link login.","nullable":true,"type":"string"}}},"TailscaleCapabilitiesDevicesCreate":{"required":["ephemeral","preauthorized","reusable","tags"],"type":"object","properties":{"reusable":{"type":"boolean"},"preauthorized":{"type":"boolean"},"tags":{"type":"array","items":{"type":"string"}},"ephemeral":{"type":"boolean"}}},"DeclineOrganizationInvite":{"required":["inviteID"],"type":"object","description":"Parameters required to decline an organization invite","properties":{"inviteID":{"description":"ID of the invitation being declined.","format":"uuid","type":"string"}}},"ObjectIdentifiers":{"required":["objectIdentifierMap"],"type":"object","properties":{"objectIdentifierMap":{"items":{"$ref":"#\/components\/schemas\/ObjectPair"},"type":"array"}}},"AcceptOrganizationInvite":{"required":["inviteID"],"type":"object","description":"Parameters required to accept an organization invite","properties":{"inviteID":{"description":"ID of the invitation being accepted.","type":"string","format":"uuid"}}},"TailscaleCapabilities":{"required":["devices"],"type":"object","properties":{"devices":{"$ref":"#\/components\/schemas\/TailscaleCapabilitiesDevices"}}},"DeleteOrganizationData":{"required":["orgID"],"type":"object","description":"Parameters require to delete an organization","properties":{"orgID":{"format":"uuid","type":"string","description":"ID of the organization being deleted"}}},"RequestResetPasswordData":{"required":["usernameOrEmail"],"type":"object","description":"Information required to request a password reset.","properties":{"usernameOrEmail":{"type":"string","description":"Email of the user requesting a reset."}}},"UserRegistrationInitiation":{"description":"Information for intiating user registration","type":"object","properties":{"firstName":{"nullable":true,"type":"string"},"lastName":{"nullable":true,"type":"string"},"email":{"description":"Email that is registering for a new account.","type":"string"}},"required":["email"]},"GenericMessageResponse":{"description":"Generic response information","type":"object","properties":{"message":{"description":"Informative message relating to the specific response","type":"string"}},"required":["message"]},"QuantumLensAppStatusResponse":{"type":"object","properties":{"osUpdate":{"nullable":true,"type":"boolean"},"appUpdate":{"nullable":true,"type":"boolean"}}},"GraphQLResult":{"type":"object","properties":{"errors":{"nullable":true,"items":{"$ref":"#\/components\/schemas\/GraphQLError"},"type":"array"},"data":{"nullable":true,"type":"boolean"}}},"BindingUploadResponse":{"required":["message"],"type":"object","description":"Binding response definition","properties":{"url":{"type":"string","nullable":true},"message":{"description":"Informative message relating to binding upload. Updated binding url with cache bust.","type":"string"}}},"GraphQLRequest":{"required":["query"],"type":"object","properties":{"variables":{"type":"object","additionalProperties":{"type":"boolean"},"nullable":true},"query":{"type":"string"},"operationName":{"type":"string","nullable":true}}},"ChangePasswordData":{"required":["newPassword"],"type":"object","description":"Information required to change a user's password from the reset password flow","properties":{"confirmNewPassword":{"type":"string","nullable":true},"newPassword":{"description":"New password for the user.","type":"string"}}},"DeployedOnHiveResponse":{"required":["runningOnHive"],"type":"object","properties":{"runningOnHive":{"type":"boolean"}}},"QuantumLensUser":{"required":["userID"],"type":"object","properties":{"firstName":{"type":"string","nullable":true},"userID":{"type":"string","format":"uuid"},"lastName":{"type":"string","nullable":true}}},"TailscalePostTailnetKeyResponse":{"required":["capabilities","expirySeconds","id","key","keyType"],"type":"object","properties":{"userId":{"type":"string","nullable":true},"tags":{"type":"array","items":{"type":"string"},"nullable":true},"created":{"format":"date-time","type":"string","nullable":true},"invalid":{"type":"boolean","nullable":true},"expirySeconds":{"format":"int64","type":"integer"},"key":{"type":"string"},"id":{"type":"string"},"keyType":{"type":"string"},"description":{"type":"string","nullable":true},"expires":{"format":"date-time","type":"string","nullable":true},"capabilities":{"$ref":"#\/components\/schemas\/TailscaleCapabilities"},"scopes":{"type":"array","items":{"type":"string"},"nullable":true},"revoked":{"format":"date-time","type":"string","nullable":true}}},"UpdatedUserEmail":{"required":["newEmail","oldEmail","password"],"type":"object","description":"Information for changing a user's email","properties":{"newEmail":{"description":"New user email","type":"string"},"oldEmail":{"description":"Previous user email","type":"string"},"password":{"description":"user's password to confirm identity","type":"string"}}},"QuantumUserStatus":{"type":"string","enum":["Active","Blocked","Deleted","Locked","Pending","Reset"]},"ImageData":{"required":["fileType","image"],"type":"object","description":"Data required to upload image without using an image model.","properties":{"fileType":{"description":"The type of file the given data represents, from a list of allowed files.","type":"string"},"image":{"format":"byte","description":"File data to write to the server. Must be Base64-encoded if sending as JSON.","type":"string"}}}},"examples":{"InviteUserToOrganizationData":{"value":{"expiration":"2027-08-17T10:44:55Z","orgID":"F6676283-6BEA-443A-A24A-6076FE036B77","role":"StandardUser","inviteEmail":"mithrawnuruodo@galactic-empire.com"}},"AuthGroupRemovalResponse":{"value":{"message":"User has been successfully removed!","userID":"7E6C957D-8C69-43E2-850C-89A488451C61","authGroupID":"3F493B86-DFB5-42E2-9ED2-1F3482C7A742"}},"AcceptOrganizationInvite":{"value":{"inviteID":"87EA32C7-3B94-4FED-853B-0E07FC042864"}},"RegisterUserResponse":{"value":{"newUserID":{"id":"B46E0317-A6D3-4BAE-AD2F-8D3B952581CB","type":"User"},"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJQYXNzaXZlTG9naWMiLCJzdWIiOiJBUEkiLCJleHAiOjE1MTYyMzkwMjIsIklEIjoiMjAyZTI0MTEtNjQ5OS00YWJlLTk5MmYtMmZmODU1MWY5NmU5IiwibmFtZSI6ImRhcnRodmFkZXIiLCJzdGF0dXMiOiJBY3RpdmUifQ.KiI6-jHPAMsDHvyA7U-BaRZ8mZnByF9a1887lVb-1lY","refresh":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJQYXNzaXZlTG9naWMiLCJzdWIiOiJBUEkiLCJleHAiOjE1MTYyMzkwMjIsIklEIjoiMjAyZTI0MTEtNjQ5OS00YWJlLTk5MmYtMmZmODU1MWY5NmU5IiwidXNlcklEIjoiMzMwYTFmMjktMTlkMC00Y2M5LWI3MjQtOWJmNDQxNWY4ODY1In0.hyyBxcHBXqYzwZehxqW7aCwfQTlngtCc7gRW31ijK50","userStatus":"Active","message":"User registered successfully."}},"DeviceLoginResponse":{"value":{"token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzM4NCIsImtpZCI6InBsLUUwOTk2NzlGLTQyNDQtNDA4Ni05NTZBLTg4OUM4QkVCQzg2QSJ9.eyJpc3N1ZXIiOiJQYXNzaXZlTG9naWMiLCJoaXZlSUQiOiJEMjU3M0M2Qy0wQjVBLTRCMzItQjM1Ni00OEEyOTlFRDE0OTMiLCJleHBpcmF0aW9uIjoxNzE0NDA2OTA3LjcyODE1Mywic3ViamVjdCI6IkhpdmUgQXV0aGVudGljYXRpb24iLCJoaXZlU2VyaWFsTnVtYmVyIjoiUTBSWFQyUE1HWCJ9.11Awfpm7Uo1LWBtZTCNn1pxUuliE3lcMF4bIqbJzX87u5zJRFRKqfNWdULlU7mmEq_Fes7CzEvSFmn7wlNLlZxY-T8NKhFq35raskqDW-ZdpXUKRk8aHyWfrCVeFcCZU"}},"InviteUserToAuthGroupData":{"value":{"expiration":"2027-08-17T10:44:55Z","role":"StandardUser","inviteEmail":"mithrawnuruodo@galactic-empire.com","authGroupID":"7028EF7C-7458-4E96-A078-C80148B717DA"}},"UpdatedUserEmail":{"value":{"newEmail":"emperorpalps@gallactic-empire.com","password":"unlimitedP0wuh!!!","oldEmail":"sheevpalpatine@old-republic.net"}},"LoginResponse":{"value":{"whoAmI":{"userID":"BCA270EE-DEFD-49B1-A8FD-131147A9986A","eulaAccepted":true,"firstName":"Anakin","lastName":"Skywalker","emailVerified":true},"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJQYXNzaXZlTG9naWMiLCJzdWIiOiJBUEkiLCJleHAiOjE1MTYyMzkwMjIsIklEIjoiMjAyZTI0MTEtNjQ5OS00YWJlLTk5MmYtMmZmODU1MWY5NmU5IiwibmFtZSI6ImRhcnRodmFkZXIiLCJzdGF0dXMiOiJBY3RpdmUifQ.KiI6-jHPAMsDHvyA7U-BaRZ8mZnByF9a1887lVb-1lY","refresh":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJQYXNzaXZlTG9naWMiLCJzdWIiOiJBUEkiLCJleHAiOjE1MTYyMzkwMjIsIklEIjoiMjAyZTI0MTEtNjQ5OS00YWJlLTk5MmYtMmZmODU1MWY5NmU5IiwidXNlcklEIjoiMzMwYTFmMjktMTlkMC00Y2M5LWI3MjQtOWJmNDQxNWY4ODY1In0.hyyBxcHBXqYzwZehxqW7aCwfQTlngtCc7gRW31ijK50"}},"UploadFileData":{"value":{"file":"PHN2ZyBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjQwIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjMiIGZpbGw9ImJsdWUiIC8+PC9zdmc+","fileType":"svg","ID":"6F1EA494-8DBA-448E-877A-3459FA6EE81C"}},"GenerateApiKeyResponse":{"value":{"expiration":840278695876574,"key":"564d9054fb2cf06e3592c8c4fdc1f613822b0de6358d8580a78ae0b204be3f95"}},"ImageData":{"value":{"image":"PHN2ZyBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjQwIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjMiIGZpbGw9ImJsdWUiIC8+PC9zdmc+","fileType":"svg"}},"ChangePasswordData":{"value":{"newPassword":"SandSuxDest0ryAllSand"}},"WhoAmIResponse":{"value":{"lastName":"Skywalker","userID":"CA79DDF9-3053-401A-BF55-EF62F07A31C5","emailVerified":true,"firstName":"Anakin","eulaAccepted":true}},"OrgInviteResponse":{"value":{"message":"Invitation sent.","inviteID":"E550CD28-0644-4F08-B68C-46B9EDC9415D"}},"ImageUploadResponse":{"value":{"message":"Image was succefully updated.","url":"http:\/\/www.passivelogic.com\/image\/0F6AAED5-7221-4F11-8379-C0963CB195FE"}},"String":{"value":"some string"},"GenericMessageResponse":{"value":{"message":"We will watch your career with great interest."}},"RemoveApiKeyRequest":{"value":{"key":"564d9054fb2cf06e3592c8c4fdc1f613822b0de6358d8580a78ae0b204be3f95"}},"BindingUploadResponse":{"value":{"message":"Binding object was successfully updated.","url":"https:\/\/passivelogic.com\/binding\/C764C3FD-ED99-40A0-9DB9-B85737173853"}},"RequestResetPasswordData":{"value":{"usernameOrEmail":"darthvader@galactic-empire.com"}},"OrganizationImageData":{"value":{"fileType":"svg","organizationID":"A3088298-30CA-4268-AA5D-1DA877314693","image":"PHN2ZyBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjQwIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjMiIGZpbGw9ImJsdWUiIC8+PC9zdmc+"}},"UserRegistrationInitiation":{"value":{"email":"darthvader@galactic-empire.com"}},"KeycloakUserInfo":{"value":{"username":"darthvader","attributes":{"likes":["lightsabers","the Force"],"position":["Dark Lord of the Sith"]},"email":"darthvader@galactic-empire.com","access":{"manageGroupMembership":true,"view":true},"requiredActions":["UPDATE_PASSWORD","UPDATE_PROFILE"],"groups":["sith","empire"],"enabled":true,"firstName":"Anakin","id":"76701A7E-EAAB-4878-AE12-3123BB931A39","roles":["admin"],"lastName":"Skywalker","emailVerified":true}},"DeclineOrganizationInvite":{"value":{"inviteID":"CE5935AA-CCE2-4795-B23B-5451AFBB959D"}},"ChangeUserPassword":{"value":{"newPassword":"SandSuxDest0ryAllSand","oldPassword":"Ih8obi-wan!higrndSUXX"}},"AuthGroupInviteResponse":{"value":{"message":"Invitation sent.","inviteID":"848C651B-CE81-447A-BE05-597A0A0716A6"}},"RegisterUserData":{"value":{"username":"942FC4F7-457B-4E47-B8BD-3FFA874CDFE4","token":"<JWT Token from registration email>","email":"darthvader@galactic-empire.com","firstName":"Anakin","lastName":"Skywalker","acceptedEULA":true,"password":"Ih8obi-wan!higrndSUXX","acceptMailingList":false}},"UploadImageData":{"value":{"image":"PHN2ZyBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiPjxjaXJjbGUgY3g9IjUwIiBjeT0iNTAiIHI9IjQwIiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjMiIGZpbGw9ImJsdWUiIC8+PC9zdmc+","fileType":"svg","ID":"A8866A5B-B1DB-417B-9973-3A9960DAF34D"}},"DeleteOrganizationData":{"value":{"orgID":"D77EEF49-B939-40DF-AC74-B94A48837278"}}},"securitySchemes":{"PL API Key":{"description":"PL API Key in header","type":"apiKey","in":"header","name":"PL-API-KEY"},"Basic Auth - login":{"description":"Basic authentication used only at login.","scheme":"basic","type":"http"},"DEPRECATED - PL API Key":{"description":"DEPRECATED - PL API Key in Bearer header","type":"apiKey","in":"header","name":"Authorization: PL-API-KEY"},"XSRF header":{"description":"Authentication using an XSRF protected JWT","type":"apiKey","in":"header","name":"X-PL-AUTH"}}},"tags":[{"name":"app"},{"description":"Routes related to user auth","name":"Authentication"},{"description":"Routes related to user account management.","name":"Account"},{"description":"Routes related to AuthGroup management.","name":"Auth Groups"},{"description":"Routes related to organization management","name":"Organization"},{"description":"Routes related to PassiveLogic devices","name":"PassiveLogic Device"},{"description":"Routes related to the GraphQL API","name":"GraphQL"},{"description":"Routes related to Image management","name":"Images"},{"description":"Routes related to Binding management.","name":"Bindings"},{"description":"Routes related to server metadata\/utility","name":"Utility"},{"description":"Routes related to exporting objects and history","name":"Export"},{"description":"Routes related to site objects","name":"Site"},{"description":"Routes related to quantum sync","name":"Quantum Sync"},{"description":"Routes related to server health checks","name":"Health"}],"info":{"description":"This page documents the operations supported by the PassiveLogic HTTP API, covering authentication, user management, and\nGraphQL API access.","version":"0.0.0","title":"PassiveLogic REST API"}}