PingOne Platform APIs

DaVinci Flow Capabilities (HTML)

POST {{authPath}}/{{envID}}/davinci/connections/{{connectionID}}/capabilities/{{capabilityName}}

The POST {{authPath}}/{{envID}}/davinci/connections/{{connectionID}}/capabilities/{{capabilityName}} operation initiates the DaVinci authentication flow by specifying the connection and the capabilities associated with that connection. The capability name (for example, customHTMLTemplate) and the connection ID are specified in the request URL. The DaVinci interactionId and interactionToken should be set as headers in the request.

This sample request shows the customHTMLTemplate capability, which is a common capability to build a form for collecting user information required by the flow. The request body includes a formData property that specifies the form fields needed by the flow to register a new user. Note that this is just one sample usage of the customHTMLTemplate capability. If the actionKey property specified a sign-on action instead of registration, the flow might use different or fewer fields.

The parameters property includes the eventType value, which is submit for a SUBMIT_BUTTON and action for a FLOW_BUTTON. The actionKey property varies based on whether the flow needs to submit the form data using the SUBMIT_BUTTON or take a secondary action using the FLOW_BUTTON.

  • "eventType": "action" should be passed in the payload when a FLOW_BUTTON action is intended.

  • "eventType": "submit" should be passed in the payload when a SUBMIT_BUTTON action is intended.

The actionKey in both the above cases should be mapped to the key of the SUBMIT_BUTTON or FLOW_BUTTON.

The response includes a form property that builds the form. The components.fields property defines the fields and buttons presented to users to initiate the specified action.

This endpoint supports different request body property values depending on the flow action required. Click the Request model heading below to show the required properties and additional sample request payloads.

Request Model
Property Type? Required?

eventName

String

Required

id

String

Required

interactionId

String

Required

parameters

Object

Required

parameters.eventType

String

Required

parameters.data

Object

Required

parameters.data.actionKey

String

Required

parameters.data.formData

Object

Required

parameters.data.formData.{{attribute}}

String

Required

Refer to the DaVinci flow capabilities data model properties for full property descriptions.

Request body properties for actions

The following request body samples show the different request payloads for the most common flow actions.

Secondary action, navigate to register route

{
   "id": "0mkskx7cez",
   "eventName": "continue",
   "parameters": {
     "eventType": "action",
     "data": {
       "actionKey": "REGISTER",
       "formData": {
       }
     }
   }
 }

Submit action where form details are submitted

 {
   "id": "x0txd3bdfn",
   "eventName": "continue",
   "parameters": {
     "eventType": "submit",
     "data": {
       "actionKey": "REGISTER",
       "formData": {
         "email" : "DummyEmail@dummydomain.com",
         "password" : "DummyPassword@1234"/       }
     }
   }
 }

Resend verification code during registration

{
   "id": "o4yhix414e",
   "eventName": "continue",
   "parameters": {
     "eventType": "action",
     "data": {
       "actionKey": "RESEND",
       "formData": {
       }
     }
   }
 }



 {
   "id": "o4yhix414e",
   "eventName": "continue",
   "parameters": {
     "eventType": "submit",
     "data": {
       "actionKey": "VERIFY",
       "formData": {
         "passcode" : "1ki2dsaq"
       }
     }
   }
 }

Last step to get the PingOne session token

{
   "id": "h2cy2gkjip",
   "eventName": "continue",
   "parameters": {
     "eventType": "submit",
     "data": {
       "actionKey": "NEXT",
       "formData": {
       }
     }
   }
 }


 {
   "id": "65u7m8cm28",
   "eventName": "continue",
   "parameters": {
     "eventType": "action",
     "data": {
       "actionKey": "TROUBLE",
       "formData": {
       }
     }
   }
 }

From forgot password, to cancel and go back

{
   "id": "afyus0g868",
   "eventName": "continue",
   "parameters": {
     "eventType": "action",
     "data": {
       "actionKey": "CANCEL",
       "formData": {
       }
     }
   }
 }

Enter email for forgot password to send a recovery code to the id

