.. title:: Developer API Developer API ============= The Kasm Workspaces Developer API can be leveraged to extend the systems functionality and/or integrate with an exiting platform. Integrators interface with the API to create and manage sessions, users and groups. .. figure:: /images/api/workflow.png :width: 100% :align: center **Integration Workflow** Code-less Integration Options ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Integrators are encouraged to review :doc:`Session Casting <../guide/casting>` which provides an easy way to expose access to Kasm sessions via special URLs. API Keys ~~~~~~~~ API Keys can be generated via the **Developers** tab. An **API_KEY** and **API_KEY_SECRET** will be automatically generated. .. figure:: /images/api/api_key.png :width: 70% :align: center **Creating an API Key** Authentication ~~~~~~~~~~~~~~ The API key and secret must be sent with all of the following requests as json data. .. sourcecode:: js { "api_key": "bMjMwTT0JKUQ" "api_key_secret": "KUNAvRw4KLHGmldBxhRUD5sAhWkvJVzS" } Base URL ~~~~~~~~ https:///api/public/ Errors ~~~~~~ In the event of an error processing an api request, Kasm will respond with an **error_message** in the body of the json response **Example Response** .. sourcecode:: js {"error_message": ""} Users ~~~~~ Create User +++++++++++ Create a new user. .. http:post:: /api/public/create_user **Example request**: .. tabs:: .. code-tab:: json { "api_key":"{{api_key}}", "api_key_secret": "{{api_key_secret}}", "target_user": { "username" : "test_user1@example.com", "first_name" : "Bob", "last_name" : "Williams", "locked": false, "disabled": false, "organization": "example", "phone": "123-456-7890", "password": "3UPKGg7g!a9g2@39v6" } } **Example response**: .. sourcecode:: json { "user": { "first_name": "Bob", "username": "test_user1@example.com", "realm": "local", "last_name": "Williams", "phone": "123-456-7890", "last_session": null, "notes": null, "user_id": "50faa5439c574b518cd868dac9256e4b", "groups": [ { "name": "All Users", "group_id": "68d557ac4cac42cca9f31c7c853de0f3" } ], "disabled": false, "organization": "example", "locked": false } } Get User ++++++++ Retrieve the properties of an existing user. :code:`target_user.user_id` or :code:`target_user.username` can be passed .. http:post:: /api/public/get_user **Example request**: .. tabs:: .. code-tab:: json { "api_key": "{{api_key}}", "api_key_secret": "{{api_key_secret}}", "target_user": { "user_id": "4bbb6998064a4d1ea4685f3cdd05feb4", "username": "user@kasm.local" } } **Example response**: .. sourcecode:: json { "user": { "user_id": "4bbb6998064a4d1ea4685f3cdd05feb4", "username": "user@kasm.local", "locked": false, "last_session": "2020-11-09 14:41:33.578622", "groups": [ { "name": "All Users", "group_id": "68d557ac4cac42cca9f31c7c853de0f3" } ], "first_name": null, "last_name": null, "phone": null, "organization": null, "notes": null, "kasms": [ { "kasm_id": "28cfc2a510bb424cad18e571f11ee26c", "start_date": "2020-11-09 14:46:42.321900", "keepalive_date": "2020-11-09 14:46:43.140623", "expiration_date": "2020-11-09 15:46:43.140623", "server": { "server_id": "36e2aeff0e02445db26a521c9c85f1c1", "hostname": "proxy", "port": 443 } } ], "realm": "local", "two_factor": false, "program_id": null, "hash": "9fdfdaad0098cdd8a466b2badbaf962e40214affb07596a6e9d776a409793780" } } Get Users +++++++++ Retrieve the list of users registered in the system. .. http:post:: /api/public/get_users **Example request**: .. tabs:: .. code-tab:: json { "api_key": "{{api_key}}", "api_key_secret": "{{api_key_secret}}", } **Example response**: .. sourcecode:: json { "users": [ { "kasms": [], "company": {}, "username": "user@kasm.local", "locked": false, "realm": "local", "phone": null, "first_name": null, "notes": null, "user_id": "57e8fc1a-fa86-4ff4-9474-60d9831f42d5", "last_session": "2020-11-12 14:29:25.808258", "groups": [ { "name": "All Users", "group_id": "68d557ac4cac42cca9f31c7c853de0f3" } ], "disabled": true, "organization": null, "last_name": null }, { "kasms": [], "company": {}, "username": "admin@kasm.local", "locked": false, "realm": "local", "phone": null, "first_name": null, "notes": null, "user_id": "4acb13bf-1215-4972-9f0d-8c537d17f2da", "last_session": "2020-11-12 14:35:19.700863", "groups": [ { "name": "All Users", "group_id": "68d557ac4cac42cca9f31c7c853de0f3" }, { "name": "Administrators", "group_id": "31aa063c670648589533d3c42092d02a" } ], "disabled": false, "organization": null, "last_name": null } ] } Update User +++++++++++ Update the properties of an existing user. .. http:post:: /api/public/update_user **Example request**: .. tabs:: .. code-tab:: json { "api_key":"{{api_key}}", "api_key_secret": "{{api_key_secret}}", "target_user": { "username" : "test_user1@example.com", "first_name" : "Bob", "last_name" : "Williams", "locked": false, "disabled": false, "organization": "example", "phone": "123-456-7890", "password": "3UPKGg7g!a9g2@39v6" } } **Example response**: .. sourcecode:: json { "user": { "first_name": "Bob", "username": "test_user1@example.com", "realm": "local", "last_name": "Williams", "phone": "123-456-7890", "last_session": null, "notes": null, "user_id": "50faa5439c574b518cd868dac9256e4b", "groups": [ { "name": "All Users", "group_id": "68d557ac4cac42cca9f31c7c853de0f3" } ], "disabled": false, "organization": "example", "locked": false } } Delete User +++++++++++ Delete an existing user. If the user has any existing Kasm sessions, deletion will fail. Set the **force** option to true to delete the user's sessions and delete the user. .. http:post:: /api/public/delete_user **Example request**: .. tabs:: .. code-tab:: json { "api_key": "{{api_key}}", "api_key_secret": "{{api_key_secret}}", "target_user": { "user_id": "4bbb6998064a4d1ea4685f3cdd05feb4" }, "force": false } **Example response**: .. sourcecode:: json {} Get User Attributes +++++++++++++++++++ Get the attribute (preferences) settings for an existing user. .. http:post:: /api/public/get_attributes **Example request**: .. tabs:: .. code-tab:: json { "api_key": "{{api_key}}", "api_key_secret": "{{api_key_secret}}", "target_user": { "user_id": "67d7c4e6-f891-4900-897f-ce5ed62fecc0", } } **Example response**: .. sourcecode:: json { "user_attributes": { "ssh_public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCjy8izTD7DlykY0J7iiBn4ysIRqLBwM94ZnjfYH1XAo96ay3grQjSDl5f4u0hrVz6bX62kgPlm9QvTqceNZ+rC/anKp/9nQIrDM6y2W3jNUM6Eo+Ryh7xIOII2lnCbtE/M4urX4lZx3oB2JyIMSIN3yvKUBCSht5FsFabguc8i+nwLvXjmnZx+fcR2/BNcIM9UjCfYBjLFd1XFER7aIXjRy7y2MJQHCFrzhDThNllJ6C1oMZiBsBJ5lXpBmlim80A9IvcW7YBgsAQoqLgrCvRc7IdENTzPAyyhODE/ib5SkwK/peUuCRM+SZnPpUGlv9emLXVjrg5P+TPO/N/v7lyj", "show_tips": false, "user_id": "57e8fc1afa864ff4947460d9831f42d5", "toggle_control_panel": false, "chat_sfx": true, "user_attributes_id": "ef7b72db25b14ab1ac98ac19676ac93f", "default_image": null, "auto_login_kasm": null } } Update User Attributes ++++++++++++++++++++++ Update a users attributes. .. http:post:: /api/public/update_user_attributes **Example request**: .. tabs:: .. code-tab:: json { "api_key": "{{api_key}}", "api_key_secret": "{{api_key_secret}}", "target_user_attributes": { "user_id": "67d7c4e6-f891-4900-897f-ce5ed62fecc0", "auto_login_kasm": false, "default_image": "b2609fbf72954b20a56c1fe502aa2c41", "show_tips": false, "toggle_control_panel": false } } **Example response**: .. sourcecode:: json {} Kasms ~~~~~ Request Kasm ++++++++++++ Requesting a Kasm will create and start the container and assign a user to that Kasm. .. note:: If you intend to integrate Kasm into your app and will utilize iframes to load user sessions, be sure to set the **Same Site Cookie Policy** `Global Setting <../guide/settings.html#authentication>`_ to None if the Kasm Workspaces server is hosted under a different domain name. Reference: ``__ .. http:post:: /api/public/request_kasm **Example request**: .. tabs:: .. code-tab:: json { "api_key": "{{api_key}}", "api_key_secret": "{{api_key_secret}}", "user_id": "8affcdbc16fc4910acb8a6dc268cd7ed", "image_id": "6a2d63fa8959412ca5fddd3890fb7223", "enable_sharing": true } **Example response**: .. sourcecode:: json { "kasm_id": "6d62ec66-3062-4f1d-b861-aeb3f5ca2390", "session_token": "b03bf84a-53fc-4934-85e4-c434461f1178", "username": "1d47uudwcynkd2su", "status": "starting", "share_id": "fe9770a4", "user_id": "8affcdbc16fc4910acb8a6dc268cd7ed", "kasm_url": "/#/connect/kasm/6d62ec66-3062-4f1d-b861-aeb3f5ca2390/8affcdbc16fc4910acb8a6dc268cd7ed/b03bf84a-53fc-4934-85e4-c434461f1178" } **Arguments** user_id* *string*: An user Id can be specified to create the Kasm under that user. If no User ID is sent an anonymous user will be created and used for the Kasm. image_id* *string*: An image id can be sent for the desired image. Otherwise the default image sent on the group or user level will be used. enable_sharing* *boolean*: When the enable sharing flag is set to true the kasm will be created with sharing mode automatically enabled. kasm_url* *string*: If specified, the browser inside the Kasm session will navigate to this page. This is only applicable if the Image used is Kasm Chrome, Kasm Firefox, or Kasm Tor Browser. \* Optional **Response Format** kasm_id *string*: Returns the ID for the newly created Kasm. session_token *string*: Returns the token created for the user used in authorization of the Kasm. username *string*: Returns the username of the specified or newly created user. status *string*: Returns the operational status of the Kasm. Will be in Starting, Running or Stopped state. share_id *string*: Returns the Share id user_id *string*: Returns the user id of the specified or newly created user kasm_url *string*: Returns the url path to the specified kasm. This path must be appended to the current Kasm Workspaces server address. It is in the form of /#/connect/kasm/// Direct the user's browser to this url to access the Kasm session. This link should not be re-used for different users. Get Kasm Status +++++++++++++++ After creating a kasm the status can be checked with get_kasm_status. This call also updates the session token for the user creating a new connection link and invalidating the old one. .. http:post:: /api/public/get_kasm_status **Example request**: .. tabs:: .. code-tab:: json { "api_key": "{{api_key}}", "api_key_secret": "{{api_key_secret}}", "user_id": "c7357f11eb4d47ad8021b5847d8415d8", "kasm_id": "d79ccb22-f6e7-4473-b8a2-a77da82278da" } **Example response**: .. sourcecode:: json { "current_time": "2020-11-12 13:30:24.833834", "kasm_url": "/#/connect/kasm/116f18170fdc4a1a87146164a880fb93/583035bb-5819-4e51-83b9-21223badc569/2d110a49-4c6a-48b9-8cfb-398d6f543d5b", "kasm": { "expiration_date": "2020-11-12 14:28:40.446756", "container_ip": "192.168.32.9", "start_date": "2020-11-12 13:28:40.446737", "point_of_presence": null, "token": "43ab8a765e1e42fe9ee637783731f577", "image_id": "e12266d0f5f44bf5afb80b6c41fabce2", "view_only_token": "6f756f76e8704772bd8e32eb4d7bb835", "cores": 1.0, "hostname": "kasm.server", "kasm_id": "116f18170fdc4a1a87146164a880fb93", "port_map": { "audio": { "port": 443, "path": "desktop/116f1817-0fdc-4a1a-8714-6164a880fb93/audio" }, "vnc": { "port": 443, "path": "desktop/116f1817-0fdc-4a1a-8714-6164a880fb93/vnc" }, "audio_input": { "port": 443, "path": "desktop/116f1817-0fdc-4a1a-8714-6164a880fb93/audio_input" }, "uploads": { "port": 443, "path": "desktop/116f1817-0fdc-4a1a-8714-6164a880fb93/uploads" } }, "image": { "image_id": "e12266d0f5f44bf5afb80b6c41fabce2", "name": "kasmweb/chrome:1.8.0", "image_src": "img/thumbnails/chrome.png", "friendly_name": "Kasm Chrome" }, "is_persistent_profile": false, "memory": 1768000000, "operational_status": "running", "client_settings": { "allow_kasm_audio": false, "idle_disconnect": 20, "lock_sharing_video_mode": true, "allow_persistent_profile": false, "allow_kasm_clipboard_down": false, "allow_kasm_microphone": false, "allow_kasm_downloads": false, "kasm_audio_default_on": false, "allow_point_of_presence": false, "allow_kasm_uploads": false, "allow_kasm_clipboard_up": false, "enable_webp": false, "allow_kasm_sharing": true, "allow_kasm_clipboard_seamless": false }, "container_id": "dbc977159f79e55c466fec52a5b4954b7c26ba88e51937d85a5077d7c79e92e5", "port": 443, "keepalive_date": "2020-11-12 13:28:40.446754", "user_id": "583035bb58194e5183b921223badc569", "persistent_profile_mode": null, "share_id": "30a09d61", "host": "192.168.32.8", "server_id": "8270f8f0acfd4a34a56cc9a9cb7a67d9" } } **Arguments** user_id *string*: The user ID associated with the requested kasm. kasm_id *string*: The ID of the desired Kasm. **Response Format** current_time *string*: Returns the time at which the call was recieved in UTC. kasm *json object*: Returns the Kasm object containing all of the current information. kasm_url *string*: Returns the link path to the specified kasm. This path must be appended to the current Kasm Workspaces server address. It is in the form of /#/connect/kasm/// Direct the user's browser to this url to access the Kasm session. This link should not be re-used for different users. Join Kasm +++++++++ Join Kasm returns the status of the shared kasm and a join url to connect to the Kasm session as a view-only user. .. http:post:: /api/public/join_kasm **Example request**: .. tabs:: .. code-tab:: json { "api_key": "{{api_key}}", "api_key_secret": "{{api_key_secret}}", "user_id":"c7357f11eb4d47ad8021b5847d8415d8", "share_id":"89cc8cd3" } **Example response**: .. sourcecode:: json { "current_time": "2020-11-12 13:36:16.065711", "session_token": "c9ade890-7693-44bc-a1d4-797bbddf6771", "user_id": "583035bb58194e5183b921223badc569", "kasm": { "port_map": { "vnc": { "port": 443, "path": "desktop/116f1817-0fdc-4a1a-8714-6164a880fb93/vnc" }, "audio": { "port": 443, "path": "desktop/116f1817-0fdc-4a1a-8714-6164a880fb93/audio" } }, "port": 443, "hostname": "kasm.server", "image": { "image_id": "e12266d0f5f44bf5afb80b6c41fabce2", "name": "kasmweb/chrome:1.8.0", "image_src": "img/thumbnails/chrome.png", "friendly_name": "Kasm Chrome" }, "view_only_token": "6f756f76e8704772bd8e32eb4d7bb835", "user": { "username": "anon_2wipg0symxwmm4i1" }, "share_id": "30a09d61", "host": "192.168.32.8", "client_settings": { "allow_kasm_audio": false, "idle_disconnect": 20, "lock_sharing_video_mode": true, "allow_persistent_profile": false, "allow_kasm_clipboard_down": false, "allow_kasm_microphone": false, "allow_kasm_downloads": false, "kasm_audio_default_on": false, "allow_point_of_presence": false, "allow_kasm_uploads": false, "allow_kasm_clipboard_up": false, "enable_webp": false, "allow_kasm_sharing": true, "allow_kasm_clipboard_seamless": false }, "kasm_id": "116f18170fdc4a1a87146164a880fb93" }, "username": "anon_2wipg0symxwmm4i1", "kasm_url": "/#/connect/join/30a09d61/583035bb58194e5183b921223badc569/c9ade890-7693-44bc-a1d4-797bbddf6771" } **Arguments** user_id* *string*: The user ID used to create the join link. If none supplied an anonymous user will be created. share_id *string*: The share ID of the desired kasm. \* Optional **Response Format** current_time *string*: Returns the time at which the call was received in UTC. kasm *json object*: Returns the Kasm object containing all of the current information. kasm_url *string*: Returns the link path to the specified shared kasm. This path must be appended to the current kasm server address. It is in the form of /#/connect/join/// Direct the user's browser to this url to access the Kasm session. This link should not be re-used for different users. session_token *string*: Returns the token created for the user used in authorization of the Kasm. username *string*: Returns the username of the specified or newly created user. user_id *string*: Returns the user ID of the specified or newly created user. Get Kasms +++++++++ Retrieve a list of live sessions. .. http:post:: /api/public/get_kasms **Example request**: .. tabs:: .. code-tab:: json { "api_key": "{{api_key}}", "api_key_secret": "{{api_key_secret}}" } **Example response**: .. sourcecode:: json { "current_time": "2020-11-12 13:45:33.253299", "kasms": [ { "expiration_date": "2020-11-12 14:28:40.446756", "container_ip": "192.168.32.9", "server": { "port": 443, "hostname": "proxy", "zone_name": "default", "provider": "hardware" }, "user": { "username": "anon_2wipg0symxwmm4i1" }, "start_date": "2020-11-12 13:28:40.446737", "point_of_presence": null, "token": "43ab8a765e1e42fe9ee637783731f577", "image_id": "e12266d0f5f44bf5afb80b6c41fabce2", "view_only_token": "6f756f76e8704772bd8e32eb4d7bb835", "cores": 1.0, "hostname": "proxy", "kasm_id": "116f18170fdc4a1a87146164a880fb93", "port_map": { "audio": { "port": 443, "path": "desktop/116f1817-0fdc-4a1a-8714-6164a880fb93/audio" }, "vnc": { "port": 443, "path": "desktop/116f1817-0fdc-4a1a-8714-6164a880fb93/vnc" }, "audio_input": { "port": 443, "path": "desktop/116f1817-0fdc-4a1a-8714-6164a880fb93/audio_input" }, "uploads": { "port": 443, "path": "desktop/116f1817-0fdc-4a1a-8714-6164a880fb93/uploads" } }, "image": { "image_id": "e12266d0f5f44bf5afb80b6c41fabce2", "name": "kasmweb/chrome:1.8.0", "image_src": "img/thumbnails/chrome.png", "friendly_name": "Kasm Chrome" }, "is_persistent_profile": false, "memory": 1768000000, "operational_status": "running", "client_settings": { "allow_kasm_audio": false, "idle_disconnect": 20, "lock_sharing_video_mode": true, "allow_persistent_profile": false, "allow_kasm_clipboard_down": false, "allow_kasm_microphone": false, "allow_kasm_downloads": false, "kasm_audio_default_on": false, "allow_point_of_presence": false, "allow_kasm_uploads": false, "allow_kasm_clipboard_up": false, "enable_webp": false, "allow_kasm_sharing": true, "allow_kasm_clipboard_seamless": false }, "container_id": "dbc977159f79e55c466fec52a5b4954b7c26ba88e51937d85a5077d7c79e92e5", "port": 443, "keepalive_date": "2020-11-12 13:28:40.446754", "user_id": "583035bb58194e5183b921223badc569", "persistent_profile_mode": null, "share_id": "30a09d61", "host": "192.168.32.8", "server_id": "8270f8f0acfd4a34a56cc9a9cb7a67d9" } ] } Destroy Kasm ++++++++++++ Destroy kasm can be called to destroy a Kasm. .. http:post:: /api/public/destroy_kasm **Example request**: .. tabs:: .. code-tab:: json { "api_key": "{{api_key}}", "api_key_secret": "{{api_key_secret}}" "kasm_id": "1a85859d-9d75-45e1-a173-e720472a24f8", "user_id": "4d892bf39321494da9a159178972c147", } **Example response**: .. sourcecode:: json {} **Arguments** user_id *string*: The user ID used of the kasm owner. kasm_id *string*: The ID of the kasm to be destroyed. **Response Format** If empty response is sent the Kasm was successfully deleted. Keepalive +++++++++ Issue a keepalive to reset the expiration time of a Kasm session. The new expiration time will be updated to reflect the **keepalive_expiration** :doc:`Group Setting <../guide/groups>` assigned to the Kasm's associated user. .. http:post:: /api/public/keepalive **Example request**: .. tabs:: .. code-tab:: json { "api_key": "{{api_key}}", "api_key_secret": "{{api_key_secret}}" "kasm_id": "1a85859d-9d75-45e1-a173-e720472a24f8" } **Example response**: .. sourcecode:: json { "usage_reached": false } **Arguments** kasm_id *string*: The ID of the kasm to issue the expiration update. **Response Format** The response returns a single value **usage_reached**. If `true`, the user has exceeded the quota defined be the **usage_limit** group setting and the expiration time was **not** reset. Session Component Control +++++++++++++++++++++++++ The developer may choose to hide the display of certain visual components that normally appear during a Kasm session. This is done by appending the following query arguments to any of the `kasm_url` response urls generated by the apis above. **Example** .. sourcecode:: /#/connect/join/89cc8cd3/c7357f11eb4d47ad8021b5847d8415d8/070fce1f-86c6-4e05-9b10-935632acb8ce?disable_control_panel=1&disable_tips=1&disable_chat=1&disable_fixed_res=1 **Query Arguments** disable_control_panel=1 Hides the Kasm control panel that is normally used for uploads, downloads etc. Users will be unable to access this functionality. disable_tips=1 Stops the tips modal from showing when the user connects to a session. disable_chat=1 Hides the chat interface for shared sessions. disable_fixed_res=1 By default, shared sessions are forced into a fixed resolution and aspect ratio. When specified this will allow the shared session to operate with a dynamic resolution and aspect ratio. Images ~~~~~~ Get Images ++++++++++ Retrieve a list of available images. .. http:post:: /api/public/get_images **Example request**: .. tabs:: .. code-tab:: json { "api_key": "{{api_key}}", "api_key_secret": "{{api_key_secret}}" } **Example response**: .. sourcecode:: json { "images": [ { "restrict_to_network": false, "memory": 768000000, "zone_name": null, "x_res": 800, "description": "Single-Application : Chrome", "image_id": "b483f0a4fb6546f79064f9b6759758cb", "persistent_profile_path": null, "friendly_name": "Kasm Chrome", "volume_mappings": {}, "restrict_to_zone": false, "docker_token": null, "persistent_profile_config": {}, "cores": 1.0, "docker_registry": "https://index.docker.io/v1/", "available": true, "run_config": { "hostname": "kasm" }, "imageAttributes": [ { "image_id": "b483f0a4fb6546f79064f9b6759758cb", "attr_id": "11cd3b92d73c4caaa84c70e75190ec25", "name": "vnc", "category": "port_map", "value": "6901/tcp" }, { "image_id": "b483f0a4fb6546f79064f9b6759758cb", "attr_id": "ec1531322190445db70d10c31766503a", "name": "audio", "category": "port_map", "value": "4901/tcp" }, { "image_id": "b483f0a4fb6546f79064f9b6759758cb", "attr_id": "3634ba1144bc4f64a932a561983c64f5", "name": "uploads", "category": "port_map", "value": "4902/tcp" } ], "docker_user": null, "restrict_to_server": false, "enabled": true, "name": "kasmweb/chrome:1.8.0", "zone_id": null, "y_res": 600, "server_id": null, "network_name": null, "exec_config": { "first_launch": { "environment": { "LAUNCH_URL": "" }, "cmd": "bash -c 'google-chrome --start-maximized \"$KASM_URL\"'" }, "go": { "cmd": "bash -c 'google-chrome --start-maximized \"$KASM_URL\"'" } }, "hash": null, "image_src": "img/thumbnails/chrome.png" } ] } Groups ~~~~~~ Add User to Group +++++++++++++++++ Add a user to an existing group. .. http:post:: /api/public/add_user_group **Example request**: .. tabs:: .. code-tab:: json { "api_key": "{{api_key}}", "api_key_secret": "{{api_key_secret}}", "target_user": { "user_id": "67d7c4e6-f891-4900-897f-ce5ed62fecc0" }, "target_group": { "group_id": "87fd617577984033be5bd269b4d170c6" } } **Example response**: .. sourcecode:: json {} Remove User from Group ++++++++++++++++++++++ Remove a user from an existing group. .. http:post:: /api/public/remove_user_group **Example request**: .. tabs:: .. code-tab:: json { "api_key": "{{api_key}}", "api_key_secret": "{{api_key_secret}}", "target_user": { "user_id": "67d7c4e6-f891-4900-897f-ce5ed62fecc0" }, "target_group": { "group_id": "87fd617577984033be5bd269b4d170c6" } } **Example response**: .. sourcecode:: json {} Login ~~~~~ Get Login +++++++++ Generate a link for the user to login to Kasm without the need to enter a username or password. Redirect the user to the provided url. .. http:post:: /api/public/get_login **Example request**: .. tabs:: .. code-tab:: json { "api_key": "{{api_key}}", "api_key_secret": "{{api_key_secret}}", "target_user": { "user_id": "67d7c4e6-f891-4900-897f-ce5ed62fecc0" } } **Example response**: .. sourcecode:: json { "url": "https://kasm.server/#/connect/login/dash/57e8fc1afa864ff4947460d9831f42d5/930d6a5d-082e-438a-b5cf-98ae7ca5b67c" }