Skip to content

Commit ae056af

Browse files
author
ci.datadog-api-spec
committed
Regenerate client from commit 0d5c9ee of spec repo
1 parent 318a939 commit ae056af

13 files changed

Lines changed: 409 additions & 0 deletions

.generator/schemas/v2/openapi.yaml

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1721,6 +1721,15 @@ components:
17211721
required: true
17221722
schema:
17231723
type: string
1724+
SecurityMonitoringRuleVersion:
1725+
description: The historical version number of the rule to restore.
1726+
in: path
1727+
name: version
1728+
required: true
1729+
schema:
1730+
example: 1
1731+
format: int64
1732+
type: integer
17241733
SecurityMonitoringSuppressionID:
17251734
description: The ID of the suppression rule
17261735
in: path
@@ -169544,6 +169553,60 @@ paths:
169544169553
operator: OR
169545169554
permissions:
169546169555
- security_monitoring_rules_read
169556+
/api/v2/security_monitoring/rules/{rule_id}/restore/{version}:
169557+
post:
169558+
description: |-
169559+
Restores a custom detection rule to a previously saved historical version.
169560+
Only custom rules can be restored. Default and partner rules return 400.
169561+
The restore creates a new version entry; it does not overwrite history.
169562+
operationId: RestoreSecurityMonitoringRule
169563+
parameters:
169564+
- $ref: "#/components/parameters/SecurityMonitoringRuleID"
169565+
- $ref: "#/components/parameters/SecurityMonitoringRuleVersion"
169566+
responses:
169567+
"200":
169568+
content:
169569+
"application/json":
169570+
examples:
169571+
default:
169572+
value:
169573+
cases:
169574+
- condition: "a > 0"
169575+
name: ""
169576+
notifications: []
169577+
status: info
169578+
id: abc-123
169579+
isEnabled: true
169580+
message: Test rule
169581+
name: My security monitoring rule.
169582+
tags: []
169583+
type: log_detection
169584+
schema:
169585+
$ref: "#/components/schemas/SecurityMonitoringRuleResponse"
169586+
description: OK
169587+
"400":
169588+
$ref: "#/components/responses/BadRequestResponse"
169589+
"403":
169590+
$ref: "#/components/responses/NotAuthorizedResponse"
169591+
"404":
169592+
$ref: "#/components/responses/NotFoundResponse"
169593+
"409":
169594+
$ref: "#/components/responses/ConflictResponse"
169595+
"429":
169596+
$ref: "#/components/responses/TooManyRequestsResponse"
169597+
security:
169598+
- apiKeyAuth: []
169599+
appKeyAuth: []
169600+
- AuthZ:
169601+
- security_monitoring_rules_write
169602+
summary: Restore a rule to a historical version
169603+
tags: ["Security Monitoring"]
169604+
"x-permission":
169605+
operator: OR
169606+
permissions:
169607+
- security_monitoring_rules_write
169608+
x-unstable: |-
169609+
**Note**: This endpoint is in beta and may be subject to changes.
169547169610
/api/v2/security_monitoring/rules/{rule_id}/test:
169548169611
post:
169549169612
description: |-
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
"""
2+
Restore a rule to a historical version returns "OK" response
3+
"""
4+
5+
from os import environ
6+
from datadog_api_client import ApiClient, Configuration
7+
from datadog_api_client.v2.api.security_monitoring_api import SecurityMonitoringApi
8+
9+
# there is a valid "security_rule" in the system
10+
SECURITY_RULE_ID = environ["SECURITY_RULE_ID"]
11+
12+
configuration = Configuration()
13+
configuration.unstable_operations["restore_security_monitoring_rule"] = True
14+
with ApiClient(configuration) as api_client:
15+
api_instance = SecurityMonitoringApi(api_client)
16+
response = api_instance.restore_security_monitoring_rule(
17+
rule_id=SECURITY_RULE_ID,
18+
version=1,
19+
)
20+
21+
print(response)

