PingOne Platform APIs

Create Risk Predictor (Suspicious device)

 

POST {{apiPath}}/environments/{{envID}}/riskPredictors

This request creates a suspicious device predictor.

By setting the value of shouldValidatePayloadSignature to true, it specifies that 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.

Prerequisites

Request Model

Refer to Risk Predictors for the complete data models.

Base data model

Property Type Required?

compactName

String

Required

default

Object

Required

default.result

Object

Required

default.result.level

String

Required

detect

String

Required

licensed

Boolean

Required

name

String

Required

shouldValidatePayloadSignature

Boolean

Optional

type

String

Required

Headers

Authorization      Bearer {{accessToken}}

Content-Type      application/json

Body

raw ( application/json )

{
    "name": "Susp Device with signed SDK payload",
    "compactName": "susDeviceSignedPayload",
    "licensed": true,
    "type": "DEVICE",
    "detect":"SUSPICIOUS_DEVICE",
    "shouldValidatePayloadSignature": true,
    "default": {
        "result": {
            "level": "MEDIUM"
        }
    }
}

Example Request

  • cURL

  • C#

  • Go

  • HTTP

  • Java

  • jQuery

  • NodeJS

  • Python

  • PHP

  • Ruby

  • Swift

curl --location --globoff '{{apiPath}}/environments/{{envID}}/riskPredictors' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{accessToken}}' \
--data '{
    "name": "Susp Device with signed SDK payload",
    "compactName": "susDeviceSignedPayload",
    "licensed": true,
    "type": "DEVICE",
    "detect":"SUSPICIOUS_DEVICE",
    "shouldValidatePayloadSignature": true,
    "default": {
        "result": {
            "level": "MEDIUM"
        }
    }
}'
var options = new RestClientOptions("{{apiPath}}/environments/{{envID}}/riskPredictors")
{
  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" +
@"    ""name"": ""Susp Device with signed SDK payload""," + "\n" +
@"    ""compactName"": ""susDeviceSignedPayload""," + "\n" +
@"    ""licensed"": true," + "\n" +
@"    ""type"": ""DEVICE""," + "\n" +
@"    ""detect"":""SUSPICIOUS_DEVICE""," + "\n" +
@"    ""shouldValidatePayloadSignature"": true," + "\n" +
@"    ""default"": {" + "\n" +
@"        ""result"": {" + "\n" +
@"            ""level"": ""MEDIUM""" + "\n" +
@"        }" + "\n" +
@"    }" + "\n" +
@"}";
request.AddStringBody(body, DataFormat.Json);
RestResponse response = await client.ExecuteAsync(request);
Console.WriteLine(response.Content);
package main

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

func main() {

  url := "{{apiPath}}/environments/{{envID}}/riskPredictors"
  method := "POST"

  payload := strings.NewReader(`{
    "name": "Susp Device with signed SDK payload",
    "compactName": "susDeviceSignedPayload",
    "licensed": true,
    "type": "DEVICE",
    "detect":"SUSPICIOUS_DEVICE",
    "shouldValidatePayloadSignature": true,
    "default": {
        "result": {
            "level": "MEDIUM"
        }
    }
}`)

  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}}/riskPredictors HTTP/1.1
Host: {{apiPath}}
Content-Type: application/json
Authorization: Bearer {{accessToken}}

