PingOne Protect

The PingOne Protect service provides capabilities to configure and retrieve risk evaluations from internal and external risk providers based on a specified risk policy.

Refer also to PingOne Protect's integration with Ping Gateway for on-premise use of PingOne Protect with web applications protected by PingGateway.

Risk Policies

A risk policy is determined by your specific configuration settings. The risk policy enables you to customize a risk evaluation to fit your use case. The policy is used during a risk evaluation to calculate the risk scores for received events. For more information about risk policies, refer to Risk Policies.

Risk Evaluations

Use risk evaluations to calculate the risk level and other risk-related details associated with a received event based on the environment's settings and data provided in the event. For more information about risk evaluation, refer to Risk Evaluations.

Risk Predictors

Risk predictors are employed by risk policies, and define thresholds for certain criteria (such as, IP Velocity, User Velocity, or User Location Anomaly) to determine whether there's the potential for fraudulent user behavior. For more information refer to Risk Predictors.

Use Cases

Risk Policies

Risk policies enable you to customize the risk evaluations to your specific needs. Risk policies are containers for specific risk logic. You can define multiple risk policies and deploy them to initiate different authentication flow actions based on the calculated risk. By default, every PingOne environment has an associated system-level default risk policy set.

For more information about the default risk policies, refer to the example response in Read Risk Policy Sets. Each risk policy set contains a list of risk policies. The maximum number of policy sets per environment is 100; the maximum number of policies per policy set is 100.

Risk policies have the components:

  • Condition

    A Boolean predicate that defines when the policy element is evaluated to true and when it is evaluated to false.

  • Result

    Defines the final result of the risk evaluation when the condition is evaluated to true.

Value comparison conditions

Value comparison conditions compare a placeholder to a value. For example:

{
  "value": "${some.placeholder}",
  "equals": "some value"
}

The value is the outcome of one of the risk predictors.

IP range conditions

IP range conditions designate IP addresses for whitelisting and blacklisting.

{
  "ipRange": ["1.1.1.1/16", "2.2.2.2/24"],
  "contains": "${transaction.ip}"
}

Override policies

Override policies are the ones with the highest priority. They should be listed at the beginning of the riskPolicies array. They can have value comparison condition rules or IP range condition rules. The risk policy array can have no override policies or multiple override policies.

Combining predictors

There are two methods of combining the predictors - Weights and Scores. When you use the Weights approach, you are determining relative weights that should be used when calculating the individual risk score for each predictor. When you use the Scores approach, you can exercise more control over the overall calculation because you can specify an exact numerical score that should be assigned when PingOne Protect determines that there is a medium or high risk level for a predictor.

Weighted policies

Weighted policies allow you to combine results from multiple predictors.

Weighted policies determine risk based on aggregated weighted risk score. These policies must be listed in the riskPolicies array after all override policies are specified. An aggregated risk score involves two weighted policies, and these policies must be the last policies in the riskPolicies array.

The weighted policies that determine the aggregated risk score complement each other and are subject to these restrictions:

  • The first weighted policy should have result.level=MEDIUM and the second should have result.level=HIGH.

  • The value for the condition.aggregatedWeights attribute for both policies must be the same.

  • The value for the condition.between.maxScore attribute for the HIGH weighted policy must be 100.

  • The value of the condition.between attribute for the two policies must be complementary. For example, if the HIGH policy has condition.between.minScore = 70, the MEDIUM policy should have condition.between.maxScore = 70.

  • condition.type should be set to AGGREGATED_WEIGHTS.

  • Choose the weight value assigned to each predictor outcome according to its significance. The following example shows the weight for two predictors: ipAddressReputation at 9 and the weight for geoVelocity at 4. The maximum and minimum scores are set at 60 and 90, respectively:

{
  "aggregatedWeights": [
    {
      "value": "${details.aggregatedWeights.ipAddressReputation}",
      "weight": 9
    },
    {
      "value": "${details.aggregatedWeights.geoVelocity}",
      "weight": 4
    }
  ],
  "between": {
    "minScore": 60,
    "maxScore": 90
  }
}

The value of value consists of the identifier for a specific predictor, and it takes the form ${details.aggregatedWeights.geoVelocity}, where the string after aggregatedWeights is the compact name of the relevant predictor.

Score policies

The JSON content below shows an example of a policy set that uses the Scores approach to risk calculation.

Details to note about the use of score policies:

  • If you are including overrides in the policy set, they must precede the score policies.

  • The policy set must include two score policies - one that includes the score range that should be translated into MEDIUM risk, and one that includes the score range that should be translated into HIGH risk.

  • In terms of order, the MEDIUM policy must precede the HIGH policy.

  • Use condition.between.minScore and condition.between.maxScore to define the ranges for MEDIUM risk and HIGH risk. The maxScore for MEDIUM risk should always equal the minScore for HIGH risk.

  • condition.type should be set to AGGREGATED_SCORES.

  • The condition object should contain an aggregatedScores object that consists of an array of value/score pairs. The value of value consists of the identifier for a specific predictor, and it takes the form ${details.userLocationAnomaly.level}, where the string between details and level is the compact name of the relevant predictor. The value of score is the score you want to assign to that predictor when it is determined that there is a high risk for the predictor. If it is determined that there is medium risk, the predictor will automatically be assigned a score equal to half of the value you specified for high risk.

  • The array in condition.aggregatedScores must be identical in the MEDIUM policy that you define and the HIGH policy that you define.


{
    "id": "944fa7b4-e280-4932-80e7-01853ac9ce6d",
    "name": "aa",
    "default": false,
    "defaultResult": {
        "level": "Low"
    },
    "riskPolicies": [
        {
            "name": "ANONYMOUS_NETWORK_DETECTION",
            "result": {
                "level": "HIGH"
            },
            "condition": {
                "value": "${details.anonymousNetworkDetected}",
                "equals": true
            }
        },
        {
            "name": "GEOVELOCITY_ANOMALY",
            "result": {
                "level": "MEDIUM"
            },
            "condition": {
                "value": "${details.impossibleTravel}",
                "equals": true
            }
        },
        {
            "name": "Medium score policy",
            "result": {
                "level": "MEDIUM"
            },
            "condition": {
                "type" : "AGGREGATED_SCORES",
                "aggregatedScores": [
                    {
                        "value": "${details.userLocationAnomaly.level}",
                        "score": 40
                    },
                    {
                        "value": "${details.anonymousNetwork.level}",
                        "score": 60
                    },
                    {
                        "value": "${details.ipRisk.level}",
                        "score": 40
                    }
                ],
                "between": {
                    "minScore": 700,
                    "maxScore": 900
                }
            }
        },
        {
            "name": "High score policy",
            "result": {
                "level": "HIGH"
            },
            "condition": {
                "type" : "AGGREGATED_SCORES",
                "aggregatedScores": [
                    {
                        "value": "${details.userLocationAnomaly.level}",
                        "score": 40
                    },
                    {
                        "value": "${details.anonymousNetwork.level}",
                        "score": 60
                    },
                    {
                        "value": "${details.ipRisk.level}",
                        "score": 40
                    }
                ],
                "between": {
                    "minScore": 900,
                    "maxScore": 1000
                }
            }
        }
    ]
}

Condition type

The condition.type field indicates the type of policy you are defining. It can take any of the following values:

  • AGGREGATED_SCORES
  • AGGREGATED_WEIGHTS (deprecated)
  • VALUE_COMPARISON
  • IP_RANGE (for override policies or custom predictors)

Risk staging policy set

Risk staging policy allows you to test a policy set in parallel with another policy set. You link an existing policy set to the test policy set with a triggers object in the existing policy set, which points to the test policy set in its triggers.policySet object. Every time the existing policy set runs, it triggers the test policy set to also run. While in staging, the test policy set runs but only records its evaluation. A trigger expires 3 months from when it is set. Use Update Risk Policy Set to add the triggers object to an existing policy set.

Targeted risk policies

For standard risk policies, you must choose the risk policy to pass to the risk evaluation. Targeted risk policies allow you to define risk policies for different "targets" - combinations of transaction types, user groups, and applications that are being accessed. You can then order the targeted risk policies that you defined. When a risk evaluation is carried out, these targeted policies are processed in the order that you specified. The risk policy that is ultimately used for the risk evaluation will be the first one whose conditions (transaction type, user group, application) are met.

The following JSON snippet shows how to specify the target for a risk policy. For details, refer to the targets object in the Risk policies data model and the Create Risk Policy Set - Targeted Policy with Mitigations example.

    "targets":{
        "condition": { "and": [{
            "list": ["AUTHENTICATION", "AUTHORIZATION"],
            "contains": "${event.flow.type}"
          },
          { 
            "list": ["Sales"],
            "contains": "${event.user.groups}"
          },
          { 
            "list": ["6b6f867b-d768-4c2c-a9b6-6816da00d824", "845c9918-94d7-430c-b3d8-eafafc215fd9"],
            "contains": "${event.targetResource.id}"
          }]
        }
    }