{
   "id": "afyus0g868",
   "eventName": "continue",
   "parameters": {
     "eventType": "submit",
     "data": {
       "actionKey": "CONTINUE",
       "formData": {
         "username":"DummyEmail@dummydomain.com"
       }
     }
   }
 }

Resend verification code to email if needed

{
   "id": "9gi11xivkc",
   "eventName": "continue",
   "parameters": {
     "eventType": "action",
     "data": {
       "actionKey": "RESEND",
       "formData": {
       }
     }
   }
 }

Enter recovery code, new password, and confirm new password

{
   "id": "9gi11xivkc",
   "eventName": "continue",
   "parameters": {
     "eventType": "submit",
     "data": {
       "actionKey": "UPDATE",
       "formData": {
         "recoveryCode" : "sv4tk2oe",
         "newPassword" : "*******",
         "verifyNewPassword" : "*******"
       }
     }
   }
 }

Password recovery is successful. Submit form to get a PingOne session token

{
   "id": "c28j6unuv1",
   "eventName": "continue",
   "parameters": {
     "eventType": "submit",
     "data": {
       "actionKey": "NEXT",
       "formData": {
       }
     }
   }
 }

Successful login

{
   "id": "65u7m8cm28",
   "eventName": "continue",
   "parameters": {
     "eventType": "submit",
     "data": {
       "actionKey": "SIGNON",
       "formData": {
         "username" : "DummyEmail@dummydomain.com",
         "password" : "DummyPassword"

       }
     }
   }
 }

Incorrect login details

{
   "id": "dnu7jt3sjz",
   "eventName": "continue",
   "parameters": {
     "eventType": "submit",
     "data": {
       "actionKey": "SIGNON",
       "formData": {
         "username" : "DummyEmail@dummydomain.com",
         "password" : "DummyPassword"
       }
     }
   }
 }

Incorrect registration

{
   "id": "65u7m8cm28",
   "eventName": "continue",
   "parameters": {
     "eventType": "action",
     "data": {
       "actionKey": "REGISTER",
       "formData": {
       }
     }
   }
 }


 {
   "id": "leznhnimpg",
   "eventName": "continue",
   "parameters": {
     "eventType": "submit",
     "data": {
       "actionKey": "REGISTER",
       "formData": {
         "email" : "DummyEmail@dummydomain.com",
         "password" : "******"
       }
     }
   }
 }

Sign on with expired password and password reset

{
   "id": "65u7m8cm28",
   "eventName": "continue",
   "parameters": {
     "eventType": "submit",
     "data": {
       "actionKey": "SIGNON",
       "formData": {
         "username" : "DummyEmail@dummydomain.com",
         "password" : "******"
       }
     }
   }
 }


 {
   "id": "yscz5j5r84",
   "eventName": "continue",
   "parameters": {
     "eventType": "submit",
     "data": {
       "actionKey": "UPDATE",
       "formData": {
         "currentPassword" : "******",
         "newPassword" : "*******",
         "verifyNewPassword" : "******"
       }
     }
   }
 }


 {
   "id": "3rcqks6t1v",
   "eventName": "continue",
   "parameters": {
     "eventType": "submit",
     "data": {
       "actionKey": "NEXT",
       "formData": {
       }
     }
   }
 }

Headers

Content-Type      application/json

interactionId      {{interactionID}}

interactionToken      {{interactionToken}}

Body

raw ( application/json )

{
  "id": "0mkskx7cez",
  "eventName": "continue",
 "interactionId": "095036ef-2270-4f40-99ba-9e7f83379868",
  "parameters": {
    "eventType": "action",
    "data": {
      "actionKey": "REGISTER",
      "formData": {

      }
    }
  }
}

Example Request

  • cURL

  • C#

  • Go

  • HTTP

  • Java

  • jQuery

  • NodeJS

  • Python

  • PHP

  • Ruby

  • Swift

