PingOne Platform APIs

Update Bot Detection Predictor (rule exclusion)

PUT {{apiPath}}/v1/environments/{{envID}}/riskPredictors/{{botDetectionPredictorID}}

This request uses the riskPredictors endpoint to update the Bot Detection predictor, specifying that two of the bot detection rules should be ignored when evaluating the level of risk.

The excludedDetectionRules array is used to specify the IDs of the rules that should be ignored.

You can find the IDs for the available rules in Predictor rules.

The URL for the request contains the ID of the Bot Detection predictor. You can find this ID by sending a READ request to get the details for all of the risk predictors in the PingOne environment.

Note that while the predictor is identified by the predictor ID in the URL of the request, the following parameters are also required in order for the request to succeed: name, compactName, type.

Prerequisites

Request Model

For complete property descriptions, refer to the Base risk predictor data model.

Base data model

Property Type Required?

compactName

String

Required

default.result.level

String

Optional

default.result.type

String

Optional

excludedDetectionRules

String

Optional

includeRepeatedEventsWithoutSdk

Boolean

Optional

name

String

Required

type

String

Required

Headers

Authorization      Bearer {{accessToken}}

Content-Type      application/json

Body

raw ( application/json )

{
    "name": "Bot Detection",
    "compactName": "botDetection",
    "type": "BOT",
    "includeRepeatedEventsWithoutSdk": true,
    "default": {
        "result": {
            "level": "MEDIUM",
            "type": "VALUE"
        }
    },
    "excludedDetectionRules": [
        610,
        660
    ]
}

Example Request

  • cURL

  • C#

  • Go

  • HTTP

  • Java

  • jQuery

  • NodeJS

  • Python

  • PHP

  • Ruby

  • Swift

curl --location --globoff --request PUT '{{apiPath}}/v1/environments/{{envID}}/riskPredictors/{{botDetectionPredictorID}}' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{accessToken}}' \
--data '{
    "name": "Bot Detection",
    "compactName": "botDetection",
    "type": "BOT",
    "includeRepeatedEventsWithoutSdk": true,
    "default": {
        "result": {
            "level": "MEDIUM",
            "type": "VALUE"
        }
    },
    "excludedDetectionRules": [
        610,
        660
    ]
}'
var options = new RestClientOptions("{{apiPath}}/v1/environments/{{envID}}/riskPredictors/{{botDetectionPredictorID}}")
{
  MaxTimeout = -1,
};
var client = new RestClient(options);
var request = new RestRequest("", Method.Put);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", "Bearer {{accessToken}}");
var body = @"{" + "\n" +
@"    ""name"": ""Bot Detection""," + "\n" +
@"    ""compactName"": ""botDetection""," + "\n" +
@"    ""type"": ""BOT""," + "\n" +
@"    ""includeRepeatedEventsWithoutSdk"": true," + "\n" +
@"    ""default"": {" + "\n" +
@"        ""result"": {" + "\n" +
@"            ""level"": ""MEDIUM""," + "\n" +
@"            ""type"": ""VALUE""" + "\n" +
@"        }" + "\n" +
@"    }," + "\n" +
@"    ""excludedDetectionRules"": [" + "\n" +
@"        610," + "\n" +
@"        660" + "\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}}/v1/environments/{{envID}}/riskPredictors/{{botDetectionPredictorID}}"
  method := "PUT"

  payload := strings.NewReader(`{
    "name": "Bot Detection",
    "compactName": "botDetection",
    "type": "BOT",
    "includeRepeatedEventsWithoutSdk": true,
    "default": {
        "result": {
            "level": "MEDIUM",
            "type": "VALUE"
        }
    },
    "excludedDetectionRules": [
        610,
        660
    ]
}`)

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

{
    "name": "Bot Detection",
    "compactName": "botDetection",
    "type": "BOT",
    "includeRepeatedEventsWithoutSdk": true,
    "default": {
        "result": {
            "level": "MEDIUM",
            "type": "VALUE"
        }
    },
    "excludedDetectionRules": [
        610,
        660
    ]
}
OkHttpClient client = new OkHttpClient().newBuilder()
  .build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n    \"name\": \"Bot Detection\",\n    \"compactName\": \"botDetection\",\n    \"type\": \"BOT\",\n    \"includeRepeatedEventsWithoutSdk\": true,\n    \"default\": {\n        \"result\": {\n            \"level\": \"MEDIUM\",\n            \"type\": \"VALUE\"\n        }\n    },\n    \"excludedDetectionRules\": [\n        610,\n        660\n    ]\n}");
Request request = new Request.Builder()
  .url("{{apiPath}}/v1/environments/{{envID}}/riskPredictors/{{botDetectionPredictorID}}")
  .method("PUT", body)
  .addHeader("Content-Type", "application/json")
  .addHeader("Authorization", "Bearer {{accessToken}}")
  .build();