Using mitigations in your policies

You can choose to include mitigations in your risk policies. In this context, a mitigation is an action that you recommend if a given condition is met, for example, deny access if the email reputation predictor indicates high risk. In situations where the condition is met, the action that you recommended be taken is returned in the risk evaluation response as the value of the result.mitigations[].action field.

The following JSON snippet shows how to define mitigations in a risk policy (within the riskPolicies array). For details, refer to the result.mitigations array in the Risk policies data model and the Create Risk Policy Set - Targeted Policy with Mitigations example.

    {
        "name" : "USER_LOCATION_ANOMALY",
        "result" : {
          "mitigations" : [ {
            "action" : "CUSTOM",
            "customAction" : "CustomActionForUserLocationAnomaly"
          }],
          "type" : "MITIGATION"
        },
        "condition" : {
          "value" : "${details.userLocationAnomaly.level}",
          "equals" : "High",
          "type" : "VALUE_COMPARISON"
        }
      },
      {
        "name" : "VELOCITY",
        "result" : {
          "mitigations" : [ {
            "action" : "DENY_AND_SUSPEND"
          } ],
          "type" : "MITIGATION"
        },
        "condition" : {
          "value" : "${details.ipVelocityByUser.level}",
          "equals" : "High",
          "type" : "VALUE_COMPARISON"
        }
      },{
        "name" : "USER_RISK_BEHAVIOR",
        "result" : {
          "mitigations" : [ {
            "action" : "VERIFY"
          } ],
          "type" : "MITIGATION"
        },
        "condition" : {
          "value" : "${details.userBasedRiskBehavior.level}",
          "equals" : "Medium",
          "type" : "VALUE_COMPARISON"
        }
      },
      {
        "name" : "EMAIL_REPUTATION",
        "result" : {
          "mitigations" : [ {
            "action" : "MFA",
            "mfaAuthenticationPolicyId" : "{{deviceAuthenticationPolicyID}}"
          } ],
          "type" : "MITIGATION"
        },
        "condition" : {
          "value" : "${details.emailReputation.level}",
          "equals" : "High",
          "type" : "VALUE_COMPARISON"
        }
      },
      {
        "name" : "IP_REPUTATION",
        "result" : {
          "mitigations" : [ {
            "action" : "APPROVE"
          } ],
          "type" : "MITIGATION"
        },
        "condition" : {
          "value" : "${details.ipRisk.level}",
          "equals" : "Low",
          "type" : "VALUE_COMPARISON"
        }
    }

Base risk policy set data model