curl --location --globoff '{{authPath}}/{{envID}}/davinci/connections/{{connectionID}}/capabilities/{{capabilityName}}' \
--header 'interactionId: {{interactionID}}' \
--header 'interactionToken: {{interactionToken}}' \
--header 'Content-Type: application/json' \
--data '{
  "id": "0mkskx7cez",
  "eventName": "continue",
 "interactionId": "095036ef-2270-4f40-99ba-9e7f83379868",
  "parameters": {
    "eventType": "action",
    "data": {
      "actionKey": "REGISTER",
      "formData": {

      }
    }
  }
}'
var options = new RestClientOptions("{{authPath}}/{{envID}}/davinci/connections/{{connectionID}}/capabilities/{{capabilityName}}")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("", Method.Post);
request.AddHeader("interactionId", "{{interactionID}}");
request.AddHeader("interactionToken", "{{interactionToken}}");
request.AddHeader("Content-Type", "application/json");
var body = @"{" + "\n" +
@"  ""id"": ""0mkskx7cez""," + "\n" +
@"  ""eventName"": ""continue""," + "\n" +
@" ""interactionId"": ""095036ef-2270-4f40-99ba-9e7f83379868""," + "\n" +
@"  ""parameters"": {" + "\n" +
@"    ""eventType"": ""action""," + "\n" +
@"    ""data"": {" + "\n" +
@"      ""actionKey"": ""REGISTER""," + "\n" +
@"      ""formData"": {" + "\n" +
@"        " + "\n" +
@"      }" + "\n" +
@"    }" + "\n" +
@"  }" + "\n" +
@"}";
request.AddStringBody(body, DataFormat.Json);
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
package main

import (
  "fmt"
  "strings"
  "net/http"
  "io"
)

func main() {

  url := "{{authPath}}/{{envID}}/davinci/connections/{{connectionID}}/capabilities/{{capabilityName}}"
  method := "POST"

  payload := strings.NewReader(`{
  "id": "0mkskx7cez",
  "eventName": "continue",
 "interactionId": "095036ef-2270-4f40-99ba-9e7f83379868",
  "parameters": {
    "eventType": "action",
    "data": {
      "actionKey": "REGISTER",
      "formData": {

      }
    }
  }
}`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("interactionId", "{{interactionID}}")
  req.Header.Add("interactionToken", "{{interactionToken}}")
  req.Header.Add("Content-Type", "application/json")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := io.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
POST /{{envID}}/davinci/connections/{{connectionID}}/capabilities/{{capabilityName}} HTTP/1.1
Host: {{authPath}}
interactionId: {{interactionID}}
interactionToken: {{interactionToken}}
Content-Type: application/json

{
  "id": "0mkskx7cez",
  "eventName": "continue",
 "interactionId": "095036ef-2270-4f40-99ba-9e7f83379868",
  "parameters": {
    "eventType": "action",
    "data": {
      "actionKey": "REGISTER",
      "formData": {

      }
    }
  }
}
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n  \"id\": \"0mkskx7cez\",\n  \"eventName\": \"continue\",\n \"interactionId\": \"095036ef-2270-4f40-99ba-9e7f83379868\",\n  \"parameters\": {\n    \"eventType\": \"action\",\n    \"data\": {\n      \"actionKey\": \"REGISTER\",\n      \"formData\": {\n        \n      }\n    }\n  }\n}");
Request request = new Request.Builder()
  .url("{{authPath}}/{{envID}}/davinci/connections/{{connectionID}}/capabilities/{{capabilityName}}")
  .method("POST", body)
  .addHeader("interactionId", "{{interactionID}}")
  .addHeader("interactionToken", "{{interactionToken}}")
  .addHeader("Content-Type", "application/json")
  .build();
Response response = client.newCall(request).execute();
var settings = {
  "url": "{{authPath}}/{{envID}}/davinci/connections/{{connectionID}}/capabilities/{{capabilityName}}",
  "method": "POST",
  "timeout": 0,
  "headers": {
    "interactionId": "{{interactionID}}",
    "interactionToken": "{{interactionToken}}",
    "Content-Type": "application/json"
  },
  "data": JSON.stringify({
    "id": "0mkskx7cez",
    "eventName": "continue",
    "interactionId": "095036ef-2270-4f40-99ba-9e7f83379868",
    "parameters": {
      "eventType": "action",
      "data": {
        "actionKey": "REGISTER",
        "formData": {}
      }
    }
  }),
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
var request = require('request');
var options = {
  'method': 'POST',
  'url': '{{authPath}}/{{envID}}/davinci/connections/{{connectionID}}/capabilities/{{capabilityName}}',
  'headers': {
    'interactionId': '{{interactionID}}',
    'interactionToken': '{{interactionToken}}',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    "id": "0mkskx7cez",
    "eventName": "continue",
    "interactionId": "095036ef-2270-4f40-99ba-9e7f83379868",
    "parameters": {
      "eventType": "action",
      "data": {
        "actionKey": "REGISTER",
        "formData": {}
      }
    }
  })

};
request(options, function (error, response) {
  if (error) throw new Error(error);
  console.log(response.body);
});
import requests
import json

url = "{{authPath}}/{{envID}}/davinci/connections/{{connectionID}}/capabilities/{{capabilityName}}"

payload = json.dumps({
  "id": "0mkskx7cez",
  "eventName": "continue",
  "interactionId": "095036ef-2270-4f40-99ba-9e7f83379868",
  "parameters": {
    "eventType": "action",
    "data": {
      "actionKey": "REGISTER",
      "formData": {}
    }
  }
})
headers = {
  'interactionId': '{{interactionID}}',
  'interactionToken': '{{interactionToken}}',
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('{{authPath}}/{{envID}}/davinci/connections/{{connectionID}}/capabilities/{{capabilityName}}');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'interactionId' => '{{interactionID}}',
  'interactionToken' => '{{interactionToken}}',
  'Content-Type' => 'application/json'
));
$request->setBody('{\n  "id": "0mkskx7cez",\n  "eventName": "continue",\n "interactionId": "095036ef-2270-4f40-99ba-9e7f83379868",\n  "parameters": {\n    "eventType": "action",\n    "data": {\n      "actionKey": "REGISTER",\n      "formData": {\n        \n      }\n    }\n  }\n}');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}
require "uri"
require "json"
require "net/http"