Response response = client.newCall(request).execute();
var settings = {
  "url": "{{apiPath}}/v1/environments/{{envID}}/riskPredictors/{{botDetectionPredictorID}}",
  "method": "PUT",
  "timeout": 0,
  "headers": {
    "Content-Type": "application/json",
    "Authorization": "Bearer {{accessToken}}"
  },
  "data": JSON.stringify({
    "name": "Bot Detection",
    "compactName": "botDetection",
    "type": "BOT",
    "includeRepeatedEventsWithoutSdk": true,
    "default": {
      "result": {
        "level": "MEDIUM",
        "type": "VALUE"
      }
    },
    "excludedDetectionRules": [
      610,
      660
    ]
  }),
};

$.ajax(settings).done(function (response) {
  console.log(response);
});
var request = require('request');
var options = {
  'method': 'PUT',
  'url': '{{apiPath}}/v1/environments/{{envID}}/riskPredictors/{{botDetectionPredictorID}}',
  'headers': {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer {{accessToken}}'
  },
  body: JSON.stringify({
    "name": "Bot Detection",
    "compactName": "botDetection",
    "type": "BOT",
    "includeRepeatedEventsWithoutSdk": true,
    "default": {
      "result": {
        "level": "MEDIUM",
        "type": "VALUE"
      }
    },
    "excludedDetectionRules": [
      610,
      660
    ]
  })

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

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

payload = json.dumps({
  "name": "Bot Detection",
  "compactName": "botDetection",
  "type": "BOT",
  "includeRepeatedEventsWithoutSdk": True,
  "default": {
    "result": {
      "level": "MEDIUM",
      "type": "VALUE"
    }
  },
  "excludedDetectionRules": [
    610,
    660
  ]
})
headers = {
  'Content-Type': 'application/json',
  'Authorization': 'Bearer {{accessToken}}'
}

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

print(response.text)
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('{{apiPath}}/v1/environments/{{envID}}/riskPredictors/{{botDetectionPredictorID}}');
$request->setMethod(HTTP_Request2::METHOD_PUT);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/json',
  'Authorization' => 'Bearer {{accessToken}}'
));
$request->setBody('{\n    "name": "Bot Detection",\n    "compactName": "botDetection",\n    "type": "BOT",\n    "includeRepeatedEventsWithoutSdk": true,\n    "default": {\n        "result": {\n            "level": "MEDIUM",\n            "type": "VALUE"\n        }\n    },\n    "excludedDetectionRules": [\n        610,\n        660\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}}/v1/environments/{{envID}}/riskPredictors/{{botDetectionPredictorID}}")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Put.new(url)
request["Content-Type"] = "application/json"
request["Authorization"] = "Bearer {{accessToken}}"
request.body = JSON.dump({
  "name": "Bot Detection",
  "compactName": "botDetection",
  "type": "BOT",
  "includeRepeatedEventsWithoutSdk": true,
  "default": {
    "result": {
      "level": "MEDIUM",
      "type": "VALUE"
    }
  },
  "excludedDetectionRules": [
    610,
    660
  ]
})

response = http.request(request)
puts response.read_body
let parameters = "{\n    \"name\": \"Bot Detection\",\n    \"compactName\": \"botDetection\",\n    \"type\": \"BOT\",\n    \"includeRepeatedEventsWithoutSdk\": true,\n    \"default\": {\n        \"result\": {\n            \"level\": \"MEDIUM\",\n            \"type\": \"VALUE\"\n        }\n    },\n    \"excludedDetectionRules\": [\n        610,\n        660\n    ]\n}"
let postData = parameters.data(using: .utf8)

var request = URLRequest(url: URL(string: "{{apiPath}}/v1/environments/{{envID}}/riskPredictors/{{botDetectionPredictorID}}")!,timeoutInterval: Double.infinity)
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("Bearer {{accessToken}}", forHTTPHeaderField: "Authorization")

request.httpMethod = "PUT"
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

200 OK

{
    "_links": {
        "self": {
            "href": "https://api.pingone.eu/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6/riskPredictors/7579bcfa-cc13-064b-364e-151ff8bb918d"
        },
        "environment": {
            "href": "https://api.pingone.eu/v1/environments/abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
        }
    },
    "id": "7579bcfa-cc13-064b-364e-151ff8bb918d",
    "environment": {
        "id": "abfba8f6-49eb-49f5-a5d9-80ad5c98f9f6"
    },
    "createdAt": "2021-05-12T13:11:50.960Z",
    "createdBy": "SYSTEM_GENERATED",
    "updatedAt": "2026-05-21T09:17:12.100Z",
    "name": "Bot Detection",
    "compactName": "botDetection",
    "licensed": true,
    "excludedDetectionRules": [
        610,
        660
    ],
    "includeRepeatedEventsWithoutSdk": true,
    "type": "BOT",
    "tooltip": "predictor.tooltip.bot",
    "condition": {
        "scores": [
            {
                "name": "HIGH",
                "value": "HIGH"
            },
            {
                "name": "MEDIUM",
                "value": "MEDIUM"
            },
            {
                "name": "LOW",
                "value": "LOW"
            }
        ]
    },
    "deletable": false,
    "default": {
        "weight": 5,
        "score": 80,
        "result": {
            "level": "MEDIUM",
            "type": "VALUE"
        },
        "evaluated": true
    }
}