curl --request POST \
--url https://api.gcore.com/waap/v1/domains/{domain_id}/custom-rules \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Block foobar bot",
"enabled": true,
"action": {
"allow": {},
"block": {
"action_duration": "12h"
},
"captcha": {},
"handshake": {},
"monitor": {}
},
"conditions": [
{
"owner_types": {
"negation": false,
"owner_types": [
"COMMERCIAL"
]
}
}
],
"description": "<string>"
}
'import requests
url = "https://api.gcore.com/waap/v1/domains/{domain_id}/custom-rules"
payload = {
"name": "Block foobar bot",
"enabled": True,
"action": {
"allow": {},
"block": { "action_duration": "12h" },
"captcha": {},
"handshake": {},
"monitor": {}
},
"conditions": [{ "owner_types": {
"negation": False,
"owner_types": ["COMMERCIAL"]
} }],
"description": "<string>"
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Block foobar bot',
enabled: true,
action: {
allow: {},
block: {action_duration: '12h'},
captcha: {},
handshake: {},
monitor: {}
},
conditions: [{owner_types: {negation: false, owner_types: ['COMMERCIAL']}}],
description: '<string>'
})
};
fetch('https://api.gcore.com/waap/v1/domains/{domain_id}/custom-rules', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.gcore.com/waap/v1/domains/{domain_id}/custom-rules",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Block foobar bot',
'enabled' => true,
'action' => [
'allow' => [
],
'block' => [
'action_duration' => '12h'
],
'captcha' => [
],
'handshake' => [
],
'monitor' => [
]
],
'conditions' => [
[
'owner_types' => [
'negation' => false,
'owner_types' => [
'COMMERCIAL'
]
]
]
],
'description' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.gcore.com/waap/v1/domains/{domain_id}/custom-rules"
payload := strings.NewReader("{\n \"name\": \"Block foobar bot\",\n \"enabled\": true,\n \"action\": {\n \"allow\": {},\n \"block\": {\n \"action_duration\": \"12h\"\n },\n \"captcha\": {},\n \"handshake\": {},\n \"monitor\": {}\n },\n \"conditions\": [\n {\n \"owner_types\": {\n \"negation\": false,\n \"owner_types\": [\n \"COMMERCIAL\"\n ]\n }\n }\n ],\n \"description\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.gcore.com/waap/v1/domains/{domain_id}/custom-rules")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Block foobar bot\",\n \"enabled\": true,\n \"action\": {\n \"allow\": {},\n \"block\": {\n \"action_duration\": \"12h\"\n },\n \"captcha\": {},\n \"handshake\": {},\n \"monitor\": {}\n },\n \"conditions\": [\n {\n \"owner_types\": {\n \"negation\": false,\n \"owner_types\": [\n \"COMMERCIAL\"\n ]\n }\n }\n ],\n \"description\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gcore.com/waap/v1/domains/{domain_id}/custom-rules")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Block foobar bot\",\n \"enabled\": true,\n \"action\": {\n \"allow\": {},\n \"block\": {\n \"action_duration\": \"12h\"\n },\n \"captcha\": {},\n \"handshake\": {},\n \"monitor\": {}\n },\n \"conditions\": [\n {\n \"owner_types\": {\n \"negation\": false,\n \"owner_types\": [\n \"COMMERCIAL\"\n ]\n }\n }\n ],\n \"description\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"name": "Block foobar bot",
"enabled": true,
"action": {
"allow": {},
"block": {
"action_duration": "12h"
},
"captcha": {},
"handshake": {},
"monitor": {},
"tag": {
"tags": [
"<string>"
]
}
},
"conditions": [
{
"ip": {
"ip_address": "<string>",
"negation": false
},
"ip_range": {
"lower_bound": "<string>",
"upper_bound": "<string>",
"negation": false
},
"url": {
"url": "/wp-admin/",
"negation": false,
"match_type": "Contains"
},
"user_agent": {
"user_agent": "curl/",
"negation": false,
"match_type": "Contains"
},
"header": {
"header": "Origin",
"value": "<string>",
"negation": false,
"match_type": "Contains"
},
"header_exists": {
"header": "Origin",
"negation": false
},
"response_header": {
"header": "<string>",
"value": "<string>",
"negation": false,
"match_type": "Contains"
},
"response_header_exists": {
"header": "<string>",
"negation": false
},
"http_method": {
"negation": false
},
"file_extension": {
"file_extension": [
"pdf"
],
"negation": false
},
"content_type": {
"content_type": [
"application/xml"
],
"negation": false
},
"country": {
"country_code": "CN",
"negation": false
},
"organization": {
"organization": "UptimeRobot s.r.o",
"negation": false
},
"request_rate": {
"path_pattern": "/",
"requests": 21,
"time": 1800,
"ips": [
"<string>"
],
"http_methods": [],
"user_defined_tag": "<string>"
},
"owner_types": {
"negation": false,
"owner_types": [
"COMMERCIAL"
]
},
"tags": {
"tags": "botnetclient",
"negation": false
},
"session_request_count": {
"request_count": 123,
"negation": false
},
"user_defined_tags": {
"tags": [
"<string>"
],
"negation": false
},
"ja3": {
"ja3_fingerprints": [
"e7d705a3286e19ea42f587b344ee6865"
],
"negation": false
},
"ja4": {
"ja4_fingerprints": [
"t13d3113h2_e8f1e7e78f70_ce5650b735ce"
],
"negation": false
}
}
],
"id": 123,
"description": "<string>"
}{
"type": "http-bad-request",
"title": "Bad Request",
"status": 400,
"detail": "Invalid domain name: ''''"
}{
"detail": "Auth token is missing or invalid"
}{
"title": "Quota limit exceeded",
"type": "quota-check-limit-exceeded",
"status": 403,
"detail": "You have reached the maximum limit allowed for your current plan. Please upgrade your plan to add more."
}{
"title": "Resource not found",
"type": "quota-check-no-resource",
"status": 404,
"detail": "The quota resource requested does not exist. Cannot enable WAAP for this domain. Please reach out to our support team."
}{
"type": "request-validation-failed",
"title": "Request validation error.",
"status": 422,
"detail": "One or more fields have validation errors.",
"errors": [
{
"loc": [
"body",
"name"
],
"detail": "Input should be a valid string"
},
{
"loc": [
"body",
"date"
],
"detail": "Field required"
},
{
"loc": [
"query",
"limit"
],
"detail": "Field required"
}
]
}{
"type": "internal-server-error",
"title": "Internal server error.",
"status": 500,
"detail": "An unexpected condition was encountered which prevented the server from fulfilling the request."
}Create a custom rule
curl --request POST \
--url https://api.gcore.com/waap/v1/domains/{domain_id}/custom-rules \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Block foobar bot",
"enabled": true,
"action": {
"allow": {},
"block": {
"action_duration": "12h"
},
"captcha": {},
"handshake": {},
"monitor": {}
},
"conditions": [
{
"owner_types": {
"negation": false,
"owner_types": [
"COMMERCIAL"
]
}
}
],
"description": "<string>"
}
'import requests
url = "https://api.gcore.com/waap/v1/domains/{domain_id}/custom-rules"
payload = {
"name": "Block foobar bot",
"enabled": True,
"action": {
"allow": {},
"block": { "action_duration": "12h" },
"captcha": {},
"handshake": {},
"monitor": {}
},
"conditions": [{ "owner_types": {
"negation": False,
"owner_types": ["COMMERCIAL"]
} }],
"description": "<string>"
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Block foobar bot',
enabled: true,
action: {
allow: {},
block: {action_duration: '12h'},
captcha: {},
handshake: {},
monitor: {}
},
conditions: [{owner_types: {negation: false, owner_types: ['COMMERCIAL']}}],
description: '<string>'
})
};
fetch('https://api.gcore.com/waap/v1/domains/{domain_id}/custom-rules', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.gcore.com/waap/v1/domains/{domain_id}/custom-rules",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Block foobar bot',
'enabled' => true,
'action' => [
'allow' => [
],
'block' => [
'action_duration' => '12h'
],
'captcha' => [
],
'handshake' => [
],
'monitor' => [
]
],
'conditions' => [
[
'owner_types' => [
'negation' => false,
'owner_types' => [
'COMMERCIAL'
]
]
]
],
'description' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.gcore.com/waap/v1/domains/{domain_id}/custom-rules"
payload := strings.NewReader("{\n \"name\": \"Block foobar bot\",\n \"enabled\": true,\n \"action\": {\n \"allow\": {},\n \"block\": {\n \"action_duration\": \"12h\"\n },\n \"captcha\": {},\n \"handshake\": {},\n \"monitor\": {}\n },\n \"conditions\": [\n {\n \"owner_types\": {\n \"negation\": false,\n \"owner_types\": [\n \"COMMERCIAL\"\n ]\n }\n }\n ],\n \"description\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.gcore.com/waap/v1/domains/{domain_id}/custom-rules")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Block foobar bot\",\n \"enabled\": true,\n \"action\": {\n \"allow\": {},\n \"block\": {\n \"action_duration\": \"12h\"\n },\n \"captcha\": {},\n \"handshake\": {},\n \"monitor\": {}\n },\n \"conditions\": [\n {\n \"owner_types\": {\n \"negation\": false,\n \"owner_types\": [\n \"COMMERCIAL\"\n ]\n }\n }\n ],\n \"description\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gcore.com/waap/v1/domains/{domain_id}/custom-rules")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Block foobar bot\",\n \"enabled\": true,\n \"action\": {\n \"allow\": {},\n \"block\": {\n \"action_duration\": \"12h\"\n },\n \"captcha\": {},\n \"handshake\": {},\n \"monitor\": {}\n },\n \"conditions\": [\n {\n \"owner_types\": {\n \"negation\": false,\n \"owner_types\": [\n \"COMMERCIAL\"\n ]\n }\n }\n ],\n \"description\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"name": "Block foobar bot",
"enabled": true,
"action": {
"allow": {},
"block": {
"action_duration": "12h"
},
"captcha": {},
"handshake": {},
"monitor": {},
"tag": {
"tags": [
"<string>"
]
}
},
"conditions": [
{
"ip": {
"ip_address": "<string>",
"negation": false
},
"ip_range": {
"lower_bound": "<string>",
"upper_bound": "<string>",
"negation": false
},
"url": {
"url": "/wp-admin/",
"negation": false,
"match_type": "Contains"
},
"user_agent": {
"user_agent": "curl/",
"negation": false,
"match_type": "Contains"
},
"header": {
"header": "Origin",
"value": "<string>",
"negation": false,
"match_type": "Contains"
},
"header_exists": {
"header": "Origin",
"negation": false
},
"response_header": {
"header": "<string>",
"value": "<string>",
"negation": false,
"match_type": "Contains"
},
"response_header_exists": {
"header": "<string>",
"negation": false
},
"http_method": {
"negation": false
},
"file_extension": {
"file_extension": [
"pdf"
],
"negation": false
},
"content_type": {
"content_type": [
"application/xml"
],
"negation": false
},
"country": {
"country_code": "CN",
"negation": false
},
"organization": {
"organization": "UptimeRobot s.r.o",
"negation": false
},
"request_rate": {
"path_pattern": "/",
"requests": 21,
"time": 1800,
"ips": [
"<string>"
],
"http_methods": [],
"user_defined_tag": "<string>"
},
"owner_types": {
"negation": false,
"owner_types": [
"COMMERCIAL"
]
},
"tags": {
"tags": "botnetclient",
"negation": false
},
"session_request_count": {
"request_count": 123,
"negation": false
},
"user_defined_tags": {
"tags": [
"<string>"
],
"negation": false
},
"ja3": {
"ja3_fingerprints": [
"e7d705a3286e19ea42f587b344ee6865"
],
"negation": false
},
"ja4": {
"ja4_fingerprints": [
"t13d3113h2_e8f1e7e78f70_ce5650b735ce"
],
"negation": false
}
}
],
"id": 123,
"description": "<string>"
}{
"type": "http-bad-request",
"title": "Bad Request",
"status": 400,
"detail": "Invalid domain name: ''''"
}{
"detail": "Auth token is missing or invalid"
}{
"title": "Quota limit exceeded",
"type": "quota-check-limit-exceeded",
"status": 403,
"detail": "You have reached the maximum limit allowed for your current plan. Please upgrade your plan to add more."
}{
"title": "Resource not found",
"type": "quota-check-no-resource",
"status": 404,
"detail": "The quota resource requested does not exist. Cannot enable WAAP for this domain. Please reach out to our support team."
}{
"type": "request-validation-failed",
"title": "Request validation error.",
"status": 422,
"detail": "One or more fields have validation errors.",
"errors": [
{
"loc": [
"body",
"name"
],
"detail": "Input should be a valid string"
},
{
"loc": [
"body",
"date"
],
"detail": "Field required"
},
{
"loc": [
"query",
"limit"
],
"detail": "Field required"
}
]
}{
"type": "internal-server-error",
"title": "Internal server error.",
"status": 500,
"detail": "An unexpected condition was encountered which prevented the server from fulfilling the request."
}Authorizations
API key for authentication. Make sure to include the word apikey, followed by a single space and then your token.
Example: apikey 1234$abcdef
Path Parameters
The domain ID
Body
A request to create a new WAAP rule
The name assigned to the rule
1 - 100^[A-Za-z0-9\s.:'";<>?&|\\]+$"Block foobar bot"
Whether or not the rule is enabled
The action that the rule takes when triggered. Only one action can be set per rule.
Show child attributes
Show child attributes
The conditions required for the WAAP engine to trigger the rule. Rules may have between 1 and 5 conditions. All conditions must pass for the rule to trigger
1 - 5 elementsShow child attributes
Show child attributes
The description assigned to the rule
100Response
Successful Response
An WAAP rule applied to a domain
The name assigned to the rule
1 - 100^[A-Za-z0-9\s.:'";<>?&|\\]+$"Block foobar bot"
Whether or not the rule is enabled
The action that the rule takes when triggered. Only one action can be set per rule.
Show child attributes
Show child attributes
The conditions required for the WAAP engine to trigger the rule. Rules may have between 1 and 5 conditions. All conditions must pass for the rule to trigger
1 - 5 elementsShow child attributes
Show child attributes
The unique identifier for the rule
The description assigned to the rule
100Was this page helpful?