url = URI("{{authPath}}/{{envID}}/davinci/connections/{{connectionID}}/capabilities/{{capabilityName}}")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["interactionId"] = "{{interactionID}}"
request["interactionToken"] = "{{interactionToken}}"
request["Content-Type"] = "application/json"
request.body = JSON.dump({
  "id": "0mkskx7cez",
  "eventName": "continue",
  "interactionId": "095036ef-2270-4f40-99ba-9e7f83379868",
  "parameters": {
    "eventType": "action",
    "data": {
      "actionKey": "REGISTER",
      "formData": {}
    }
  }
})

response = http.request(request)
puts response.read_body
let parameters = "{\n  \"id\": \"0mkskx7cez\",\n  \"eventName\": \"continue\",\n \"interactionId\": \"095036ef-2270-4f40-99ba-9e7f83379868\",\n  \"parameters\": {\n    \"eventType\": \"action\",\n    \"data\": {\n      \"actionKey\": \"REGISTER\",\n      \"formData\": {\n        \n      }\n    }\n  }\n}"
let postData = parameters.data(using: .utf8)

var request = URLRequest(url: URL(string: "{{authPath}}/{{envID}}/davinci/connections/{{connectionID}}/capabilities/{{capabilityName}}")!,timeoutInterval: Double.infinity)
request.addValue("{{interactionID}}", forHTTPHeaderField: "interactionId")
request.addValue("{{interactionToken}}", forHTTPHeaderField: "interactionToken")
request.addValue("application/json", forHTTPHeaderField: "Content-Type")

request.httpMethod = "POST"
request.httpBody = postData

let task = URLSession.shared.dataTask(with: request) { data, response, error in
  guard let data = data else {
    print(String(describing: error))
    return
  }
  print(String(data: data, encoding: .utf8)!)
}

task.resume()

Example Response

201 Created