{
    "name": "Susp Device with signed SDK payload",
    "compactName": "susDeviceSignedPayload",
    "licensed": true,
    "type": "DEVICE",
    "detect":"SUSPICIOUS_DEVICE",
    "shouldValidatePayloadSignature": true,
    "default": {
        "result": {
            "level": "MEDIUM"
        }
    }
}
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n    \"name\": \"Susp Device with signed SDK payload\",\n    \"compactName\": \"susDeviceSignedPayload\",\n    \"licensed\": true,\n    \"type\": \"DEVICE\",\n    \"detect\":\"SUSPICIOUS_DEVICE\",\n    \"shouldValidatePayloadSignature\": true,\n    \"default\": {\n        \"result\": {\n            \"level\": \"MEDIUM\"\n        }\n    }\n}");
Request request = new Request.Builder()
  .url("{{apiPath}}/environments/{{envID}}/riskPredictors")
  .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}}/riskPredictors",
  "method": "POST",
  "timeout": 0,
  "headers": {
    "Content-Type": "application/json",
    "Authorization": "Bearer {{accessToken}}"
  },
  "data": JSON.stringify({
    "name": "Susp Device with signed SDK payload",
    "compactName": "susDeviceSignedPayload",
    "licensed": true,
    "type": "DEVICE",
    "detect": "SUSPICIOUS_DEVICE",
    "shouldValidatePayloadSignature": true,
    "default": {
      "result": {
        "level": "MEDIUM"
      }
    }
  }),
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
var request = require('request');
var options = {
  'method': 'POST',
  'url': '{{apiPath}}/environments/{{envID}}/riskPredictors',
  'headers': {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer {{accessToken}}'
  },
  body: JSON.stringify({
    "name": "Susp Device with signed SDK payload",
    "compactName": "susDeviceSignedPayload",
    "licensed": true,
    "type": "DEVICE",
    "detect": "SUSPICIOUS_DEVICE",
    "shouldValidatePayloadSignature": true,
    "default": {
      "result": {
        "level": "MEDIUM"
      }
    }
  })

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

url = "{{apiPath}}/environments/{{envID}}/riskPredictors"

payload = json.dumps({
  "name": "Susp Device with signed SDK payload",
  "compactName": "susDeviceSignedPayload",
  "licensed": True,
  "type": "DEVICE",
  "detect": "SUSPICIOUS_DEVICE",
  "shouldValidatePayloadSignature": True,
  "default": {
    "result": {
      "level": "MEDIUM"
    }
  }
})
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}}/riskPredictors');
$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    "name": "Susp Device with signed SDK payload",\n    "compactName": "susDeviceSignedPayload",\n    "licensed": true,\n    "type": "DEVICE",\n    "detect":"SUSPICIOUS_DEVICE",\n    "shouldValidatePayloadSignature": true,\n    "default": {\n        "result": {\n            "level": "MEDIUM"\n        }\n    }\n}');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}
require "uri"
require "json"
require "net/http"

url = URI("{{apiPath}}/environments/{{envID}}/riskPredictors")

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({
  "name": "Susp Device with signed SDK payload",
  "compactName": "susDeviceSignedPayload",
  "licensed": true,
  "type": "DEVICE",
  "detect": "SUSPICIOUS_DEVICE",
  "shouldValidatePayloadSignature": true,
  "default": {
    "result": {
      "level": "MEDIUM"
    }
  }
})

response = http.request(request)
puts response.read_body
let parameters = "{\n    \"name\": \"Susp Device with signed SDK payload\",\n    \"compactName\": \"susDeviceSignedPayload\",\n    \"licensed\": true,\n    \"type\": \"DEVICE\",\n    \"detect\":\"SUSPICIOUS_DEVICE\",\n    \"shouldValidatePayloadSignature\": true,\n    \"default\": {\n        \"result\": {\n            \"level\": \"MEDIUM\"\n        }\n    }\n}"
let postData = parameters.data(using: .utf8)

var request = URLRequest(url: URL(string: "{{apiPath}}/environments/{{envID}}/riskPredictors")!,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/riskPredictors/b57a6b99-58cc-4eb9-a3bb-e647c84da2db"
        },
        "environment": {
            "href": "https://api.pingone.eu/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
        }
    },
    "id": "b57a6b99-58cc-4eb9-a3bb-e647c84da2db",
    "environment": {
        "id": "abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
    },
    "createdAt": "2024-06-18T13:21:21.829Z",
    "createdBy": "USER_DEFINED",
    "updatedAt": "2024-06-18T13:21:21.829Z",
    "name": "Susp Device with signed SDK payload",
    "compactName": "susDeviceSignedPayload",
    "licensed": true,
    "detect": "SUSPICIOUS_DEVICE",
    "shouldValidatePayloadSignature": true,
    "type": "DEVICE",
    "condition": {
        "scores": [
            {
                "name": "HIGH",
                "value": "HIGH"
            },
            {
                "name": "MEDIUM",
                "value": "MEDIUM"
            },
            {
                "name": "LOW",
                "value": "LOW"
            }
        ]
    },
    "deletable": true,
    "tooltip": "predictor.tooltip.device.suspicious.device",
    "default": {
        "weight": 5,
        "score": 80,
        "result": {
            "level": "MEDIUM",
            "type": "VALUE"
        },
        "evaluated": false
    }
}