Create Application (OIDC Protocol - Native App)
POST {{apiPath}}/environments/{{envID}}/applications
The POST {{apiPath}}/environments/{{envID}}/applications operation adds a new application resource to the specified environment.
In addition to the required name attribute, the request body also specifies a value of "true" for the enabled attribute. If a value is not specified for the enabled attribute, it is set to false by default.
The property mobile.push.numberMatching.type is included to specify how number matching authentication should be presented to users. The value ENTER_MANUALLY specifies that users must actually enter the number that was shown rather than just selecting the number from a group of numbers. Note that to use number matching in an application, you must enable it in the relevant MFA policy, using the property push.numberMatching.enabled.
Note that the example includes the optional signing object, which contains a key rotation policy ID. To get a key rotation policy ID, run the Create Key Rotation Policy request.
Prerequisites
-
Refer to Application Operations for important overview information.
Query parameters
| Parameter | Description |
|---|---|
|
Shows additional information in the |
Request Model
Base application data model (native application)
Refer to Applications base data model for complete descriptions.
| Property | Required? | Type |
|---|---|---|
|
Optional |
Boolean |
|
Optional |
String |
|
Optional |
String |
|
Optional |
Array |
|
Optional |
UUID |
|
Optional |
String |
|
Required |
Boolean |
|
Optional |
URL |
|
Optional |
URL |
|
Optional |
UUID |
|
Optional |
URL |
|
Required |
String |
|
Optional |
Integer |
|
Required |
String |
|
Optional |
Array |
|
Required |
String |
Additional OIDC settings
Refer to Applications OIDC settings data model for complete descriptions.
If you set the protocol attribute to OPENID_CONNECT, you must provide values for the required OIDC settings. Optional settings can be omitted.
| Property | Required? | Type |
|---|---|---|
|
Optional |
Boolean |
|
Optional |
String |
|
String |
Optional |
|
String |
Optional |
|
Optional |
String |
|
Required |
URL |
|
Required |
URL |
|
Optional |
Integer |
|
Optional |
Integer |
|
Optional |
Boolean |
|
Required |
String |
|
Optional |
Object |
|
Required |
Object |
|
Required |
String |
|
Optional |
Boolean |
|
Required |
String |
Additional NATIVE_APP settings
If you set the type attribute to NATIVE_APP, you can also set the following optional properties.
| Property | Required? | Type |
|---|---|---|
|
Optional |
String |
|
Optional |
String |
|
Optional |
String |
|
Optional |
String |
|
Optional |
Integer |
|
Optional |
String |
|
Optional |
String |
|
Optional |
String |
Body
raw ( application/json )
{
"enabled": true,
"name": "Native app with number matching and modified grace period",
"description": "Native app that includes configuration of number-matching option",
"type": "NATIVE_APP",
"protocol": "OPENID_CONNECT",
"homePageUrl": "https://example.com/homePage",
"loginPageUrl": "https://example.com/loginPage",
"icon": {
"id": "{{imageID}}",
"href": "https://upload.image.org/image.jpg"
},
"grantTypes": [
"AUTHORIZATION_CODE",
"IMPLICIT"
],
"postLogoutRedirectUris": [
"https://example.com/logout"
],
"redirectUris": [
"https://example.com"
],
"responseTypes": [
"CODE",
"TOKEN",
"ID_TOKEN"
],
"signing": {
"keyRotationPolicy": {
"id": "{{krpID}}"
}
},
"tokenEndpointAuthMethod": "NONE",
"pkceEnforcement": "REQUIRED",
"refreshTokenDuration": 86400,
"refreshTokenRollingDuration": 86400,
"mobile": {
"bundleId": "myAppleBundle9.myApp",
"packageName": "myAndroidPackage10.myApp",
"huaweiAppId": "120240988",
"huaweiPackageName": "com.company.huaweiPackage_2",
"integrityDetection": {
"mode": "ENABLED",
"cacheDuration": {
"amount": 10,
"units": "MINUTES"
},
"googlePlay":{
"verificationType":"INTERNAL",
"decryptionKey":"{{integrityDecryptionKey}}",
"verificationKey":"{{integrityVerificationKey}}"
}
},
"push": {
"numberMatching": {
"type":"ENTER_MANUALLY"
}
},
"passcodeRefreshDuration": {
"duration": 50,
"timeUnit": "SECONDS"
},
"passcodeGracePeriod" : 8
}
}
Example Request
-
cURL
-
C#
-
Go
-
HTTP
-
Java
-
jQuery
-
NodeJS
-
Python
-
PHP
-
Ruby
-
Swift
curl --location --globoff '{{apiPath}}/environments/{{envID}}/applications' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{accessToken}}' \
--data '{
"enabled": true,
"name": "Native app with number matching and modified grace period",
"description": "Native app that includes configuration of number-matching option",
"type": "NATIVE_APP",
"protocol": "OPENID_CONNECT",
"homePageUrl": "https://example.com/homePage",
"loginPageUrl": "https://example.com/loginPage",
"icon": {
"id": "{{imageID}}",
"href": "https://upload.image.org/image.jpg"
},
"grantTypes": [
"AUTHORIZATION_CODE",
"IMPLICIT"
],
"postLogoutRedirectUris": [
"https://example.com/logout"
],
"redirectUris": [
"https://example.com"
],
"responseTypes": [
"CODE",
"TOKEN",
"ID_TOKEN"
],
"signing": {
"keyRotationPolicy": {
"id": "{{krpID}}"
}
},
"tokenEndpointAuthMethod": "NONE",
"pkceEnforcement": "REQUIRED",
"refreshTokenDuration": 86400,
"refreshTokenRollingDuration": 86400,
"mobile": {
"bundleId": "myAppleBundle9.myApp",
"packageName": "myAndroidPackage10.myApp",
"huaweiAppId": "120240988",
"huaweiPackageName": "com.company.huaweiPackage_2",
"integrityDetection": {
"mode": "ENABLED",
"cacheDuration": {
"amount": 10,
"units": "MINUTES"
},
"googlePlay":{
"verificationType":"INTERNAL",
"decryptionKey":"{{integrityDecryptionKey}}",
"verificationKey":"{{integrityVerificationKey}}"
}
},
"push": {
"numberMatching": {
"type":"ENTER_MANUALLY"
}
},
"passcodeRefreshDuration": {
"duration": 50,
"timeUnit": "SECONDS"
},
"passcodeGracePeriod" : 8
}
}'
var options = new RestClientOptions("{{apiPath}}/environments/{{envID}}/applications")
{
MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("", Method.Post);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer {{accessToken}}");
var body = @"{" + "\n" +
@" ""enabled"": true," + "\n" +
@" ""name"": ""Native app with number matching and modified grace period""," + "\n" +
@" ""description"": ""Native app that includes configuration of number-matching option""," + "\n" +
@" ""type"": ""NATIVE_APP""," + "\n" +
@" ""protocol"": ""OPENID_CONNECT""," + "\n" +
@" ""homePageUrl"": ""https://example.com/homePage""," + "\n" +
@" ""loginPageUrl"": ""https://example.com/loginPage""," + "\n" +
@" ""icon"": {" + "\n" +
@" ""id"": ""{{imageID}}""," + "\n" +
@" ""href"": ""https://upload.image.org/image.jpg""" + "\n" +
@" }," + "\n" +
@" ""grantTypes"": [" + "\n" +
@" ""AUTHORIZATION_CODE""," + "\n" +
@" ""IMPLICIT""" + "\n" +
@" ]," + "\n" +
@" ""postLogoutRedirectUris"": [" + "\n" +
@" ""https://example.com/logout""" + "\n" +
@" ]," + "\n" +
@" ""redirectUris"": [" + "\n" +
@" ""https://example.com""" + "\n" +
@" ]," + "\n" +
@" ""responseTypes"": [" + "\n" +
@" ""CODE""," + "\n" +
@" ""TOKEN""," + "\n" +
@" ""ID_TOKEN""" + "\n" +
@" ]," + "\n" +
@" ""signing"": {" + "\n" +
@" ""keyRotationPolicy"": {" + "\n" +
@" ""id"": ""{{krpID}}""" + "\n" +
@" }" + "\n" +
@" }," + "\n" +
@" ""tokenEndpointAuthMethod"": ""NONE""," + "\n" +
@" ""pkceEnforcement"": ""REQUIRED""," + "\n" +
@" ""refreshTokenDuration"": 86400," + "\n" +
@" ""refreshTokenRollingDuration"": 86400," + "\n" +
@" ""mobile"": {" + "\n" +
@" ""bundleId"": ""myAppleBundle9.myApp""," + "\n" +
@" ""packageName"": ""myAndroidPackage10.myApp""," + "\n" +
@" ""huaweiAppId"": ""120240988""," + "\n" +
@" ""huaweiPackageName"": ""com.company.huaweiPackage_2""," + "\n" +
@" ""integrityDetection"": {" + "\n" +
@" ""mode"": ""ENABLED""," + "\n" +
@" ""cacheDuration"": {" + "\n" +
@" ""amount"": 10," + "\n" +
@" ""units"": ""MINUTES""" + "\n" +
@" }," + "\n" +
@" ""googlePlay"":{" + "\n" +
@" ""verificationType"":""INTERNAL""," + "\n" +
@" ""decryptionKey"":""{{integrityDecryptionKey}}""," + "\n" +
@" ""verificationKey"":""{{integrityVerificationKey}}""" + "\n" +
@" }" + "\n" +
@" }," + "\n" +
@" ""push"": {" + "\n" +
@" ""numberMatching"": {" + "\n" +
@" ""type"":""ENTER_MANUALLY""" + "\n" +
@" }" + "\n" +
@" }," + "\n" +
@" ""passcodeRefreshDuration"": {" + "\n" +
@" ""duration"": 50," + "\n" +
@" ""timeUnit"": ""SECONDS""" + "\n" +
@" }," + "\n" +
@" ""passcodeGracePeriod"" : 8" + "\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 := "{{apiPath}}/environments/{{envID}}/applications"
method := "POST"
payload := strings.NewReader(`{
"enabled": true,
"name": "Native app with number matching and modified grace period",
"description": "Native app that includes configuration of number-matching option",
"type": "NATIVE_APP",
"protocol": "OPENID_CONNECT",
"homePageUrl": "https://example.com/homePage",
"loginPageUrl": "https://example.com/loginPage",
"icon": {
"id": "{{imageID}}",
"href": "https://upload.image.org/image.jpg"
},
"grantTypes": [
"AUTHORIZATION_CODE",
"IMPLICIT"
],
"postLogoutRedirectUris": [
"https://example.com/logout"
],
"redirectUris": [
"https://example.com"
],
"responseTypes": [
"CODE",
"TOKEN",
"ID_TOKEN"
],
"signing": {
"keyRotationPolicy": {
"id": "{{krpID}}"
}
},
"tokenEndpointAuthMethod": "NONE",
"pkceEnforcement": "REQUIRED",
"refreshTokenDuration": 86400,
"refreshTokenRollingDuration": 86400,
"mobile": {
"bundleId": "myAppleBundle9.myApp",
"packageName": "myAndroidPackage10.myApp",
"huaweiAppId": "120240988",
"huaweiPackageName": "com.company.huaweiPackage_2",
"integrityDetection": {
"mode": "ENABLED",
"cacheDuration": {
"amount": 10,
"units": "MINUTES"
},
"googlePlay":{
"verificationType":"INTERNAL",
"decryptionKey":"{{integrityDecryptionKey}}",
"verificationKey":"{{integrityVerificationKey}}"
}
},
"push": {
"numberMatching": {
"type":"ENTER_MANUALLY"
}
},
"passcodeRefreshDuration": {
"duration": 50,
"timeUnit": "SECONDS"
},
"passcodeGracePeriod" : 8
}
}`)
client := &http.Client {
}
req, err := http.NewRequest(method, url, payload)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Content-Type", "application/json")
req.Header.Add("Authorization", "Bearer {{accessToken}}")
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 /environments/{{envID}}/applications HTTP/1.1
Host: {{apiPath}}
Content-Type: application/json
Authorization: Bearer {{accessToken}}
{
"enabled": true,
"name": "Native app with number matching and modified grace period",
"description": "Native app that includes configuration of number-matching option",
"type": "NATIVE_APP",
"protocol": "OPENID_CONNECT",
"homePageUrl": "https://example.com/homePage",
"loginPageUrl": "https://example.com/loginPage",
"icon": {
"id": "{{imageID}}",
"href": "https://upload.image.org/image.jpg"
},
"grantTypes": [
"AUTHORIZATION_CODE",
"IMPLICIT"
],
"postLogoutRedirectUris": [
"https://example.com/logout"
],
"redirectUris": [
"https://example.com"
],
"responseTypes": [
"CODE",
"TOKEN",
"ID_TOKEN"
],
"signing": {
"keyRotationPolicy": {
"id": "{{krpID}}"
}
},
"tokenEndpointAuthMethod": "NONE",
"pkceEnforcement": "REQUIRED",
"refreshTokenDuration": 86400,
"refreshTokenRollingDuration": 86400,
"mobile": {
"bundleId": "myAppleBundle9.myApp",
"packageName": "myAndroidPackage10.myApp",
"huaweiAppId": "120240988",
"huaweiPackageName": "com.company.huaweiPackage_2",
"integrityDetection": {
"mode": "ENABLED",
"cacheDuration": {
"amount": 10,
"units": "MINUTES"
},
"googlePlay":{
"verificationType":"INTERNAL",
"decryptionKey":"{{integrityDecryptionKey}}",
"verificationKey":"{{integrityVerificationKey}}"
}
},
"push": {
"numberMatching": {
"type":"ENTER_MANUALLY"
}
},
"passcodeRefreshDuration": {
"duration": 50,
"timeUnit": "SECONDS"
},
"passcodeGracePeriod" : 8
}
}
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n \"enabled\": true,\n \"name\": \"Native app with number matching and modified grace period\",\n \"description\": \"Native app that includes configuration of number-matching option\",\n \"type\": \"NATIVE_APP\",\n \"protocol\": \"OPENID_CONNECT\",\n \"homePageUrl\": \"https://example.com/homePage\",\n \"loginPageUrl\": \"https://example.com/loginPage\",\n \"icon\": {\n \"id\": \"{{imageID}}\",\n \"href\": \"https://upload.image.org/image.jpg\"\n },\n \"grantTypes\": [\n \"AUTHORIZATION_CODE\",\n \"IMPLICIT\"\n ],\n \"postLogoutRedirectUris\": [\n \"https://example.com/logout\"\n ],\n \"redirectUris\": [\n \"https://example.com\"\n ],\n \"responseTypes\": [\n \"CODE\",\n \"TOKEN\",\n \"ID_TOKEN\"\n ],\n \"signing\": {\n \"keyRotationPolicy\": {\n \"id\": \"{{krpID}}\"\n }\n },\n \"tokenEndpointAuthMethod\": \"NONE\",\n \"pkceEnforcement\": \"REQUIRED\",\n \"refreshTokenDuration\": 86400,\n \"refreshTokenRollingDuration\": 86400,\n \"mobile\": {\n \"bundleId\": \"myAppleBundle9.myApp\",\n \"packageName\": \"myAndroidPackage10.myApp\",\n \"huaweiAppId\": \"120240988\",\n \"huaweiPackageName\": \"com.company.huaweiPackage_2\",\n \"integrityDetection\": {\n \"mode\": \"ENABLED\",\n \"cacheDuration\": {\n \"amount\": 10,\n \"units\": \"MINUTES\"\n },\n \"googlePlay\":{\n \"verificationType\":\"INTERNAL\",\n \"decryptionKey\":\"{{integrityDecryptionKey}}\",\n \"verificationKey\":\"{{integrityVerificationKey}}\"\n }\n },\n \"push\": {\n \"numberMatching\": {\n \"type\":\"ENTER_MANUALLY\"\n }\n },\n \"passcodeRefreshDuration\": {\n \"duration\": 50,\n \"timeUnit\": \"SECONDS\"\n },\n \"passcodeGracePeriod\" : 8\n }\n}");
Request request = new Request.Builder()
.url("{{apiPath}}/environments/{{envID}}/applications")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.addHeader("Authorization", "Bearer {{accessToken}}")
.build();
Response response = client.newCall(request).execute();
var settings = {
"url": "{{apiPath}}/environments/{{envID}}/applications",
"method": "POST",
"timeout": 0,
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer {{accessToken}}"
},
"data": JSON.stringify({
"enabled": true,
"name": "Native app with number matching and modified grace period",
"description": "Native app that includes configuration of number-matching option",
"type": "NATIVE_APP",
"protocol": "OPENID_CONNECT",
"homePageUrl": "https://example.com/homePage",
"loginPageUrl": "https://example.com/loginPage",
"icon": {
"id": "{{imageID}}",
"href": "https://upload.image.org/image.jpg"
},
"grantTypes": [
"AUTHORIZATION_CODE",
"IMPLICIT"
],
"postLogoutRedirectUris": [
"https://example.com/logout"
],
"redirectUris": [
"https://example.com"
],
"responseTypes": [
"CODE",
"TOKEN",
"ID_TOKEN"
],
"signing": {
"keyRotationPolicy": {
"id": "{{krpID}}"
}
},
"tokenEndpointAuthMethod": "NONE",
"pkceEnforcement": "REQUIRED",
"refreshTokenDuration": 86400,
"refreshTokenRollingDuration": 86400,
"mobile": {
"bundleId": "myAppleBundle9.myApp",
"packageName": "myAndroidPackage10.myApp",
"huaweiAppId": "120240988",
"huaweiPackageName": "com.company.huaweiPackage_2",
"integrityDetection": {
"mode": "ENABLED",
"cacheDuration": {
"amount": 10,
"units": "MINUTES"
},
"googlePlay": {
"verificationType": "INTERNAL",
"decryptionKey": "{{integrityDecryptionKey}}",
"verificationKey": "{{integrityVerificationKey}}"
}
},
"push": {
"numberMatching": {
"type": "ENTER_MANUALLY"
}
},
"passcodeRefreshDuration": {
"duration": 50,
"timeUnit": "SECONDS"
},
"passcodeGracePeriod": 8
}
}),
};
$.ajax(settings).done(function (response) {
console.log(response);
});
var request = require('request');
var options = {
'method': 'POST',
'url': '{{apiPath}}/environments/{{envID}}/applications',
'headers': {
'Content-Type': 'application/json',
'Authorization': 'Bearer {{accessToken}}'
},
body: JSON.stringify({
"enabled": true,
"name": "Native app with number matching and modified grace period",
"description": "Native app that includes configuration of number-matching option",
"type": "NATIVE_APP",
"protocol": "OPENID_CONNECT",
"homePageUrl": "https://example.com/homePage",
"loginPageUrl": "https://example.com/loginPage",
"icon": {
"id": "{{imageID}}",
"href": "https://upload.image.org/image.jpg"
},
"grantTypes": [
"AUTHORIZATION_CODE",
"IMPLICIT"
],
"postLogoutRedirectUris": [
"https://example.com/logout"
],
"redirectUris": [
"https://example.com"
],
"responseTypes": [
"CODE",
"TOKEN",
"ID_TOKEN"
],
"signing": {
"keyRotationPolicy": {
"id": "{{krpID}}"
}
},
"tokenEndpointAuthMethod": "NONE",
"pkceEnforcement": "REQUIRED",
"refreshTokenDuration": 86400,
"refreshTokenRollingDuration": 86400,
"mobile": {
"bundleId": "myAppleBundle9.myApp",
"packageName": "myAndroidPackage10.myApp",
"huaweiAppId": "120240988",
"huaweiPackageName": "com.company.huaweiPackage_2",
"integrityDetection": {
"mode": "ENABLED",
"cacheDuration": {
"amount": 10,
"units": "MINUTES"
},
"googlePlay": {
"verificationType": "INTERNAL",
"decryptionKey": "{{integrityDecryptionKey}}",
"verificationKey": "{{integrityVerificationKey}}"
}
},
"push": {
"numberMatching": {
"type": "ENTER_MANUALLY"
}
},
"passcodeRefreshDuration": {
"duration": 50,
"timeUnit": "SECONDS"
},
"passcodeGracePeriod": 8
}
})
};
request(options, function (error, response) {
if (error) throw new Error(error);
console.log(response.body);
});
import requests
import json
url = "{{apiPath}}/environments/{{envID}}/applications"
payload = json.dumps({
"enabled": True,
"name": "Native app with number matching and modified grace period",
"description": "Native app that includes configuration of number-matching option",
"type": "NATIVE_APP",
"protocol": "OPENID_CONNECT",
"homePageUrl": "https://example.com/homePage",
"loginPageUrl": "https://example.com/loginPage",
"icon": {
"id": "{{imageID}}",
"href": "https://upload.image.org/image.jpg"
},
"grantTypes": [
"AUTHORIZATION_CODE",
"IMPLICIT"
],
"postLogoutRedirectUris": [
"https://example.com/logout"
],
"redirectUris": [
"https://example.com"
],
"responseTypes": [
"CODE",
"TOKEN",
"ID_TOKEN"
],
"signing": {
"keyRotationPolicy": {
"id": "{{krpID}}"
}
},
"tokenEndpointAuthMethod": "NONE",
"pkceEnforcement": "REQUIRED",
"refreshTokenDuration": 86400,
"refreshTokenRollingDuration": 86400,
"mobile": {
"bundleId": "myAppleBundle9.myApp",
"packageName": "myAndroidPackage10.myApp",
"huaweiAppId": "120240988",
"huaweiPackageName": "com.company.huaweiPackage_2",
"integrityDetection": {
"mode": "ENABLED",
"cacheDuration": {
"amount": 10,
"units": "MINUTES"
},
"googlePlay": {
"verificationType": "INTERNAL",
"decryptionKey": "{{integrityDecryptionKey}}",
"verificationKey": "{{integrityVerificationKey}}"
}
},
"push": {
"numberMatching": {
"type": "ENTER_MANUALLY"
}
},
"passcodeRefreshDuration": {
"duration": 50,
"timeUnit": "SECONDS"
},
"passcodeGracePeriod": 8
}
})
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer {{accessToken}}'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('{{apiPath}}/environments/{{envID}}/applications');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
'follow_redirects' => TRUE
));
$request->setHeader(array(
'Content-Type' => 'application/json',
'Authorization' => 'Bearer {{accessToken}}'
));
$request->setBody('{\n "enabled": true,\n "name": "Native app with number matching and modified grace period",\n "description": "Native app that includes configuration of number-matching option",\n "type": "NATIVE_APP",\n "protocol": "OPENID_CONNECT",\n "homePageUrl": "https://example.com/homePage",\n "loginPageUrl": "https://example.com/loginPage",\n "icon": {\n "id": "{{imageID}}",\n "href": "https://upload.image.org/image.jpg"\n },\n "grantTypes": [\n "AUTHORIZATION_CODE",\n "IMPLICIT"\n ],\n "postLogoutRedirectUris": [\n "https://example.com/logout"\n ],\n "redirectUris": [\n "https://example.com"\n ],\n "responseTypes": [\n "CODE",\n "TOKEN",\n "ID_TOKEN"\n ],\n "signing": {\n "keyRotationPolicy": {\n "id": "{{krpID}}"\n }\n },\n "tokenEndpointAuthMethod": "NONE",\n "pkceEnforcement": "REQUIRED",\n "refreshTokenDuration": 86400,\n "refreshTokenRollingDuration": 86400,\n "mobile": {\n "bundleId": "myAppleBundle9.myApp",\n "packageName": "myAndroidPackage10.myApp",\n "huaweiAppId": "120240988",\n "huaweiPackageName": "com.company.huaweiPackage_2",\n "integrityDetection": {\n "mode": "ENABLED",\n "cacheDuration": {\n "amount": 10,\n "units": "MINUTES"\n },\n "googlePlay":{\n "verificationType":"INTERNAL",\n "decryptionKey":"{{integrityDecryptionKey}}",\n "verificationKey":"{{integrityVerificationKey}}"\n }\n },\n "push": {\n "numberMatching": {\n "type":"ENTER_MANUALLY"\n }\n },\n "passcodeRefreshDuration": {\n "duration": 50,\n "timeUnit": "SECONDS"\n },\n "passcodeGracePeriod" : 8\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("{{apiPath}}/environments/{{envID}}/applications")
http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {{accessToken}}"
request.body = JSON.dump({
"enabled": true,
"name": "Native app with number matching and modified grace period",
"description": "Native app that includes configuration of number-matching option",
"type": "NATIVE_APP",
"protocol": "OPENID_CONNECT",
"homePageUrl": "https://example.com/homePage",
"loginPageUrl": "https://example.com/loginPage",
"icon": {
"id": "{{imageID}}",
"href": "https://upload.image.org/image.jpg"
},
"grantTypes": [
"AUTHORIZATION_CODE",
"IMPLICIT"
],
"postLogoutRedirectUris": [
"https://example.com/logout"
],
"redirectUris": [
"https://example.com"
],
"responseTypes": [
"CODE",
"TOKEN",
"ID_TOKEN"
],
"signing": {
"keyRotationPolicy": {
"id": "{{krpID}}"
}
},
"tokenEndpointAuthMethod": "NONE",
"pkceEnforcement": "REQUIRED",
"refreshTokenDuration": 86400,
"refreshTokenRollingDuration": 86400,
"mobile": {
"bundleId": "myAppleBundle9.myApp",
"packageName": "myAndroidPackage10.myApp",
"huaweiAppId": "120240988",
"huaweiPackageName": "com.company.huaweiPackage_2",
"integrityDetection": {
"mode": "ENABLED",
"cacheDuration": {
"amount": 10,
"units": "MINUTES"
},
"googlePlay": {
"verificationType": "INTERNAL",
"decryptionKey": "{{integrityDecryptionKey}}",
"verificationKey": "{{integrityVerificationKey}}"
}
},
"push": {
"numberMatching": {
"type": "ENTER_MANUALLY"
}
},
"passcodeRefreshDuration": {
"duration": 50,
"timeUnit": "SECONDS"
},
"passcodeGracePeriod": 8
}
})
response = http.request(request)
puts response.read_body
let parameters = "{\n \"enabled\": true,\n \"name\": \"Native app with number matching and modified grace period\",\n \"description\": \"Native app that includes configuration of number-matching option\",\n \"type\": \"NATIVE_APP\",\n \"protocol\": \"OPENID_CONNECT\",\n \"homePageUrl\": \"https://example.com/homePage\",\n \"loginPageUrl\": \"https://example.com/loginPage\",\n \"icon\": {\n \"id\": \"{{imageID}}\",\n \"href\": \"https://upload.image.org/image.jpg\"\n },\n \"grantTypes\": [\n \"AUTHORIZATION_CODE\",\n \"IMPLICIT\"\n ],\n \"postLogoutRedirectUris\": [\n \"https://example.com/logout\"\n ],\n \"redirectUris\": [\n \"https://example.com\"\n ],\n \"responseTypes\": [\n \"CODE\",\n \"TOKEN\",\n \"ID_TOKEN\"\n ],\n \"signing\": {\n \"keyRotationPolicy\": {\n \"id\": \"{{krpID}}\"\n }\n },\n \"tokenEndpointAuthMethod\": \"NONE\",\n \"pkceEnforcement\": \"REQUIRED\",\n \"refreshTokenDuration\": 86400,\n \"refreshTokenRollingDuration\": 86400,\n \"mobile\": {\n \"bundleId\": \"myAppleBundle9.myApp\",\n \"packageName\": \"myAndroidPackage10.myApp\",\n \"huaweiAppId\": \"120240988\",\n \"huaweiPackageName\": \"com.company.huaweiPackage_2\",\n \"integrityDetection\": {\n \"mode\": \"ENABLED\",\n \"cacheDuration\": {\n \"amount\": 10,\n \"units\": \"MINUTES\"\n },\n \"googlePlay\":{\n \"verificationType\":\"INTERNAL\",\n \"decryptionKey\":\"{{integrityDecryptionKey}}\",\n \"verificationKey\":\"{{integrityVerificationKey}}\"\n }\n },\n \"push\": {\n \"numberMatching\": {\n \"type\":\"ENTER_MANUALLY\"\n }\n },\n \"passcodeRefreshDuration\": {\n \"duration\": 50,\n \"timeUnit\": \"SECONDS\"\n },\n \"passcodeGracePeriod\" : 8\n }\n}"
let postData = parameters.data(using: .utf8)
var request = URLRequest(url: URL(string: "{{apiPath}}/environments/{{envID}}/applications")!,timeoutInterval: Double.infinity)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer {{accessToken}}", forHTTPHeaderField: "Authorization")
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
{
"_links": {
"self": {
"href": "https://api.pingone.eu/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/applications/c22cb3c8-65b1-4101-8b15-90bfb83afc06"
},
"environment": {
"href": "https://api.pingone.eu/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
},
"attributes": {
"href": "https://api.pingone.eu/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/applications/c22cb3c8-65b1-4101-8b15-90bfb83afc06/attributes"
},
"pushCredentials": {
"href": "https://api.pingone.eu/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/applications/c22cb3c8-65b1-4101-8b15-90bfb83afc06/pushCredentials"
},
"secret": {
"href": "https://api.pingone.eu/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/applications/c22cb3c8-65b1-4101-8b15-90bfb83afc06/secret"
},
"grants": {
"href": "https://api.pingone.eu/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/applications/c22cb3c8-65b1-4101-8b15-90bfb83afc06/grants"
},
"keyRotationPolicy": {
"href": "https://api.pingone.eu/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/keyRotationPolicies/1aa02240-d851-49ca-a293-fa40a58fc034"
}
},
"environment": {
"id": "abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
},
"id": "c22cb3c8-65b1-4101-8b15-90bfb83afc06",
"name": "Native app with number matching and modified grace period",
"description": "Native app that includes configuration of number-matching option",
"enabled": true,
"hiddenFromAppPortal": false,
"type": "NATIVE_APP",
"loginPageUrl": "https://example.com/loginPage",
"homePageUrl": "https://example.com/homePage",
"icon": {
"id": "e8ad78dd-d45c-49b4-974d-8d5e443d4531",
"href": "https://upload.image.org/image.jpg"
},
"protocol": "OPENID_CONNECT",
"createdAt": "2025-07-23T14:30:50.387Z",
"updatedAt": "2025-07-23T14:30:50.387Z",
"assignActorRoles": false,
"mobile": {
"bundleId": "myAppleBundle9.myApp",
"packageName": "myAndroidPackage10.myApp",
"huaweiAppId": "120240988",
"huaweiPackageName": "com.company.huaweiPackage_2",
"integrityDetection": {
"mode": "ENABLED",
"cacheDuration": {
"amount": 10,
"units": "MINUTES"
},
"googlePlay": {
"verificationType": "INTERNAL"
}
},
"push": {
"numberMatching": {
"type": "ENTER_MANUALLY"
}
},
"passcodeRefreshDuration": {
"duration": 50,
"timeUnit": "SECONDS"
},
"passcodeGracePeriod": 8
},
"bundleId": "myAppleBundle9.myApp",
"packageName": "myAndroidPackage10.myApp",
"responseTypes": [
"CODE",
"ID_TOKEN",
"TOKEN"
],
"pkceEnforcement": "REQUIRED",
"requestScopesForMultipleResourcesEnabled": false,
"redirectUris": [
"https://example.com"
],
"deviceTimeout": 600,
"grantTypes": [
"AUTHORIZATION_CODE",
"IMPLICIT"
],
"idpSignoff": false,
"refreshTokenDuration": 86400,
"additionalRefreshTokenReplayProtectionEnabled": true,
"p1ApiAccessTokenValiditySeconds": 3600,
"tokenEndpointAuthMethod": "NONE",
"postLogoutRedirectUris": [
"https://example.com/logout"
],
"refreshTokenRollingDuration": 86400,
"parRequirement": "OPTIONAL",
"devicePollingInterval": 5,
"signing": {
"keyRotationPolicy": {
"id": "1aa02240-d851-49ca-a293-fa40a58fc034"
}
},
"parTimeout": 60
}