Developer's Guide

API documentation and developer resources

Admin API

Admin API, Account Endpoints, Organization Endpoints, Customer Endpoints, Infrastructure Endpoints

Admin API

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:

  1. Authenticate with the Frame REST API to sign the HTTPS API request. You'll need to create a signature with the client_id, the client_secret, and a timestamp. The client_id and client_secret is obtained by a Frame administrator in Frame Console.

  2. Make the HTTPS REST call to the Admin API endpoint using the client_id, timestamp, and the signature in the HTTP header.

  3. 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

  1. Navigate to your Frame Admin Console as an Administrator.

  2. Navigate to the Customer or Organization page and select Users from the left-hand menu.

  3. Enable the API option and click Save. The API tab will appear on the Users Page. This tab lists all of the API providers that have been created at the Customer or Organization level.

  4. Go to the newly created API tab and click Add API User.

  5. Enter a name for the API provider and choose the role and scope (customer, organization, or account) you would like to grant to the API key. You may assign more than one role and scope to the API provider by clicking on Add a role. Click Add at the bottom of the window once you have defined the name, role(s), and scope(s).

  6. After successfully creating a new API Use, its credentials will be displayed. Record the client_id and client_secret to be used later by your API calls.

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:

  1. Get the current timestamp.

  2. Create a string by concatenating the timestamp with the client_id (timestamp + client_id).

  3. 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.

Admin API

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
The instance type ID can be found by using the [List Instance Types](account#list-instance-types) endpoint and specifying the `id` for the instance type you want to use
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.

You must "Enable Session Reports" in the General tab of the Account Settings for this endpoint to work. If you do not enable this feature, you will get an empty array and HTTP 200 response from your request.

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_DATA

touch: 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).

This endpoint is required to [reassign persistent desktops](#reassign-persistent-desktop) for persistent Frame Accounts. However, this endpoint can be used with any other account type.

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
** If `force` is set to true, the server will be rebooted immediately **
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
** If `force` is set to true, the server will be stopped immediately. This will not be considered a clean shutdown by the VM **
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
**This is an irreversable action, use with caution!**
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.

Practice caution and make sure you understand the meanings of minimum, buffer, and maximum server elasticity values before setting them via API. Incorrectly setting these values can be expensive in regards to infrastructure costs and resources.

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.

Practice caution with these values. For example, setting a lower **max_users** value below the current number of assigned persistent desktops will result in zero unassigned persistent desktops for new users. Incorrectly setting these values can be expensive in regards to infrastructure costs and resources.

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.

This process will overwrite the Sandbox image for the target account which means all existing data will be lost. Be sure to perform a backup before continuing.

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

Returns authorization rules for the account, organization, and customers, respectively.

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"
Use the **pending_request.id**/**task_id** to track the status of your account creation via [[Get Task Status]](#get-task-status).

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
You can combine launchpad creation with other automation APIs, such as onboarding apps to your sandbox, publishing, and toggling apps and instance types on a Launchpad. All of these endpoints are documented here.
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: namepathworking_directoryicon_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: namepathworking_directoryicon_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
You can find your application IDs by querying [GET /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

Admin API

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
Admin API

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
Admin API

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

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:

  1. 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.

  2. 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.

  3. A SAML2 relying party is required for each domain name (e.g. example.com) you wish provide authenticated redirects to (e.g. acme.com or localhost: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:

Session API

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

Required Session API Components

The following components are required for the Frame Session API:

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);
});
Events must be bound **before starting or resuming a session**.
## Start Sessions

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.

The *userData* parameter can only contain a single string within 10,000 characters.

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
  }

}
Try/catch blocks will only catch errors "bubbled" up from **asynchronous** calls. For example, you must call async methods like `await terminal.start()` instead of `terminal.start()`.

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

focusApplication() only works in the original legacy App Mode (Pre App Mode 2.0). Legacy App Mode will eventually be deprecated and this feature will no longer work once App Mode 2.0 becomes standard

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.