src/datadog_api_client/configuration.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,7 @@ def __init__(
436436
"v2.list_vulnerabilities": False,
437437
"v2.list_vulnerable_assets": False,
438438
"v2.mute_findings": False,
439+
"v2.restore_security_monitoring_rule": False,
439440
"v2.run_historical_job": False,
440441
"v2.search_security_monitoring_histsignals": False,
441442
"v2.update_findings_assignee": False,

src/datadog_api_client/v2/api/security_monitoring_api.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3510,6 +3510,35 @@ def __init__(self, api_client=None):
35103510
api_client=api_client,
35113511
)
35123512

3513+
self._restore_security_monitoring_rule_endpoint = _Endpoint(
3514+
settings={
3515+
"response_type": (SecurityMonitoringRuleResponse,),
3516+
"auth": ["apiKeyAuth", "appKeyAuth", "AuthZ"],
3517+
"endpoint_path": "/api/v2/security_monitoring/rules/{rule_id}/restore/{version}",
3518+
"operation_id": "restore_security_monitoring_rule",
3519+
"http_method": "POST",
3520+
"version": "v2",
3521+
},
3522+
params_map={
3523+
"rule_id": {
3524+
"required": True,
3525+
"openapi_types": (str,),
3526+
"attribute": "rule_id",
3527+
"location": "path",
3528+
},
3529+
"version": {
3530+
"required": True,
3531+
"openapi_types": (int,),
3532+
"attribute": "version",
3533+
"location": "path",
3534+
},
3535+
},
3536+
headers_map={
3537+
"accept": ["application/json"],
3538+
},
3539+
api_client=api_client,
3540+
)
3541+
35133542
self._run_historical_job_endpoint = _Endpoint(
35143543
settings={
35153544
"response_type": (JobCreateResponse,),
@@ -7370,6 +7399,30 @@ def patch_vulnerability_notification_rule(
73707399

73717400
return self._patch_vulnerability_notification_rule_endpoint.call_with_http_info(**kwargs)
73727401

7402+
def restore_security_monitoring_rule(
7403+
self,
7404+
rule_id: str,
7405+
version: int,
7406+
) -> SecurityMonitoringRuleResponse:
7407+
"""Restore a rule to a historical version.
7408+
7409+
Restores a custom detection rule to a previously saved historical version.
7410+
Only custom rules can be restored. Default and partner rules return 400.
7411+
The restore creates a new version entry; it does not overwrite history.
7412+
7413+
:param rule_id: The ID of the rule.
7414+
:type rule_id: str
7415+
:param version: The historical version number of the rule to restore.
7416+
:type version: int
7417+
:rtype: SecurityMonitoringRuleResponse
7418+
"""
7419+
kwargs: Dict[str, Any] = {}
7420+
kwargs["rule_id"] = rule_id
7421+
7422+
kwargs["version"] = version
7423+
7424+
return self._restore_security_monitoring_rule_endpoint.call_with_http_info(**kwargs)
7425+
73737426
def run_historical_job(
73747427
self,
73757428
body: RunHistoricalJobRequest,
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2026-06-12T09:57:22.725Z
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
interactions:
2+
- request:
3+
body: '{"cases":[{"condition":"a > 0","name":"","notifications":[],"status":"info"}],"filters":[],"isEnabled":true,"message":"Test
4+
rule","name":"Test-Restore_a_rule_to_a_historical_version_returns_Conflict_response-1781258242","options":{"evaluationWindow":900,"keepAlive":3600,"maxSignalDuration":86400},"queries":[{"aggregation":"count","distinctFields":[],"groupByFields":[],"metrics":[],"query":"@test:true"}],"tags":[],"type":"log_detection"}'
5+
headers:
6+
accept:
7+
- application/json
8+
content-type:
9+
- application/json
10+
method: POST
11+
uri: https://api.datadoghq.com/api/v2/security_monitoring/rules
12+
response:
13+
body:
14+
string: '{"name":"Test-Restore_a_rule_to_a_historical_version_returns_Conflict_response-1781258242","createdAt":1781258244898,"isDefault":false,"isPartner":false,"isEnabled":true,"isBeta":false,"isDeleted":false,"isDeprecated":false,"queries":[{"query":"@test:true","groupByFields":[],"hasOptionalGroupByFields":false,"distinctFields":[],"aggregation":"count","name":"","dataSource":"logs"}],"options":{"evaluationWindow":900,"detectionMethod":"threshold","maxSignalDuration":86400,"keepAlive":3600},"cases":[{"name":"","status":"info","notifications":[],"condition":"a
15+
\u003e 0"}],"message":"Test rule","tags":[],"hasExtendedTitle":false,"type":"log_detection","filters":[],"version":1,"id":"xrz-jfq-dfm","blocking":false,"metadata":{"entities":null,"sources":null},"creationAuthorId":2320499,"creator":{"handle":"9919ec9b-ebc7-49ee-8dc8-03626e717cca","name":"CI
16+
Account"},"updater":{"handle":"","name":""}}'
17+
headers:
18+
content-type:
19+
- application/json
20+
status:
21+
code: 200
22+
message: OK
23+
- request:
24+
body: '{"cases":[{"condition":"a > 0","name":"","notifications":[],"status":"info"}],"filters":[],"isEnabled":true,"message":"Test
25+
rule updated","name":"Test-Restore_a_rule_to_a_historical_version_returns_Conflict_response-1781258242-updated","options":{"evaluationWindow":900,"keepAlive":3600,"maxSignalDuration":86400},"queries":[{"aggregation":"count","distinctFields":[],"groupByFields":[],"metrics":[],"query":"@test:true"}],"tags":[]}'
26+
headers:
27+
accept:
28+
- application/json
29+
content-type:
30+
- application/json
31+
method: PUT
32+
uri: https://api.datadoghq.com/api/v2/security_monitoring/rules/xrz-jfq-dfm
33+
response:
34+
body:
35+
string: '{"name":"Test-Restore_a_rule_to_a_historical_version_returns_Conflict_response-1781258242-updated","isEnabled":true,"queries":[{"query":"@test:true","groupByFields":[],"hasOptionalGroupByFields":false,"distinctFields":[],"aggregation":"count","name":"","dataSource":"logs"}],"options":{"evaluationWindow":900,"detectionMethod":"threshold","maxSignalDuration":86400,"keepAlive":3600},"cases":[{"name":"","status":"info","notifications":[],"condition":"a
36+
\u003e 0"}],"message":"Test rule updated","tags":[],"hasExtendedTitle":false,"type":"log_detection","filters":[],"id":"xrz-jfq-dfm","version":2,"createdAt":1781258244898,"creationAuthorId":2320499,"updateAuthorId":2320499,"updatedAt":1781258245104,"isDefault":false,"blocking":false,"isBeta":false,"isDeleted":false,"isDeprecated":false,"metadata":{"entities":null,"sources":null}}'
37+
headers:
38+
content-type:
39+
- application/json
40+
status:
41+
code: 200
42+
message: OK
43+
- request:
44+
body: null
45+
headers:
46+
accept:
47+
- application/json
48+
method: POST
49+
uri: https://api.datadoghq.com/api/v2/security_monitoring/rules/xrz-jfq-dfm/restore/2
50+
response:
51+
body:
52+
string: '{"error":{"code":"AlreadyExists","message":"Cannot restore: target
53+
version is the current version."}}'
54+
headers:
55+
content-type:
56+
- application/json
57+
status:
58+
code: 409
59+
message: Conflict
60+
- request:
61+
body: null
62+
headers:
63+
accept:
64+
- '*/*'
65+
method: DELETE
66+
uri: https://api.datadoghq.com/api/v2/security_monitoring/rules/xrz-jfq-dfm
67+
response:
68+
body:
69+
string: ''
70+
headers: {}
71+
status:
72+
code: 204
73+
message: No Content
74+
version: 1
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2026-06-12T08:39:41.348Z
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
interactions:
2+
- request:
3+
body: '{"cases":[{"condition":"a > 0","name":"","notifications":[],"status":"info"}],"filters":[],"isEnabled":true,"message":"Test
4+
rule","name":"Test-Restore_a_rule_to_a_historical_version_returns_Not_Found_response-1781253581","options":{"evaluationWindow":900,"keepAlive":3600,"maxSignalDuration":86400},"queries":[{"aggregation":"count","distinctFields":[],"groupByFields":[],"metrics":[],"query":"@test:true"}],"tags":[],"type":"log_detection"}'
5+
headers:
6+
accept:
7+
- application/json
8+
content-type:
9+
- application/json
10+
method: POST
11+
uri: https://api.datadoghq.com/api/v2/security_monitoring/rules
12+
response:
13+
body:
14+
string: '{"name":"Test-Restore_a_rule_to_a_historical_version_returns_Not_Found_response-1781253581","createdAt":1781253581645,"isDefault":false,"isPartner":false,"isEnabled":true,"isBeta":false,"isDeleted":false,"isDeprecated":false,"queries":[{"query":"@test:true","groupByFields":[],"hasOptionalGroupByFields":false,"distinctFields":[],"aggregation":"count","name":"","dataSource":"logs"}],"options":{"evaluationWindow":900,"detectionMethod":"threshold","maxSignalDuration":86400,"keepAlive":3600},"cases":[{"name":"","status":"info","notifications":[],"condition":"a
15+
\u003e 0"}],"message":"Test rule","tags":[],"hasExtendedTitle":false,"type":"log_detection","filters":[],"version":1,"id":"uig-ynq-xlh","blocking":false,"metadata":{"entities":null,"sources":null},"creationAuthorId":2320499,"creator":{"handle":"9919ec9b-ebc7-49ee-8dc8-03626e717cca","name":"CI
16+
Account"},"updater":{"handle":"","name":""}}'
17+
headers:
18+
content-type:
19+
- application/json
20+
status:
21+
code: 200
22+
message: OK
23+
- request:
24+
body: null
25+
headers:
26+
accept:
27+
- application/json
28+
method: POST
29+
uri: https://api.datadoghq.com/api/v2/security_monitoring/rules/uig-ynq-xlh/restore/9999
30+
response:
31+
body:
32+
string: '{"error":{"code":"NotFound","message":"Threat detection rule not found:
33+
uig-ynq-xlh, version=9999"}}'
34+
headers:
35+
content-type:
36+
- application/json
37+
status:
38+
code: 404
39+
message: Not Found
40+
- request:
41+
body: null
42+
headers:
43+
accept:
44+
- '*/*'
45+
method: DELETE
46+
uri: https://api.datadoghq.com/api/v2/security_monitoring/rules/uig-ynq-xlh
47+
response:
48+
body:
49+
string: ''
50+
headers: {}
51+
status:
52+
code: 204
53+
message: No Content
54+
version: 1
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
2026-06-12T09:57:25.549Z
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
interactions:
2+
- request:
3+
body: '{"cases":[{"condition":"a > 0","name":"","notifications":[],"status":"info"}],"filters":[],"isEnabled":true,"message":"Test
4+
rule","name":"Test-Restore_a_rule_to_a_historical_version_returns_OK_response-1781258245","options":{"evaluationWindow":900,"keepAlive":3600,"maxSignalDuration":86400},"queries":[{"aggregation":"count","distinctFields":[],"groupByFields":[],"metrics":[],"query":"@test:true"}],"tags":[],"type":"log_detection"}'
5+
headers:
6+
accept:
7+
- application/json
8+
content-type:
9+
- application/json
10+
method: POST
11+
uri: https://api.datadoghq.com/api/v2/security_monitoring/rules
12+
response:
13+
body:
14+
string: '{"name":"Test-Restore_a_rule_to_a_historical_version_returns_OK_response-1781258245","createdAt":1781258245670,"isDefault":false,"isPartner":false,"isEnabled":true,"isBeta":false,"isDeleted":false,"isDeprecated":false,"queries":[{"query":"@test:true","groupByFields":[],"hasOptionalGroupByFields":false,"distinctFields":[],"aggregation":"count","name":"","dataSource":"logs"}],"options":{"evaluationWindow":900,"detectionMethod":"threshold","maxSignalDuration":86400,"keepAlive":3600},"cases":[{"name":"","status":"info","notifications":[],"condition":"a
15+
\u003e 0"}],"message":"Test rule","tags":[],"hasExtendedTitle":false,"type":"log_detection","filters":[],"version":1,"id":"7sm-pyl-xzv","blocking":false,"metadata":{"entities":null,"sources":null},"creationAuthorId":2320499,"creator":{"handle":"9919ec9b-ebc7-49ee-8dc8-03626e717cca","name":"CI
16+
Account"},"updater":{"handle":"","name":""}}'
17+
headers:
18+
content-type:
19+
- application/json
20+
status:
21+
code: 200
22+
message: OK
23+
- request:
24+
body: '{"cases":[{"condition":"a > 0","name":"","notifications":[],"status":"info"}],"filters":[],"isEnabled":true,"message":"Test
25+
rule updated","name":"Test-Restore_a_rule_to_a_historical_version_returns_OK_response-1781258245-updated","options":{"evaluationWindow":900,"keepAlive":3600,"maxSignalDuration":86400},"queries":[{"aggregation":"count","distinctFields":[],"groupByFields":[],"metrics":[],"query":"@test:true"}],"tags":[]}'
26+
headers:
27+
accept:
28+
- application/json
29+
content-type:
30+
- application/json
31+
method: PUT
32+
uri: https://api.datadoghq.com/api/v2/security_monitoring/rules/7sm-pyl-xzv
33+
response:
34+
body:
35+
string: '{"name":"Test-Restore_a_rule_to_a_historical_version_returns_OK_response-1781258245-updated","isEnabled":true,"queries":[{"query":"@test:true","groupByFields":[],"hasOptionalGroupByFields":false,"distinctFields":[],"aggregation":"count","name":"","dataSource":"logs"}],"options":{"evaluationWindow":900,"detectionMethod":"threshold","maxSignalDuration":86400,"keepAlive":3600},"cases":[{"name":"","status":"info","notifications":[],"condition":"a
36+
\u003e 0"}],"message":"Test rule updated","tags":[],"hasExtendedTitle":false,"type":"log_detection","filters":[],"id":"7sm-pyl-xzv","version":2,"createdAt":1781258245670,"creationAuthorId":2320499,"updateAuthorId":2320499,"updatedAt":1781258245844,"isDefault":false,"blocking":false,"isBeta":false,"isDeleted":false,"isDeprecated":false,"metadata":{"entities":null,"sources":null}}'
37+
headers:
38+
content-type:
39+
- application/json
40+
status:
41+
code: 200
42+
message: OK
43+
- request:
44+
body: null
45+
headers:
46+
accept:
47+
- application/json
48+
method: POST
49+
uri: https://api.datadoghq.com/api/v2/security_monitoring/rules/7sm-pyl-xzv/restore/1
50+
response:
51+
body:
52+
string: '{"name":"Test-Restore_a_rule_to_a_historical_version_returns_OK_response-1781258245","createdAt":1781258245670,"isDefault":false,"isPartner":false,"isEnabled":true,"isBeta":false,"isDeleted":false,"isDeprecated":false,"queries":[{"query":"@test:true","groupByFields":[],"hasOptionalGroupByFields":false,"distinctFields":[],"aggregation":"count","name":"","dataSource":"logs"}],"options":{"evaluationWindow":900,"detectionMethod":"threshold","maxSignalDuration":86400,"keepAlive":3600},"cases":[{"name":"","status":"info","notifications":[],"condition":"a
53+
\u003e 0"}],"message":"Test rule","tags":[],"hasExtendedTitle":false,"type":"log_detection","filters":[],"version":3,"id":"7sm-pyl-xzv","updatedAt":1781258246099,"blocking":false,"metadata":{"entities":null,"sources":null},"creationAuthorId":2320499,"updateAuthorId":2320499,"creator":{"handle":"9919ec9b-ebc7-49ee-8dc8-03626e717cca","name":"CI
54+
Account"},"updater":{"handle":"9919ec9b-ebc7-49ee-8dc8-03626e717cca","name":"CI
55+
Account"}}'
56+
headers:
57+
content-type:
58+
- application/json
59+
status:
60+
code: 200
61+
message: OK
62+
- request:
63+
body: null
64+
headers:
65+
accept:
66+
- '*/*'
67+
method: DELETE
68+
uri: https://api.datadoghq.com/api/v2/security_monitoring/rules/7sm-pyl-xzv
69+
response:
70+
body:
71+
string: ''
72+
headers: {}
73+
status:
74+
code: 204
75+
message: No Content
76+
version: 1

0 commit comments

Comments
 (0)