PingOne Platform APIs

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

Query parameters
Parameter Description

expand

Shows additional information in the _embedded resource list. Optional value is attributes.

Request Model

Base application data model (native application)

Refer to Applications base data model for complete descriptions.

Property Required? Type

assignActorRoles

Optional

Boolean

accessControl.role.type

Optional

String

accessControl.group.type

Optional

String

accessControl.group.groups

Optional

Array

accessControl.group.groups.id

Optional

UUID

description

Optional

String

enabled

Required

Boolean

homePageUrl

Optional

URL

loginPageUrl

Optional

URL

icon.id

Optional

UUID

icon.href

Optional

URL

name

Required

String

passcodeGracePeriod

Optional

Integer

protocol

Required

String

tags

Optional

Array

type

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

additionalRefreshTokenReplayProtectionEnabled

Optional

Boolean

grantTypes

Optional

String

jwks

String

Optional

jwksUrl

String

Optional

pkceEnforcement

Optional

String

postLogoutRedirectUris

Required

URL

redirectUris

Required

URL

refreshTokenDuration

Optional

Integer

refreshTokenRollingDuration

Optional

Integer

requireSignedRequestObject

Optional

Boolean

responseTypes

Required

String

signing

Optional

Object

signing.keyRotationPolicy

Required

Object

signing.keyRotationPolicy.id

Required

String

supportUnsignedRequestObject

Optional

Boolean

tokenEndpointAuthMethod

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

bundleId

Optional

String

mobile.bundleId

Optional

String

mobile.packageName

Optional

String

mobile.integrityDetection.mode

Optional

String

mobile.integrityDetection.cacheDuration.amount

Optional

Integer

mobile.integrityDetection.cacheDuration.units

Optional

String

mobile.push.numberMatching.type

Optional

String

packageName

Optional

String

Headers

Authorization      Bearer {{accessToken}}

Content-Type      application/json

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
}