Developer's Guide
API documentation and developer resources
Admin API
Admin API, Account Endpoints, Organization Endpoints, Customer Endpoints, Infrastructure Endpoints
Admin API
The Frame Admin API service is based on standard REST HTTPS calls. All API endpoints require signed authentication via HTTP headers and role-based access control configured within Frame Console.
The typical workflow for an API call is as follows:
-
Authenticate with the Frame REST API to sign the HTTPS API request. You'll need to create a signature with the
client_id, theclient_secret, and a timestamp. Theclient_idandclient_secretis obtained by a Frame administrator in Frame Console. -
Make the HTTPS REST call to the Admin API endpoint using the
client_id, timestamp, and the signature in the HTTP header. -
The Frame REST API verifies the signature of the HTTPS request, verifies the requestor has sufficient authorization to make the request, and will then send the requested response.
Frame Admin API is served from the following URL:
https://api.console.nutanix.com/v1
In the next section, we will review how to properly configure Frame to authenticate and authorize Frame Admin API requests.
Authentication and Authorization
All REST API calls require signed requests for authentication of each 3rd party service request. To sign an API request call, a client_id and client_secret (obtained from Frame Console by an administrator) are required for signature creation and verification.
How to Provision API Credentials
Making API Calls
In the last section, you generated a client_id and a client_secret.
The client_id is a unique string that Frame uses to identify and authorize the proper entity and API permissions.
The client_secret is an HMAC-SHA256 key used to generate the signature and is required by the signature verification process.
A signature is created by applying the HMAC-SHA256 algorithm to a string that is constructed from the client_id and a timestamp. The timestamp is the current time in seconds since epoch.
The proper steps for creating a signature are as follows:
-
Get the current timestamp.
-
Create a string by concatenating the timestamp with the
client_id(timestamp + client_id). -
Apply HMAC-SHA256 on the newly created string using the
client_secret.
In order to verify the signature, our API also requires the client_id, and the
timestamp in your request's HTTP headers. The client_secret should
NOT be included.
Python 3 Example
Below is a simple example of a Python 3 script that can be used to generate the signature needed for the API call and then the HTTPS request.
#!/bin/env python
import hashlib
import hmac
import time
import requests
# Client credentials
client_id = "<Your API Client ID goes here>"
client_secret = b"<Your API Client Secret goes here>"
# Create signature
timestamp = int(time.time())
to_sign = "%s%s" % (timestamp, client_id)
signature = hmac.new(client_secret, to_sign.encode('utf-8'), hashlib.sha256).hexdigest()
# Prepare http request headers
headers = { "X-Frame-ClientId": client_id, "X-Frame-Timestamp": str(timestamp), "X-Frame-Signature": signature }
# Make request
r = requests.get("https://api.console.nutanix.com/v1/accounts", headers=headers)
accounts = r.json()
# Print accounts
for account in accounts:
print(account)
API Endpoints
Lastly, each Frame entity (Customer, Organization, Account, Infrastructure) has its own set of endpoints.
Account Endpoints
List Accounts
Lists all Frame accounts.
GET /accounts/
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| name | Name or portion of name you would like to use for searching/filtering. | Search Query | string | False |
| organization_id | Frame Organization ID you'd would like to use for searching/filtering | Search Query | string | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts"
Response Example
[
{
"website": null,
"name": "Aca Ivic Local",
"last_publish": "2018-07-12T11:26:18.879116",
"id": "b614cb6f-796b-4371-86cb-465d6dfc433b",
"description": null,
"active": true
}
]
Status: 200 OK
List Account Details
Returns details of an account.
GET /accounts/:account_id
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/31cbf42c-8767-486c-9ed3-d6a804q7cfe1"
Response Example
{
"active": false,
"description": null,
"id": "31cbf42c-8767-486c-9ed3-d6a804q7cfe1",
"inserted_at": "2020-02-27T19:08:53.892063Z",
"kind": "frame",
"last_publish": null,
"name": "Example Account",
"notes": null,
"url_slug": "example-account-slug",
"website": null
}
Status: 200 OK
List Account Availability Zones
Lists all availability zones of a Frame account.
GET /accounts/:id/availability_zones
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/availability_zones"
Response Example
["eu-central-1a", "eu-central-1b", "eu-central-1c"]
Status: 200 OK
List Account Upgrade Groups
Lists all upgrade groups of the account.
GET /accounts/:id/deployment_groups
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/deployment_groups"
Response Example
[
{
"id": "upgrade-group-1",
"description": "Upgrade group 1 description",
"not_selectable": false,
"name": "Upgrade Group 1"
}
]
Status: 200 OK
Get Account User Volumes Settings
Returns user volumes settings of a Frame account.
GET /accounts/:id/user_volumes_settings
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/user_volumes_settings"
Response Example
{
"user_personal_drive": {
"enabled": true,
"size": 1
},
"user_profile": {
"enabled": true,
"size": 1
}
}
Status: 200 OK
Get Account Domain Join Settings
Returns domain join settings of a Frame account.
GET /accounts/:id/domain_join_settings
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/domain_join_settings"
Response Example
{
"settings": {
"promote_user_to_local_admin": false,
"ad_type": "",
"delete_terminated_hostnames": false,
"dns_servers": "",
"domain_controller_ip": "",
"domain_name": "",
"enroll_intune": false,
"logout_local_user": false,
"machine_name_prefix": "",
"service_account_name": "",
"service_account_password": "",
"sso_passthrough_enabled": false,
"target_ou": "",
"vpc_cidr": ""
},
"is_domain_join_available": true,
"is_domain_join_enabled": true
}
Status: 200 OK
Get Account General Settings
Returns general settings of a Frame account.
GET /accounts/:id/general_settings
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/general_settings"
Response Example
{
"light_publish_settings": {
"threshold": 10
},
"is_light_publish_enabled": false,
"host_name_prefix": "IF-",
"is_generate_session_report_enabled": false,
"is_test_publish_enabled": false,
"auto_termination_time": null,
"is_login_banner_enabled": true,
"is_terminal_banner_enabled": true,
"login_banner_settings": {
"title": "",
"message": ""
},
"terminal_banner_settings": {
"message": "",
"color": "#FFFFFF",
"background_color": "#FFFFFF"
}
}
Status: 200 OK
Get Account Session Settings
Returns session settings of a Frame account.
GET /accounts/:id/session_settings
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/session_settings"
Response Example
{
"is_webrtc_enabled": false,
"advanced_server_arguments": null,
"advanced_terminal_arguments": null,
"clipboard_integration": {
"direction": "bidirectional",
"is_enabled": true
},
"idle_timeout_minutes": 60,
"is_app_switching_enabled": true,
"is_camera_enabled": false,
"is_cpu_display4k_enabled": true,
"is_download_enabled": true,
"is_grayscale_enabled": false,
"is_microphone_enabled": false,
"is_print_enabled": true,
"is_settings_dialog_enabled": true,
"is_upload_enabled": true,
"is_usb_redirection_enabled": false,
"max_audio_bit_rate_kbps": 160,
"max_bandwidth_kbps": 0,
"max_frame_rate_fps": 20,
"max_session_duration_minutes": 0,
"max_video_bit_rate_mbps": 16.0,
"max_video_quantization": 42,
"qos_rate_change": 4,
"reservation_timeout_seconds": 600,
"scale_video": 1.0,
"session_preparation_timeout_minutes": 15,
"terminal_build": "latest",
"user_inactivity_timeout_minutes": 10,
"video_buffer_length_ms": 0,
"yuv444": false
}
Status: 200 OK
Update Account Enterprise Profiles
Updates enterprise profiles of a Frame account. (Should be used only if enabling enterprise profiles or updating its size. In case you want to disable enterprise profiles, you should use disable_enterprise_profiles endpoint instead.)
POST /accounts/:id/update_enterprise_profiles
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | ID of the Org the account will be created under | URL | String | True |
| user_profile | A JSON object that includes values for the following properties: enabled of type boolean and size of type integer |
Data | JSON | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/update_enterprise_profiles"
--data-raw '{
"user_profile": {
"enabled": true,
"size": 1
}
}'
Response Example
{
"enabled": true,
"size": 1
}
Status: 200 "OK"
Update Account Personal Drives
Updates personal drives of a Frame account. (Should be used only if enabling personal drives or updating its size. In case you want to disable personal drives, you should use disable_personal_drives endpoint instead.)
POST /accounts/:id/update_personal_drives
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | ID of the Org the account will be created under | URL | String | True |
| enabled | Boolean which determines whether personal drives are enabled | Data | Boolean | True |
| size | Integer which determines size of personal drives if enabled | Data | Integer | False |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/update_personal_drives"
--data-raw '{
"enabled": true,
"size": 1
}'
Response Example
{
"enabled": true,
"size": 1
}
Status: 200 "OK"
Disable Account Enterprise Profiles
Disables enterprise profiles of a Frame account and returns the pending task.
POST /accounts/:id/disable_enterprise_profiles
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | ID of the Org the account will be created under | URL | String | True |
| do_backup | Boolean which determines whether new backups of existing enterprise profiles should be created | Data | Boolean | False |
| delete_all_backups | Boolean which determines whether existing backups should be deleted | Data | Boolean | False |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/disable_enterprise_profiles"
--data-raw '{
"do_backup": false,
"delete_all_backups": false
}'
Response Example
{
"account_id": "6b9a8c85-dd5b-4c1c-9bf2-ca1ba8e537b7",
"customer_id": "XXXXXXXX-5ab2-47ef-9f9c-XXXXXXXXXXX",
"display_name": "Publishing Sandbox to Production",
"duration_sec": null,
"external_resource_id": null,
"finished_at": null,
"id": "c454d6da-fa30-4dc4-a533-6af2286d1754",
"inserted_at": "2021-09-29T19:30:57.708442Z",
"kind": "disable_enterprise_profiles",
"organization_id": "2fb210e0-e931-4c62-83fd-b31fe13468ca",
"pool_id": null,
"progress_info": null,
"result_info": null,
"stage": "not_started",
"started_by": {
"email": "976bcbc7-945a-4511-b1ca-2a3f60e3cade.img.frame.nutanix.com_third-party-api",
"first_name": "X",
"id": "a4da51c5-1c74-45e6-b1ca-2ec739d528d2",
"identity_provider": "third-party-api",
"last_name": "X"
},
"updated_at": "2021-09-29T19:30:57.708442Z"
}
Status: 200 "OK"
Disable Account Personal Drives
Disables personal drives of a Frame account and returns the pending task.
POST /accounts/:id/disable_personal_drives
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | ID of the Org the account will be created under | URL | String | True |
| do_backup | Boolean which determines whether new backups of existing enterprise profiles should be created | Data | Boolean | False |
| delete_all_backups | Boolean which determines whether existing backups should be deleted | Data | Boolean | False |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/disable_personal_drives"
--data-raw '{
"do_backup": false,
"delete_all_backups": false
}'
Response Example
{
"account_id": "6b9a8c85-dd5b-4c1c-9bf2-ca1ba8e537b7",
"customer_id": "XXXXXXXX-5ab2-47ef-9f9c-XXXXXXXXXXX",
"display_name": "Publishing Sandbox to Production",
"duration_sec": null,
"external_resource_id": null,
"finished_at": null,
"id": "c454d6da-fa30-4dc4-a533-6af2286d1754",
"inserted_at": "2021-09-29T19:30:57.708442Z",
"kind": "disable_enterprise_profiles",
"organization_id": "2fb210e0-e931-4c62-83fd-b31fe13468ca",
"pool_id": null,
"progress_info": null,
"result_info": null,
"stage": "not_started",
"started_by": {
"email": "976bcbc7-945a-4511-b1ca-2a3f60e3cade.img.frame.nutanix.com_third-party-api",
"first_name": "X",
"id": "a4da51c5-1c74-45e6-b1ca-2ec739d528d2",
"identity_provider": "third-party-api",
"last_name": "X"
},
"updated_at": "2021-09-29T19:30:57.708442Z"
}
Status: 200 "OK"
Update Account Domain Join Settings
Updates domain join settings of a Frame account and returns pending task.
POST /accounts/:id/update_domain_join_settings
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | ID of the Org the account will be created under | URL | String | True |
| domain_name | Domain name | Data | String | False |
| service_account_name | Service account name | Data | String | False |
| service_account_password | Service account password | Data | String | False |
| target_ou | Target OU | Data | String | False |
| dns_servers | DNS servers | Data | String | False |
| logout_local_user | Boolean which determines whether local user should be logged out | Data | Boolean | False |
| domain_controller_ip | Domain controller IP | Data | String | False |
| promote_user_to_local_admin | Boolean which determines whether user should be promoted to local admin | Data | Boolean | False |
| machine_name_prefix | Machine name prefix | Data | String | False |
| sso_passthrough_enabled | Boolean which determines whether SSO Passthrough is enabled | Data | Boolean | False |
| delete_terminated_hostnames | Boolean which determines whether terminated hostnames should be deleted | Data | Boolean | False |
| ad_type | AD type | Data | String | False |
| enroll_intune | Enroll intune? | Data | Boolean | False |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/update_domain_join_settings"
--data-raw '{
"domain_name": "",
"service_account_name: "",
"service_account_password: "",
"target_ou": "",
"dns_servers": "",
"logout_local_user": false,
"domain_controller_ip": "",
"promote_user_to_local_admin": true,
"machine_name_prefix": "",
"sso_passthrough_enabled": true,
"delete_terminated_hostnames": false,
"ad_type": "",
"enroll_intune": false
}'
Response Example
{
"pending_request": {
"account_id": "6b9a8c85-dd5b-4c1c-9bf2-ca1ba8e537b7",
"customer_id": "XXXXXXXX-5ab2-47ef-9f9c-XXXXXXXXXXX",
"display_name": "Publishing Sandbox to Production",
"duration_sec": null,
"external_resource_id": null,
"finished_at": null,
"id": "c454d6da-fa30-4dc4-a533-6af2286d1754",
"inserted_at": "2021-09-29T19:30:57.708442Z",
"kind": "disable_enterprise_profiles",
"organization_id": "2fb210e0-e931-4c62-83fd-b31fe13468ca",
"pool_id": null,
"progress_info": null,
"result_info": null,
"stage": "not_started",
"started_by": {
"email": "976bcbc7-945a-4511-b1ca-2a3f60e3cade.img.frame.nutanix.com_third-party-api",
"first_name": "X",
"id": "a4da51c5-1c74-45e6-b1ca-2ec739d528d2",
"identity_provider": "third-party-api",
"last_name": "X"
},
"updated_at": "2021-09-29T19:30:57.708442Z"
}
}
Status: 200 "OK"
Update Account General Settings
Updates general settings of a Frame account.
POST /accounts/:id/update_general_settings
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | ID of the Org the account will be created under | URL | String | True |
| is_terminal_banner_enabled | Boolean which determines whether terminal banner is enabled | Data | Boolean | True |
| terminal_banner_settings | A JSON object with string values "background_color", "color" and "message" | Data | JSON | False |
| is_login_banner_enabled | Boolean which determines whether login banner is enabled | Data | Boolean | True |
| login_banner_settings | A JSON object with string values "title" and "message" | Data | JSON | False |
| is_light_publish_enabled | Boolean which determines whether light publish is enabled | Data | Boolean | True |
| light_publish_settings | A JSON object with integer value "threshold" | Data | JSON | False |
| host_name_prefix | Host name prefix | Data | String | True |
| is_test_publish_enabled | Boolean which determines whether test publish is enabled | Data | Boolean | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/update_general_settings"
--data-raw '{
"is_terminal_banner_enabled" true,
"terminal_banner_settings": {
"background_color": "#FFFFFF",
"color": "#000000",
"message": ""
},
"is_login_banner_enabled": true,
"login_banner_settings": {
"title": "",
"message": ""
},
"is_light_publish_enabled": true,
"light_publish_settings": {
"threshold": 1
},
"host_name_prefix": "",
"is_test_publish_enabled": false
}'
Response Example
{
"is_terminal_banner_enabled" true,
"terminal_banner_settings": {
"background_color": "#FFFFFF",
"color": "#000000",
"message": ""
},
"is_login_banner_enabled": true,
"login_banner_settings": {
"title": "",
"message": ""
},
"is_light_publish_enabled": true,
"light_publish_settings": {
"threshold": 1
},
"host_name_prefix": "",
"is_test_publish_enabled": false
}
Status: 200 "OK"
Update Account Session Settings
Updates session settings of a Frame account.
POST /accounts/:id/update_session_settings
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | ID of the Org the account will be created under | URL | String | True |
| is_app_switching_enabled | Is application switching enabled? | Data | Boolean | True |
| is_microphone_enabled | Is microphone enabled? | Data | Boolean | True |
| is_camera_enabled | Is camera enabled? | Data | Boolean | False |
| is_usb_redirection_enabled | Is USB redirection enabled? | Data | Boolean | False |
| clipboard_integration | A JSON object with "is_enabled" boolean value and string value "direction" which has possible values: "local_to_remote", "remote_to_local" and "bidirectional" | Data | JSON | True |
| is_download_enabled | Is download enabled? | Data | Boolean | True |
| is_cpu_display4k_enabled | Is CPU display 4K enabled? | Data | Boolean | True |
| is_upload_enabled | Is upload enabled? | Data | Boolean | True |
| is_print_enabled | Is print enabled? | Data | Boolean | True |
| reservation_timeout_seconds | Reservation timeout in seconds | Data | Integer | True |
| user_inactivity_timeout_minutes | User inactivity timeout in minutes | Data | Integer | True |
| idle_timeout_minutes | Idle timeout in minutes | Data | Integer | True |
| max_session_duration_minutes | Max session duration in minutes | Data | Integer | True |
| session_preparation_timeout_minutes | Session preparation timeout in minutes | Data | Integer | True |
| max_bandwidth_kbps | Max bandwidth in KBPS | Data | Integer | True |
| max_frame_rate_fps | Max Frame rate in FPS | Data | Integer | True |
| max_video_bit_rate_mbps | Max video bit rate in MBPS | Data | Integer | True |
| max_audio_bit_rate_kbps | Max audio bit rate in KBPS | Data | Integer | True |
| yuv444 | Boolean which determines whether YUV444 feature is enabled | Data | Boolean | True |
| scale_video | Scale video | Data | Number | True |
| max_video_quantization | Max video quantization | Data | Integer | True |
| qos_rate_change | QOS rate change | Data | Integer | True |
| is_grayscale_enabled | Is grayscale enabled? | Data | Boolean | True |
| is_webrtc_enabled | Is webRTC enabled? | Data | Boolean | True |
| video_buffer_length_ms | Video buffer length in ms | Data | Integer | True |
| is_settings_dialog_enabled | Is settings dialog enabled? | Data | Boolean | True |
| advanced_terminal_arguments | Advanced terminal arguments | Data | String | False |
| advanced_server_arguments | Advanced server arguments | Data | String | False |
| terminal_build | Terminal Build | Data | String | False |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/update_session_settings"
--data-raw '{
"session_settings": {
"is_webrtc_enabled": false,
"advanced_server_arguments": null,
"advanced_terminal_arguments": null,
"clipboard_integration": {
"direction": "bidirectional",
"is_enabled": true
},
"idle_timeout_minutes": 60,
"is_app_switching_enabled": true,
"is_camera_enabled": false,
"is_cpu_display4k_enabled": true,
"is_download_enabled": true,
"is_grayscale_enabled": false,
"is_microphone_enabled": false,
"is_print_enabled": true,
"is_settings_dialog_enabled": true,
"is_upload_enabled": true,
"is_usb_redirection_enabled": false,
"max_audio_bit_rate_kbps": 160,
"max_bandwidth_kbps": 0,
"max_frame_rate_fps": 20,
"max_session_duration_minutes": 0,
"max_video_bit_rate_mbps": 16.0,
"max_video_quantization": 42,
"qos_rate_change": 4,
"reservation_timeout_seconds": 600,
"scale_video": 1.0,
"session_preparation_timeout_minutes": 15,
"terminal_build": "latest",
"user_inactivity_timeout_minutes": 10,
"video_buffer_length_ms": 0,
"yuv444": false
}
}'
Response Example
{
"is_webrtc_enabled": false,
"advanced_server_arguments": null,
"advanced_terminal_arguments": null,
"clipboard_integration": {
"direction": "bidirectional",
"is_enabled": true
},
"idle_timeout_minutes": 60,
"is_app_switching_enabled": true,
"is_camera_enabled": false,
"is_cpu_display4k_enabled": true,
"is_download_enabled": true,
"is_grayscale_enabled": false,
"is_microphone_enabled": false,
"is_print_enabled": true,
"is_settings_dialog_enabled": true,
"is_upload_enabled": true,
"is_usb_redirection_enabled": false,
"max_audio_bit_rate_kbps": 160,
"max_bandwidth_kbps": 0,
"max_frame_rate_fps": 20,
"max_session_duration_minutes": 0,
"max_video_bit_rate_mbps": 16.0,
"max_video_quantization": 42,
"qos_rate_change": 4,
"reservation_timeout_seconds": 600,
"scale_video": 1.0,
"session_preparation_timeout_minutes": 15,
"terminal_build": "latest",
"user_inactivity_timeout_minutes": 10,
"video_buffer_length_ms": 0,
"yuv444": false
}
Status: 200 "OK"
Publish a Sandbox
Starts the publish action for an account's Sandbox and returns the task ID.
POST /accounts/:account_id/publish
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/publish"
Response Example
{
"account": {
"active": true,
"description": null,
"id": "6b9a8c85-dd5b-4c1c-9bf2-ca1ba8e537b7",
"inserted_at": "2021-08-24T19:59:29.077406Z",
"kind": "frame",
"last_publish": "2021-09-22T16:25:59Z",
"name": "Example Account",
"notes": null,
"url_slug": "example-account",
"website": null
},
"pending_request": {
"account_id": "6b9a8c85-dd5b-4c1c-9bf2-ca1ba8e537b7",
"customer_id": "XXXXXXXX-5ab2-47ef-9f9c-XXXXXXXXXXX",
"display_name": "Publishing Sandbox to Production",
"duration_sec": null,
"external_resource_id": null,
"finished_at": null,
"id": "c454d6da-fa30-4dc4-a533-6af2286d1754",
"inserted_at": "2021-09-29T19:30:57.708442Z",
"kind": "publish_sandbox_to_production",
"organization_id": "2fb210e0-e931-4c62-83fd-b31fe13468ca",
"pool_id": null,
"progress_info": null,
"result_info": null,
"stage": "not_started",
"started_by": {
"email": "976bcbc7-945a-4511-b1ca-2a3f60e3cade.img.frame.nutanix.com_third-party-api",
"first_name": "X",
"id": "a4da51c5-1c74-45e6-b1ca-2ec739d528d2",
"identity_provider": "third-party-api",
"last_name": "X"
},
"updated_at": "2021-09-29T19:30:57.708442Z"
}
}
Status: 200 OK
List Publish Tasks
Lists publishing tasks for the given account ID.
GET /accounts/:account_id/publish/tasks
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/publish/tasks"
Response Example
[
{
"id": "gateway-prod.57186",
"last_change": "2021-09-08T16:10:27.790959",
"number_of_instances": 1,
"request_id": 1853969,
"status": "completed"
},
{
"id": "gateway-prod.57640",
"last_change": "2021-09-14T14:54:21.841399",
"number_of_instances": 1,
"request_id": 1882914,
"status": "completed"
},
{
"id": "gateway-prod.57651",
"last_change": "2021-09-14T16:11:07.401356",
"number_of_instances": 1,
"request_id": 1883040,
"status": "completed"
},
{
"id": "gateway-prod.58427",
"last_change": "2021-09-22T09:25:58.885327",
"number_of_instances": 1,
"request_id": 1922643,
"status": "completed"
}
]
Status: 200 OK
Get Publish Status
Returns the publishing status for a given account ID and publish request ID.
GET /accounts/:account_id/publish/:task_id
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
| task_id | Task id of a publish | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/publish/${request_id}"
Response Example
{
"status": "in_progress",
"id": "793db0f3-31f7-4cc1-8cd5-741c80407aba"
}
Status: 200 OK
Cancel Publish
Returns details of an account.
DELETE /accounts/:account_id/publish/:task_id
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
| task_id | Task id of a publish | URL | String | True |
Request Example
curl -X DELETE \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/publish/${task_id}"
Response Example
Status: 200 "OK"
List Instance Types
Returns a list of available instance types for the account specified.
GET /accounts/:account_id/instance_types
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/instance_types"
Response Example
[
{
"display_name": "Air 4GB",
"external_id": "gateway-prod.1",
"fgw_compatible": null,
"gpu": "None",
"gpu_metadata": null,
"id": "gateway-prod.1",
"name": "t2.medium",
"ram": 4,
"vcpu": 2
},
{
"display_name": "Pro 122GB",
"external_id": "gateway-prod.3",
"fgw_compatible": null,
"gpu": "1 GPU",
"gpu_metadata": null,
"id": "gateway-prod.3",
"name": "g3.4xlarge",
"ram": 122,
"vcpu": 16
}
// ... more instance types
]
Status: 200 OK
Change Instance Type for a Persistent Desktop
Changes the instance type for a Persistent Desktop
POST /accounts/:account_id/servers/:server_id/update_persistent_desktop_instance_type
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Frame Account ID | URL | string | True |
| server_id | Frame Server ID for the Persistent Desktop | URL | string | True |
| instance_type_id | Endpoint request body payload ({"instance_type_id": "gateway-prod.61616"}) |
Search Query | string | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
--data-raw '{"instance_type_id" : "gateway-prod.61616" }'
"https://api.console.nutanix.com/v1/accounts/${account_id}/servers/reboot"
Response Example
The response after updating the instance type is simply the server object that was updated successfully.
{
"active": false,
"cloud_instance_id": "i-0cc3ec91870672ab6",
"creation_time": "2022-05-12 23:22:31.047114Z",
"debug": false,
"desired_status": "stopped",
"domain_joined": false,
"external_id": "gateway-prod.61616",
"id": 61616,
"in_use": false,
"instance_type_name": "t3.xlarge",
"last_change": "2022-06-08 20:35:10.633672Z",
"launch_time": null,
"machine_name": "IF-3B1F59DDA36E",
"machine_status": null,
"maintenance": false,
"name": "Unassigned",
"pool_external_id": "gateway-prod.588775",
"pool_name": "persistent_desktop_production",
"private_ip": "10.0.5.62",
"problem": false,
"public_hostname": null,
"public_wsport": 443,
"recovery": false,
"reserved": -1,
"server_ip": null,
"server_version": "8.4.9.0",
"status": "stopped",
"upgrade_version": 0,
"user_in_session": null,
"zone": "us-east-2a"
}
Status: 200 "OK"
List Applications
Returns a list of applications for the account specified.
GET /accounts/:account_id/applications
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/applications"
Response Example
[
{
"working_directory": null,
"path": "C:\\Program Files\\Frame\\FrameExplorer\\FrameExplorer.exe",
"name": "Frame Explorer",
"is_updated": false,
"is_published": true,
"is_deleted": false,
"id": "909b74cc-d207-47ed-bd25-2b8088c36912",
"icon_url": "https://next-cpanel-dev.s3.amazonaws.com/images/apps/frame_explorer.png",
"arguments": null
},
{
"working_directory": null,
"path": "C:\\Program Files(x86)\\Google\\Chrome\\Application\\chrome.exe",
"name": "Google Chrome",
"is_updated": false,
"is_published": true,
"is_deleted": false,
"id": "e288cac6-87c6-4dcf-bd19-5287f571e774",
"icon_url": "https://next-cpanel-dev.s3.amazonaws.com/images/apps/google_chrome.png",
"arguments": null
},
{
"working_directory": null,
"path": "C:\\Windows\\system32\\notepad.exe",
"name": "Notepad",
"is_updated": false,
"is_published": true,
"is_deleted": false,
"id": "547e2eeb-7d6c-4ec8-976e-d0677f23322b",
"icon_url": "https://next-cpanel-dev.s3.amazonaws.com/images/apps/notepad.png",
"arguments": null
}
// ... more onboarded applications
]
Status: 200 OK
List Session Reports
Returns a list of generated session reports.
GET /accounts/:account_id/session_reports
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/session_reports"
Response Example
[
{
"year": 2018,
"url": "https://s3-datest.dev.fra.me/datest-session-reports/datest/9rnKxGPdbozby6YA.2018.7.4311c.31.csv.zip?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=900&X-Amz-Credential=QazWsxEdc777%2F20180724%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-SignedHeaders=host&X-Amz-Date=20180724T101921Z&X-Amz-Signature=b77249805c20ddd45d2c38ffed5af6284ee34c57defb33f46911c10ace82dccf",
"month": 7
}
]
Status: 200 OK
List Active Sessions
Returns a list of active sessions for all pools on a specified account.
GET /accounts/:account_id/active_sessions
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/active_sessions"
Response Example
[
{
"fail_description": null,
"id": "gateway-prod.oRXVPyy0rklPJrwG",
"is_https_connection": true,
"location_city": "Morgan Hill",
"location_country": "US",
"location_distance": 288.4650445335911,
"pool_id": "gateway-prod.535675",
"server_address": "prod-34-94-1-114.nutanixframe.com",
"server_ws_port": "443",
"start_time": 1632949455,
"state": "open",
"storages": [],
"user": {
"email": "jason.thompson@nutanix.com",
"first_name": "Jason",
"identity_provider": "example-idp-name",
"last_name": "Thompson"
},
"user_uuid": "52b19f2e-c8ae-4f12-beab-f2838ce8dce9"
}
]
Status: 200 OK
List Recent Sessions
Returns a list of sessions for a given period of time.
GET /accounts/:account_id/recent_sessions
Request Parameters
| Parameter Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | string | True |
| from_date | The beginning date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | True |
| to_date | The ending date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/recent_sessions?from_date=2021-12-01T23:20:58.128Z&to_date=2021-12-25T23:20:58.128Z"
Response Example
[
{
"end_time": "2021-09-14T16:51:14.858774Z",
"fail_description": null,
"hash_id": "LjpnejZqv1Ve7ak5",
"id": "gateway-prod.LjpnejZqv1Ve7ak5",
"location": {
"city": "Morgan Hill",
"client_ip": "123.32.145.255",
"county": null,
"distance": 288.4650445335911
},
"pool_id": "gateway-prod.535675",
"server": {
"address": null,
"https": true,
"id": "gateway-prod.5909980",
"instance_type": "e2-standard-2-Windows",
"pool_group_type": "production",
"wsport": "443"
},
"session_duration": 467,
"start_time": "2021-09-14T16:43:27.322017Z",
"state": "closed",
"timeouts": {
"connection": 120,
"idle": 600,
"max_duration": 3600
},
"user_uuid": "52b19f2e-c8ae-4f12-beab-f2838ce8dce9"
},
{
"end_time": "2021-09-14T18:01:43.079788Z",
"fail_description": null,
"hash_id": "kvg0PbwL1ggDw1Er",
"id": "gateway-prod.kvg0PbwL1ggDw1Er",
"location": {
"city": "Morgan Hill",
"client_ip": "123.32.145.255",
"county": null,
"distance": 288.4650445335911
},
"pool_id": "gateway-prod.535674",
"server": {
"address": "prod-34-94-251-72.nutanixframe.com",
"https": true,
"id": "gateway-prod.5847490",
"instance_type": "e2-standard-2-Windows",
"pool_group_type": "sandbox",
"wsport": "443"
},
"session_duration": 521,
"start_time": "2021-09-14T17:53:01.232834Z",
"state": "closed",
"timeouts": {
"connection": 120,
"idle": 600,
"max_duration": 3600
},
"user_uuid": "52b19f2e-c8ae-4f12-beab-f2838ce8dce9"
}
]
Status: 200 OK
List Session Details
Returns information regarding a specific session.
GET /accounts/:account_id/sessions/:session_id/
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Frame Account ID | URL | String | True |
| session_id | ID of a session | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${account_id}/sessions/${session_id}"
Response Example
[
[
{
"fail_description": null,
"id": "gateway-prod.oRXVPyy0rklPJrwG",
"is_https_connection": true,
"location_city": "Morgan Hill",
"location_country": "US",
"location_distance": 288.4650445335911,
"pool_id": "gateway-prod.535675",
"server_address": "prod-34-94-1-114.nutanixframe.com",
"server_ws_port": "443",
"start_time": 1632949455,
"state": "open",
"storages": [],
"user_uuid": "52b19f2e-c8ae-4f12-beab-f2838ce8dce9"
}
]
]
Status: 200 OK
List Session Trails
Returns Session Trails for the Frame Account specified.
GET /accounts/:account_id/session-trails
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Frame Account ID | URL | String | True |
| search | Filters results if the provided string matches against Server ID, Session ID, email address, and a user's full name. | Search Query | String | False |
| session_start | The beginning date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | False |
| session_end | The ending date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | False |
| instance_type | Filters Session Trails based on a specific instance type ID. | Search Query | String | False |
| pool_group_type | Filters Session Trails based on the pool group type (e.g. "sandbox", "test", "production"). | Search Query | String | False |
| pool_id | Filters Session Trails based on provided instance type's pool ID. | Search Query | String | False |
| offset | Used to specify where to start the query. Must be used in conjunction with the limit parameter. | Search Query | Integer (String) | False |
| limit | Used to specify the “page size” of the query. Must be used in conjunction with the offset parameter. | Search Query | Integer (String) | False |
| order | Specifies the order of the results. Use “asc” for ascending order, and “desc” for descending order. | Search Query | String | False |
| order_by | Specifies the field of which the ordering should occur. For example, “session_start”, “session_duration”, etc. | Search Query | String | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${account_id}/session-trails?limit=50&offset=0&order=desc&order_by=session_start"
Response Example
[
{
"account_id": "084ab7d0-e4ca-4dea-932a-45bf33f02088",
"bandwidth_kbps_avg": 15921.05,
"bandwidth_kbps_max": 16128,
"bandwidth_kbps_min": 14024,
"city": "Tehama",
"client_ip": "123.32.145.255",
"customer_id": "XXXXXXXX-5ab2-47ef-9f9c-XXXXXXXXXXX",
"distance": 2369.002238311968,
"fail_description": null,
"framerate_ps_avg": 19.74,
"framerate_ps_max": 20,
"framerate_ps_min": 10,
"id": "b970ec31-ca07-48c9-8b56-4547a7b1a9f8",
"instance_type": "t2.large",
"latency_ms_avg": 110.36,
"latency_ms_max": 132,
"latency_ms_min": 106,
"launchpad_id": "19ca2393-ac2e-4497-939e-757f02c18654",
"organization_id": "2fb210e0-e931-4c62-83fd-b31fe13468ca",
"pool_group_type": "sandbox",
"pool_id": "d54b760c-956a-487b-a675-e113677fe871",
"pool_instance_type": {
"bare_metal": null,
"cpu": null,
"display_name": "Air 8GB",
"fgw_compatible": null,
"gpu": "None",
"id": "gateway-prod.5",
"name": "t2.large",
"ram": 8,
"vcpu": 2
},
"server_id": "gateway-prod.5232637",
"session_duration": 2391,
"session_end": "2021-02-25T23:17:27.000000Z",
"session_id": "gateway-prod.nMOARz25k9LDmGN0",
"session_start": "2021-02-25T23:15:56.000000Z",
"time_to_start": 7,
"user_email": "example.user@company.com",
"user_first_name": "Example",
"user_id": "52b19f2e-c8ae-4f12-beab-f2838ce8dce9",
"user_idp": "example-idp",
"user_last_name": "User"
}
// ... more sessions
]
Status: 200 OK
List Audit Trails
Returns Audit Trails for an account, constrained by a date range and a number of ways to filter & search for granular queries.
GET accounts/:account_id/audit-trails
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Frame Account ID | URL | String | True |
| search | Filters results if the provided string matches against a user's full name, email, idp, or the Audit Trail kind. | Search Query | String | False |
| kind | Filters Audit Trails by wildcard matching against the supplied string. For example, a kind of “launchpad” will return Audit Trails for both createLaunchpad and updateLaunchpad actions. | Search Query | String | False |
| from_date | The beginning date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | False |
| to_date | The ending date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | False |
| offset | Used to specify where to start a Audit Trails query. Must be used in conjunction with the limit parameter. | Search Query | Integer (String) | False |
| limit | Used to specify the “page size” of the Audit Trails query. Must be used in conjunction with the offset parameter. | Search Query | Integer (String) | False |
| order | Specifies the order of the results. Use “asc” for ascending order, and “desc” for descending order. | Search Query | String | False |
| order_by | Specifies the field of which the ordering should occur. For example, “session_start”, “session_duration”, etc. | Search Query | String | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${account_id}/audit-trails?search=jason.thompson@nutanix.com&kind=launchpad"
Response Example
[
{
"id": "7c3dee57-5a7b-4232-a55d-7d5b8e5f595b",
"user_first_name": "Jason",
"user_last_name": "Thompson",
"user_idp": "example-idp-name",
"user_email": "jason.thompson@nutanix.com",
"kind": "updateLaunchpad",
"account_id": "b00636bf-4f08-404e-a7ba-3c2aaa173335",
"organization_id": "86bcea89-389f-496a-3c75-1df0ce8d96ca",
"customer_id": "XXXXXXXX-5ab2-47ef-9f9c-XXXXXXXXXXX",
"inserted_at": "2021-10-15T20:49:13.377350Z"
},
{
"id": "4f62a8e4-1ac7-430b-9f4f-96fa77ff24f5",
"user_first_name": "Jason",
"user_last_name": "Thompson",
"user_idp": "example-idp-name",
"user_email": "jason.thompson@nutanix.com",
"kind": "createLaunchpad",
"account_id": "b00636bf-4f08-404e-a7ba-3c2aaa173335",
"organization_id": "86bcea89-389f-496a-3c75-1df0ce8d96ca",
"customer_id": "XXXXXXXX-5ab2-47ef-9f9c-XXXXXXXXXXX",
"inserted_at": "2021-10-15T20:49:09.833114Z"
}
// ... more Audit Trails
]
Status: 200 OK
Start a Session
Starts a headless/clientless session. Use this endpoint to start a session without a browser or FrameApp. This is typically used for automation and custom workflows (Sandbox installers, CI/CD automations, etc).
Please note that you can use either a token or signed HTTP headers for authentication with this endpoint.
If you use a token for authentication, you will be able to modify metadata for the session (email, first name, last name, etc).
If you use a token, use the header "Authorization: Bearer token" instead of the signed headers.
Also note, if you use the signed HTTP headers (Instead of the token), the first and last name will show up as "X" in the audit logs respectively. Additionaly, your email address will reflect the API provider with a very cryptic looking address.
POST /sessions/start
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| terminal_configuration_id | The desired Launchpad Terminal Configuration ID | Search Query | String | True |
| options | JSON object with multiple options to choose from (All optional) { "user_data": "string", "touch": true }user_data passes a string into the remote Windows environment variable FRAME_USER_DATAtouch: if true enables touch controls to the session (Touch displays) |
Search Query | String | False |
Request Example
curl -X POST \
-H "Authorization: Bearer ${token}" \
"https://api.console.nutanix.com/v1/sessions/start" \
--data-raw '{
"options": {
"user_data" : "Any string",
"touch" : "false"
}
}'
Response Example
{
"account_id": "57fa46fc-eda7-484e-b2ec-cc7032c1811a",
"close_reason_code": "",
"fail_description": "",
"id": "gateway-prod.LjpnejWlw0yP7ak5",
"is_https_connection": "true",
"location_city": "Oxon Hill",
"location_country": "US",
"location_distance": "331.3852962263057",
"protocol": "webrtc",
"server_address": "",
"server_ws_port": "",
"signaling_server_url": "wss://messaging.console.nutanix.com/socket/websocket",
"sso_passthrough_public_key": "",
"start_time_utc_date_time": "2023-03-28T19:15:30.598820Z",
"state": "init",
"stun_server_url": "stun:stun.console.nutanix.com",
"turn_server_url": ""
}
Status: 200 "OK"
Stop a Session
Stops the specified session.
DELETE /accounts/:account_id/sessions/:session_id
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Frame Account ID | URL | String | True |
| session_id | ID of a session | URL | String | True |
Request Example
curl -X DELETE \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${account_id}/sessions/${session_id}"
Response Example
{
"fail_description": null,
"id": "gateway-prod.GykYPnBAvMxPldOW",
"is_https_connection": true,
"location_city": "Redding",
"location_country": "US",
"location_distance": 127.65657296078405,
"pool_id": "gateway-prod.557068",
"server_address": "prod-13-xx-xxx-97.nutanixframe.com",
"server_ws_port": "443",
"session_token": null,
"start_time": 1634330027,
"state": "closing",
"storages": [],
"user_uuid": "84c661ab-60ba-43e0-b7bd-3fa33d49ce05"
}
Status: 200 "OK"
Get Sandbox Status
Returns the status of a Sandbox pool on a specified account.
GET /accounts/:account_id/sandbox/status
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/sandbox/status"
Response Example
{
"active_servers": 1,
"active_sessions": 0,
"available_servers": 1,
"buffer_servers": 0,
"max_servers": 1,
"max_users": 0,
"min_servers": 0,
"pool_id": "2d176f51-175d-4b70-8be3-57e67ad84909",
"running_servers": 1,
"status": "running_server_available",
"total_running_servers": 1,
"total_servers": 1
}
Status: 200 "OK"
Start a Sandbox
Starts the Sandbox server on a specified account.
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
POST /accounts/:account_id/sandbox/start
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/sandbox/start"
Response Example
{
"account_id": "6b9a8c85-dd5b-4c1c-9bf2-ca1ba8e537b7",
"customer_id": "XXXXXXXX-5ab2-47ef-9f9c-XXXXXXXXXXX",
"display_name": "Powering on",
"duration_sec": null,
"external_resource_id": null,
"finished_at": null,
"id": "291f6621-431d-425b-9edc-15a9b7aa335b",
"inserted_at": "2021-09-30T17:10:49.867508Z",
"kind": "power_on",
"organization_id": "2fb210e0-e931-4c62-83fd-b31fe13468ca",
"pool_id": "2d176f51-175d-4b70-8be3-57e67ad84909",
"progress_info": null,
"result_info": null,
"stage": "not_started",
"started_by": {
"email": "976bcbc7-945a-4511-b1ca-2a3f60e3cade.img.frame.nutanix.com_third-party-api",
"first_name": "X",
"id": "a4da51c5-1c74-45e6-b1ca-2ec739d528d2",
"identity_provider": "third-party-api",
"last_name": "X"
},
"updated_at": "2021-09-30T17:10:49.867508Z"
}
Status: 200 OK
Reboot a Sandbox
Reboots a Sandbox server on a specified account.
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
POST /accounts/:account_id/sandbox/reboot
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/sandbox/reboot"
Response Example
{
"account_id": "6b9a8c85-dd5b-4c1c-9bf2-ca1ba8e537b7",
"customer_id": "XXXXXXXX-5ab2-47ef-9f9c-XXXXXXXXXXX",
"display_name": "Rebooting",
"duration_sec": null,
"external_resource_id": null,
"finished_at": null,
"id": "291f6621-431d-425b-9edc-15a9b7aa335b",
"inserted_at": "2021-09-30T17:10:49.867508Z",
"kind": "power_on",
"organization_id": "2fb210e0-e931-4c62-83fd-b31fe13468ca",
"pool_id": "2d176f51-175d-4b70-8be3-57e67ad84909",
"progress_info": null,
"result_info": null,
"stage": "not_started",
"started_by": {
"email": "976bcbc7-945a-4511-b1ca-2a3f60e3cade.img.frame.nutanix.com_third-party-api",
"first_name": "X",
"id": "a4da51c5-1c74-45e6-b1ca-2ec739d528d2",
"identity_provider": "third-party-api",
"last_name": "X"
},
"updated_at": "2021-09-30T17:10:49.867508Z"
}
Status: 200 OK
Stop a Sandbox
Stops the Sandbox server on specified account.
POST /accounts/:account_id/sandbox/stop
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/sandbox/stop"
Response Example
{}
Status: 202 "Accepted"
List Pools for an Account{#list-pools}
GET /accounts/:account_id/pools
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID. | URL | string | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${account_id}/pools"
Response Example
[
{
"disk_size": 50,
"external_id": "gateway-prod.535675",
"id": "4256364f-80af-4abd-9292-741211acf27d",
"image_family": "GoogleWindows2016",
"instance_type": "e2-standard-2-Windows",
"kind": "production",
"name": "Air 8GB (E2)"
},
{
"disk_size": 50,
"external_id": "gateway-prod.551557",
"id": "fc0cc851-0d33-4517-9e67-f6205c762261",
"image_family": "GoogleWindows2016",
"instance_type": "custom-2-4096-Windows",
"kind": "production",
"name": "Air 4GB"
}
]
Status: 200 "OK"
List Account's Overall Capacity Settings
Returns the current min, buffer, and max values configured for all pools/instance types in an account.
GET /accounts/:account_id/elasticity
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${account_id}/elasticity"
Response Example
{
"min_servers": 75,
"buffer_servers": 20,
"max_servers": 475
}
Status: 200 "OK"
List Persistent Desktop Capacity Settings
Returns the current Persistent Desktop capacity settings for an account.
This includes values for number_of_backups_to_save, max_users, and
keep_instances_running_for_new_users.
GET /accounts/:persistent_account_id/persistent_desktop_elasticity_settings
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| persistent_account_id | Frame Account ID (must be a persistent). | URL | string | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${persistent_account_id}/persistent_desktop_elasticity_settings"
Response Example
{
"keep_instances_running_for_new_users": false,
"max_users": 10,
"number_of_backups_to_save": 1
}
Status: 200 "OK"
List Persistent Desktop Backups for an Account
Returns a list of the Backups for Persistent Desktops in an account.
GET /accounts/:persistent_account_id/persistent_desktop_backups
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| persistent_account_id | Frame Account ID (must be a persistent). | URL | string | True |
| offset | Used to specify where to start the query from the results (Used for pagination). Must be in conjunction with the limit parameter. | Search Query | Integer (String) | False |
| limit | Used to specify the "page size" of the query. Must be used in conjunction with the offset parameter | Search Query | Integer (String) | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${persistent_account_id}/persistent_desktop_backups"
Response Example
{
"current_disk_size": 60.0,
"free_disk_space": 37.198338,
"id": "gateway-prod.7705597",
"last_used_time": "2023-04-06T16:15:02.055502",
"name": "Persistent desktop - David Example - david.example@nutanix.com",
"pool_id": "091c6494-b7ef-4c7c-9c5f-bdc611b0d66e",
"session_id": null,
"status": "available",
"user_uuid": "b87c7870-efb7-4539-a7d3-91725ba84fea"
}
Status: 200 "OK"
List Persistent Desktops in an Account
Returns a list of the Persistent Desktops in an account.
GET /accounts/:persistent_account_id/persistent_desktop_servers
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| persistent_account_id | Frame Account ID (must be a persistent). | URL | string | True |
| offset | Used to specify where to start the query from the results (Used for pagination). Must be in conjunction with the limit parameter. | Search Query | Integer (String) | False |
| limit | Used to specify the "page size" of the query. Must be used in conjunction with the offset parameter | Search Query | Integer (String) | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${persistent_account_id}/persistent_desktop_servers"
Response Example
{
"current_disk_size": 60.0,
"free_disk_space": 37.198338,
"id": "gateway-prod.7705597",
"last_used_time": "2023-04-06T16:15:02.055502",
"name": "Persistent desktop - David Example - david.example@nutanix.com",
"pool_id": "091c6494-b7ef-4c7c-9c5f-bdc611b0d66e",
"session_id": null,
"status": "available",
"user_uuid": "b87c7870-efb7-4539-a7d3-91725ba84fea"
}
Status: 200 "OK"
List Logged In Users
Lists all previously logged in users for an account (And the associated IDP).
GET /accounts/:account_id/logged_in_users
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Frame Account ID | URL | string | True |
| offset | Used to specify where to start the query from the results (Used for pagination). Must be in conjunction with the limit parameter. | Search Query | Integer (String) | False |
| limit | Used to specify the "page size" of the query. Must be used in conjunction with the offset parameter | Search Query | Integer (String) | False |
| search | Used to search/filter for specific results from the returned list of logged in users | Search Query | String | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${account_id}/logged_in_users"
Response Example
[
{
"idp": "frame-password",
"id": "e69e7f7c-83fd-461f-8387-13dbcef87a53",
"email": "john.doe@example.net"
}
]
Status: 200 "OK"
Unassign Persistent Desktop
Unassigns the user from their assigned Persistent Desktop server. This allows the administrator to assign that Persistent Desktop server to another user (or terminate the server).
POST /accounts/:persistent_account_id/servers/:server_external_id/unassign
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| persistent_account_id | Frame Account ID (must be a persistent). | URL | string | True |
| server_external_id | Frame "external" server ID (found by querying account servers). | URL | string | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${persistent_account_id}/servers/${persistent_server_id}/unassign"
Response Example
{
"active": false,
"cloud_instance_id": "i-0cc3ec91870672ab6",
"creation_time": "2022-05-12 23:22:31.047114Z",
"debug": false,
"desired_status": "stopped",
"domain_joined": false,
"external_id": "gateway-prod.6810382",
"id": 6810382,
"in_use": false,
"instance_type_name": "t3.xlarge",
"last_change": "2022-06-08 20:35:10.633672Z",
"launch_time": null,
"machine_name": "IF-3B1F59DDA36E",
"machine_status": null,
"maintenance": false,
"name": "Unassigned",
"pool_external_id": "gateway-prod.588775",
"pool_name": "persistent_desktop_production",
"private_ip": "10.0.5.62",
"problem": false,
"public_hostname": null,
"public_wsport": 443,
"recovery": false,
"reserved": -1,
"server_ip": null,
"server_version": "8.4.9.0",
"status": "stopped",
"upgrade_version": 0,
"user_in_session": null,
"zone": "us-east-2a"
}
Status: 200 "OK"
Reassign Persistent Desktop
Reassigns a user to a particular Persistent Desktop server. Please note that the Persistent Desktop server should already be unassigned.
POST /accounts/:persistent_account_id/servers/:server_external_id/reassign
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| persistent_account_id | Frame Account ID (must be a persistent). | URL | string | True |
| server_external_id | Frame "external" server ID (found by querying account servers). | URL | string | True |
| user_uuid | Frame User's UUID (found by querying logged_in_users) | URL | string | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${persistent_account_id}/servers/${persistent_server_id}/reassign"
Response Example
{
"zone": "us-east-2a",
"user_in_session": {
"last_name": "Doe",
"identity_provider": "string",
"first_name": "John",
"email": "john.doe@example.net"
},
"upgrade_version": 0,
"status": "stopped",
"server_version": "8.4.9.0",
"server_ip": null,
"reserved": 0,
"recovery": true,
"public_wsport": 0,
"public_hostname": null,
"problem": true,
"private_ip": "10.0.5.62",
"pool_name": "persistent_desktop_production",
"pool_external_id": "gateway-prod.588775",
"name": "Unassigned",
"maintenance": true,
"machine_status": null,
"machine_name": "IF-3B1F59DDA36E",
"launch_time": null,
"last_change": "2022-05-12 23:22:31.047114Z",
"instance_type_name": "t3.xlarge",
"in_use": true,
"id": 6810382,
"external_id": "gateway-prod.6810382",
"domain_joined": true,
"desired_status": "stopped",
"debug": true,
"creation_time": "2022-05-12 23:22:31.047114Z""string",
"cloud_instance_id": "i-0cc3ec91870672ab6",
"active": true
}
Status: 200 "OK"
Reboot a Server
Reboots the specified server.
POST /accounts/:account_id/servers/reboot
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| server_id | Frame Server ID. | URL | string | True |
| account_server_reboot | Server reboot payload ({"force": false}) |
Search Query | string | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
--data-raw '{
"id" : "server_id",
"account_server_reboot": {
"force" : "false"
}
}'
"https://api.console.nutanix.com/v1/accounts/${account_id}/servers/reboot"
Response Example
The response after rebooting a server is simply the server object that was rebooted successfully.
{
"active": false,
"cloud_instance_id": "i-0cc3ec91870672ab6",
"creation_time": "2022-05-12 23:22:31.047114Z",
"debug": false,
"desired_status": "stopped",
"domain_joined": false,
"external_id": "gateway-prod.6810382",
"id": 6810382,
"in_use": false,
"instance_type_name": "t3.xlarge",
"last_change": "2022-06-08 20:35:10.633672Z",
"launch_time": null,
"machine_name": "IF-3B1F59DDA36E",
"machine_status": null,
"maintenance": false,
"name": "Unassigned",
"pool_external_id": "gateway-prod.588775",
"pool_name": "persistent_desktop_production",
"private_ip": "10.0.5.62",
"problem": false,
"public_hostname": null,
"public_wsport": 443,
"recovery": false,
"reserved": -1,
"server_ip": null,
"server_version": "8.4.9.0",
"status": "stopped",
"upgrade_version": 0,
"user_in_session": null,
"zone": "us-east-2a"
}
Status: 200 "OK"
Start a Server
Starts the specified server.
POST /accounts/:account_id/servers/:server_id/start
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Frame Account ID. | URL | string | True |
| server_external_id | Server External ID. | URL | string | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
--data-raw '{
"account_server_stop": {
"force" : "false"
}
}'
"https://api.console.nutanix.com/v1/accounts/${account_id}/servers/${server_id}/start"
Response Example
The response after starting a server is simply the server object that was started successfully.
{
"active": false,
"cloud_instance_id": "i-0cc3ec91870672ab6",
"creation_time": "2022-05-12 23:22:31.047114Z",
"debug": false,
"desired_status": "stopped",
"domain_joined": false,
"external_id": "gateway-prod.6810382",
"id": 6810382,
"in_use": false,
"instance_type_name": "t3.xlarge",
"last_change": "2022-06-08 20:35:10.633672Z",
"launch_time": null,
"machine_name": "IF-3B1F59DDA36E",
"machine_status": null,
"maintenance": false,
"name": "Unassigned",
"pool_external_id": "gateway-prod.588775",
"pool_name": "persistent_desktop_production",
"private_ip": "10.0.5.62",
"problem": false,
"public_hostname": null,
"public_wsport": 443,
"recovery": false,
"reserved": -1,
"server_ip": null,
"server_version": "8.4.9.0",
"status": "stopped",
"upgrade_version": 0,
"user_in_session": null,
"zone": "us-east-2a"
}
Status: 200 "OK"
Stop a Server
Shuts down the specified server.
POST /accounts/:account_id/servers/:server_id/stop
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Frame Account ID. | URL | string | True |
| server_external_id | Server External ID. | URL | string | True |
| account_server_stop | Server stop payload ({ "force": false}) |
Search Query | string | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
--data-raw '{
"account_server_stop": {
"force" : "false"
}
}'
"https://api.console.nutanix.com/v1/accounts/${account_id}/servers/${server_id}/stop"
Response Example
The response after stopping a server is simply the server object that was stopped successfully.
{
"active": false,
"cloud_instance_id": "i-0cc3ec91870672ab6",
"creation_time": "2022-05-12 23:22:31.047114Z",
"debug": false,
"desired_status": "stopped",
"domain_joined": false,
"external_id": "gateway-prod.6810382",
"id": 6810382,
"in_use": false,
"instance_type_name": "t3.xlarge",
"last_change": "2022-06-08 20:35:10.633672Z",
"launch_time": null,
"machine_name": "IF-3B1F59DDA36E",
"machine_status": null,
"maintenance": false,
"name": "Unassigned",
"pool_external_id": "gateway-prod.588775",
"pool_name": "persistent_desktop_production",
"private_ip": "10.0.5.62",
"problem": false,
"public_hostname": null,
"public_wsport": 443,
"recovery": false,
"reserved": -1,
"server_ip": null,
"server_version": "8.4.9.0",
"status": "stopped",
"upgrade_version": 0,
"user_in_session": null,
"zone": "us-east-2a"
}
Status: 200 "OK"
Terminate Server
Terminates the specified server.
POST /accounts/:persistent_account_id/servers/:server_external_id/terminate
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Frame Account ID. | URL | string | True |
| server_external_id | Frame "external" server ID (found by querying account servers). | URL | string | True |
| force | If set to true, the server will be terminated immediately. If set to false, it will terminate as soon as it's available. | Search Query | boolean | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${persistent_account_id}/servers/${server_id}/terminate?force=false"
Response Example
The response after terminating a server is simply the server object that was terminated successfully.
{
"active": false,
"cloud_instance_id": "i-0cc3ec91870672ab6",
"creation_time": "2022-05-12 23:22:31.047114Z",
"debug": false,
"desired_status": "stopped",
"domain_joined": false,
"external_id": "gateway-prod.6810382",
"id": 6810382,
"in_use": false,
"instance_type_name": "t3.xlarge",
"last_change": "2022-06-08 20:35:10.633672Z",
"launch_time": null,
"machine_name": "IF-3B1F59DDA36E",
"machine_status": null,
"maintenance": false,
"name": "Unassigned",
"pool_external_id": "gateway-prod.588775",
"pool_name": "persistent_desktop_production",
"private_ip": "10.0.5.62",
"problem": false,
"public_hostname": null,
"public_wsport": 443,
"recovery": false,
"reserved": -1,
"server_ip": null,
"server_version": "8.4.9.0",
"status": "stopped",
"upgrade_version": 0,
"user_in_session": null,
"zone": "us-east-2a"
}
Status: 200 "OK"
List Pool Capacity Settings
Returns the current min, buffer, and max values configured for a specific pool.
GET /pools/:pool_id/elasticity_settings
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| pool_id | ID of the Instance Type/pool you're getting settings for. | URL | string | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/pools/${pool_id}/elasticity_settings"
Response Example
{
"min_servers": 15,
"buffer_servers": 2,
"max_servers": 100
}
Status: 200 "OK"
Set Pool Capacity Settings
Sets new min, buffer, or max values for a specific pool. Frame immediately sets new values and orchestrates workloads to match these settings. You can the status of this operation using the returned task ID.
Please allow these tasks to complete ("DONE" status) before making another request for the same pool.
POST /pools/:pool_id/elasticity_settings
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| pool_id | ID of the specific pool you'd like to set capacity settings for | URL | String | True |
| min_servers | Minimum servers value for a pool | Form Data | String | False |
| buffer_servers | Buffer servers value for a pool | Form Data | String | False |
| max_servers | Maximum server capacity value for a pool | Form Data | String | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/pools/${pool_id}/elasticity_settings" \
-F min_servers=5 \
-F buffer_servers=0 \
-F max_servers=80 \
Response Example
{
"account_id": "XXXXXXXX-09cf-44d9-a386-XXXXXXXXXXX",
"customer_id": "XXXXXXXX-5ab2-47df-9f9c-XXXXXXXXXXX",
"display_name": "Updating elasticity for Air 4GB",
"duration_sec": null,
"external_resource_id": null,
"finished_at": null,
"id": "0bf720c4-7729-48aa-95a8-470211aea40f",
"inserted_at": "2021-08-05T17:50:32.106790Z",
"kind": "update_pool_elasticity_settings",
"organization_id": "82ccea89-389f-496a-9c75-XXXXXXXXXXX",
"pool_id": "cd5e4467-3f20-49eb-803b-9514eeab7711",
"progress_info": null,
"result_info": null,
"stage": "not_started",
"started_by": {
"email": "XXXXXXXXXXX.img.frame.nutanix.com_third-party-api",
"first_name": "X",
"id": "XXXXXXXX-2f74-4dad-8e55-XXXXXXXXXXX",
"identity_provider": "third-party-api",
"last_name": "X"
},
"updated_at": "2021-08-05T17:50:32.106790Z"
}
Status: 200 "OK"
Set Persistent Desktop Capacity Settings
Sets the current Persistent Desktop capacity settings for an account.
This includes values for number_of_backups_to_save, max_users, and
keep_instances_running_for_new_users.
Please allow these tasks to complete ("DONE" status) before making sending more capacity change requests.
POST /accounts/:persistent_account_id/persistent_desktop_elasticity_settings
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| persistent_account_id | ID of your persistent Frame account. | URL | String | True |
| number_of_backups_to_save | Like it says, this value determines the number of persistent desktop backups to save for recovery. | Form Data | String | False |
| max_users | This value is the maximum amount of persistent desktops you'd like to provision. Be mindful when lowering this value below the current number of assigned persistent desktops as that will result in zero unassigned persistent desktops for new users. | Form Data | String | True |
| keep_instances_running_for_new_users | If true, unassigned persistent desktops will continue running until a new user connects and assigns it. | Form Data | Boolean | True |
For more information, reference our documentation about persistent desktop capacity settings.
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${persistent_account_id}/persistent_desktop_elasticity_settings" \
-F number_of_backups_to_save=2 \
-F max_users=20 \
-F keep_instances_running_for_new_users=false \
Response Example
{
"account_id": "XXXXXXXX-d55d-4aec-98f6-XXXXXXXXXXX",
"customer_id": "XXXXXXXX-5ab2-47ef-9f9c-XXXXXXXXXXX",
"display_name": "Updating capacity for persistent desktop",
"duration_sec": null,
"external_resource_id": null,
"finished_at": null,
"id": "111e0873-08e6-4cfa-9cf0-5d60eaae1585",
"inserted_at": "2022-06-27T18:02:39.637192Z",
"kind": "update_persistent_desktop_settings",
"organization_id": "XXXXXXXX-389f-496a-9c75-XXXXXXXXXXX",
"pool_id": null,
"progress_info": null,
"result_info": null,
"stage": "not_started",
"started_by": {
"email": "XXXXXXXX-3bee-405f-8c28-XXXXXXXXXXX.img.frame.nutanix.com_third-party-api",
"first_name": "X",
"id": "XXXXXXXX-2f74-45b2-8e55-XXXXXXXXXXX",
"identity_provider": "third-party-api",
"last_name": "X"
},
"updated_at": "2022-06-27T18:02:39.637192Z"
}
Status: 200 "OK"
List Elasticity Logs
Returns logs for elasticity changes.
GET /accounts/:account_id/elasticity-logs
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Frame Account ID | URL | String | True |
| instance_type_name | Filters results based on the instance type's name. For example, if our account was hosted in AWS, we could filter by “t2.medium”, “t3.large”, etc. | Search Query | String | True |
| from_date | The beginning date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | True |
| to_date | The ending date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${account_id}/elasticity-logs?instance_type_name=t2.medium&from_date=2021-03-20T23:59:59.128Z&to_date=2022-03-15T23:59:59.128Z"
Response Example
[
{
"active_instances": 15,
"active_sessions": 0,
"buffer_instances": 0,
"max_instances": 20,
"max_setting": 20,
"min_instances": 0,
"timestamp": "2021-07-20T21:28:59.893337Z"
},
{
"active_instances": 15,
"active_sessions": 0,
"buffer_instances": 0,
"max_instances": 15,
"max_setting": 15,
"min_instances": 0,
"timestamp": "2021-07-20T22:16:31.521437Z"
},
{
"active_instances": 80,
"active_sessions": 0,
"buffer_instances": 0,
"max_instances": 80,
"max_setting": 80,
"min_instances": 65,
"timestamp": "2021-08-05T18:47:08.435230Z"
},
{
"active_instances": 100,
"active_sessions": 0,
"buffer_instances": 0,
"max_instances": 100,
"max_setting": 100,
"min_instances": 75,
"timestamp": "2021-09-30T18:53:56.513631Z"
}
]
Status: 200 "OK"
List Account Roles
Returns an array of available roles and the associated permissions to an account
GET /accounts/:account_id/roles
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Nutanix Account ID | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${account_id}/roles"
Response Example
[
{
"applicable_on": "account",
"category": null,
"description": null,
"id": "c1aad088-50c2-45ab-aca2-8261d9982d14",
"name": "Account Administrator",
"permissions": [
"cpanel_mutation_update_application_on_publish",
"cpanel_account_data_center",
"cpanel_account_analytics",
"cpanel_mutation_revoke_user_invitation",
"cpanel_launchpad_session_settings"
// ... More role permissions
]
}
]
Status: 200 "OK"
List Account User Activity
Returns basic user “activity” information for the specified Account constrained by a date range. You'll receive a total count of user activities, as well as a unique count of users for the given time period. Can be ordered by passing a string parameter as well as exclude specified user Identity Provider Ids.
GET /accounts/:account_id/user_activities
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Frame Account ID | URL | String | True |
| from_date | The beginning date range for the query. | Search Query | YYYY-MM-DD Date string | True |
| to_date | The ending date range for the query. | Search Query | YYYY-MM-DD Date string | True |
| order | Specifies the order of the results. Use “asc” for ascending order, and “desc” for descending order. | Search Query | String | False |
| order_by | Specifies the field of which the ordering should occur. For example, “session_start”, “session_duration”, etc. | Search Query | String | False |
| skip_user_idps[] | User Identity Providers to skip. | Search Query | Array (String) | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${account_id}/user_activities?from_date=${from_date}&to_date=${to_date}&skip_user_idps[]=example-okta-admins&skip_user_idps[]=example-okta-dev"
Response Example
{
"data": [
{
"access_date": "2022-02-01",
"access_datetime": "2022-02-01T21:11:00.398870Z",
"account_id": "0e52b11b-23bf-411e-a070-bc0ea014cbc2",
"customer_id": "6ba31e38-1735-4274-a58e-6fb8c662e425",
"organization_id": "bc24563d-375b-49fb-8f15-1682b8bc6deb",
"user_email": "dontcallme.shirley@example.com",
"user_first_name": "Shirley",
"user_id": "20acd3a2-b455-4dca-b22b-520e16079e11",
"user_idp": "example-okta-workforce",
"user_last_name": "Dontcallme"
}
// ... more User Activities
],
"total": 66866,
"total_unique": 8133
}
Status: 200 "OK"
List Servers for an Account{#list-servers}
Returns all workload servers for an account.
GET /accounts/:account_id/servers
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Your Frame account ID. | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${account_id}/servers"
Response Example
[
{
"active": false,
"cloud_instance_id": "i-04198255723b27d69",
"creation_time": "2021-07-20 21:22:49.287276Z",
"debug": false,
"desired_status": "stopped",
"domain_joined": false,
"external_id": "gateway-prod.575XXXX",
"id": 575XXXX,
"in_use": false,
"instance_type_name": "t2.medium",
"last_change": "2021-08-04 21:13:57.243020Z",
"launch_time": null,
"machine_name": "IF-F89A27E05E86",
"machine_status": null,
"maintenance": false,
"name": "Lenticular Cloud Project - 575XXXX",
"pool_external_id": "gateway-prod.520XXX",
"pool_name": "sandbox",
"private_ip": "10.0.4.145",
"problem": false,
"public_hostname": null,
"public_wsport": 443,
"recovery": false,
"reserved": -1,
"server_ip": null,
"server_version": null,
"status": "stopped",
"upgrade_version": 0,
"user_in_session": null,
"zone": "us-west-1a"
},
// More servers...
]
Status: 200 "OK"
Clone a Sandbox
This endpoint will clone a Sandbox image from one account to the specified target account. The target account and source account must belong to the same Cloud Provider (e.g. clone from AWS to AWS, GCP to GCP, Azure to Azure). You can check the status of this operation using the returned task ID.
POST /accounts/:target_account_id/pools/:source_pool_id/clone
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| target_account_id | This is the target account ID | URL | String | True |
| source_pool_id | The source account's Sandbox pool ID | URL | String | True |
| join_domain | Optional. Can be true or false. Determines whether Frame should attempt to join the domain after the Sandbox has been cloned. | search Query | String | False |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/pools/${source_pool_id}/clone"
-F join_domain=false
Response Example
{
"account": {
"active": true,
"description": null,
"id": "XXXXXXXX-32ef-4ea9-a896-XXXXXXXXXXX",
"inserted_at": "2021-07-28T20:48:09.614305Z",
"kind": "frame",
"last_publish": null,
"name": "API Clone Tutorial",
"notes": null,
"url_slug": "api-clone-tutorial",
"website": null
},
"pending_request": {
"account_id": "XXXXXXXX-32ef-4ea9-a896-XXXXXXXXXXX",
"customer_id": "XXXXXXXX-5ab2-47ef-9f9c-XXXXXXXXXXX",
"display_name": "Cloning system",
"duration_sec": null,
"external_resource_id": null,
"finished_at": null,
"id": "e7e44ecb-5e8c-342d-8c23-b190b1004e31",
"inserted_at": "2021-08-05T18:17:20.692055Z",
"kind": "clone_pool",
"organization_id": "XXXXXXXX-389f-496a-9c75-XXXXXXXXXXX",
"pool_id": "cce63a88-4dad-4725-81b0-d492a6427b00",
"progress_info": null,
"result_info": null,
"stage": "not_started",
"started_by": {
"email": "XXXXXXXX-3bee-405f-8c28-XXXXXXXXXXX.img.frame.nutanix.com_third-party-api",
"first_name": "X",
"id": "XXXXXXXX-2f74-4dad-8e55-XXXXXXXXXXX",
"identity_provider": "third-party-api",
"last_name": "X"
},
"updated_at": "2021-08-05T18:17:20.692055Z"
}
}
Status: 200 "OK"
Get Task Status
Returns the current status of a provided task ID.
GET /accounts/:account_id/task/:task_id
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
| task_id | Frame Task ID | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/task/${task_id}"
Response Example
{
"account_id": "XXXXXXXX-09cf-44d9-a386-XXXXXXXXXXX",
"customer_id": "XXXXXXXX-5ab2-47ef-9f9c-XXXXXXXXXXX",
"display_name": "Publishing Sandbox to Production",
"duration_sec": 1530,
"external_resource_id": null,
"finished_at": "2021-07-20T22:16:31.680241Z",
"id": "57643caa-1700-4938-b6cc-94b8dd5fa7df",
"inserted_at": "2021-07-20T21:51:01.481733Z",
"kind": "publish_sandbox_to_production",
"organization_id": "86bcea89-389f-496a-3c75-1df0ce8d96ca",
"pool_id": null,
"progress_info": null,
"result_info": null,
"stage": "done",
"started_by": {
"email": "68f43670-3bee-405f-8c28-cc5baf354e5f.img.frame.nutanix.com_third-party-api",
"first_name": "X",
"id": "d15d3125-2f74-45b2-8e55-1574de5e2b6a",
"identity_provider": "third-party-api",
"last_name": "X"
},
"updated_at": "2021-07-20T22:16:31.681266Z"
}
Status: 200 "OK"
List Account Usage
Returns usage information for an account within a specified time period.
GET /accounts/:account_id/usage
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | Search Query | String | True |
| from_date | The beginning date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | True |
| to_date | The ending date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | True |
| resolution_type | What is the resolution type: by_hour, by_day, by_month, by_year |
Search Query | String | False |
| server_type | Server Type: by_hour, by_day, by_month, by_year |
Search Query | String | False |
| pool_id | Frame Pool ID. | Search Query | String | False |
| instance_type_id | Frame Instance Type ID: | Search Query | String | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
-H "resolution_type: by_day" \
"https://api.console.nutanix.com/v1/accounts/${id}/usage?from_date=2021-12-01T23:20:58.128Z&to_date=2021-12-25T23:20:58.128Z"
Response Example
{
"usage_data": {
"vendor_id": 1338,
"usage": [
{
"time": 1532217600000,
"server_type_id": "sandbox",
"instance_type": {
"name": "t2.medium",
"id": 4
},
"hours_used": 1,
"datacenter": {
"name": "aws-de",
"id": 6,
"geo_long": 8.683333,
"geo_lat": 50.116667
}
},
{
"time": 1532253600000,
"server_type_id": "sandbox",
"instance_type": {
"name": "t2.medium",
"id": 4
},
"hours_used": 1,
"datacenter": {
"name": "aws-de",
"id": 6,
"geo_long": 8.683333,
"geo_lat": 50.116667
}
}
],
"gateway_id": "gateway-web-datest.dev.fra.me"
},
"status_message": "Success.",
"status": 0,
"resolution": "by_hour",
"credited_data": {
"vendor_id": 1338,
"gateway_id": "gateway-web-datest.dev.fra.me",
"credit": [
{
"time": 1532253600000,
"server_type_id": null,
"instance_type": {
"name": "t2.medium",
"id": 4
},
"datacenter": {
"name": "aws-de",
"id": 6,
"geo_long": 8.683333,
"geo_lat": 50.116667
},
"credited_hours": 2
}
]
}
}
Status: 200 "OK"
List Disk Volume Usage
Returns the disk volume usage for a specified account in a specified time period.
GET /accounts/:account_id/disk_volume_usage?params=...
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Frame Account ID | URL | String | True |
| from_date | The beginning date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | URL | ISO 8601 UTC String | True |
| to_date | The ending date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | URL | ISO 8601 UTC String | True |
| server_type | Server Type: by_hour, by_day, by_month, by_year |
Search Query | String | False |
| resolution_type | Defaults to by_hour, options: by_hour, by_day, by_month, by_year |
Search Query | String | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/disk_volume_usage?from_date=2020-01-01&to_date=2020-06-30&resolution_type=by_month"
Response Example
{
"data": [
{
"account_external_id": "gateway-prod.1337",
"usage": [
{
"datacenter_id": "gateway-prod.3",
"hours_used": 1488,
"disk_volume_size_used": 223200,
"disk_volume_type_id": "gp2",
"time": 1577836800000
},
{
"datacenter_id": "gateway-prod.3",
"hours_used": 1392,
"disk_volume_size_used": 208800,
"disk_volume_type_id": "gp2",
"time": 1580515200000
},
{
"datacenter_id": "gateway-prod.3",
"hours_used": 1488,
"disk_volume_size_used": 223200,
"disk_volume_type_id": "gp2",
"time": 1583020800000
},
{
"datacenter_id": "gateway-prod.3",
"hours_used": 1443,
"disk_volume_size_used": 247779,
"disk_volume_type_id": "gp2",
"time": 1585699200000
},
{
"datacenter_id": "gateway-prod.3",
"hours_used": 1539,
"disk_volume_size_used": 299343,
"disk_volume_type_id": "gp2",
"time": 1588291200000
},
{
"datacenter_id": "gateway-prod.3",
"hours_used": 2344,
"disk_volume_size_used": 295136,
"disk_volume_type_id": "gp2",
"time": 1590969600000
},
{
"datacenter_id": "gateway-prod.3",
"hours_used": 10311,
"disk_volume_size_used": 334187,
"disk_volume_type_id": "gp2",
"time": 1593561600000
}
]
}
],
"total": 1831645
}
Status: 200 "OK"
List API Authorization Rules
- GET
/customers/:customer_id/api_authorization_rules - GET
/organizations/:organization_id/api_authorization_rules - GET
/accounts/:account_id/api_authorization_rules
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| entity_id | Frame Account, Organization, or Customer ID. | URL | String | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/api_authorization_rules"
Response Example
[
{
"roles": [
{
"role": {
"permissions": ["..."],
"name": "Account Administrator",
"description": null,
"applicable_on": "account"
},
"id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
],
"name": "example2",
"id": 8,
"credentials": [
{
"name": "example2_key",
"client_id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.img-external-api-prod.frame.nutanix.com"
}
],
"api_authorization_id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
},
{
"roles": [
{
"role": {
"permissions": ["..."],
"name": "Account Administrator",
"description": null,
"applicable_on": "account"
},
"id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
],
"name": "example",
"id": 7,
"credentials": [
{
"name": "example_key",
"client_id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.img-external-api-prod.frame.nutanix.com"
}
],
"api_authorization_id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
}
]
Status: 200 "OK"
Create an Account
Accounts can be created within an organization with the following
endpoint and parameters. Initiating an account creation will give
you a task_id. You can check the status of the
account creation via the task id.
Creating an account via our API requires a few parameters:
cloud_service_external_id,
data_center_external_id,
sandbox_instance_type_id,
image_family,
master_image_id and
disk_size. Look in each parameter's
descriptions for where to find these values. If you're having trouble
creating an account, please reach out to your Frame representative for
assistance.
POST /accounts
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| organization_id | The Frame Organization ID that the account will be created under. | Data | String | True |
| name | A unique name of the new account. | Data | String | True |
| url_slug | A URL-friendly slug that will be used in URLs to access the account. | Data | String | True |
| cloud_service_external_id | This represents which Cloud Service (BYO) or Cloud Provider (Frame IaaS) the account will be created with. Use List Cloud Providers or List Cloud Services to locate these IDs. For example: gateway-prod.xx. | Data | String | True |
| data_center_external_id | This is the ID of a datacenter or “region” that will be used for the account. Use List Datacenters to locate these IDs. For example gateway-prod.xx. | Data | String | True |
| sandbox_instance_type_id | This ID is used to specify the instance type of the Sandbox. Use List Datacenters to find the Image Family and instance type you'd like, then use the instance type's ID here. For example: gateway-prod.xx | Data | String | True |
| image_family | This references the name of an OS image that is supported by Frame. Use List Image Families to help find this value by each Image Family's name field. |
Data | String | True |
| master_image_id | Required. ID of the master image that will be used to create the sandbox. Please query List Customer Master Images, or List Organization Master Images. For example: nutanix-prod.xxxxxx. | Data | String | True |
| disk_size | Optional. Desired size of the sandbox image (in GiB). If this value is not provided, our system uses a default of 45 GiB. However, some operating systems images have different disk size requirements | Data | String | False |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/" \
-F organization_id=d63caa09-5723-4ab9-a1ea-6659b349aabe \
-F 'name=API Example Account on AWS' \
-F url_slug=example-account \
-F cloud_service_external_id=gateway-prod.55 \
-F data_center_external_id=gateway-prod.15 \
-F image_family=FrameAWSWindows2016 \
-F sandbox_instance_type_id=gateway-prod.33 \
-F master_image_id=gateway-prod.38512 \
-F disk_size=64
Response Example
{
"account": {
"active": false,
"description": null,
"id": "724a1d0b-a2eb-69a1-8557-8fdd41e3654b",
"inserted_at": "2022-04-27T19:40:11.086149Z",
"kind": "frame",
"last_publish": null,
"last_test_publish": null,
"name": "Example Account",
"notes": null,
"url_slug": "example-account",
"website": null
},
"pending_request": {
"account_id": "154a1d0b-a2ec-42a1-8757-8fdd41e3554c",
"customer_id": "XXXXXXXX-5ab2-47ef-9f9c-XXXXXXXXXXX",
"display_name": "Creating account Example Account",
"duration_sec": null,
"external_resource_id": null,
"finished_at": null,
"id": "96c8d6c1-8008-562b-81d7-d40073a88b11",
"inserted_at": "2022-04-27T19:40:12.310097Z",
"kind": "create_account",
"organization_id": "83ccba89-389f-492a-1c75-5df0ce8c96ce",
"pool_id": null,
"progress_info": null,
"result_info": null,
"stage": "not_started",
"started_by": {
"email": "68f43670-3bce-405f-8c28-cc5baf354e52.img.console.nutanix.com_jasons-awesome-api",
"first_name": "Jason",
"id": "d15d3125-2f74-45b2-8e55-1574de5e2b6a",
"identity_provider": "jasons-awesome-api",
"last_name": "Thompson"
},
"updated_at": "2022-04-27T19:40:12.310097Z"
}
}
Status: 200 "OK"
Create an Account Launchpad
Creates a Launchpad based on supplied parameters.
POST /accounts/:account_id/launchpad
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | ID of the account the Launchpad will be created under. | URL | String | True |
| name | Name of the new Launchpad. | Data | String | True |
| url_slug | A URL-friendly slug that will be used in URLs to access the Launchpad | Data | String | True |
| kind | This determines the kind of Launchpad you want to create. You can create two kinds: application and desktop | Data | String | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/launchpad" \
-F 'name=Windows 2019 Desktop' \
-F url_slug=w2019-desktop \
-F kind=desktop \
Response Example
{
"active": true,
"description": null,
"id": "7d8fdb87-7683-40d0-81be-e7ee35a05db2",
"kind": "desktop",
"name": "Windows 2019 Desktop",
"notes": null,
"order": 1,
"url_slug": "w2019-desktop"
}
Status: 200 "OK"
Onboard an Application
Applications can be automatically onboarded to Frame if the account already has the Application's executable present in it's system image, and if you have the app's basic information available, most notably the app's icon image. Please note that you must also enable the application on your Launchpad(s) and publish before your newly onboarded applications are visible to your users.
POST /account/:account_id/onboard_app
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | ID of the Org the account will be created under | URL | String | True |
| Application | A JSON object that includes string values for the following property names: name, path, working_directory, icon_base64, and arguments. For the icon, you must provide a base64 encoded Data URL of your icon image. Encoding your image in base64 can be done using various tools and programming languages, but there are also a large number of tools online to do this as well. Your Data URL it must include the proper syntax for your image or “media” type (png, jpeg, etc.). For example, converting a PNG to base64 would start with data:image/png;base64,. |
Data | JSON | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/onboard_app"
--data-raw '{
"arguments": "",
"name": "Internet Explorer (Last Resort)",
"path": "C:\\Program Files\\Internet Explorer\\iexplore.exe",
"working_directory": "",
"icon_base64": "data:image/png;base64,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"
}'
Response Example
{
"arguments": "",
"icon_url": "https://assets.console.nutanix.com/images/icons/81679a506e0d4523b5532c4609b60f8c.png",
"id": "6ca03d2d-8729-432e-add9-c9fe21f42e9b",
"is_deleted": false,
"is_published": false,
"is_updated": false,
"name": "Internet Explorer (Last Resort)",
"path": "C:\\Program Files\\Internet Explorer\\iexplore.exe",
"updated_arguments": null,
"updated_icon_url": null,
"updated_name": null,
"updated_path": null,
"updated_working_directory": null,
"working_directory": ""
}
Status: 200 "OK"
Onboard Multiple Applications (Bulk process)
This is the process of onboarding multiple applications at once. Applications can be automatically onboarded to Frame if the account already has the Application's executable present in it's system image, and if you have the app's basic information available, most notably the app's icon image. Please note that you must also enable the application on your Launchpad(s) and publish before your newly onboarded applications are visible to your users.
POST /account/:account_id/onboard_applications
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | ID of the Org the account will be created under | URL | String | True |
| applications | A JSON object that includes string values for the following property names: name, path, working_directory, icon_base64, and arguments. For the icon, you must provide a base64 encoded Data URL of your icon image. Encoding your image in base64 can be done using various tools and programming languages, but there are also a large number of tools online to do this as well. Your Data URL it must include the proper syntax for your image or “media” type (png, jpeg, etc.). For example, converting a PNG to base64 would start with data:image/png;base64,. |
Data | JSON | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${id}/onboard_applications"
--data-raw '{
"applications": [
{
"arguments": "",
"name": "Internet Explorer (Last Resort)",
"path": "C:\\Program Files\\Internet Explorer\\iexplore.exe",
"working_directory": "",
"icon_url": "https://url-to-your-icon.com/image.png"
},
// ... More applications
]
}'
Response Example
{
[
{
"arguments": "",
"icon_url": "https://assets.console.nutanix.com/images/icons/81679a506e0d4523b5532c4609b60f8c.png",
"id": "6ca03d2d-8729-432e-add9-c9fe21f42e9b",
"is_deleted": false,
"is_published": false,
"is_updated": false,
"name": "Internet Explorer (Last Resort)",
"path": "C:\\Program Files\\Internet Explorer\\iexplore.exe",
"updated_arguments": null,
"updated_icon_url": null,
"updated_name": null,
"updated_path": null,
"updated_working_directory": null,
"working_directory": ""
},
// ... All of the other applications you onboarded
]
}
Status: 200 "OK"
List Launchpads
Returns a list of each Launchpad for an account, including their current settings, pools, and enabled applications if applicable.
GET /accounts/:account_id/launchpads
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | ID of the Frame Account you'd like to list Launchpads for. | URL | String | True |
| offset | Used to specify where to start the query from the results (Used for pagination). Must be in conjunction with the limit parameter. | Search Query | Integer (String) | False |
| limit | Used to specify the "page size" of the query. Must be used in conjunction with the offset parameter | Search Query | Integer (String) | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${account_id}/launchpads"
Response Example
[
{
"url_slug": "desktop-1",
"settings": {
"session_settings": {},
"new_app_mode_enabled": false,
"is_session_setting_enabled": false
},
"order": 0,
"name": "Desktop 1",
"kind": "desktop",
"id": "996cb66d-0d16-468e-b05f-192497fafc14",
"backgrounds": [],
"pools": [],
"description": null,
"active": true
},
{
"url_slug": "apps-1",
"settings": {
"session_settings": {},
"new_app_mode_enabled": false,
"is_session_setting_enabled": false
},
"order": 1,
"name": "Apps 1",
"kind": "application",
"id": "896cb66d-0d16-468e-b05f-192497fafc13",
"applications": [],
"pools": [],
"backgrounds": [],
"description": null,
"active": true
}
]
Status: 200 "OK"
List Launchpad Details
Returns the requested Launchpad's current settings, pools, and enabled applications if applicable.
GET /accounts/:account_id/launchpads/:launchpad_id
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | ID of the Frame Account. | URL | String | True |
| launchpad_id | ID of the Launchpad to query. | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${account_id}/launchpads/${launchpad_id}"
Response Example
{
"url_slug": "apps-1",
"settings": {
"session_settings": {},
"new_app_mode_enabled": false,
"is_session_setting_enabled": false
},
"order": 1,
"name": "Apps 1",
"kind": "application",
"id": "896cb66d-0d16-468e-b05f-192497fafc13",
"applications": [],
"pools": [],
"backgrounds": [],
"description": null,
"active": true
}
Status: 200 "OK"
Toggle Launchpad Application
Once an application is onboarded to a Frame account, it can then be enabled/toggled on any Application Launchpad. You'll need to toggle an app on to enable visibility and access for your end-users by application ID.
POST /launchpads/:launchpad_id/toggle_application
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| launchpad_id | ID of the Launchpad you'd like to enable an application for. | URL | String | True |
| Application | A JSON object that includes string values for the following property names: application_id, and order (optional). |
Data | JSON | True |
/accounts/:account_id/applications](#list-applications)
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/launchpads/${launchpad_id}/toggle_application" \
--data-raw '{
"application_id": "79829dbb-ebcf-4927-9e29-5302ae26a385"
}'
Response Example
The response will include the Launchpad's details. Including all enabled applications, and all enabled pools. If your application is present in the response, it's enabled and visible in Frame (a browser refresh required). If your application is not in the response, it is now disabled and no longer visible to end users (browser refresh required).
{
"active": true,
"applications": [
{
"id": "b7cba1b1-04ae-41e1-8375-c8346f542684",
"name": "SketchBook",
"path": "C:\\Program Files\\Autodesk\\SketchBook\\SketchBook.exe",
"icon_url": "https://assets.console.nutanix.com/images/icons/886669ca055840c9ad10ed839d7081c9.png",
"working_directory": null,
"arguments": null,
"is_published": true,
"is_updated": false,
"is_deleted": false
},
{
"id": "03c8a53e-e1c0-4801-9b86-dea1de76fadf",
"name": "ZBrushCoreMini 2020",
"path": "C:\\Program Files\\Pixologic\\ZBrushCoreMini 2020\\ZBrushCoreMini.exe",
"icon_url": "https://assets.console.nutanix.com/images/icons/8fc401a395f847ac9f0c65d7e88e4ca2.png",
"working_directory": null,
"arguments": null,
"is_published": true,
"is_updated": false,
"is_deleted": false
},
{
"id": "92ac6d27-c791-42b8-b3f0-2c72912d962d",
"name": "Frame Explorer",
"path": "C:\\Program Files\\Frame\\FrameExplorer\\FrameExplorer.exe",
"icon_url": "https://assets.console.nutanix.com/images/icons/frame_explorer.png",
"working_directory": null,
"arguments": null,
"is_published": true,
"is_updated": false,
"is_deleted": false
}
]
// ... the rest of the launchpad's details, including instance type pools and settings.
}
Status: 200 "OK"
Toggle Launchpad Pool
Once an pool is onboarded to a Frame account, it can then be enabled/toggled on any Application Launchpad. You'll need to toggle an app on to enable visibility and access for your end-users.
POST /launchpads/:launchpad_id/toggle_pool
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| launchpad_id | ID of the Launchpad you'd like to enable an application for. | URL | String | True |
| Application | A JSON object that includes string values for the following property names: application_id, and order (optional). You can find your application IDs by querying account applications. |
Data | JSON | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/launchpads/${launchpad_id}/toggle_pool" \
--data-raw '{
"pool_id": "c23b4ba1-c4d8-4bcf-8e62-d1f0d8477907"
}'
Response Example
The response will include the Launchpad's details. Including all enabled applications, and all enabled pools. If your requested instance pool is present in the response, it's enabled and visible in Frame (a browser refresh required). If your instance pool is not in the response, it is now disabled and no longer visible to end users (browser refresh required).
{
"active": true,
"applications": [
// our applications
],
"pools": [
{
"id": "28dfa4dd-4354-47fd-9fd0-3d287e157d92",
"kind": "production",
"name": "Air 4GB",
"instance_type": "t2.medium",
"disk_size": 201,
"external_id": "gateway-prod.595566"
},
{
"id": "c23b4ba1-c4d8-4bcf-8e62-d1f0d8477907",
"kind": "production",
"name": "Pro 122GB",
"instance_type": "g3.4xlarge",
"disk_size": 201,
"external_id": "gateway-prod.12005"
}
]
// ... the rest of the Launchpad's details and settings.
}
Status: 200 "OK"
List User Volumes
Lists the user profile and personal disks associated with a Frame Account
GET /accounts/:account_id/user_volumes
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Frame Account ID | URL | string | True |
| offset | Used to specify where to start the query from the results (Used for pagination). Must be in conjunction with the limit parameter. | Search Query | Integer (String) | False |
| limit | Used to specify the "page size" of the query. Must be used in conjunction with the offset parameter | Search Query | Integer (String) | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${account_id}/user_volumes/?statuses=detached"
Response Example
[
{
"created_time": "2023-02-23T17:21:25.280777Z",
"free_space": 5.92408,
"id": "gateway-prod.137452",
"last_backup_fail_reason": "success",
"last_backup_success": true,
"last_used_time": "2023-02-28T16:33:42.168903Z",
"name": "David Horv - djhorv+01@gmail.com",
"server": null,
"size": 6.0,
"status": "detached",
"type": "profile",
"user_uuid": "2394aa40-a078-4cd4-a293-f17c0ba22825",
"vendor": "gateway-prod.49981",
"volume_id": "vol-049a795cceef7372a"
}
]
Status: 200 "OK"
Delete User Volumes
Deletes onbe or more user volumes.
DELETE /accounts/:account_id/user_volumes
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Frame Account ID | URL | String | True |
| user_volume_ids | List of User Volume IDs | body | json | True |
Request Example
curl -X DELETE \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${account_id}/user_volumnes"
--data-raw '{
"user_volume_ids" : ["gateway-prod.920000","gateway-prod.940154"]
}'
Response Example
{
"account_id": "c54a4189-93e0-46d7-a333-d07cab1d4e7b",
"customer_id": "fd8dc130-cfe6-40d9-8b3e-7af39024e0e8",
"display_name": "Deleting user volumes",
"duration_sec": 21,
"external_resource_id": null,
"finished_at": "2023-03-13T16:43:14.600164Z",
"id": "bf873017-5359-4516-ba8e-91330566abe4",
"inserted_at": "2023-03-13T16:42:53.768400Z",
"kind": "bulk_delete_user_volume",
"organization_id": "fefca2ef-e0fc-42c6-88d3-a21ef995be97",
"pool_id": null,
"progress_info": null,
"result_info": null,
"stage": "done",
"started_by": {
"email": "afe5c674-60a6-4143-8015-55d3f9a4e74a.img.frame.nutanix.com_third-party-api",
"first_name": "X",
"id": "b93bef6a-0f9a-455e-92dc-5ff52ddd014a",
"identity_provider": "third-party-api",
"last_name": "X"
},
"updated_at": "2023-03-13T16:43:14.600807Z"
}
Status: 200 "OK"
List User Volume Backups{#list-backups}
Returns all user volumes associated with an account.
GET /accounts/:account_id/user_volumes_backups
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Your Frame account ID. | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${account_id}/user_volumes_backups"
Response Example
[
{
"backup_datetime": "2023-04-06 17:40:24",
"id": "gateway-prod.927553",
"kind": "personal",
"name": "David-02 Example - djexample+02@gmail.com - Personal drive backup - pc4pvb",
"replication_status": null,
"type": "manual",
"vendor_id": "gateway-prod.50591"
}
// More backups...
]
Status: 200 "OK"
Delete User Volume Backups{#delete-volume-backups}
Deletes all user volumes that are specified in the user_volume_backup_ids array parameter. This is a bulk action and the API expects an array of volume backup IDs. The Account ID is not required for this call.
DELETE /accounts/:account_id/user_volumes_backups
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| user_volume_backup_ids | An array of volume backup strings | Body | String | True |
| account_id | Your Frame account ID. | URL | String | False |
Request Example
curl -X DELETE\
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
--data-raw '{
"user_volume_backup_ids" : ["gateway-prod.920000","gateway-prod.940154"]
}'
"https://api.console.nutanix.com/v1/accounts/${account_id}/user_volumes_backups"
Response Example
[]
Status: 200 "OK"
Restore a User Volume from Backup
Restore a user volume from backup.
POST /accounts/:account_id/user_volume_backups/:user_volume_backup_id/restore
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Frame Account ID | URL | string | True |
| user_volume_backup_id | Id of the backup (found by querying backups) | URL | string | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/accounts/${account_id}/user_volume_backups/${user_volume_backup_id}/restore"
Response Example
{
"account_id": "0a4e3b25-2365-4a71-bdb0-b0e26788ebf7",
"customer_id": "fd8dc130-cfe6-40d9-8b3e-7af39024e0e8",
"display_name": "Restoring user volume backup",
"duration_sec": null,
"external_resource_id": "gateway-prod.50591",
"finished_at": null,
"id": "d7266ef3-11ad-4e8f-8bca-1ee8c1baa5a3",
"inserted_at": "2023-04-11T18:51:24.217658Z",
"kind": "restore_user_volume_backup",
"organization_id": "fefca2ef-e0fc-42c6-88d3-a21ef995be97",
"pool_id": null,
"progress_info": null,
"result_info": null,
"stage": "not_started",
"started_by": {
"email": "afe5c674-60a6-4143-8015-55d3f9a4e74a.img.frame.nutanix.com_third-party-api",
"first_name": "X",
"id": "b93bef6a-0f9a-455e-92dc-5ff52ddd014a",
"identity_provider": "third-party-api",
"last_name": "X"
},
"updated_at": "2023-04-11T18:51:24.217658Z"
}
Status: 200 "OK"
Update maintenance mode
Update maintenance mode on the account.
POST /accounts/:account_id/update_account_maintenance_mode
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Frame Account ID | URL | string | True |
| under_maintenance | Maintenance mode switch | Body | boolean | True |
| maintenance_message | Maintenance mode message | Body | string | False |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
--data-raw '{
"under_maintenance" : true,
"maintenance_message": "This account is under maintenance mode"
}'
"https://api.console.nutanix.com/v1/accounts/${account_id}/update_account_maintenance_mode"
Response Example
{
"website": null,
"name": "Aca Ivic Local",
"last_publish": "2018-07-12T11:26:18.879116",
"id": "b614cb6f-796b-4371-86cb-465d6dfc433b",
"description": null,
"active": true
}
Status: 200 "OK"
Change Upgrade Group
Change upgrade/deployment group of the account.
POST /accounts/:account_id/change_deployment_group
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| account_id | Frame Account ID | URL | string | True |
| upgrade_group_id | Upgrade Group External ID | Body | string | True |
Request Example
curl -X POST \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
--data-raw '{
"upgrade_group_id" : "gateway-prod.1"
}'
"https://api.console.nutanix.com/v1/accounts/${account_id}/change_deployment_group"
Response Example
{
"website": null,
"name": "Aca Ivic Local",
"last_publish": "2018-07-12T11:26:18.879116",
"id": "b614cb6f-796b-4371-86cb-465d6dfc433b",
"description": null,
"active": true
}
Status: 200 "OK"
Restore Persistent Desktop Backup
Restore Persistent Desktop Server to a backup.
POST /servers/:server_external_id/restore_persistent_desktop/:backup_external_id
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| server_external_id | Persistent Desktop Server External ID | URL | string | True |
| backup_external_id | Backup External ID | URL | string | True |
| force_restore_from_replica | Force restore from replica? | Body | boolean | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
--data-raw '{
"force_restore_from_replica" : false
}'
"https://api.console.nutanix.com/v1/servers/${server_external_id}/restore_persistent_desktop/${backup_external_id}"
Response Example
{
"account_id": "c54a4189-93e0-46d7-a333-d07cab1d4e7b",
"customer_id": "fd8dc130-cfe6-40d9-8b3e-7af39024e0e8",
"display_name": "Restoring Persistent Desktop Backup",
"duration_sec": 21,
"external_resource_id": null,
"finished_at": "2023-03-13T16:43:14.600164Z",
"id": "bf873017-5359-4516-ba8e-91330566abe4",
"inserted_at": "2023-03-13T16:42:53.768400Z",
"kind": "restore_persistent_desktop_backup",
"organization_id": "fefca2ef-e0fc-42c6-88d3-a21ef995be97",
"pool_id": null,
"progress_info": null,
"result_info": null,
"stage": "done",
"started_by": {
"email": "afe5c674-60a6-4143-8015-55d3f9a4e74a.img.frame.nutanix.com_third-party-api",
"first_name": "X",
"id": "b93bef6a-0f9a-455e-92dc-5ff52ddd014a",
"identity_provider": "third-party-api",
"last_name": "X"
},
"updated_at": "2023-03-13T16:43:14.600807Z"
}
Status: 200 OK
Organization Endpoints
List Organizations
Returns all Organizations.
GET /organizations
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| name | Name or portion of name you would like to use for searching/filtering. | Search Query | String | False |
| show_deleted | Filters organization results based on if they're deleted or not. This is useful for filtering out older deleted organizations. | Search Query | Boolean | False |
| order | Specifies the order of the results. Use “asc” for ascending order, and “desc” for descending order. | Search Query | String | False |
| order_by | Specifies the field of which the ordering should occur. For example, “name”, “url_slug”, etc. | Search Query | String | False |
| offset | Used to specify where to start a query. | Search Query | Integer (String) | False |
| limit | Used to specify the “page size” of the query. | Search Query | Integer (String) | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/organizations?show_deleted=false"
Response Example
[
{
"description": null,
"id": "aa49ea9a-3925-4f6f-86e4-6825ffe1ed24",
"name": "Acme Org",
"url_slug": "acme-org",
"website": null
},
{
"description": null,
"id": "786904d3-6a19-4af2-8bfc-5479a1010961",
"name": "Acme Training Group",
"url_slug": "remote-training",
"website": null
}
]
Status: 200 OK
List Organization Details
Returns information about your customer entity.
GET /organizations/:organization_id
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/organizations/${organization_id}/"
Response Example
{
"description": null,
"id": "2fb210e0-e931-4c62-83fd-b31fe13468ca",
"name": "Chuck's Organization",
"url_slug": "example-org",
"website": null
}
Status: 200 OK
List Organization Audit Trails
Returns Audit Trails for an account, constrained by a date range and a number of ways to filter & search for granular queries.
GET /organizations/:organization_id/audit-trails
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| organization_id | Your Frame Organization ID | URL | String | True |
| search | Filters results if the provided string matches against a user's full name, email, idp, or the Audit Trail kind. | Search Query | String | False |
| kind | Filters Audit Trails by wildcard matching against the supplied string. For example, a kind of “launchpad” will return Audit Trails for both createLaunchpad and updateLaunchpad actions. | Search Query | String | False |
| from_date | The beginning date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | False |
| to_date | The ending date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | False |
| offset | Used to specify where to start a Audit Trails query. Must be used in conjunction with the limit parameter. | Search Query | Integer (String) | False |
| limit | Used to specify the “page size” of the Audit Trails query. Must be used in conjunction with the offset parameter. | Search Query | Integer (String) | False |
| order | Specifies the order of the results. Use “asc” for ascending order, and “desc” for descending order. | Search Query | String | False |
| order_by | Specifies the field of which the ordering should occur. For example, “session_start”, “session_duration”, etc. | Search Query | String | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/organizations/${organization_id}/audit-trails?search=jason.thompson@nutanix.com&kind=launchpad&limit=5&offset=0&from_date=${from_date}&to_date=${to_date}&order_by=inserted_at&order=desc"
Response Example
[
{
"id": "7c3dee57-5a7b-4211-a55d-7d5b8e5f595b",
"user_first_name": "Jason",
"user_last_name": "Thompson",
"user_idp": "example-idp-name",
"user_email": "jason.thompson@nutanix.com",
"kind": "updateLaunchpad",
"account_id": "b00636bf-4f08-404e-a7ba-3c2aaa173335",
"organization_id": "86bcea89-389f-496a-3c75-1df0ce8d96ca",
"customer_id": "b3e7d4e0-5ab2-43cf-9f9c-0c02909931e1",
"inserted_at": "2021-10-15T20:49:13.377350Z"
},
{
"id": "4f62a8e4-1ab4-430b-9f4f-96fa77ff24f5",
"user_first_name": "Jason",
"user_last_name": "Thompson",
"user_idp": "example-idp-name",
"user_email": "jason.thompson@nutanix.com",
"kind": "createLaunchpad",
"account_id": "b00636bf-4f08-404e-a7ba-3c2aaa173335",
"organization_id": "86bcea89-389f-496a-3c75-1df0ce8d96ca",
"customer_id": "b3e7d4e0-5ab2-43cf-9f9c-0c02909931e1",
"inserted_at": "2021-10-15T20:49:09.833114Z"
}
// ... more Audit Trails
]
Status: 200 OK
List Organization Session Trails
Returns Session Trails based on a specified organization, time frame, and filters.
GET /organizations/:organization_id/session-trails
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| organization_id | Your Frame Organization ID | URL | String | True |
| search | Filters results if the provided string matches against Server ID, Session ID, email address, and a user's full name. | Search Query | String | False |
| session_start | The beginning date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | False |
| session_end | The ending date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | False |
| instance_type | Filters Session Trails based on a specific instance type ID. | Search Query | String | False |
| pool_group_type | Filters Session Trails based on the pool group server type: sandbox, production, utility, persistent_desktop_production, persistent_desktop_shadow. | Search Query | String | False |
| pool_id | Filters Session Trails based on provided instance type's pool ID. | Search Query | String | False |
| offset | Used to specify where to start a Session Trails query. Must be used in conjunction with the limit parameter. | Search Query | Integer (String) | False |
| limit | Used to specify the “page size” of the Session Trails query. Must be used in conjunction with the offset parameter. | Search Query | Integer (String) | False |
| order | Specifies the order of the results. Use “asc” for ascending order, and “desc” for descending order. | Search Query | String | False |
| order_by | Specifies the field of which the ordering should occur. For example, “session_start”, “session_duration”, etc. | Search Query | String | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/organizations/${organization_id}/session-trails?limit=50&offset=0&order=desc&order_by=session_start"
Response Example
[
{
"account_id": "084ab7d0-e4ca-4dea-932a-45bf33f02088",
"bandwidth_kbps_avg": 15921.05,
"bandwidth_kbps_max": 16128,
"bandwidth_kbps_min": 14024,
"city": "Tehama",
"client_ip": "123.32.145.255",
"customer_id": "b3e7d4e0-5ab2-43cf-9f9c-0c02909931e1",
"distance": 2369.002238311968,
"fail_description": null,
"framerate_ps_avg": 19.74,
"framerate_ps_max": 20,
"framerate_ps_min": 10,
"id": "b970ec31-ca07-48c9-8b56-4547a7b1a9f8",
"instance_type": "t2.large",
"latency_ms_avg": 110.36,
"latency_ms_max": 132,
"latency_ms_min": 106,
"organization_id": "2fb210e0-e931-4c62-83fd-b31fe13468ca",
"pool_group_type": "sandbox",
"pool_id": "d54b760c-956a-487b-a675-e113677fe871",
"pool_instance_type": {
"bare_metal": null,
"display_name": "Air 8GB",
"gpu": "None",
"id": "gateway-prod.5",
"name": "t2.large",
"ram": 8,
"vcpu": 2
},
"server_id": "gateway-prod.5232637",
"session_duration": 2391,
"session_end": "2021-02-25T23:17:27.000000Z",
"session_id": "gateway-prod.nMOARz25k9LDmGN0",
"session_start": "2021-02-25T23:15:56.000000Z",
"user_email": "example.user@company.com",
"user_first_name": "Example",
"user_id": "52b19f2e-c8ae-4f12-beab-f2838ce8dce9",
"user_idp": "example-idp",
"user_last_name": "User"
}
]
Status: 200 OK
List Organization API Authorization Rules
Returns all Organization-level API keys that have been generated and their associated permissions.
GET /organizations/:organization_id/api_authorization_rules
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/organizations/${organization_id}/api_authorization_rules"
Response Example
[
{
"api_authorization_id": "e8d5f1f0-2e4d-4362-9002-a5c11da1ffc9",
"credentials": [
{
"client_id": "ed1147f0-3d3e-4629-a8a5-9cc67053518c.img.frame.nutanix.com",
"name": "Development Server"
}
],
"id": 980,
"name": "Chuck's customized admin roles",
"roles": [
{
"id": "871dbc2d-f55f-4f15-ab4a-eb14541da4de",
"role": {
"applicable_on": "organization",
"category": null,
"description": null,
"id": "6498134a-df89-4548-be2d-86b01fac91c9",
"name": "Organization Administrator",
"permissions": [
"cpanel_mutation_restore_backup",
"cpanel_mutation_check_cluster_create_limits",
"cpanel_acknowledge_notification",
"cpanel_mutation_move_launchpad"
// ... more permissions
]
}
}
// ... more roles if available
]
}
]
Status: 200 OK
List Organization Roles
Returns available roles and associated permission granted for the specified Organization.
GET /organizations/:organization_id/roles
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| organization_id | Your Frame Organization ID | URL | String | True |
| category | Filters the results by the role category, e.g. "api" | Search Query | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/organizations/${organization_id}/roles?category="api"
Response Example
[
{
"applicable_on": "account",
"category": "api",
"description": null,
"id": "f1147b3ta-f927-46aa-66ea-6eea8569663b",
"name": "API - Generate Anonymous Account Token",
"permissions": ["create_anonymous_access_token"]
}
]
Status: 200 OK
List Organization Cloud Services
Returns a list of registered Cloud Service Providers configured with Frame for a specified Organization.
GET /organizations/:organization_id/cloud_services
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| organization_id | Your Frame Organization ID. | URL | String | True |
| cloud_provider_id | The Frame cloud provider ID. | Search Query | String | true |
| active | Lists cloud services based on their “active” status. | Search Query | Boolean | False |
| omit_default | If true, omits Frame's default Cloud Services from the results. | Search Query | Boolean | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/organizations/${organization_id}/cloud_services?active=true"
Response Example
[
{
"active": true,
"cloud_account_id": "199955555555",
"cloud_provider_display_name": "AWS",
"cloud_provider_id": "gateway-prod.2",
"cloud_provider_name": "amazon",
"context": "organization",
"creation_date": "2019-06-11T20:25:33Z",
"datacenters": [],
"display_name": "Example Account",
"external_id": null,
"gateway": "gateway-prod",
"id": "gateway-prod.459",
"is_default": false,
"is_provider_default": false,
"name": "Example Account",
"owner_id": "b3e7d4e0-5ab2-43cf-9f9c-0c02909931e1",
"properties": {
"cloud_account_id": "199955555555"
},
"status": "ready",
"supported_datacenter_ids": null,
"supported_types": ["frame-high"]
}
]
Status: 200 "OK"
List Organization Elasticity
Returns information on all customer instance elasticity.
GET /organizations/:organization_id/elasticity
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| organization_id | Your Frame Organization ID. | URL | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/organizations/${organization_id}/elasticity
Response Example
{
"buffer_servers": 10,
"max_servers": 150,
"min_servers": 100
}
Status: 200 OK
List Organization Settings
Returns all customer entity settings.
GET /organizations/:organization_id/settings
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/organizations/${organization_id}/settings"
Response Example
{
"authorized_nutanix_personnel": [
"jason.thompson@nutanix.com",
"alex.fontaine@nutanix.com",
"stuart.allen@nutanix.com"
],
"can_frame_account_support_start_session": null,
"frame_cloud_account_allowed": false,
"frame_support_admin_access": "full_access",
"is_frame_support_customer_admin": true,
"is_generate_session_report_enabled": false,
"is_light_publish_enabled": false,
"is_login_banner_enabled": false,
"is_persistent_desktops_backups_enabled": true,
"is_terminal_banner_enabled": false,
"light_publish_settings": {
"threshold": 10
},
"login_banner_settings": null,
"max_concurrency": 160,
"max_concurrency_per_account": null,
"max_monthly_credits_usage": null,
"max_monthly_credits_usage_description": null,
"max_utility_pools_per_account": 50,
"note": null,
"notification_center_settings": {
"email_addresses": null,
"is_send_notification_emails_enabled": null,
"notify_on_critical": null,
"notify_on_info": null,
"notify_on_warning": null
},
"terminal_banner_settings": null
}
Status: 200 OK
List Organization Overall Usage
Returns instance usage for the specified Organization constrained by a date range.
GET /organizations/:organization_id/usage
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| organization_id | Your Frame Organization ID | URL | String | True |
| from_date | The beginning date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | False |
| to_date | The ending date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | False |
| resolution_type | Resolution Type: by_hour, by_day, by_month, by_year |
Search Query | String | False |
| server_type | Filters query based on a specific server ID. | Search Query | String | False |
| pool_id | Filters query based on provided instance type's pool ID. | Search Query | String | False |
| instance_type_id | Filters the usage by an instance type's “external” ID, e.g. “gateway-prod.3”. | Search Query | String | False |
| datacenter_id | Limits the results to a specific Datacenter by ID. | Search Query | String | False |
| skip_if_byo_account | True/False boolean value determining if BYO results should be returned. | Search Query | Boolean | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/organizations/${organization_id}/usage?from_date=${from_date}&to_date=${to_date}&server_type=production"
Response Example
{
"data": [
{
"account": null,
"account_external_id": "gateway-prod.35917",
"usage": [
{
"datacenter": null,
"datacenter_id": "gateway-prod.1",
"hours_used": 1,
"instance_type": null,
"instance_type_id": "gateway-prod.3152",
"server_type": "production",
"time": 1626454800000
}
// ... more usage data
]
}
// ... more accounts and usage
],
"total": 43533
}
Status: 200 OK
List Organization Disk Volume Usage
Returns disk volume usage statistics for specified Organization within a specified date range.
GET /organizations/:organization_id/disk_volume_usage?from_date=X&to_date=Y&server
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| organization_id | Your Frame Organization ID. | URL | String | True |
| from_date | The beginning date range for the query. | The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | YYYY-MM-DD Date string | False |
| to_date | The ending date range for the query. | The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | YYYY-MM-DD Date string | False |
| resolution_type | Resolution Type: by_hour, by_day, by_month, by_year |
Search Query | String | False |
| server_type | Server Type: sandbox, production, utility, persistent_desktop_production, persistent_desktop_shadow |
Search Query | String | False |
| disk_volume_type_id | Disk Volume Type: all, standard, gp2, io1 |
Search Query | String | False |
| datacenter_id | Limits the results to a specific Datacenter ID number. | Search Query | String | False |
| skip_if_byo_account | True/False boolean value determining if BYO results should be returned. | Search Query | Boolean | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/organizations/${organization_id}/disk_volume_usage?from_date=${from_date}&to_date=${to_date}"
Response Example
{
"data": [
{
"account": null,
"account_external_id": "gateway-prod.1791",
"usage": [
{
"datacenter": null,
"datacenter_id": "gateway-prod.3",
"disk_volume_size_used": 180,
"disk_volume_type_id": "gp2",
"hours_used": 36,
"time": 1625101200000
}
// ... more usage data for this account
]
}
// ... more accounts and their usage
],
"total": 758884
}
Status: 200 OK
List Organization Master Images
Returns Maser or "Gold" Image information for the specified Organization for a specified datacenter.
GET /organizations/:organization_id/cloud_services/:external_cloud_service_id/master_images?external_data_center_id=XYZ
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| external_data_center_id | This ID represents a Frame “external” datacenter ID. | Search Query | String | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/organizations/${organization_id}/cloud_services/${external_cloud_service_id}/master_images?external_data_center_id=${external_data_center_id}"
Response Example
[
{
"description": "Frame Master Image mif:1, v:0, date:2020-01-28 09:30:10",
"id": "gateway-prod.15474",
"instance_types": [
{
"display_name": "Air 4GB",
"external_id": "gateway-prod.1",
"gpu": "None",
"id": "gateway-prod.1",
"name": "t2.medium",
"ram": 4,
"vcpu": 2
}
"machine_image_family": {
"display_name": "Windows Server 2016 (G4)",
"id": "gateway-prod.xxx",
"name": "FrameAWSWindows20126G4"
},
"master_image_copy_required": null
]
},
// ... more master images
]
Status: 200 OK
List Organization User Activity
Returns statistical user activity information for the specified Customer constrained by a date range. Can be ordered by passing a string parameter as well as exclude specified user IDPs.
GET /organizations/:organization_id/user_activities?from_date=X&to_date=Y
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| organization_id | Your Frame Organization ID | URL | String | True |
| from_date | The beginning date range for the query. | Search Query | YYYY-MM-DD Date string | True |
| to_date | The ending date range for the query. | Search Query | YYYY-MM-DD Date string | True |
| order | Specifies the order of the results. Use “asc” for ascending order, and “desc” for descending order. | Search Query | String | False |
| order_by | Specifies the field of which the ordering should occur. For example, “session_start”, “session_duration”, etc. | Search Query | String | False |
| skip_user_idps | User Identity Providers to skip. | Search Query | Array (String) | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/organizations/${organization_id}/user_activities?from_date=${from_date}&to_date=${to_date}&skip_user_idps[]=example-okta-admins&skip_user_idps[]=example-okta-dev"
Response Example
{
"data": [
{
"access_date": "2022-02-01",
"access_datetime": "2022-02-01T21:11:00.398870Z",
"account_id": "0e52b11b-23bf-411e-a070-bc0ea014cbc2",
"customer_id": "6ba31e38-1735-4274-a58e-6fb8c662e425",
"organization_id": "bc24563d-375b-49fb-8f15-1682b8bc6deb",
"user_email": "dontcallme.shirley@example.com",
"user_first_name": "Shirley",
"user_id": "20acd3a2-b455-4dca-b22b-520e16079e11",
"user_idp": "example-okta-workforce",
"user_last_name": "Dontcallme"
}
// ... many more User Activities
],
"total": 66866,
"total_unique": 8133
}
Status: 200 OK
Customer Endpoints
List Customer Details
Returns information about your customer entity.
GET /customers/
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/customers/"
Response Example
{
"active": true,
"available_applications": ["frame"],
"billing_subscriptions": null,
"description": "Internal, Frame Support",
"extra_features": ["deployment_group_tag", "compatibility_matrix_tag"],
"id": "d3e7d4e0-5ab2-47cf-9f9c-0b02999931e7",
"name": "Frame Support",
"notes": "Frame Support Customer, used for all things Frame!",
"owner_email": null,
"tenant_domain": null,
"url_slug": "frame-support",
"website": null
}
Status: 200 OK
List Customer Accounts
Returns a list of all accounts across all organizations.
GET /customers/:customer_id/accounts
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| name | Name or portion of name you would like to use for searching/filtering. | URL | String | False |
| active | Filters the accounts based on their “active” status. Useful for filtering out older terminated accounts. | Search Query | String | False |
| organization_id | Filters accounts list based on the provided Organization ID. | Search Query | String | False |
| offset | Used to specify where to start a Audit Trails query. Must be used in conjunction with the limit parameter. | Search Query | Integer (String) | False |
| limit | Used to specify the “page size” of the Audit Trails query. Must be used in conjunction with the offset parameter. | Search Query | Integer (String) | False |
| order | Specifies the order of the results. Use “asc” for ascending order, and “desc” for descending order. | Search Query | String | False |
| order_by | Specifies the field of which the ordering should occur. For example, “session_start”, “session_duration”, etc. | Search Query | String | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/customers/${customer_id}/accounts?active=true"
Response Example
[
{
"active": true,
"description": "Kitchen Toaster API backplane",
"id": "54aaf078-8c03-4c75-8cda-2fc4ce661f22",
"inserted_at": "2021-07-19T17:57:36.221864Z",
"kind": "frame",
"last_publish": "2022-12-20T20:43:03Z",
"name": "Example Account",
"notes": null,
"url_slug": "example-account-slug",
"website": null
}
// ... more accounts
]
Status: 200 OK
List Customer Audit Trails
Returns Audit Trails for an account, constrained by a date range and a number of ways to filter & search for granular queries.
GET /customers/:customer_id/audit-trails
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| customer_id | Your Nutanix Customer ID | URL | String | True |
| search | Filters results if the provided string matches against a user's full name, email, idp, or the Audit Trail kind. | Search Query | String | False |
| kind | Filters Audit Trails by wildcard matching against the supplied string. For example, a kind of “launchpad” will return Audit Trails for both createLaunchpad and updateLaunchpad actions. | Search Query | String | False |
| from_date | The beginning date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | False |
| to_date | The ending date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | False |
| offset | Used to specify where to start a Audit Trails query. Must be used in conjunction with the limit parameter. | Search Query | Integer (String) | False |
| limit | Used to specify the “page size” of the Audit Trails query. Must be used in conjunction with the offset parameter. | Search Query | Integer (String) | False |
| order | Specifies the order of the results. Use “asc” for ascending order, and “desc” for descending order. | Search Query | String | False |
| order_by | Specifies the field of which the ordering should occur. For example, “session_start”, “session_duration”, etc. | Search Query | String | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/customers/${customer_id}/audit-trails?search=jason.thompson@nutanix.com&kind=launchpad&limit=5&offset=0&from_date={{from_date}}&to_date={{to_date}}&order_by=inserted_at&order=desc"
Response Example
[
{
"id": "7c3dee57-5a7b-4211-a55d-7d5b8e5f595b",
"user_first_name": "Jason",
"user_last_name": "Thompson",
"user_idp": "example-idp-name",
"user_email": "jason.thompson@nutanix.com",
"kind": "updateLaunchpad",
"account_id": "b00636bf-4f08-404e-a7ba-3c2aaa173335",
"organization_id": "86bcea89-389f-496a-3c75-1df0ce8d96ca",
"customer_id": "b3e7d4e0-5ab2-43cf-9f9c-0c02909931e1",
"inserted_at": "2021-10-15T20:49:13.377350Z"
},
{
"id": "4f62a8e4-1ab4-430b-9f4f-96fa77ff24f5",
"user_first_name": "Jason",
"user_last_name": "Thompson",
"user_idp": "example-idp-name",
"user_email": "jason.thompson@nutanix.com",
"kind": "createLaunchpad",
"account_id": "b00636bf-4f08-404e-a7ba-3c2aaa173335",
"organization_id": "86bcea89-389f-496a-3c75-1df0ce8d96ca",
"customer_id": "b3e7d4e0-5ab2-43cf-9f9c-0c02909931e1",
"inserted_at": "2021-10-15T20:49:09.833114Z"
}
// ... more Audit Trails
]
Status: 200 OK
List Customer Session Trails
Returns Session Trails based on a specified time frame and filters.
GET /customers/:customer_id/session-trails
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| customer_id | Your Nutanix Customer ID | URL | String | True |
| search | Filters results if the provided string matches against Server ID, Session ID, email address, and a user's full name. | Search Query | String | False |
| session_start | The beginning date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | False |
| session_end | The ending date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | False |
| instance_type | Filters Session Trails based on a specific instance type ID. | Search Query | String | False |
| pool_group_type | Filters Session Trails based on the pool group server type: sandbox, production, utility, persistent_desktop_production, persistent_desktop_shadow. | Search Query | String | False |
| pool_id | Filters Session Trails based on provided instance type's pool ID. | Search Query | String | False |
| offset | Used to specify where to start a Session Trails query. Must be used in conjunction with the limit parameter. | Search Query | Integer (String) | False |
| limit | Used to specify the “page size” of the Session Trails query. Must be used in conjunction with the offset parameter. | Search Query | Integer (String) | False |
| order | Specifies the order of the results. Use “asc” for ascending order, and “desc” for descending order. | Search Query | String | False |
| order_by | Specifies the field of which the ordering should occur. For example, “session_start”, “session_duration”, etc. | Search Query | String | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/customers/${customer_id}/session-trails?limit=50&offset=0&order=desc&order_by=session_start"
Response Example
[
{
"account_id": "084ab7d0-e4ca-4dea-932a-45bf33f02088",
"bandwidth_kbps_avg": 15921.05,
"bandwidth_kbps_max": 16128,
"bandwidth_kbps_min": 14024,
"city": "Tehama",
"client_ip": "123.32.145.255",
"customer_id": "d3e7d4e0-5ab2-47cf-9f9c-0b02999931e7",
"distance": 2369.002238311968,
"fail_description": null,
"framerate_ps_avg": 19.74,
"framerate_ps_max": 20,
"framerate_ps_min": 10,
"id": "b970ec31-ca07-48c9-8b56-4547a7b1a9f8",
"instance_type": "t2.large",
"latency_ms_avg": 110.36,
"latency_ms_max": 132,
"latency_ms_min": 106,
"organization_id": "2fb210e0-e931-4c62-83fd-b31fe13468ca",
"pool_group_type": "sandbox",
"pool_id": "d54b760c-956a-487b-a675-e113677fe871",
"pool_instance_type": {
"bare_metal": null,
"display_name": "Air 8GB",
"gpu": "None",
"id": "gateway-prod.5",
"name": "t2.large",
"ram": 8,
"vcpu": 2
},
"server_id": "gateway-prod.5232637",
"session_duration": 2391,
"session_end": "2021-02-25T23:17:27.000000Z",
"session_id": "gateway-prod.nMOARz25k9LDmGN0",
"session_start": "2021-02-25T23:15:56.000000Z",
"user_email": "example.user@company.com",
"user_first_name": "Example",
"user_id": "52b19f2e-c8ae-4f12-beab-f2838ce8dce9",
"user_idp": "example-idp",
"user_last_name": "User"
}
]
Status: 200 OK
List Customer API Authorization Rules
Returns all Customer API keys that have been generated and their associated permissions.
GET /customers/:customer_id/api_authorization_rules
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/customers/${customer_id}/api_authorization_rules"
Response Example
[
{
"api_authorization_id": "c3103e65-6add-4fd1-abc3-2c348235cd40",
"credentials": [],
"id": 53,
"name": "ExampleA Dev Environment API credentials",
"roles": [
{
"id": "0f77adc8-d9e5-4e40-a900-358b54b6c8f8",
"role": {
"applicable_on": "customer",
"category": null,
"description": null,
"id": "6ae133ae-a9cb-4160-1337-e904f97293d5",
"name": "Customer Administrator",
"permissions": [
"cpanel_mutation_delete_backup",
"cpanel_list_virtual_networks_organization_cloud_services",
"cpanel_launchpad",
"cpanel_account_authentication_settings",
"cpanel_launchpad_session_settings",
"cpanel_mutation_start_session_production",
"cpanel_mutation_delete_google_authorization_rule",
"cpanel_customer_authorization_rule",
"cpanel_mutation_update_launchpad_session_settings",
"cpanel_account_authorization_rules",
"cpanel_cluster_host",
"cpanel_customer_audit_trail",
"cpanel_account",
"cpanel_organization_api_authorization",
"cpanel_mutation_dismiss_pool_alert",
"cpanel_mutation_update_cluster_aos_tier",
"cpanel_mutation_update_account_general_settings"
// ... more permissions
]
}
}
]
}
]
Status: 200 OK
List Customer Cloud Services
Returns a list of registered Cloud Service Providers configured with your Frame Customer entity.
GET /customers/:customer_id/cloud_services
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Your Nutanix Customer ID. | URL | String | True |
| cloud_provider_id | The Frame cloud provider ID. | Search Query | String | True |
| active | Lists cloud services based on their “active” status. | Search Query | Boolean | False |
| omit_default | If true, omits Frame's default Cloud Services from the results. | Search Query | Boolean | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/customers/${customer_id}/cloud_services?active=true"
Response Example
[
{
"active": false,
"cloud_account_id": "192964173893",
"cloud_provider_display_name": "AWS",
"cloud_provider_id": "gateway-prod.2",
"cloud_provider_name": "amazon",
"context": "customer",
"creation_date": "2019-06-11T20:25:33Z",
"datacenters": [],
"display_name": "Frame Support AWS Account",
"external_id": null,
"gateway": "gateway-prod",
"id": "gateway-prod.459",
"is_default": false,
"is_provider_default": false,
"name": "Frame Support AWS Account",
"owner_id": "d3e7d4e0-5ab2-47cf-9f9c-0b02999931e7",
"properties": {
"cloud_account_id": "192964173893"
},
"status": "ready",
"supported_datacenter_ids": null,
"supported_types": ["frame-high"]
}
]
Status: 200 "OK"
List Customer Elasticity
Returns information on all customer instance elasticity.
GET /customers/:customer_id/elasticity
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/customers/${customer_id}/elasticity
Response Example
{
"buffer_servers": 30,
"max_servers": 250,
"min_servers": 150
}
Status: 200 OK
List Customer Settings
Returns all customer entity settings.
GET /customers/:customer_id/settings
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/customers/${customer_id}/settings"
Response Example
{
"authorized_nutanix_personnel": [
"jason.thompson@nutanix.com",
"alex.fontaine@nutanix.com",
"stuart.allen@nutanix.com"
],
"can_frame_account_support_start_session": null,
"frame_cloud_account_allowed": false,
"frame_support_admin_access": "full_access",
"is_frame_support_customer_admin": true,
"is_generate_session_report_enabled": false,
"is_light_publish_enabled": false,
"is_login_banner_enabled": false,
"is_persistent_desktops_backups_enabled": true,
"is_terminal_banner_enabled": false,
"light_publish_settings": {
"threshold": 10
},
"login_banner_settings": null,
"max_concurrency": 160,
"max_concurrency_per_account": null,
"max_monthly_credits_usage": null,
"max_monthly_credits_usage_description": null,
"max_utility_pools_per_account": 50,
"note": null,
"notification_center_settings": {
"email_addresses": null,
"is_send_notification_emails_enabled": null,
"notify_on_critical": null,
"notify_on_info": null,
"notify_on_warning": null
},
"terminal_banner_settings": null
}
Status: 200 OK
List Customer Overall Usage
Returns information on all customer entity utilization.
GET /customers/:customer_id/usage
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| id | Your Nutanix Customer ID | URL | String | True |
| from_date | The beginning date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | False |
| to_date | The ending date range for the query. The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | Search Query | ISO 8601 UTC String | False |
| resolution_type | Resolution Type: by_hour, by_day, by_month, by_year |
Search Query | String | False |
| server_type | Filters query based on a specific server ID. | Search Query | String | False |
| pool_id | Filters query based on provided instance type's pool ID. | Search Query | String | False |
| instance_type_id | Filters the usage by an instance type's “external” ID, e.g. “gateway-prod.3”. | Search Query | String | False |
| datacenter_id | Limits the results to a specific Datacenter by ID. | Search Query | String | False |
| skip_if_byo_account | True/False boolean value determining if BYO results should be returned. | Search Query | Boolean | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/customers/${customer_id}/usage?from_date=${from_date}&to_date=${to_date}"
Response Example
{
"data": [
{
"account": null,
"account_external_id": "gateway-prod.35917",
"usage": [
{
"datacenter": null,
"datacenter_id": "gateway-prod.1",
"hours_used": 1,
"instance_type": null,
"instance_type_id": "gateway-prod.3152",
"server_type": "production",
"time": 1626454800000
}
// ... more usage data
]
}
// ... more accounts and usage
],
"total": 43533
}
Status: 200 OK
List Customer Disk Volume Usage
Returns information on all customer entity disk volume utilization.
GET /customers/:customer_id/disk_volume_usage?from_date=X&to_date=Y
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| customer_id | Your Nutanix Customer ID. | URL | String | True |
| from_date | The beginning date range for the query. | The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | YYYY-MM-DD Date string | False |
| to_date | The ending date range for the query. | The date needs to be an ISO 8601 UTC string (with the “Z” suffix). For example: “2021-12-25T23:20:58.128Z”. | YYYY-MM-DD Date string | False |
| resolution_type | Resolution Type: by_hour, by_day, by_month, by_year |
Search Query | String | False |
| server_type | Server Type: sandbox, production, utility, persistent_desktop_production, persistent_desktop_shadow | Search Query | String | False |
| disk_volume_type_id | Disk Volume Type: all, standard, gp2, io1 | Search Query | String | False |
| datacenter_id | Limits the results to a specific Datacenter ID number. | Search Query | String | False |
| skip_if_byo_account | True/False boolean value determining if BYO results should be returned. | Search Query | Boolean | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/customers/${customer_id}/disk_volume_usage?from_date=${from_date}&to_date=${to_date}"
Response Example
{
"data": [
{
"account": null,
"account_external_id": "gateway-prod.1791",
"usage": [
{
"datacenter": null,
"datacenter_id": "gateway-prod.3",
"disk_volume_size_used": 180,
"disk_volume_type_id": "gp2",
"hours_used": 36,
"time": 1625101200000
}
// ... more usage data for this account
]
}
// ... more accounts and their usage
],
"total": 758884
}
Status: 200 OK
List Customer Master Images
Returns information on all customer master images.
GET /customers/:customer_id/cloud_services/:external_cloud_service_id/master_images?external_data_center_id=XYZ
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| external_data_center_id | This ID represents a Frame “external” datacenter ID. | Search Query | String | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/customers/${customer_id}/cloud_services/${external_cloud_service_id}/master_images?external_data_center_id=${external_data_center_id}"
Response Example
[
{
"description": "Frame Master Image mif:1, v:0, date:2020-01-28 09:30:10",
"id": "gateway-prod.15474",
"instance_types": [
{
"display_name": "Air 4GB",
"external_id": "gateway-prod.1",
"gpu": "None",
"id": "gateway-prod.1",
"name": "t2.medium",
"ram": 4,
"vcpu": 2
}
"machine_image_family": {
"display_name": "Windows Server 2016 (G4)",
"id": "gateway-prod.xxx",
"name": "FrameAWSWindows20126G4"
},
"master_image_copy_required": null
]
},
// ... more master images
]
Status: 200 OK
List Customer User Activity
Returns statistical user activity information for the specified Customer constrained by a date range. Can be ordered by passing a string parameter as well as exclude specified user IDPs.
GET /customers/:customer_id/user_activities?from_date=X&to_date=Y
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| customer_id | Your Nutanix Customer ID | URL | String | True |
| from_date | The beginning date range for the query. | Search Query | YYYY-MM-DD Date string | True |
| to_date | The ending date range for the query. | Search Query | YYYY-MM-DD Date string | True |
| order | Specifies the order of the results. Use “asc” for ascending order, and “desc” for descending order. | Search Query | String | False |
| order_by | Specifies the field of which the ordering should occur. For example, “session_start”, “session_duration”, etc. | Search Query | String | False |
| skip_user_idps | User Identity Providers to skip. | Search Query | Array (String) | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/customers/${customer_id}/user_activities?from_date=${from_date}&to_date=${to_date}&skip_user_idps[]=example-okta-admins&skip_user_idps[]=example-okta-dev
Response Example
{
"data": [
{
"access_date": "2022-02-01",
"access_datetime": "2022-02-01T21:11:00.398870Z",
"account_id": "0e52b11b-23bf-411e-a070-bc0ea014cbc2",
"customer_id": "6ba31e38-1735-4274-a58e-6fb8c662e425",
"organization_id": "bc24563d-375b-49fb-8f15-1682b8bc6deb",
"user_email": "dontcallme.shirley@example.com",
"user_first_name": "Shirley",
"user_id": "20acd3a2-b455-4dca-b22b-520e16079e11",
"user_idp": "example-okta-workforce",
"user_last_name": "Dontcallme"
}
// ... more User Activities
],
"total": 66866,
"total_unique": 8133
}
Status: 200 OK
Infrastructure Endpoints
List Cloud Providers
Returns a list of available Cloud Providers. These are Frame IaaS cloud providers, such as Amazon, Azure, and Google, using Frame-managed subscriptions.
GET /cloud_providers
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/cloud_providers"
Response Example
[
{
"byo_compatible": true,
"datacenters": null,
"display_name": "AWS",
"external_id": "gateway-prod.2",
"formation_url": null,
"name": "amazon"
},
{
"byo_compatible": true,
"datacenters": null,
"display_name": "Azure",
"external_id": "gateway-prod.4",
"formation_url": null,
"name": "azure"
},
{
"byo_compatible": true,
"datacenters": null,
"display_name": "Google",
"external_id": "gateway-prod.5",
"formation_url": "https://console.cloud.google.com/cloudshell/editor?cloudshell_git_repo=https%3A%2F%2Fgithub.com%2Fmainframe2%2Fgcp-byo-cloud-shell-deployment.git&cloudshell_git_branch=prod_role_deployment&cloudshell_open_in_editor=deploy.sh",
"name": "google"
},
{
"byo_compatible": true,
"datacenters": null,
"display_name": "Nutanix-AHV",
"external_id": "gateway-prod.3",
"formation_url": null,
"name": "nutanix"
}
]
Status: 200 "OK"
List Datacenters
Provides a list of datacenters associated with the cloud service along with what Frame Image Families and Instance Types are available in each datacenter.
GET /datacenters
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| external_cloud_service_id | Filters results based on the ID of a Cloud Service provider (BYO Infrastructure). If you're not using Frame IaaS and you instead brought your own cloud provider, this is what you want. | Search Query | String | False |
| external_cloud_provider_id | Filters results based on the Frame IaaS Cloud Provider ID for AWS, Azure, GCP, or Nutanix. | Search Query | String | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/datacenters?external_cloud_service_id=gateway-prod.1337""
Response Example
[
{
"availability_zones": [
"us-east-1a",
"us-east-1b",
"us-east-1c",
"us-east-1d",
"us-east-1e",
"us-east-1f"
],
"bare_metal": true,
"configured": null,
"display_name": "Northern Virginia",
"geo_lat": 39.043611,
"geo_long": -77.4875,
"id": "gateway-prod.1",
"image_families": [],
"name": "aws-va",
"region": "us-east-1"
}
// ...
]
Status: 200 "OK"
List Image Families
Returns all image families and their supported instance types.
GET /image_families
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| cloud_provider_name | Filter results by the Cloud Provider's name, e.g. “amazon”, “azure”, “google”, or “nutanix”. | Search Query | String | False |
| byo | Determines wether or not to filter by BYO (Bring your own infrastructure) or not. | Search Query | Boolean | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/image_families?external_data_center_id=${external_datacenter_id}&cloud_provider_name=amazon"
Response Example
[
{
"display_name": "Windows Server 2016",
"external_id": "gateway-prod.x",
"id": "gateway-prod.x",
"instance_types": [
{
"display_name": "Air 4GB",
"external_id": "gateway-prod.x",
"gpu": "None",
"id": "gateway-prod.x",
"name": "t2.medium",
"ram": 4,
"vcpu": 2
}
],
"master_image_copy_required": false,
"name": "WindowsServer2016"
}
// ...
]
Status: 200 OK
List Cloud Services
Returns a list of registered Cloud Service Providers configured with Frame.
GET /cloud_services
Request Parameters
| Name | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| organization_id | Filters results based on a provided Nutanix Organization ID. | Search Query | String | True |
| name | Filters results based on a Cloud Service's “name” field. | Search Query | String | False |
| cloud_provider_name | Filters results based on the specified cloud provider: amazon, azure, google, or nutanix | Search Query | String | False |
| active | Filters results by their active status - useful for filtering out inactive cloud services. | Search Query | Boolean | False |
| omit_default | If true, omits Frame's default Cloud Services from the results. | Search Query | Boolean | False |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/cloud_services"
Response Example
[
{
"byo_compatible": true,
"datacenters": null,
"display_name": "AWS",
"external_id": "gateway-prod.2",
"formation_url": null,
"name": "amazon"
},
{
"byo_compatible": true,
"datacenters": null,
"display_name": "Nutanix-AHV",
"external_id": "gateway-prod.3",
"formation_url": null,
"name": "nutanix"
},
{
"byo_compatible": true,
"datacenters": null,
"display_name": "Azure",
"external_id": "gateway-prod.4",
"formation_url": null,
"name": "azure"
},
{
"byo_compatible": true,
"datacenters": null,
"display_name": "Google",
"external_id": "gateway-prod.5",
"formation_url": "https://console.cloud.google.com/cloudshell/editor?cloudshell_git_repo=https://yadda.com/etc/",
"name": "google"
}
// ...
]
Status: 200 "OK"
List Cloud Service VPCs
Returns a list of VPCs and their Subnets for a Cloud Service & Datacenter by ID.
GET /cloud_services/:cloud_service_id/vpcs
Request Parameters
| Parameter | Description | Param Type | Data Type | Required |
|---|---|---|---|---|
| cloud_service_id | ID of the Cloud Services hosting VPCs. | Search Query | String | True |
| datacenter_id | ID of the Datacenter that you'd like to list VPCs from. | Search Query | String | True |
Request Example
curl -X GET \
-H "X-Frame-ClientId: ${client_id}" \
-H "X-Frame-Timestamp: ${timestamp}" \
-H "X-Frame-Signature: ${signature}" \
"https://api.console.nutanix.com/v1/cloud_services
Response Example
[
{
"cidr": "10.0.0.0/18",
"id": "vpc-1d0a7baa5a9a1e71f",
"name": "prod:v8675309:vpc0",
"resource_group": null,
"subnets": [
{
"az": "us-east-2c",
"cidr": "10.0.16.0/21",
"delegated": null,
"id": "subnet-01586eaf1f4182ed8",
"name": "prod:v8675309:sn2",
"nat_gateway": null,
"private": false,
"resource_group": null
},
{
"az": "us-east-2b",
"cidr": "10.0.8.0/21",
"delegated": null,
"id": "subnet-0c1a9ce0dc7c1de1e",
"name": "prod:v8675309:sn1",
"nat_gateway": null,
"private": false,
"resource_group": null
},
{
"az": "us-east-2a",
"cidr": "10.0.0.0/21",
"delegated": null,
"id": "subnet-07c93b527007eb542",
"name": "prod:v8675309:sn0",
"nat_gateway": null,
"private": false,
"resource_group": null
}
]
}
// ... more VPCs and subnets.
]
Status: 200 "OK"
Session API
Tokens through SSO / SAML2, Session API
Acquire Tokens through SSO (SAML2)
Through SAML2 integrations with Frame, you can leverage existing SSO workflows to retrieve tokens for your users. Here's a general overview of what that process looks like:
To get started, there are three key items needed when using SSO workflows to authenticate your users:
-
You need to build a SSO URL for your SAML2 integrations. This URL is used to kick-off the authentication process to retrieve a token for your users.
-
To use the token with our Session API, your web application should expect and capture the token search query parameter to be present in the URL.
-
A SAML2 relying party is required for each domain name (e.g. example.com) you wish provide authenticated redirects to (e.g.
acme.comorlocalhost:3000).:::info
Adding relying parties for your SAML2 integrations is currently a manual process. Please create a support ticket.
:::
Building a SSO URL
Using an existing SAML2 integration with Frame, you can construct an SSO link to authenticate your users and return them to the URI that is hosting your Frame Session API.
https://img.frame.nutanix.com/login?account_type=saml2-tutorial-example&return_url=https://example.com/frame-tutorial
To illustrate, here's a breakdown of the SSO URL:
These three URL components tell us where to send users to login, and where to redirect their browser to (with a token) after they've successfully signed in.
| URL Search Query Param | Description |
|---|---|
| Base Login URL | This URL points to the Frame environment you'd like to authenticate with. For most Frame customers, this will be https://img.frame.nutanix.com/login? |
account_type |
This represents your SAML2 integration name. This tells our system where to redirect the user to login. This value is case-sensitive and must match the exact name of your SAML2 provider. |
return_url |
The URL you'd like to redirect your users back to after authenticating. When redirecting after a successful login, this URL is accompanied by a JWT in the URL as a search query parameter. |
Capturing the token from the Return URL
When successfully authenticating with a SSO workflow, the browser will be redirected to the return_url with a token search query parameter.
For example, if a user successfully logs in using this SSO URL:
https://img.frame.nutanix.com/login?account_type=acme-saml2&return_url=https://example.com/frame-example
Frame will redirect the user's browser back to the return_url with a token (JWT) appended as a search query parameter:
https://example.com/frame-example?token=xyz
Using Javascript, you can easily capture the value for use with the Session API like this:
// assign URL Search params to `params`
const params = new URLSearchParams(document.location.search);
// At this point, you can use the token with the Frame Session API
const token = params.get('token');
// Session API Parameters
const terminalOptions = {
serviceUrl: "https://cpanel-backend-prod.frame.nutanix.com/api/graphql",
terminalConfigId: "38cb4f1c-a019-4163-9f1d-168b59fb5062.0f3a542b-884e-4edc-aa5f-65380597061",
token: token
};
let terminal = await createInstance(terminalOptions);
// Optional: you can store the token somewhere for re-use, such as localStorage.
localStorage.token = token
// Optional: Clear the token from the URL
params.delete('token');
window.history.replaceState({}, document.title, document.location.pathname + params.toString());
Session API
The Frame Session API lets you seamlessly integrate virtual desktops and applications into your own custom web-based workflows. Using JavaScript, the Session API gives you control of the Frame Terminal, an HTML5 client for remotely accessing applications hosted on your Frame account in the cloud. With the Frame Session API, you can stop or resume application sessions, query application information, and much more.
Session API Prerequisites
- An active Frame account with published applications and a configured Launchpad.
- An active SAML2 or a Secure Anonymous Token provider with roles and permissions configured (for session authentication).
- Nodejs and npm.
- A web application bundler like Webpack, Vite, or Parcel to bundle Frame's Session API for use in a browser.
- Terminal Configuration ID. This is a unique ID that represents which Launchpad and resource pool you would like Terminal to launch sessions from.
- Application ID. Used to start Specific apps. Application IDs are not used with Desktop Launchpads.
Required Session API Components
The following components are required for the Frame Session API:
- Service URL (Frame environment endpoint)
- Launchpad Terminal Configuration ID
- Application ID (application Launchpads only)
- Authentication token
To obtain these components, navigate to the Dashboard of the account you wish to use with the Session API. Click Launchpads on the left menu. Click on the ellipsis in the upper right corner of your desired Launchpad select Session API Integration.
A new window will appear providing you with the service URL, a list of Terminal configuration IDs for each enabled instance type on this Launchpad, and Application IDs for every application on the Launchpad. You can copy all required information by clicking on the copy icon listed to the right of each ID.
Sessions require a valid authentication token provided by Frame's identity services. There are two different methods to obtain these tokens:
The SSO workflow involves sending a user to a Single Sign-On (SSO) URL which triggers multiple SAML2 redirects to sign the user in to their IdP. Once the user is authenticated, the user's browser will be redirected to a specified URL with the token appended as a URL search query parameter.
The SAT workflow involves a user visiting a self-hosted website. When receiving the request, the web server can use our SAT API to retrieve a token for that user. After the token is instantly retrieved, the page can be loaded, passing the token to the user's browser.
Installation
First, you will need to install the Frame Terminal package. Once installed, we recommend using a web application bundler to bundle your JavaScript app for browsers for the modern web. To get started, run the following command from your command line:
npm install @fra.me/terminal-factory
This package contains a factory method, which builds a Frame Terminal instance based on account-specific parameters that are passed into it. With these account parameters, the factory will download the required components to specification, fetch all the assets from our CDN, and create an instance of the Frame Terminal. You will automatically receive any updates, features, and improvements without needing to update the npm package with this factory module.
Instantiate a Terminal Instance
The Session API requires the following parameters to instantiate a Terminal instance:
| Parameter | Description |
|---|---|
| serviceUrl | Indicates which Frame environment you're streaming apps from. This value is almost always going to be https://cpanel-backend-prod.frame.nutanix.com/api/graphql |
| terminalConfigId | A unique ID that represents which Launchpad and VM resource pool you would like to use the API to stream sessions from. |
| Auth Token (JWT) | A JSON Web Token acquired through Frame authentication workflows (via SAML2 integrations or a Secure Anonymous Token Provider.) |
Once you have the necessary information to create a Terminal instance
and start sessions, you can include the Frame Session API in your code.
Then, use the createInstance method along with an Async/Await function
to pass in an object specifying the 3 key attributes above.
let terminal; // declare a variable for a Terminal instance.
const loadFrame = async () => {
// Session API Parameters
const terminalOptions = {
serviceUrl: "https://cpanel-backend-prod.frame.nutanix.com/api/graphql",
terminalConfigId: "38cb4f1c-a019-4163-9f1d-168b59fb5062.0f3a542b-884e-4edc-aa5f-65380597061",
token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
};
// Create a Terminal instance and bind it to the `terminal` variable.
try {
terminal = await createInstance(terminalOptions);
// more code...
} catch (e) {
// handle error
}
}
If your configuration options were accepted and the token is valid,
terminal can be used to start sessions, pass custom data to the remote
VM, etc.
Session Workflow Events (Terminal Events){#terminal-events}
During the lifetime of a Session API Terminal instance, various events will be triggered so that the parent page is informed about Terminal changes. If you want to register a handler for a specific event, you should use the bind function:
terminal.bind("someEventName", function(event) {
console.log("Event has been thrown: " + event.code);
});
Session API Terminal Events
| Event | Description |
|---|---|
| TerminalEvent.SESSION_STARTING | Triggered when a session is starting. |
| TerminalEvent.SESSION_STARTED | Triggered when the session start process has completed. |
| TerminalEvent.SESSION_RESUMING | Triggered when a session begins the resume process. |
| TerminalEvent.SESSION_RESUMED | Triggered when a session completes the resume process. Triggered only when the first frame is rendered. |
| TerminalEvent.SESSION_CLOSING | Triggered when a session begins the close process. |
| TerminalEvent.SESSION_CLOSED | Triggered when a session has finished the close process. |
| TerminalEvent.SESSION_DISCONNECTED | Triggered when a session has been disconnected (not closed). |
| TerminalEvent.SESSION_STATISTICS | Triggered each time we calculate the session's performance metrics. |
| TerminalEvent.USER_INACTIVE | Triggered when a user is considered inactive (no input received over a specified duration). |
For example, the syntax for listening for the TerminalEvent.SESSION_STARTING event would be:
terminal.bind(TerminalEvent.SESSION_STARTING, function(event) {
console.log("Event has been thrown: " + event.code);
});
Starting a session is relatively straightforward. You can start two types of sessions – Application and Desktop sessions.
Starting a Desktop session:
await terminal.start();
Starting an Application session is very similar but the start method requires an object with an appId parameter.
await terminal.start({ appId: "3cb37b52-34af-4676-90d6-6b104b87061b" });
Pass data into the session with userData{#userdata}
When invoking start(), you can optionally pass custom data via a userData object property.
For example, to start a desktop-based session with additional data: Here's another example, starting an app-based session with additional data:
const sessionData = { userData: "any data you'd like to pass into the session" };
await terminal.start(sessionData);
Here's another example with a JSON object as a string:
const exampleData = `{"user": "John Smith","user_id": "1588383008","token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"}`
await terminal.start( { appId: "xyz", userData: exampleData } );
Retrieve userData from the remote system
When userData is supplied at the start of a session, it can be
found in the remote system as an environmental variable named
FRAME_USER_DATA.
Example in Command Prompt:
Example in PowerShell:
Get-ChildItem Env:FRAME_USER_DATA | Format-Table -Wrap -AutoSize
You can use this userData parameter to pass any information you'd like into the remote system. Then, use scripts/software on the remote system to access and parse those variables.
Resume Sessions
If a user disconnects from a session (e.g. timed out, manually disconnected, or refreshed their page) and would like to resume their session, all you need is their active session ID. With the session ID, you can resume a session as follows:
const session = await terminal.getOpenSession();
if (session) {
await terminal.resume(session.id);
}
Error Handling
Handling Session API errors is rather simple using try/catch blocks
with async/await. When an error is caught, you must have access to
the error name, message, and stack attributes.
Here is an example of catching an invalid or expired auth token:
const loadFrame = async () => {
// Session API Parameters with an expired token
const terminalOptions = {
serviceUrl: "https://cpanel-backend-prod.frame.nutanix.com/api/graphql",
terminalConfigId: "38cb4f1c-a019-4163-9f1d-168b59fb5062.0f3a542b-884e-4edc-aa5f-65380597061",
token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
};
try {
terminal = await createInstance(terminalOptions);
// ..
} catch (err) {
console.error(err.message); // Network error: Response not successful: Received status code 401
}
}
Error Codes
Frame Session API Terminal Error Codes
| Code | Name | Description |
|---|---|---|
| 5000 | USER_ABORTED_CONNECTION | User-initiated disconnect from the network connection. |
| 5001 | CONNECTION_ABORTED | The network connection was lost. |
| 5002 | CONNECTION_LOST | Network was disconnected. |
| 5100 | CONFIG_VALIDATION_ERROR | Terminal configuration parameters are not valid. |
| 5101 | TERMINAL_LOAD_FAILED | The Frame Terminal assets failed to load from our CDN. |
| 5102 | TOKEN_MISSING | No token provided. |
| 5110 | TERMINAL_ACTION_INVALID_STATE | Invalid Terminal state for the action requested. |
| 5111 | PLAYER_ACTION_INVALID_STATE | Invalid Player state for the action requested. |
| 5200 | PLAYER_START_CANCELED | The start request for the session has been canceled. |
| 5202 | VIDEO_DECODERS_FAILED | Video decoder failed. |
| 5203 | USER_BLOCKED_AUDIO | Indicates a problem accessing Audio in the browser. |
| 5250 | FILE_UPLOAD_CANCELED | File transfer upload canceled. |
| 5251 | FILE_UPLOAD_FAILED | File transfer upload failed. |
| 5300 | APPLICATION_START_FAILED | The application failed to start. Please check the application and session logs for further details. |
| 5301 | APPLICATION_CLOSE_FAILED | Could not close the application properly |
| 5302 | APPLICATION_NOT_FOUND | The appId provided is invalid. |
| 5303 | APPLICATION_START_FORBIDDEN_PARAMETER | Event when an appId is provided for a desktop-based Terminal Configuration ID. |
| 5304 | APPLICATION_ID_PARAMETER_MISSING | An appId is wasn't provided for an application-based Terminal Configuration ID. |
| 5400 | SESSION_REQUEST_ACTIVE | Indicates a session start session request has already been initialized for that token and Launchpad configuration. |
| 5401 | SESSION_REQUEST_ALREADY_OPEN | Indicates that a session resume request was called for a token/user, but a session request is already in progress for another session. |
| 5402 | SESSION_REQUEST_ABORTED | Session request aborted. |
| 5403 | SESSION_RESUME_MISSING_PARAMETER | A valid session ID is missing when calling terminal.resume(). |
| 5404 | SESSION_IN_INVALID_STATE | A previous session is still closing or there is no available capacity for this account/region. If this persists, please contact your Administrator. |
| 5405 | NO_ACTIVE_SESSION | An unexpected error occurred causing the active session to close abruptly. |
| 5406 | DOMAIN_JOIN_ERROR | An error occurred when attempting to join a domain. |
| 5407 | USER_CANCELED_DOMAIN_JOIN | Triggered if the end-user's browser was reloaded or closed during a domain joining phase. |
| 5900 | INTERNAL_ERROR | Internal Error. Please contact Frame Support for more info. |
| 5901 | UNEXPECTED_SERVICE_ERROR | An unexpected error was received when communicating with Frame Services. |
| 5902 | UNKNOWN_INVALID_PARAMS | Unknown or Invalid Parameters. |
| 5903 | UNKNOWN_INVALID_STATE | Unknown or Invalid State. |
| 5904 | CONTROLLER_ALREADY_DESTROYED | Internal Error. Please contact Frame Support for more info. |
| 5905 | INTERNAL_RPC_ERROR | Internal Error. Please contact Frame Support for more info. |
| 5906 | RPC_ERROR | RPC Error. |
| 5907 | WEB_GL_ERROR | An error trying to access WebGL. Please check to ensure that the browser and device are WebGL capable. |
Session API Reference
This section outlines each of the methods available for creating and interacting with the Frame Session Terminal instance. This reference describes the methods and object types using Typescript type definitions.
createInstance()
A terminal instance can be generated using the factory function
createInstance. All necessary configuration parameters need to be
passed via a TerminalLocalConfig object. This is an asynchronous
function that will resolve with a promise once the Terminal instance
has been constructed.
TerminalLocalConfig type declaration:
TerminalLocalConfig = {
serviceUrl: string;
token: string;
terminalConfigId: string;
}
Invoking createInstance will return an instance of the Terminal class as below:
class Terminal = {
destroy(): void;
bind(eventName: string, listener: Function): void;
unbind(eventName: string, listener: Function): void;
once(eventName: string, listener: Function): void;
start(sessionStartConfig: object): Promise<Session>;
stop(): Promise<void>;
resume(sessionId: string): Promise<Session>;
disconnect(): Promise<void>;
getState(): TerminalState;
getOpenSession: Promise<Session>;
}
bind()
bind(eventName: string, listener: Function): void;
Used to attach a listener to a Terminal event. Once we trigger an event internally, all registered listeners will be invoked. An example:
terminal.bind(TerminalEvent.SESSION_STARTED, () => console.log('started!'));
unbind()
unbind(eventName: string, listener: Function): void;
Performs the opposite action of bind. Unbind removes a registered handler for a particular event.
once()
once(eventName: string, listener: Function): void;
Performs the same action as bind, but
the handler is automatically unbound once an event is thrown. It is
designed for situations requiring only the first occurrence of some
event (you wish to listen only once for an event).
start()
start(options?: sessionStartConfig): Promise<Session>;
sessionStartConfig type declaration:
sessionStartConfig = {
appId?: string,
userData?: string,
};
Invoking Start() initiates the session stream for the user. This method takes an optional object as an argument that can supply an appId and/or [userData]. Invoking Start() with an appId will start a session in "application mode" and then start the provided app. Otherwise, the terminal will start a default "desktop mode" session. Invoking this method should return a promise which will be resolved as a Session object once the user can see the session video stream.
Session type declaration:
type Session = {
id: string;
state: SessionState;
isResumed: boolean;
}
stop()
stop(): Promise<void>;
Stops the current session, both on the backend and locally. For example,
if a user can see the stream and you invoke stop, it will close the
session and destroy the iframe.
resume()
resume(sessionId: string): Promise<Session>;
If you have a session which is running (for example, a user disconnected or has reloaded a page during an active session), you can "re-attach" to that session via this method. All that's required is a valid session ID as a string.
disconnect()
disconnect(): Promise<void>;
Disconnect should be invoked only when the user is in the session. Once
called, the Session API will shut down the stream and return the user to
the host page; it will not close the session -- it will remain active on
the backend, ready for a user to connect until a configured timeout is
reached.
getOpenSession()
getOpenSession(): Promise<Session>;
Returns an object of Session type for
the current session.
getState()
getState(): TerminalState;
Returns the current state of a Terminal instance.
Terminal states:
TerminalState = [
READY = 'ready',
RUNNING = 'running',
STARTING = 'starting',
STOPPING = 'stopping'
]
setToken()
setToken(token: string): Promise<void>;
When invoked, this method sets a user auth token in the Terminal instance. This is used to replace an old/expired token with a new one.
destroy()
destroy(): void;
This function behaves as a "destructor" and will destroy the Terminal
at any point in its life cycle. For example, if a session is running and
you invoke destroy, it will destroy the iframe and the entire internal
Terminal state. After destruction, that Terminal API instance cannot
be used. Destroy should be used in the cleanup process of the parent project
(e.g. during unmount of components/elements).
startApplication()
startApplication(appId: string): Promise<void>;
When invoked, this method starts an application that was onboarded. This only works for onboarded applications and not for applications that were added to the Frame Taskbar via App Mode 2.0 server override configurations
focusApplication()
focusApplication(appId: string): Promise<void>;
When invoked, this method focuses an application that was already started (Manually via the Frame Taskbar, or using startApplication()). Focusing an application is the functionally the same and bringing a window forward in windows. If app1 is in the front and focused, you can focus app2 in the background and this method will bring app2 in front of app1 and focus on app2 (Mouse and keyboard events will go to app2). This only works for onboarded applications that have an associated AppID
Additional Information
Decoding a JWT in Javascript
You can decode the token's data easily to gather values and check expiration dates, etc.
const decodedToken = JSON.parse(atob(token.split('.')[1]))
The JWT payload references data such as the user's first name, last name, email address, token expiration date, not valid before date, etc.
JWT Data Attributes
| Attribute | Description |
|---|---|
| em | email address |
| fn | first name |
| ln | last name |
| exp | expiration date (seconds since Unix epoch) |
| nbf | not-valid-before date (seconds since Unix epoch) |
| ap | Auth provider, this value represents the auth integration name configured by an Admin |
| aud | audience, his represents the Frame environment the token is for |
| sub | subject, this represents a unique user ID the token is for |
Glossary of Terms
| Term | Description |
|---|---|
| Session | A session represents the total duration a remote system is in use by a user, from start to finish. |
| Terminal | “Terminal” represents the instance of a session player delivered via the browser. |
| Token | A string (in JWT format) provided by Frame Services for authenticating Frame Sessions. |
| JWT | JSON Web Tokens are an open, industry standard method for representing claims securely between two parties. |
| SSO | Single sign-on (SSO) is an authentication process that allows a user to access multiple applications with one set of login credentials. |
| SAT | Secure Anonymous Token. For more information, see our Secure Anonymous Token documentation. |
| Environment Variable | An environment variable is a dynamic value that the operating system and other software can use to determine information specific to that system. |