Property Type Required? Mutable? Description
createdAt Date N/A Read-only The date and time the resource was created (format ISO-8061).
default Boolean Optional Mutable Indicates whether this risk policy set is the environment's default risk policy set. This is used whenever an explicit policySet ID is not specified in the risk evaluation request. If this property is not specified when you create or update a risk policy, the value defaults to false, and this risk policy set is not regarded as the default risk policy set for the environment. If you set this property to true, the default property of all other risk policies in the environment is set to false.
defaultResult Object Optional Mutable Contains the default result returned if none of the conditions in the policy are evaluated to true. At this time, the defaultResult.level value must be LOW.
description String Optional Mutable A description for this policy set. Valid characters consist of any Unicode letter, mark (for example, accent, umlaut), numeric character, punctuation character, or space. Maximum size is 1024 characters.
environment.id String Required Immutable The environment resource's unique identifier.
evaluatedPredictors Array N/A Read-only The IDs of the risk predictors that are evaluated in the policy. Included in responses to requests to get risk policies.
id String Required Immutable The resource's unique identifier.
name String Required Mutable The name for this policy set. Valid characters consist of any Unicode letter, mark (such as, accent, umlaut), # (numeric), / (forward slash), . (period), ' (apostrophe), _ (underscore), space, or - (hyphen). Maximum size is 256 characters.
riskPolicies Array Required Mutable The conditions associated with this policy set. Refer also to [Risk policies data model]{#risk-policies-data-model} below.
riskPolicySetTargets.user.matchedGroups Array N/A Read-only The user groups specified in the policy target that the current user belongs to.
riskPolicySetTargets.user.matchedGroups[].name String N/A Read-only The name of the user group.
targetedRiskPolicySetsOrder Array Optional Mutable The targetedRiskPolicySetsOrder array represents the order that was defined for the processing of targeted risk policies in the environment. It contains the IDs of the individual targeted policies. This array is included in the response when you read one or all risk policies and include the expand query parameter set to order in the URL. You can also use targetedRiskPolicySetsOrder to specify a new order for the targeted policies, refer to the [Reorder Targeted Risk Policies]((#post-reorder-targeted-risk-policies) example.
triggers Object[] Optional Mutable Array that contains trigger definitions for staging mode.
triggers.type String Required Immutable Trigger type; must be POLICY_SET_STAGING.
triggers.policySet Object Required Immutable Contains the policy set identifier to trigger.
triggers.policySet.id String Required Immutable UUID of the policy set to trigger in staging mode.
triggers.expiresAt String Required Immutable Date and time at which the trigger expires.
updatedAt Date N/A Read-only The date and time the resource was last updated (format ISO-8061).

Risk policies data model

This table lists the fields and objects that can be included in each of the elements in the riskPolicies array.

Property Type Required? Mutable? Description
condition Object Required Mutable Contains the condition logic that determines when a policy is evaluated to true and when it is evaluated to false.
condition.aggregatedScores Array Required/Optional Mutable Required for score-based policies. The elements in the array are value-score pairs, representing the score that should be assigned to a specific predictor when it is determined that there is a high risk for the predictor.
condition.aggregatedScores.value String Required Mutable Text that identifies a specific risk predictor in the environment. It uses the form ${details.xxxxxxx.level}, where the string between details and level is the compact name of the relevant predictor.
condition.aggregatedScores.score Integer Required Mutable The score you want to assign to the predictor when it is determined that there is a high risk for the predictor. Value should be between 0 and 100. If it is determined that there is medium risk, the predictor will automatically be assigned a score equal to half of the value you specified for high risk.
condition.value String Optional Mutable When defining an override or mitigation, use condition.value to specify the predictor attribute that is checked for the value specified with the condition.equals parameter, for example, ${details.userLocationAnomaly.level}.
condition.equals String Optional Mutable When defining an override or mitigation, use condition.equals to specify the risk level that the condition is looking for when checking the predictor that you specified with condition.value. For risk predictors with three levels, the value of equals should be High, Medium, or Low. For boolean risk predictors, such as anonymous network detection. the value of equals should be true or false.
condition.type String Required Mutable Indicates the type of policy you are defining. Can be one of the following values: AGGREGATED_SCORES, AGGREGATED_WEIGHTS (deprecated), VALUE_COMPARISON, and IP_RANGE (for override policies or custom predictors).
condition.between.minScore Integer Required/Optional Mutable Required for policies of type AGGREGATED_SCORES or AGGREGATED_WEIGHTS. The beginning of the risk score range that will be translated into the specified risk level (MEDIUM or HIGH). Must be between 0 and 1000.
condition.between.maxScore Integer Required/Optional Mutable Required for policies of type AGGREGATED_SCORES or AGGREGATED_WEIGHTS. The end of the risk score range that will be translated into the specified risk level (MEDIUM or HIGH). Must be between 0 and 1000.
createdAt Date Required Immutable The date and time the resource was first created (format ISO-8061).
description String Optional Mutable A description for this risk policy. Valid characters consist of any Unicode letter, mark (for example, accent, umlaut), # (numeric), / (forward slash), . (period), ' (apostrophe), _ (underscore), space, or - (hyphen). Maximum size is 1024 characters.
environment.id String Required Immutable The environment resource's unique identifier.
id String Required Immutable The resource’s unique identifier.
name String Required Mutable The name to use for the condition. Valid characters consist of any Unicode letter, mark (for example, accent, umlaut), # (numeric), / (forward slash), . (period), ' (apostrophe), _ (underscore), space, or - (hyphen). Maximum size is 256 characters.
priority Integer N/A Read-only The index of the element in the riskPolicies array.
result Object Required Mutable The result object is used to specify the risk level that should be assigned if the defined condition is met. When defining mitigations, result is used to specify the action that is being recommended.
result.level String Required Mutable Contains the risk level that is returned if the condition is evaluated as true. If several policies are evaluated as true, the result related to the lowest priority condition is returned. For more information, refer to the Result attribute data model in Risk Evaluations.
result.mitigations Array Optional Mutable For mitigations that you define, contains the action that is being recommended if the specified condition is met.
result.mitigations[].action String Required Mutable The action that is being recommended if the condition specified for the mitigation is met. Can take any of the following values: APPROVE, VERIFY, MFA, DENY, DENY_AND_SUSPEND, CUSTOM. If you set action to MFA, use mfaRegistrationPolicyId and mfaAuthenticationPolicyId to specify the IDs of the MFA registration policy and MFA authentication policy that should be used. If you set action to VERIFY, use verifyPolicyId to specify the ID of the Verify policy that should be used. If you set action to CUSTOM, use customAction to specify the custom action that you want to recommend.
result.mitigations[].customAction String Optional Mutable If you set the action parameter to CUSTOM, use customAction to specify the custom action that you want to recommend.
result.mitigations[].mfaAuthenticationPolicyId String Optional Mutable If you set the action parameter to MFA, use mfaAuthenticationPolicyId to specify the ID of the MFA policy that should be used for authentication flows.
result.mitigations[].mfaRegistrationPolicyId String Optional Mutable If you set the action parameter to MFA, use mfaRegistrationPolicyId to specify the ID of the MFA policy that should be used for registration flows.
result.mitigations[].verifyPolicyId String Optional Mutable If you set the action parameter to VERIFY, use verifyPolicyId to specify the ID of the Verify policy that should be used.
result.type String Optional Mutable Can be one of two values: MITIGATION, MITIGATION_FALLBACK. When defining a mitigation, you must set result.type to MITIGATION. Policies that include mitigations must also include a fallback action. For the fallback action, result.type must be set to MITIGATION_FALLBACK.
targets Object Optional Mutable For targeted policies, used to define the conditions for applying the policy.
targets.condition Object Optional Mutable Used to specify the conditions for applying the policy - the type of flows, the user groups, and the applications that are being accessed.
targets.condition.and Array Optional Mutable Array of the conditions for applying the policy. It is mandatory to include in the array the relevant transaction types. The relevant user groups and applications are optional. Each element in the array contains the target transaction types/user groups/applications and the event attribute that is checked.
targets.condition.and[].list Array Optional Mutable Used to list the strings for the target transaction types, user groups, or applications, for example, ["AUTHENTICATION", "AUTHORIZATION"]. For transaction types, should contain one or more of the following: REGISTRATION,AUTHENTICATION,ACCESS,AUTHORIZATION,TRANSACTION. For user groups, should contain the name of one or more user groups. For applications, should contain the PingOne ID of one or more applications.
targets.condition.and[].contains String Optional Mutable The event attribute that is checked for the values specified in the list parameter. For transaction type, this should be set to ${event.flow.type}. For user groups, this should be set to ${event.user.groups}. For applications, this should be set to ${event.targetResource.id}.
targets.condition.and[].type String N/A Read-only Included in risk policy responses. For transaction types, value returned is STRING_LIST. For user groups, value returned is GROUPS_INTERSECTION. For transaction types, value returned is STRING_LIST.
targets.condition.type String N/A Read-only Included in risk policy responses for targeted policies. Value returned is AND if there is more than one condition, and value returned is VALUE_COMPARISON if there is only one condition.
updatedAt Date Required Immutable The date and time the resource was last updated (format ISO-8061).

Risk policies events generated

Refer to Audit Reporting Events for the events generated.


Create Risk Policy Set


Create Risk Policy Set - Targeted Policy with Mitigations


Create Risk Policy Set - Targeted Policy no Scores (PingID users)


Read Risk Policy Sets


Read Risk Policy Sets (with targeted policy order)


Read One Risk Policy Set


Reorder Targeted Risk Policies


Update Risk Policy Set


Delete Risk Policy Set

Risk Evaluations

When you define authentication or other flows for your users, you can include risk evaluations at relevant points in the flow. The risk evaluation that is carried out is based on the risk policy that you specify for the evaluation. The following diagram shows a simplified sample flow that includes risk evaluation.

Sample flow with risk evaluation

Note that the flow includes two distinct steps relating to risk evaluation.

The actual risk evaluation step should be added at a point in the flow where you would like to base the next action on the risk level calculated, for example, show an MFA prompt for medium or high-risk, but automatically grant access if the risk is deemed to be low.

After completion of the authentication steps, your flow should include a step to update the risk evaluation system with the results of the flow - was authentication completed successfully.

To ensure protection against fraudulent access attempts, it is essential that your flows include the SUCCESS/FAILED update step to indicate whether the flow was completed successfully or not. Many of the predictors used in risk policies are based on gradual learning of the characteristics of the access attempts made by your users, for example, where were they physically located and what operating system were they using. This learning process can only take place if your flows provide a clear indication which access attempts were made by legitimate users.

Risk evaluation data model

Property Type Required? Mutable? Description
createdAt Date N/A Read-only The time the resource was created (format ISO-8061).
details Object Optional Mutable Contains additional information about the risk evaluation. Refer to the following [Details data model]{#details-data-model} table.
environment.id String Required Immutable The environment resource's unique identifier.
event Object Required Mutable Contains the attributes identifying the event. For more information about event attributes, refer to the following [Event data model]{#event-data-model} table.
id String N/A Read-only The risk evaluation's unique identifier.
riskPolicySet.id String Optional Mutable The risk policy set's unique identifier. If this property and riskPolicySet.name are both specified, the policy set referenced by this property is used. If neither this property nor riskPolicySet.name are specified, the environment's default risk policy set is used.
riskPolicySet.name String Optional Mutable The risk policy set associated with this name. If this property and riskPolicySet.id are both specified, the policy set referenced by riskPolicySet.id is used. If neither this property nor riskPolicySet.id are specified, the environment's default risk policy set is used.
riskPolicySet.targeted Boolean Optional Immutable Set riskPolicySet.targeted to true if you want the risk evaluation to process the targeted policies defined in the environment rather than using a specific policy. The targeted policies are processed until a policy is found whose conditions (transaction type, user group, application) are met.
result Object N/A Read-only Contains the risk policy that evaluates as true. If there are several risk policies that evaluate as true, the highest priority risk policy is returned. If no risk policy evaluates as true, the defaultResult of the policy set is returned.
result.level String N/A Read-only The risk evaluation result level. Options are HIGH, MEDIUM, and LOW.
result.recommendedAction String N/A Read-only The recommended course of action based on the evaluation. Currently used only for policies that include a bot detection predictor, an Adversary-in-the-Middle (AitM) predictor, an email reputation predictor, or a traffic anomaly predictor. If recommendedAction is included in the response, the possible values are:
  • ACCOUNT_RECOVERY, meaning that there are indications that the user's account may have been compromised so you should have them follow your account recovery procedure.
  • AITM_MITIGATION, meaning that you should take steps to mitigate the damage from an AitM attack. For an AitM attack, the user's credentials have been intercepted, so in addition to blocking the access request, you should lock the user's account until the password is changed.
  • BOT_MITIGATION, meaning that you should take steps to handle a scenario where a bot is involved.
  • DENY - returned when a risk level of HIGH is calculated for a traffic anomaly predictor. The recommendation is that you deny access because the suspicious activity is likely due to malicious behavior.
  • TEMP_EMAIL_MITIGATION, meaning that the user has specified a disposable email address, so you should probably block the registration attempt.
result.type String N/A Read-only The risk evaluation result type. Options are VALUE, indicating any custom attribute that's defined.
updatedAt Date N/A Read-only The time the resource was last updated (format ISO-8061).

Event data model

A POST request uses these properties to specify information about events processed for risk evaluation.

Property Type Required? Mutable? Description
browser.cookie String Optional Mutable To improve risk analysis, provide the value of a persistent cookie.
browser.userAgent String Optional Mutable The user agent string for the browser.
completionStatus String N/A Read-only The state of the evaluation transaction. In risk evaluation response, returned with a value of IN_PROGRESS.
device Object Optional Mutable Contains information about the device being used.
device.externalId String Optional Mutable If you want to maintain your own device IDs, you can send the device ID to the risk evaluation by using device.externalId, and this is the ID that will be used rather than the device ID provided by the Signals SDK. One situation where you may want to use this approach is if your mobile native app incorporates a WebView. In such cases, the mobile Signals SDK and the web Signals SDK will provide different device IDs. By providing your own device ID, you'll have a consistent device ID that can be used.
evaluatedFactors.status String Optional Mutable The state of the transaction. Options are FAILED, IN_PROGRESS, and SUCCESS.
evaluatedFactors.type String Optional Mutable The transaction type.
flow.type String Optional Mutable The type of flow for which the risk evaluation is being carried out. Can take any of the following values:
  • REGISTRATION - initial registration of an account
  • AUTHENTICATION - standard authentication for login or actions such as password change
  • ACCESS - verification of whether user can access the relevant application, using tools such as PingAccess
  • AUTHORIZATION - verification of whether user is authorized to perform a specific action such as a profile change, using tools such as PingOne Authorize
  • TRANSACTION - authentication carried out in the context of a purchase or other monetary transaction
The default value is AUTHENTICATION.
flow.subtype String Optional Mutable If you want to provide additional detail about the context of the flow, you can specify a subtype in addition to type. The values that can be used for subtype are:
  • For AUTHENTICATION - ACCOUNT_RECOVERY, ACTIVE_SESSION, KERBEROS, NEO_CREDENTIALS, PASSKEY, PASSWORDLESS, USER_CERTIFICATION, USER_PASSWORD, USERNAME_RECOVERY
  • For AUTHORIZATION - ADD_ADDRESS, ADD_MFA, ADD_PAYEE, ADD_PHONE_NUMBER, ADD_USER, CHANGE_PASSWORD, DELETE_MFA, DELETE_PAYEE, UPDATE_ADDRESS, UPDATE_PHONE_NUMBER
ip String Required Mutable The originating IP address of the authentication flow.
origin String Optional Mutable The calling service.
sdk Object Optional Immutable Object used to provide the data from the Signals (Protect) SDK.
sdk.signals.data String Optional Immutable The data collected by the Signals (Protect) SDK.
session.id String Optional Mutable The unique session ID associated with the event.
sharingType String Optional Mutable The device sharing type. Options are UNSPECIFIED, SHARED, and PRIVATE.
targetResource.id String Optional Mutable The ID of the target application.
targetResource.name String Optional Mutable The name of the target application.
user.groups String[] Optional Mutable The names of the groups in which the user is a member.
user.groups.name String Optional Mutable The name of the group associated with the user (maximum size: 1024 characters).
user.id String Required/Optional Mutable The ID of the user associated with the event (maximum size: 1024 characters). Required when user.type is set to EXTERNAL. When user.type is set to PING_ONE, you must provide either user.id or user.name.
user.name String Required/Optional Mutable The name of the user associated with the event (maximum size: 1024 characters). When user.type is set to PING_ONE, you must provide either user.id or user.name.
user.type String Required Mutable The type of user associated with the event. The possible values are PING_ONE and EXTERNAL.

Details data model

A POST request returns the following attributes in the details property for the specified event.

Property Type Required? Mutable? Description
anonymousNetworkDetected Boolean N/A Read-only Indicates whether the current authentication originated from an anonymous network (for example, proxy or VPN).
city String N/A Read-only The city related to the current transaction from the IP address.
country String N/A Read-only The country related to the current transaction from the IP address.
detected Object N/A Read-only Relevant only for Bot Detection predictors and Suspicious Device predictors. Contains the information on the rule that led to the level reported.
detected.rule.id Integer N/A Read-only Relevant only for Bot Detection predictors and Suspicious Device predictors. ID number of the rule that led to the level reported.
device Object N/A Read-only Contains information about the device being used.
device.agent Object N/A Read-only For risk evaluations that include the PingID Device Trust predictor, contains the data from the trust agent.
device.agent.customScript.exitCode Integer N/A Read-only If a local script was specified when installing the Workforce Trust agent on individual computers, will contain the exit code for the script.
device.agent.customScript.output String N/A Read-only If a local script was specified when installing the Workforce Trust agent on individual computers, will contain the output of the script.
device.agent.id String N/A Read-only The ID generated by the agent to identify the user's computer.
device.agent.loggedInUser.domainName String N/A Read-only The domain name for the logged-in user.
device.agent.loggedInUser.name String N/A Read-only The name of the logged-in user.
device.agent.loggedInUser.objectSid String N/A Read-only The SID (security identifier) for the logged-in user.
device.agent.macAddress Array N/A Read-only The MAC addresses of the user's computer.
device.agent.name String N/A Read-only The name of the user's computer.
device.agent.os.name String N/A Read-only The operating system on the user's computer.
device.agent.os.version String N/A Read-only The version of the operating system on the user's computer.
device.agent.version String N/A Read-only The version of the trust agent.
device.estimatedDistance Double N/A Read-only The distance between the current location of the device and the location of the device when the last risk evaluation was carried out. Distance is given in meters.
device.externalId String N/A Read-only The externally-maintained device ID that was provided in the risk evaluation request, if such an ID was included. For more details, refer to the Event data model.
device.externalLastSeen Date N/A Read-only If an externally-maintained device ID was provided in the risk evaluation request, externalLastSeen is the date and time that device was last seen. Returned only if the risk policy used for the evaluation includes the New Device predictor.
device.id String N/A Read-only The device ID provided by the Signals (Protect) SDK.
device.lastSeen Date N/A Read-only The date and time the device was last seen. Returned only if the risk policy used for the evaluation includes the New Device predictor.
estimatedDistance Double N/A Read-only The distance between the user's current location and the user location when a risk evaluation was last updated with the completion status SUCCESS. Distance is given in meters.
estimatedSpeed Integer N/A Read-only The speed the user would have had to travel at to reach their current location, based on the distance from the location when a risk evaluation for the user was last updated with the completion status SUCCESS and the time elapsed since that update event. Speed is given in kilometers per hour.
impossibleTravel Boolean N/A Read-only Indicates whether the distance between the location of the user in their previous successful authentication and current authentication infers that the user had to travel at a speed greater than 1000 kilometers per hour. This condition is marked as fulfilled, only if:
  • Location data is available for the current and previous IP address of the user.
  • This is not the first transaction that the user has performed.
  • The user's previous successful transaction was performed less than 24 hours ago.
  • The user moved a distance of at least 100 kilometers. Thus, even if the user moved very fast, but moved only a distance of 90 kilometers, the condition is not fulfilled.
  • The user moved at a speed greater than 1000 kilometers per hour.
.
ipAddressReputation.domain.asn Integer N/A Read-only The autonomous system number.
ipAddressReputation.domain.isp String N/A Read-only The ISP that registered the domain.
ipAddressReputation.domain.organization String N/A Read-only The organization that owns the domain.
ipAddressReputation.domain.sld String N/A Read-only The second-level domain.
ipAddressReputation.domain.tld String N/A Read-only The top-level domain.
ipAddressReputation.level String N/A Read-only The risk level of the evaluated IP address. Options are LOW, MEDIUM, and HIGH. If the score is less than 55, the level is LOW; if the score is greater than 77, the level is HIGH; if the score is between 55 and 77, the level is MEDIUM. Note that these guidelines could change based on data analytics and product consideration. If the ipAddressReputation.score is unknown, NULL is returned.
ipAddressReputation.score Integer N/A Read-only Represents the calculated score of the IP address involved in the transaction. Scores range between 0 and 100. A score of 0 indicates a non-risky IP address; a score of 100 indicates a high-risk IP address. If the IP address reputation score is not available for the specific IP address, NULL is returned.
previousSuccessfulTransaction.anonymousNetworkDetected Boolean N/A Read-only Indicates whether an anonymous network was detected. Information is available twenty-four hours after the last successful transaction.
previousSuccessfulTransaction.city String N/A Read-only The city of the IP address involved in the transaction. Information is available twenty-four hours after the last successful transaction.
previousSuccessfulTransaction.country String N/A Read-only The country of the IP address involved in the transaction. Information is available twenty-four hours after the last successful transaction.
previousSuccessfulTransaction.ip String N/A Read-only The IP address involved in the transaction. Information is available twenty-four hours after the last successful transaction.
previousSuccessfulTransaction.state String N/A Read-only The state of the IP address involved in the transaction. Information is available twenty-four hours after the last successful transaction.
previousSuccessfulTransaction.timestamp String N/A Read-only The timestamp of the transaction. Information is available twenty-four hours after the last successful transaction.
state String N/A Read-only The state or province related to the current transaction from the IP address.
{{predictorCompactName}}.level String N/A Read-only The risk score calculated for the predictor-related transactions associated with the accessing device, and for the current authentication attempt. Options are LOW, MEDIUM, and HIGH.
{{predictorCompactName}}.reason String N/A Read-only The reason (or reasons) provided for the risk score classification (for example, the operating system or browser type used by the device, and country in which the accessing device is located). Each reason is classified as Unusual, to indicate how much it deviates from normal user behavior, and its effect in calculating the overall predictor risk score. Note that these messages may change in the future. If you want to take action based on a certain scenario, the action should be based on the value of detected.rule.id, which is constant.
{{predictorCompactName}}.status String N/A Read-only Additional information about the predictor evaluation outcome. Example responses are NOT_AVAILABLE, IN_TRAINING_PERIOD, or FAILED_TO_COMPUTE.
{{predictorCompactName}}.type String N/A Read-only The type of the predictor.

Update Risk Evaluation data model

Property Type Required? Mutable? Description
completionStatus String Required Immutable If the flow was completed successfully, set to SUCCESS. If not, set to FAILED. The value of this property can be changed only if its current state is IN_PROGRESS.

Risk evaluations events generated

Refer to Audit Reporting Events for the events generated.

Response codes

Code Message
200 Successful operation.
201 Successfully created.
400 The request could not be completed.
401 You do not have access to this resource.
403 You do not have permissions or are not licensed to make this request.
404 The requested resource was not found.

Providing feedback for risk evaluations

Use the riskFeedback endpoint to provide feedback on the accuracy of specific risk evaluations that were carried out. The request for providing feedback takes a list of feedback items, each consisting of the risk evaluation ID, a feedback category, and a reason for including it in that category (optional). In each such request, you can include feedback for up to 100 risk evaluations.

Risk evaluation feedback data model

Property Type Required? Mutable? Description
evaluationFeedbackItems Array Required Immutable The collection of feedback items.
evaluationFeedbackItems[].feedbackCategory String Required Immutable One of the following categories of feedback: FALSE_HIGH_RISK, FRIENDLY_BOT, NEW_ACCOUNT_FRAUD, COMPROMISED_ACCOUNT, AUTOMATED_ATTACK.
evaluationFeedbackItems[].reason String Optional Immutable The reason that the specific feedback category was specified. The possible values depend upon the category chosen.
  • False high risk: OFFICE_NETWORK, COMPANY_VPN, WRONG_LOCATION, ORG_NETWORK, SUCCESSFUL_MFA, OTHER
  • Friendly bot: KNOWN_CRAWLER, KNOWN_AGGREGATOR, INTERNAL_AUTOMATION, OTHER
  • New account fraud: SUSPICIOUS_EMAIL_ADDRESS, USERNAME_GUESSING, OTHER
  • Compromised account: USER_CLAIMS_IT_IS_NOT_THEM, UNSUCCESSFUL_MFA, OTHER
  • Automated attack: CREDENTIAL_STUFFING, PASSWORD_SPRAY, OTHER
evaluationFeedbackItems[].riskEvaluation.createdAt Date Optional Immutable The date and time the risk evaluation was carried out. Use ISO-8061 format, for example, 2024-05-01T13:44:33.417Z. This parameter is optional, but providing a value for it makes the feedback process more efficient.
evaluationFeedbackItems[].riskEvaluation.id String Required Immutable The ID of the risk evaluation.

Below is the sample body for a request that provides feedback on three risk evaluations. Full sample request can be found here.

{
  "evaluationFeedbackItems":[
    {
      "riskEvaluation": { 
            "id": "15f1d245-33b3-4dba-849d-4df4b64b2d42"
       },
      "feedbackCategory": "FRIENDLY_BOT",
      "reason": "INTERNAL_AUTOMATION"
    },
    {
      "riskEvaluation": { 
            "id": "d1b638b4-638e-4c56-8fc6-872691c1bab1"
       },
      "feedbackCategory": "FALSE_HIGH_RISK",
      "reason": "COMPANY_VPN"
    },
    {
      "riskEvaluation": { 
            "id": "35f1d245-33b3-4dba-849d-4df4b64b2d45"
       },
      "feedbackCategory": "FALSE_HIGH_RISK"
    }  
   ]
}

Create Risk Evaluation


Create Risk Evaluation (using targeted risk policies)


Create Risk Evaluation (includes device trust predictor)


Create Risk Evaluation (with custom input)


Read One Risk Evaluation


Send Risk Evaluation Feedback


Update Risk Evaluation

Risk Predictors

PingOne supports multiple risk predictors, which are intended to identify possible fraudulent user behaviors based on these criteria:

  • Anonymous network detection

    Malicious actors typically use anonymous networks, such as unknown VPNs, Tor, and proxies to mask their IP address. PingOne Protect analyzes IP address data from a user's device to determine if the address is originating from any type of anonymous network. If so, the user can be prompted for step-up authentication or denied access. PingOne Protect also supports creating a whitelist of networks, ensuring that legitimate VPN users can access authorized resources.

  • IP velocity

    IP Velocity tracks the number of distinct IPs used per user. The threshold of the number of IPs per user is based on a statistical learning of the organization's past behavior. The risk predictor learns the mean average number of distinct IPs per user per unit of time (hour), and the standard deviation. The Risk Predictor then calculates the low, medium, and high thresholds of the number of IPs per user for the organization.

  • IP reputation

    IP addresses that have been involved in malicious activities, such as distributed denial-of-service (DDoS) attacks or spam activity, are considered risky. The more frequently they are used for malicious activities, the higher their risk score. If a user attempts to access an application that is associated with an IP address previously involved with suspicious activity, the probability of potentially risky behavior increases. PingOne Protect analyzes data from different intelligence sources to determine the probability an IP address is associated with malicious activity and to request stronger authentication to verify the user's identity. It also supports creating a whitelist of networks, ensuring that legitimate VPN users can access authorized resources.

  • User velocity

    User Velocity tracks the number of distinct users per IP. The threshold of the number of users per IP is based on a statistical learning of the organization's past behavior. The risk predictor learns the mean average number of distinct users per IP per unit of time (hour), and the standard deviation. The Risk Predictor then calculates the low, medium, and high thresholds of the number of users per IP for the organization.

  • User-based risk behavior

    The user-based risk behavior predictor compares a transaction with the typical behavior of the specific user. For example, if a user accesses an application that they rarely use, user-based risk behavior detects an anomaly. User-based risk behavior is a machine-learning model that continuously updates. The machine-learning model characterizes abnormal activity as low, medium, or high risk.

  • Geovelocity anomaly

    Users frequently sign on to the same application from multiple locations throughout the day. However, a time lapse between the current sign-on location and the previous location that is shorter than the time it would take to travel between the two points could indicate potentially suspicious activity. PingOne Protect analyzes location data to calculate if travel time between two session locations is physically possible. If the elapsed time is calculated to be impossible, the user can be prompted with step-up authentication or denied access. It also supports creating a whitelist of networks, ensuring that legitimate VPN users can access authorized resources.

  • User location anomaly

    User Location Anomaly detects a user's login location and checks it against previously saved authentication locations. If an authentication attempt occurs at a location whose distance from the user's expected location is greater than the radius you defined, it is considered medium or high risk, depending on the extent of the deviation from the defined radius.

  • Bot detection

    Analyzes multiple device and user behavior factors to detect non-human behavior, automated frameworks, and recorders during attempts to register or authenticate. This type of predictor requires use of the Signals (Protect) SDK.

  • New device

    New device predictors allow your risk policy to take into account the risk associated with users trying to access applications from unknown devices or devices that have not been used for sign-on in the recent past.

  • Suspicious device

    Checks for suspicious settings or mismatches between browser, operating system, and hardware attributes in order to detect situations such as emulators, superuser permissions, virtual machines, mirroring applications, and devices that have been tampered with. This type of predictor requires use of the Signals (Protect) SDK.

  • Adversary-in-the-Middle (AitM)

    Adversary-in-the-Middle is a variant of Man-in-the-Middle attacks. In AitM, a malicious actor uses a reverse proxy to position themselves between a user and an online service in order to obtain user credentials and session tokens. This type of attack circumvents the protection usually provided by OTP-based multi-factor authentication, and is a common technique in phishing attempts. The predictor checks the domain name that the user is trying to access in order to identify AitM attacks. The AitM predictor requires use of the Signals (Protect) SDK.

  • Email reputation

    Detects the use of disposable email addresses during registration. You can add the predictor to your risk policies, and you can also define a specific course of action if the result.recommendedAction field in the risk evaluation response indicates the use of a disposable email address.

  • Traffic Anomaly

    Intended for detection of traffic anomalies in terms of variables such as users, devices, and sessions, the Traffic Anomaly predictor will eventually include a variety of rules, some of which you can select to enable or disable. Currently, the predictor detects situations where there are a large number of risk evaluations requested for a single user within a short period of time, and optionally can also detect situations where the number of users per device during a given period is suspicious. When this predictor returns a value of High, it is recommended that you deny access because the suspicious activity is likely due to malicious behavior.

  • PingID Device Trust

    The PingID Device Trust predictor checks if a device is trusted by validating the trust created during the installation of the PingID Device Trust agent. Requires use of the Signals (Protect) SDK and that the agent be installed on user computers.

  • Custom risk predictors

    You can create custom predictors to assign high, medium, or low risk level based on external data that you provide or data that is accessible via the PingOne API but not included in the out-of-the-box predictor types.

In addition to the standard risk predictors, each of which represents a single risk factor, you can create composite risk predictors for situations where you are interested in combining a number of risk factors into a single predictor. For example, a situation where you are concerned about the use of an anonymous network only in cases where a user location anomaly is also reported.

Risk predictor evaluations

The evaluatedPredictors property in the policy set identifies the list of predictors (by ID) to be evaluated. If there is not enough data to assess a predictor level, the evaluation result does not assign any level to the predictor. In these cases, the response returns a Not enough information to assess risk score message.

When a predictor is added to a policy, regardless of the predictor weight, the predictor is evaluated when the policy is evaluated and its output appears in the details section of the risk service response. If you set the risk predictor's weight to 0, this predictor is evaluated but its risk assessment is not taken into account when calculating the risk score. Conversely, if the predictor is not added to the evaluatedPredictors property, or it was removed from the policy before evaluation, then the predictor is not evaluated and its output does not appear in the details section of the response.

Base risk predictor data model

Property Type Required? Mutable? Description
activationAt Date Optional Mutable For New Device predictors, you can use the activationAt parameter to specify a date on which the learning process for the predictor should be restarted. This can be used in conjunction with the fallback setting (default.result.level) to force strong authentication when moving the predictor to production. The date should be in the form yyyy-mm-dd. Note that activation date uses UTC time.
compactName String Required Immutable A unique name for the predictor. The value must be alpha-numeric (case-sensitive), with no special characters or spaces. This name is used in the API both for policy configuration, and in the Risk Evaluation response (under details).
createdAt Date N/A Read-only The date the risk predictor was created (format ISO-8061).
default Object Optional Mutable Contains the default values used for a new risk predictor.
default.result Object Optional Mutable Contains the result assigned to the predictor if the predictor could not be calculated during the risk evaluation. If this field is not provided, and the predictor could not be calculated during risk evaluation:
  • If the predictor is used in an override, the override is skipped.
  • In a weighted policy, the predictor will have a weight of 0.
default.result.level String Optional Mutable The default result level. Options are HIGH, MEDIUM, and LOW.
default.result.type String N/A Read-only The default result type. Options are VALUE, indicating any custom attribute that's defined.
default.score Integer N/A Read-only The score assigned to the risk predictor in a new policy by default.
default.weight Integer N/A Read-only The weight assigned to the risk predictor in a new policy by default.
description String Optional Mutable The description of the risk predictor. Maximum length is 1024 characters.
detect String Optional/Required Immutable Used only for New Device, Suspicious Device, and PingID Device Trust predictors. These predictor types all use the value DEVICE for type. The detect field is used to specify the kind of devices you are trying to detect. The possible values are NEW_DEVICE, SUSPICIOUS_DEVICE, and PINGID_TRUSTED_DEVICE.
includeRepeatedEventsWithoutSdk Boolean Optional Mutable Relevant only for Bot Detection predictors. Set the value of includeRepeatedEventsWithoutSdk to true to expand the range of bot activity that PingOne Protect can detect.
name String Required Mutable A unique, friendly name for the predictor. The name value is case (and space) sensitive. The API does not allow two predictors with the exact same name. However, the API does not restrict creating predictors with names such as my name and My Name. This name is displayed in the Risk Policies UI, when the admin is asked to define the overrides and weights.
licensed Boolean N/A Read-only Indicates whether the environment has the license required for the predictor.
shouldDetectCompromisedAccount Boolean Optional Mutable Relevant only for the User-based Risk Behavior predictor. Set shouldDetectCompromisedAccount to true if you want PingOne to attempt to detect compromised user accounts and take this into account when calculating the risk level for this predictor.
shouldValidatePayloadSignature Boolean Optional Mutable Relevant only for Suspicious Device predictors. If shouldValidatePayloadSignature is set to true, then any risk policies that include this predictor will require that the Signals SDK payload be provided as a signed JWT whose signature will be verified before proceeding with risk evaluation. You instruct the Signals SDK to provide the payload as a signed JWT by using the universalDeviceIdentification flag during initialization of the SDK, or by selecting the relevant setting for the skrisk component in DaVinci flows.
type String Required Immutable Any one of the following values: ADVERSARY_IN_THE_MIDDLE, ANONYMOUS_NETWORK, BOT, COMPOSITE, DEVICE, EMAIL_REPUTATION, GEO_VELOCITY, IP_REPUTATION, MAP, TRAFFIC_ANOMALY, USER_LOCATION_ANOMALY, USER_RISK_BEHAVIOR, VELOCITY. Note that the New Device, Suspicious Device, and PingID Device Trust predictors all use the type DEVICE. To differentiate between them, you use the detect field. For COMPOSITE, refer also to the Composite risk predictor data model below. For MAP, refer also to Custom risk predictors below. For VELOCITY, refer also to Velocity risk predictor data model below. For TRAFFIC_ANOMALY, refer also to Traffic anomaly risk predictor data model below.
updatedAt Date N/A Read-only The date the risk predictor set was updated (format ISO-8061).
whiteList List[] Optional Mutable For the geoVelocity, ipReputation, and anonymousNetwork predictors, use whiteList to specify IP addresses (CDIRs) that should be ignored by the predictor (usually because these are IPs you know are legitimate). The list can include IPs in IPv4 format and IPs in IPv6 format. For the ADVERSARY_IN_THE_MIDDLE predictor, use whiteList to specify the legitimate domains that your users will access for your restricted resources.

Composite risk predictor data model

Property Type Required? Mutable? Description
compositions Array Required Mutable Contains the objects that specify the conditions to test and the risk level that should be assigned if the conditions are met. The array can contain a maximum of three elements.
compositions[].condition Object Required Mutable Specifies the set of conditions that are to be tested.
compositions[].level String Required Mutable The risk level that should be assigned if the specified conditions are met. Can be HIGH, MEDIUM, or LOW.

Traffic anomaly risk predictor data model

Property Type Required? Mutable? Description
rules Array Required Mutable Collection of rules to use for this traffic anomaly predictor.
rules[].enabled Boolean Required Mutable Set to true to use the defined rule in the predictor.
rules[].interval Object Required Mutable Object that contains the fields used to define the timeframe to consider. The timeframe can be between 1 hour and 14 days.
rules[].interval.unit String Required Mutable The time unit for defining the timeframe for tracking number of users on the device - can be DAY or HOUR
rules[].interval.quantity Integer Required Mutable The number of days or hours for the timeframe for tracking number of users on the device.
rules[].threshold Object Required Mutable Object that contains the fields used to define the risk thresholds.
rules[].threshold.medium Integer Required Mutable Number of users during the defined timeframe that will be considered Medium risk.
rules[].threshold.high Integer Required Mutable Number of users during the defined timeframe that will be considered High risk.
rules[].type String Required Mutable The type of rule. Currently the only valid value is UNIQUE_USERS_PER_DEVICE - for tracking the number of unique users for a device over a defined timeframe.

Velocity risk predictor data model

Property Type Required? Mutable? Description
by List Optional Mutable An ordered list of JSON parameters for the values to aggregate. For example, ${event.ip},${event.user.id}.
of String Optional Mutable A JSON pointer for the value to aggregate. For example ${event.ip} or ${event.user.id}.
threshold Object Optional Mutable Contains information about the calculated threshold used.
threshold.high Integer Optional Mutable The value calculated for the high threshold. If the IP was accessed by more than the high number of users during the past hour, the IP is flagged as a HIGH userVelocityByIp.level.
threshold.medium Integer Optional Mutable The value calculated for the medium threshold. If the IP was accessed by more than the medium number of users during the past hour, the IP is flagged as a MEDIUM userVelocityByIp.level
threshold.source String Optional Mutable The source used to calculate the threshold. This can be:
  • MIN_NOT_REACHED. If the measure is less than every.minSample, the threshold isn't calculated. Instead, a value of LOW is automatically assigned.

  • CALCULATED. Indicates the threshold was calculated.

  • ENVIRONMENT_FALLBACK. Indicates a global threshold calculated for the entire environment is used. The global threshold is used when the userVelocityByIp.threshold couldn't be calculated for the user, generally due to a lack of past transactions for the risk predictor to use for the threshold calculation.

  • DEFAULT_FALLBACK. Indicates the default threshold defined for the predictor (in threshold.medium or threshold.high) is used. The default threshold is used when ENVIRONMENT_FALLBACK (the global threshold) could not be calculated, generally due to a lack of past transactions for the risk predictor to use for the global threshold calculation.
threshold.calculatedAt Date Optional Mutable The timestamp for the calculated threshold.
threshold.expiresAt Date Optional Mutable Indicates when the threshold will be recalculated. The recalculation will happen before this time.
velocity.distinctCount Integer Required Mutable The distinct count during a specified number of seconds. The duration is set using the velocity.during property. Applicable only for IP velocity predictors that have measure=DISTINCT_COUNT set.
velocity.during Integer Required Mutable The number of seconds for the DISTINCT_COUNT duration. Applicable only for IP velocity predictors that have measure=DISTINCT_COUNT set.

Risk predictors events generated

Refer to Audit Reporting Events for the events generated.

Custom risk predictors

You can define three types of custom risk predictors:

  • IP Range - for custom handling of IP-related risks
  • String Matching - definition of risk levels associated with different values of custom input provided as a string
  • Numeric Range - definition of risk levels associated with different values of custom input provided as a number

While different fields are used for defining these three types of conditions, the basic JSON structure for the body of the request is similar for all types:

  • The top-level field type must be set to MAP.
  • The conditions are contained inside objects called map.high, map.medium, and map.low. You do not have to include all three levels, you just have to include at least one of these objects. If you include more than one level, for example, map.high and map.medium, each must refer to the same variable, for example, ${details.country}.
  • The contains field in the condition can use any of the following as the variable whose value is being checked:
    • Any field in the details object (refer to Risk Evaluations)
    • Any field in the event object (refer to Risk Evaluations)
    • Any custom attribute added to the event object simply by adding the attribute to the event object in the body of a risk evaluation request

IP Range custom predictor - sample request body

{
  "name": "Device IP - custom",
  "compactName": "deviceIpCustom",
  "map": {
    "high": {
        "ipRange": [
            "1.1.1.1/5",
            "2.2.2.2/8"
        ],
    "contains": "${event.ip}"
    }
  },
  "type": "MAP",
  "default": {
    "result": {
      "level": "MEDIUM"
    }
  }
}

String Matching custom predictor - sample request body

{
  "name": "Device country - custom",
  "compactName": "deviceCountryCustom",
  "map": {
    "high": {
        "list": [
            "Iran",
            "Syria"
        ],
    "contains": "${details.country}"
    },
    "medium": {
        "list": [
            "Ethiopia",
            "Russia"
        ],
    "contains": "${details.country}"
    }
  },
  "type": "MAP",
  "default": {
    "result": {
      "level": "MEDIUM"
    }
  }
}

Numeric Range custom predictor - sample request body

{
  "name": "Device Network Location",
  "compactName": "deviceNetworkLocation",
  "map": {
    "high": {
      "between": {
        "minScore": 804672,
        "maxScore": 12742000
      },
      "contains": "${details.device.estimatedDistance}"
    },
    "medium": {
      "between": {
        "minScore": 321869,
        "maxScore": 804672
      },
      "contains": "${details.device.estimatedDistance}"
    },
    "low": {
      "between": {
        "minScore": 0,
        "maxScore": 321869
      },
      "contains": "${details.device.estimatedDistance}"
    }
  },
  "type": "MAP",
  "default": {
    "result": {
      "level": "LOW"
    }
  }
}

Composite risk predictors

The JSON content below shows the body of a request for creating a composite predictor.

Details to note about the content of the request body:

  • type must be set to COMPOSITE.

  • Each of the objects in the compositions array contain a condition object, which is use to specify the set of conditions to test, and the level field, which specifies the risk level that should be assigned if the conditions are met.

  • The compositions array can contain a maximum of three elements.

  • The specific predictor comparisons to carry out should use the ${details.*.level} format to specify the predictor to use. The string between details and level should be the compact name of the predictor.

  • In addition to standard and custom predictors, you can include the following risk factors in composite predictors: country (${details.country}), state (${details.state}), IP range (${event.ip}), IP domain organization (${details.ipAddressReputation.domain.organization}), ISP (${details.ipAddressReputation.domain.isp}), target resource (${event.targetResource.name}), user ID (${event.user.id}), and user name (${event.user.name}). When creating conditions with these risk factors, you can use the following comparisons:

    • equals
    • notEquals
    • contains - to check if a value is in a defined list or in an IP range
    • notContains - to check if a value is not included in a defined list or in an IP range
    • startsWith - to check if a value begins with the specified string. Can be used with ISP, IP domain organization, user ID, and user name.
    • endsWith - to check if a value ends with the specified string. Can be used with ISP, IP domain organization, user ID, and user name.
    • containsIgnoreCase - to check if a value contains the specified substring, not case-sensitive. Can only be used for user ID and user name.
  • In your composite predictors you can also include conditions that check what user groups the user belongs to. For user groups conditions, the comparisons to use are contains and notContains.

  • Use ${details.counters.predictorLevels.high}, ${details.counters.predictorLevels.medium}, and ${details.counters.predictorLevels.low} to specify criteria relating to the number of predictors in a policy that yield a high, medium, or low risk result. For criteria of this type, use the relational terms equals, greater, lower, greaterEquals, lowerEquals.

  • Within condition objects, use or for the array of conditions if it is enough for any of the conditions to be true, and and if all the criteria must be true. If none of the criteria can be true, construct an or array, then enclose it in a not object.

    Example of or:

"compositions": [
  {
    "condition": {
      "or": [
        {
          "equals": 3,
          "value": "${details.counters.predictorLevels.high}",
          "type": "VALUE_COMPARISON"
        },
        {
          "equals": "HIGH",
          "value": "${details.anonymousNetwork.level}",
          "type": "VALUE_COMPARISON"
        },
        {
          "type": "STRING_LIST",
          "list": [
            "Italy",
            "Germany"
          ],
          "notContains": "${details.country}"
        }
      ]
    },
    "level": "HIGH"
  }
]

Example of not:

"compositions": [
  {
    "condition": {
      "not": {
        "or": [
          {
            "value": "${details.counters.predictorLevels.high}",
            "equals": 3,
            "type": "VALUE_COMPARISON"
          },
          {
            "value": "${details.anonymousNetwork.level}",
            "equals": "high",
            "type": "VALUE_COMPARISON"
          },
          {
            "list": [
              "ITALY",
              "GERMANY"
            ],
            "notContains": "${details.country}",
            "type": "STRING_LIST"
          }
        ]
      }
    },
    "level": "HIGH"
  }
]

Full composite predictor example:

{
    "name": "Composite - anonymous network and country",
    "compactName": "compositeAnonymousAndCountry",
    "licensed": true,
    "compositions": [
        {
            "condition": {
                "or": [
                    {
                        "equals": 3,
                        "value": "${details.counters.predictorLevels.high}",
                        "type": "VALUE_COMPARISON"
                    },
                    {
                        "equals": "HIGH",
                        "value": "${details.anonymousNetwork.level}",
                        "type": "VALUE_COMPARISON"
                    },
                    {
                        "type": "STRING_LIST",
                        "list": [
                            "Italy",
                            "Germany"
                        ],
                        "notContains": "${details.country}"
                    }
                ]
            },
            "level": "HIGH"
        },
        {
            "condition": {
                "and": [
                    {
                        "equals": "HIGH",
                        "value": "${details.userLocationAnomaly.level}",
                        "type": "VALUE_COMPARISON"
                    }
                ]
            },
            "level": "MEDIUM"
        }    
    ],
    "type": "COMPOSITE",
    "default": {
        "weight": 5,
        "score": 50,
        "result": {
            "level": "LOW",
            "type": "VALUE"
        }
    }
}

Deleting risk predictors


Create Risk Predictor (Custom - IP range)


Create Risk Predictor (Custom - string matching)


Create Risk Predictor (Custom - numeric range)


Create Risk Predictor (Composite with country)


Create Risk Predictor (Composite with country and user group)


Create Risk Predictor (Suspicious device)


Create Risk Predictor (Traffic anomaly)


Read All Risk Predictors


Read One Risk Predictor


Update Custom Risk Predictor


Update AITM Predictor


Delete Risk Predictor

Working with PingOne APIs

If you want to start building your own workflows with PingOne APIs, the Workflow Library provides step-by-step workflows with linked Postman collections to help you start using the PingOne APIs in your Postman environment. For information about how PingOne secures APIs, resources, and data, and what you can do to implement security measures for your PingOne deployment and applications, refer to Platform security.

PingOne API domains

This section discusses how PingOne API regional endpoints are entered in the domain name system (DNS). In DNS, and in our endpoints, the domain part of the uniform resource locator (URL) comprises three parts separated by periods, such as api.pingone.com: one of our service-specific subdomains, our PingOne domain name of pingone, and one of our top level domains.

We use Postman variables to manage this variety of domain parts in PingOne API endpoints. The later discussion is correct regarding the domain part that the variables evaluate to. However, to ease maintenance, the Postman environment template you get when you download a collection uses variables to isolate the TLD from the rest of the domain part and to isolate the domain part from the rest of the endpoint.

The environment template has a path variable for each subdomain. Each path variable uses another variable, {{tld}}, for the top level domain (TLD). Such as https://api.pingone.com/v1 for {{apiPath}}. The tld variable is first in the environment template that you downloaded.

The table below shows the top level domain value for each region. To change your region, simply change the default {{tld}} value from com to your region's TLD.

Region Code Top level domain
North America region (excluding Canada) NA com (default)
Canada region CA ca
European Union region EU eu
Australia region AU com.au
Singapore region SG sg
Asia-Pacific region AP asia

The PingOne API includes the following domains:

Domain Postman path variable Description
api.pingone.{{tld}}/v1 {{apiPath}} The primary domain for calling PingOne Management API resource server. Note: /v1 is required for {{apiPath}}.
auth.pingone.{{tld}} {{authPath}} The authorization and authentication server domain called to request the access token required to authenticate PingOne API requests. Note: do not include /v1 for {{authPath}}.
orchestrate-api.pingone.{{tld}}/v1 {{orchestratePath}} The primary domain for calling the PingOne DaVinci Management API resource server. Note: /v1 is required for {{orchestratePath}}.
scim-api.pingone.{{tld}}/v1 {{scimPath}} PingOne API service for Cross-domain Identity Management (SCIM). Note: /v1 is required for {{scimPath}}.

The {{...Path}} variable in the sample requests stand for the PingOne service endpoint. Refer to Public endpoints in the PingOne for Developers Foundations guide for more information.

The Try a Request feature

Our documentation for the PingOne APIs includes an interactive Try a Request feature. Try a Request enables you to configure and send a PingOne API request and get a response from within the documentation. This is a quick way to interactively test a PingOne API request without needing to use either Postman or the command line.

Requests in Authentication and Authorization APIs do not have the Try a Request feature due to a Cross-Origin Resource Sharing (CORS) constraint.

Calling the PingOne APIs from the command line

Each PingOne API request in the documentation includes an example request and response. By default, the example request is displayed using cURL. However, a number of coding languages are available in the associated drop-down list. If you want to run a request from the command line, you can select the coding language and copy the displayed request. You'll need to replace any variables in the request with the appropriate values before running the request.

Using Postman collection-level authorization

Most APIs require authorization to ensure that client requests access data securely. Postman can pass along whatever authorization details necessary for the method demanded by the endpoint. You can manually include authorization data in the header, body, or as parameters to a request. However, the easiest way is to use the Authorization tab in Postman. Select an authorization Type on that tab and Postman offers a dialog to gather the information required by that Type. When you run a request, Postman uses the information from the Authorization tab to automatically add the necessary authorization header, body, or parameters to the request. Postman offers the Authorization tab on requests, folders, and collections.

In PingOne collections, the authorization method is defined at the collection level. Only those requests that require a specific authorization method have authorization defined on the request (roughly 10% of PingOne requests). This allows you to easily change the authorization used for most requests. Refer to Postman Collection-Level Authorization for more information.

Postman and the PingOne APIs

We use Postman to create our PingOne DaVinci Admin API docs, and have supplied our Postman collections for you to download. There's also an accompanying Postman Environment template already populated with the variables used in the collections.

If you aren't currently using Postman, you can install the free version. Refer to Download Postman to install Postman, either locally, or in your browser.

Refer to The PingOne DaVinci Admin API Postman collections for the collections you can download or fork.

For more information about our Postman environment variables, refer to The PingOne Postman environment template.

You'll also find all of the Postman collections for our documented PingOne use cases in our Workflow Library.

The PingOne Postman collections

You can get the PingOne Protect API Postman collection by following either of these methods for retrieving a Postman collection into your workspace:

  1. Fork the collection into your workspace. Postman retains an association between the source and your fork. If we update the source collection, you can pull those changes into the fork in your workspace.

  2. Import the collection into your workspace. This is a one-time transfer and retains no association to the source collection.

To retrieve a collection

Refer to The PingOne Protect API collections on this page.

  1. Click the collection's Run In Postman button.

  2. At the prompt, click Fork Collection at the bottom of the dialog or click import a copy near the bottom of the dialog.

    RunInPostman

  3. Follow the on-screen instructions to fork or import the collection. You're prompted to select a Postman workspace for the retrieved collection.

When you fork a Postman collection, you create a copy of it in a selected workspace. Forking a collection creates a linked version that synchronizes with its source collection. This synchronization is apparent when you click the three dots icon on the forked collection - you'll see Pull changes on the context menu. When you click Pull changes, Postman compares the fork to the source collection. If changes are available, you can pull those changes into your fork. If you also elect to watch the collection, you'll receive notifications when the source changes.

If you import a collection, a copy is created in the selected workspace with no link back to the source. The collection is static. This may be desirable for some use cases. For example, if you intend to keep and use only some requests in a collection, a link back to the source is not needed.

You're not limited to choosing one method or the other. You can fork a copy to track the source and import a copy for experimentation, if you like.

The PingOne Protect API collections

These Postman collections include requests for all create, read, update, and delete (CRUD) operations for the PingOne Protect APIs.

Collection Description Retrieve
PingOne Protect Postman requests for the PingOne Protect Admin API. Includes all environment variables. No example responses to make it easy to get started. Run In Postman
PingOne Protect Postman requests for the PingOne Protect API. Includes all PingOne Platform API Reference documentation and example responses. No environment variables are included. Run In Postman

For more information about the Postman environment variables included when you download or fork one of our Postman collections, refer to The PingOne Postman environment template.

The PingOne Postman environment template

Our Postman collections use variables in the request URLs to specify the UUIDs for PingOne resources. When you click the Run in Postman button for a collection, these environment variables are included in your download or fork. Use these environment variables as a template to assign your PingOne resource UUIDs with the common variables used in many of the requests.

For more information about using Postman environments, refer to the following topic in the Postman documentation: Environments in Postman.

POST requests in the PingOne Protect API Postman collections that create a resource and return a resource ID include a Postman script. This script automatically adds a resource variable to your active Postman environment, and uses the newly created ID as the value.

For example, the following request creates a new Protect variable. This request URL contains variables for the API path and environment ID:

POST {{apiPath}}/environments/{{envID}}/variables

To run this request, you must ensure the {{apiPath}} in the Postman environment template has the regional top-level domain (TLD) associated with your organization. Refer to Variables you must value for more information.

Almost every request in PingOne requires an environment ID. If you are working primarily in one environment for testing purposes, you'll want to add your environment's UUID to your active Postman environment as the value for the {{envID}} variable.

Requests to PingOne Management API endpoints require a valid access token to authenticate the request. In the PingOne Postman collections, the token value is represented in the Postman environment template as the variable {{accessToken}}.

With the {{tld}} and {{envID}} variables defined in your Postman template, and with a valid token value defined in the {{accessToken}} variable, you can run the request shown above:

POST {{apiPath}}/environments/{{envID}}/variables

If the request is successful, Postman adds a {{variableID}} variable to the current Postman environment automatically, and associates the new user's id property value (the UUID of the new user) with this variable.

Notes about environment variables and security

It's important to understand how Postman allows you to Store and reuse values using variables. Postman has two values for each environment variable: an Initial value and a Current value. You'll want to pay particular attention to differences between Initial and current values. Initial values are saved to Postman's cloud, and available to anyone who has access to the environment. Current values are saved only locally and available only to you. Postman uses only the current value in requests. If an environment variable has an initial value but no current value, Postman doesn't copy it to the current value or use the initial value in the request, the request simply fails. In this case, you need to manually copy the initial value to the current value.

When you create a new variable with an initial value and save the environment, Postman autofills the current value. However, that is the only time that Postman autofills the current value. If you subsequently delete the current value, the variable is no longer valued in a request.

Saving initial values to the Postman cloud impacts security. These initial values are available to anyone who has access to the workspace. If a workspace is public, you have a security issue.

Postman's recommended solution to exposing secrets is to Store secrets in your Postman Vault. Remember that Postman uses only current values in requests.

Variables you must value

When you download or fork a PingOne Postman collection, your workspace receives a set of Postman environment variables for you to use as a template. The variables that represent a resource in PingOne automatically receive a value when you create a new PingOne resource using Postman. Our script associated with the request (shown on the request's Scripts tab) inserts the identifier of the resource it creates as the value of the variable associated with that resource. However, some variables essential to using Postman with PingOne do not have their values inserted automatically. You must manually add the correct value to these variables before making any requests in Postman:

Postman variable PingOne resource
adminAppID The Client ID of the Worker app you created Create an admin Worker app connection.
adminAppSecret The Client Secret of the Worker app created.
adminEnvID The ID for the environment in which your Worker app resides.
envID The ID for the environment in which you are running your Postman API requests.
orgID The ID for your organization. In the PingOne admin console, select Environment and click Properties to view your organization ID.
tld The top-level domain to use for your environment. This is used in URLs containing apiPath, authPath, orchestratePath, and scimPath.
apiPath The regional domain for the PingOne management server (https://api.pingone.{{tld}}/v1).
authPath The regional domain for the PingOne authorization and authentication server (https://auth.pingone.{{tld}}).
orchestratePath The regional domain for the PingOne DaVinci management server (https://orchestrate-api.pingone.{{tld}}/v1).
scimPath The regional domain for the PingOne SCIM management server (https://scim-api.pingone.{{tld}}).