{
    "id": "lujut6q7vy",
    "companyId": "abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6",
    "flowId": "adf4422d2ed2e81fbf7e2f721084bdf7",
    "connectionId": "867ed4363b2bc21c860085ad2baa817d",
    "capabilityName": "customHTMLTemplate",
    "screen": {
        "name": "HTTP",
        "properties": {
            "sktemplate": {
                "type": "string",
                "displayName": "Template",
                "visibility": "private",
                "createdDate": 1694687041166,
                "customerId": "",
                "companyId": "",
                "halReference": {
                    "resource": "uiTemplates",
                    "pathTemplate": "/environments/{envID}/uiTemplates/{sktemplate}"
                },
                "uiId": "285c9d55f6886242da17a6dcb6a504da",
                "description": "",
                "inputSchema": "{\n    \"type\": \"object\",\n    \"properties\": {\n        \"title\": {\n            \"type\": \"string\",\n            \"displayName\": \"Title\",\n            \"preferredControlType\": \"textField\",\n            \"enableParameters\": true,\n            \"propertyName\": \"title\"\n        },\n\t\t\"textOne\": {\n            \"type\": \"string\",\n            \"displayName\": \"Text One\",\n            \"preferredControlType\": \"textField\",\n            \"enableParameters\": true,\n            \"propertyName\": \"textOne\"\n        },\n\t\t\"textTwo\": {\n            \"type\": \"string\",\n            \"displayName\": \"Text Two\",\n            \"preferredControlType\": \"textField\",\n            \"enableParameters\": true,\n            \"propertyName\": \"textTwo\"\n        }\n    }\n}",
                "name": "Sign On Form",
                "outputSchema": null,
                "script": "",
                "style": "",
                "template": "",
                "updatedDate": 1694687155750,
                "validationRules": [],
                "version": "1.0",
                "value": "285c9d55f6886242da17a6dcb6a504da"
            },
            "customHTML": {
                "type": "string",
                "displayName": "HTML Template",
                "createdDate": 1694542156417,
                "customerId": "ecb9bf8a2fab854e65045d02cb6bab50",
                "companyId": "singularkey",
                "preferredControlType": "textArea",
                "enableParameters": true,
                "maximizeToggle": true,
                "viewToggle": true,
                "largePayload": true,
                "value": "<div\n    class=\"bg-light d-flex flex-column justify-content-center align-items-center position-absolute top-0 start-0 bottom-0 end-0 overflow-auto\">\n    <div style=\"max-width: 400px; min-width: 400px; width: 100%\">\n        <div class=\"card shadow mb-5\">\n            <div class=\"card-body p-5 d-flex flex-column\">\n                <img class=\"companyLogo align-self-center mb-5\" src=\"https://assets.pingone.com/ux/ui-library/5.0.2/images/logo-pingidentity.png\" alt=\"Ping Identity\" />\n\n                {{#if title}}\n                <h1 class=\"text-center mb-4\">{{title}}</h1>\n                {{/if}}\n\n                {{#if textOne}}\n                <p class=\"text-muted text-center\">{{textOne}}</p>\n                {{/if}}\n\n                {{#if textTwo}}\n                <p class=\"text-muted text-center\">{{textTwo}}</p>\n                {{/if}}\n\n                <!-- Generic Error Message -->\n                <p id=\"feedback\" data-id=\"feedback\" class=\"text-danger mdi mdi-alert-circle\" data-skcomponent=\"skerror\"></p>\n\n                <!-- Field Validation Error Messages -->\n                <p class=\"text-danger mdi mdi-alert-circle\" data-skerrorid=\"username\" data-skcomponent=\"skerrormessage\"></p>\n                <p class=\"text-danger mdi mdi-alert-circle\" data-skerrorid=\"password\" data-skcomponent=\"skerrormessage\"></p>\n\n                <p class=\"text-danger mdi mdi-alert-circle\" data-id=\"feedback\" data-skcomponent=\"skerror\"></p>\n                <form id=\"signonForm\" data-id=\"signonForm\">\n                    <div class=\"mb-4 form-floating\">\n                        <input class=\"form-control\" type=\"text\" id=\"username\" name=\"username\" placeholder=\"username\"\n                            autocomplete=\"off\" value=\"\" data-id=\"username-input\" />\n                        <label class=\"form-label\" for=\"username\">Username</label>\n                    </div>\n                    <div id=\"passwordDiv\" class=\"mb-4 form-floating\">\n                        <input class=\"form-control\" type=\"password\" id=\"password\" name=\"password\" placeholder=\"Password\"\n                            autocomplete=\"off\" value=\"\" data-id=\"password-input\" />\n                        <label class=\"form-label\" for=\"password\">Password</label>\n                    </div>\n                    <div class=\"d-flex flex-column\">\n                        {{#if buttonLabel}}\n                        <button data-id=\"button\" type=\"submit\" class=\"btn btn-primary mb-3\" data-skcomponent=\"skbutton\"\n                            data-skbuttontype=\"form-submit\" data-skform=\"signonForm\" id=\"btnSignIn\"\n                            data-skrequiredinputs=\"username, password\" data-skbuttonvalue=\"SIGNON\">\n                            {{buttonLabel}}\n                        </button>\n                        {{/if}}\n                        <div class=\"d-flex flex-column\">\n                            {{#if resetButtonLabel}}\n                            <button data-id=\"button\" type=\"submit\" class=\"btn btn-link\" data-skcomponent=\"skbutton\"\n                                data-skbuttontype=\"next-event\" id=\"btnTrouble\" data-skbuttonvalue=\"TROUBLE\">\n                                {{resetButtonLabel}}\n                            </button>\n                            {{/if}}\n                            {{#if registerButtonLabel}}\n                            <button type=\"submit\" class=\"btn btn-link\" data-skcomponent=\"skbutton\"\n                                data-skbuttontype=\"next-event\"  id=\"btnRegister\" data-skbuttonvalue=\"REGISTER\">\n                                {{registerButtonLabel}}\n                            </button>\n                            {{/if}}\n                        </div>\n                </form>\n            </div>\n        </div>\n    </div>\n</div>"
            },
            "validationRules": {
                "type": "object",
                "displayName": "Form validation rules",
                "value": [],
                "info": "Rules to check to validate form inputs",
                "createdDate": 1694542156291,
                "customerId": "ecb9bf8a2fab854e65045d02cb6bab50",
                "companyId": "singularkey",
                "preferredControlType": "validationRules"
            },
            "customCSS": {
                "type": "string",
                "displayName": "CSS",
                "createdDate": 1694542156320,
                "customerId": "ecb9bf8a2fab854e65045d02cb6bab50",
                "companyId": "singularkey",
                "preferredControlType": "codeEditor",
                "language": "css",
                "maximizeToggle": true,
                "largePayload": true,
                "value": ""
            },
            "customScript": {
                "type": "string",
                "displayName": "Script",
                "createdDate": 1694542156320,
                "customerId": "ecb9bf8a2fab854e65045d02cb6bab50",
                "companyId": "singularkey",
                "preferredControlType": "codeEditor",
                "value": "const setFieldFocus = (id) => {\n    const element = document.getElementById(id);\n    if (element) {\n        element.focus();\n    }\n}\n\nconst makePasswordToggle = (id) => {\n    let container = document.getElementById(id);\n\n    if (container) {\n        let password = container.getElementsByTagName(\"input\")[0];\n        let toggler = document.createElement(\"button\");\n        toggler.setAttribute(\"type\", \"button\");\n        toggler.setAttribute(\"aria-label\", \"Show/Hide Password\");\n        toggler.className = \"btn mdi mdi-eye-off-outline position-absolute end-0 top-50 translate-middle-y\";\n        container.appendChild(toggler);\n\n        function showHidePassword() {\n            if (password.type == \"password\") {\n                password.setAttribute(\"type\", \"text\");\n                toggler.classList.add(\"mdi-eye-outline\");\n                toggler.classList.remove(\"mdi-eye-off-outline\");\n            } else {\n                toggler.classList.add(\"mdi-eye-off-outline\");\n                toggler.classList.remove(\"mdi-eye-outline\");\n                password.setAttribute(\"type\", \"password\");\n            }\n            password.focus();\n        };\n\n        toggler.addEventListener(\"click\", showHidePassword);\n    }\n}\n\nconst start = () => {\n    makePasswordToggle(\"passwordDiv\");\n    setFieldFocus(\"username\")\n}\n\nif (document.readyState === \"loading\") {\n    // Loading hasn't finished yet\n    document.addEventListener(\"DOMContentLoaded\", start);\n} else {\n    // `DOMContentLoaded` has already fired\n    start();\n}",
                "language": "javascript",
                "maximizeToggle": true,
                "info": "Write custom JavaScript. Caution: Custom code is for advanced users only. Before using custom code, review the security risks in the DaVinci documentation by searching for \"Using custom code safely\"."
            },
            "inputSchema": {
                "type": "string",
                "displayName": "Input Schema",
                "createdDate": 1694542156288,
                "customerId": "ecb9bf8a2fab854e65045d02cb6bab50",
                "companyId": "singularkey",
                "preferredControlType": "codeEditor",
                "language": "json",
                "info": "Follow example for JSON schema.",
                "maximizeToggle": true,
                "value": {
                    "type": "object",
                    "properties": {
                        "title": {
                            "type": "string",
                            "displayName": "Title",
                            "preferredControlType": "textField",
                            "enableParameters": true,
                            "propertyName": "title"
                        },
                        "textOne": {
                            "type": "string",
                            "displayName": "Text One",
                            "preferredControlType": "textField",
                            "enableParameters": true,
                            "propertyName": "textOne"
                        },
                        "textTwo": {
                            "type": "string",
                            "displayName": "Text Two",
                            "preferredControlType": "textField",
                            "enableParameters": true,
                            "propertyName": "textTwo"
                        },
                        "buttonLabel": {
                            "type": "string",
                            "displayName": "Button Label",
                            "preferredControlType": "textField",
                            "enableParameters": true,
                            "propertyName": "buttonLabel"
                        },
                        "forgotButtonLabel": {
                            "type": "string",
                            "displayName": "Forgot Password Button Label",
                            "preferredControlType": "textField",
                            "enableParameters": true,
                            "propertyName": "resetButtonLabel"
                        },
                        "registerButtonLabel": {
                            "type": "string",
                            "displayName": "Register Button Label",
                            "preferredControlType": "textField",
                            "enableParameters": true,
                            "propertyName": "registerButtonLabel"
                        }
                    }
                }
            },
            "outputSchema": {
                "type": "string",
                "displayName": "Output Schema",
                "createdDate": 1694542156271,
                "customerId": "ecb9bf8a2fab854e65045d02cb6bab50",
                "companyId": "singularkey",
                "preferredControlType": "codeEditor",
                "language": "json",
                "info": "Follow example for JSON schema.",
                "maximizeToggle": true,
                "value": {}
            },
            "formFieldsList": {
                "type": "array",
                "constructType": "formFieldsList",
                "displayName": "Output Fields List",
                "createdDate": 1694542156244,
                "customerId": "ecb9bf8a2fab854e65045d02cb6bab50",
                "companyId": "singularkey",
                "preferredControlType": "formFieldsList",
                "hideLabel": false,
                "value": [
                    {
                        "preferredControlType": "textField",
                        "preferredDataType": "string",
                        "propertyName": "username",
                        "displayName": "Username",
                        "hashedVisibility": false,
                        "value": ""
                    },
                    {
                        "propertyName": "password",
                        "preferredControlType": "textField",
                        "preferredDataType": "string",
                        "value": "",
                        "hashedVisibility": true,
                        "displayName": "Password"
                    },
                    {
                        "preferredControlType": "textField",
                        "preferredDataType": "string",
                        "propertyName": "buttonValue"
                    }
                ]
            },
            "challenge": {
                "type": "string",
                "displayName": "Challenge",
                "createdDate": 1694542156314,
                "customerId": "ecb9bf8a2fab854e65045d02cb6bab50",
                "companyId": "singularkey",
                "preferredControlType": "textField",
                "enableParameters": true
            },
            "button": {
                "constructType": "button",
                "displayName": "Submit",
                "createdDate": 1694542156280,
                "customerId": "ecb9bf8a2fab854e65045d02cb6bab50",
                "companyId": "singularkey",
                "logo": "",
                "showLogo": true,
                "preferredControlType": "button",
                "css": {
                    "backgroundColor": "#1CAB42",
                    "color": "#ffffff"
                },
                "onClick": {
                    "constructType": "skEvent",
                    "eventName": "continue",
                    "params": [],
                    "eventType": "post",
                    "postProcess": {}
                }
            },
            "showFooter": {
                "value": true
            },
            "returnRequestParameters": {
                "value": true
            },
            "messageTitle": {
                "value": "Information"
            },
            "message": {
                "value": ""
            },
            "title": {
                "value": "Account Registration Demo"
            },
            "showPoweredBy": {
                "value": false
            },
            "showContinueButton": {
                "value": false
            },
            "enablePolling": {
                "value": false
            },
            "pollInterval": {
                "value": 2000
            },
            "pollRetries": {
                "value": 60
            },
            "pollChallengeStatus": {
                "value": true
            },
            "httpMethod": {
                "value": "GET"
            },
            "httpBody": {
                "value": "none"
            },
            "raw": {
                "value": ""
            },
            "signResponse": {
                "value": false
            },
            "additionalFieldsName": {
                "value": "additionalProperties"
            },
            "unsafeIgnoreTLSErrors": {
                "value": false
            },
            "delayTime": {
                "value": 50
            },
            "returnSuccess": {
                "value": true
            },
            "keepOutputIfNotValid": {
                "value": false
            },
            "fieldValidation": {
                "value": false
            },
            "outboundMtlsKey": {
                "value": "none"
            },
            "textOne": {
                "value": "Demo illustrating PingOne account creation with email verification."
            },
            "nodeTitle": {
                "value": "Sign On Form"
            },
            "backgroundColor": {
                "value": "#afd5ffff"
            },
            "nodeDescription": {
                "value": "Prompt for username and password"
            },
            "textTwo": {
                "value": "Click 'No account? Register now!' to begin."
            },
            "buttonLabel": {
                "value": "Continue"
            },
            "registerButtonLabel": {
                "value": "No account? Register Now!"
            },
            "resetButtonLabel": {
                "value": "Having trouble signing on?"
            },
            "isLinkStyleSheetSupportEnabled": {
                "value": false
            }
        },
        "userViews": [
            {
                "screenTemplateName": "CustomHTMLTemplate",
                "items": [
                    {
                        "propertyName": "sktemplate"
                    },
                    {
                        "propertyName": "customHTML"
                    },
                    {
                        "propertyName": "validationRules"
                    },
                    {
                        "propertyName": "customCSS"
                    },
                    {
                        "propertyName": "customScript"
                    },
                    {
                        "propertyName": "inputSchema"
                    },
                    {
                        "propertyName": "outputSchema"
                    },
                    {
                        "propertyName": "formFieldsList"
                    },
                    {
                        "propertyName": "challenge"
                    },
                    {
                        "propertyName": "button"
                    }
                ]
            }
        ],
        "metadata": {
            "colors": {
                "canvas": "#AFD5FF",
                "canvasText": "#253746",
                "dark": "#2E5EA6"
            },
            "logos": {
                "canvas": {
                    "imageFileName": "http.svg"
                }
            },
            "type": "core",
            "vendor": ""
        }
    },
    "_links": {
        "self": {
            "href": "https://auth.pingone.com/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/davinci/connections/867ed4363b2bc21c860085ad2baa817d/capabilities/customHTMLTemplate"
        }
    },
    "defaultErrorLogo": false,
    "customLogoURLSelection": 1,
    "customErrorBrandLogoUrl": ""
}