diff --git a/.generator/schemas/v1/openapi.yaml b/.generator/schemas/v1/openapi.yaml
index 9466f691bd4..aa4e625e596 100644
--- a/.generator/schemas/v1/openapi.yaml
+++ b/.generator/schemas/v1/openapi.yaml
@@ -8067,6 +8067,36 @@ components:
- data_source
- query
type: object
+ MonitorFormulaAndFunctionDataJobsQueryDefinition:
+ description: A formula and functions data jobs query.
+ properties:
+ job_type:
+ description: |-
+ The type of job being monitored. Valid values include:
+ `databricks.job`, `spark.application`, `airflow.dag`,
+ `dbt.job`, `dbt.model`, `dbt.test`, `glue.job`.
+ Custom job types are supported with the `custom.ol.` prefix.
+ example: "databricks.job"
+ type: string
+ jobs_query:
+ description: Filter expression used to select the jobs to monitor.
+ example: "job_name:smoke*"
+ type: string
+ name:
+ description: Name of the query for use in formulas. Must be `run_query`.
+ example: "run_query"
+ type: string
+ query_dialect:
+ description: |-
+ Query dialect for data jobs queries. Currently only `metric` is supported.
+ example: "metric"
+ type: string
+ required:
+ - name
+ - jobs_query
+ - job_type
+ - query_dialect
+ type: object
MonitorFormulaAndFunctionDataQualityDataSource:
description: Data source for data quality queries.
enum:
@@ -8373,6 +8403,7 @@ components:
- $ref: "#/components/schemas/MonitorFormulaAndFunctionEventQueryDefinition"
- $ref: "#/components/schemas/MonitorFormulaAndFunctionCostQueryDefinition"
- $ref: "#/components/schemas/MonitorFormulaAndFunctionDataQualityQueryDefinition"
+ - $ref: "#/components/schemas/MonitorFormulaAndFunctionDataJobsQueryDefinition"
- $ref: "#/components/schemas/MonitorFormulaAndFunctionAggregateAugmentedQueryDefinition"
- $ref: "#/components/schemas/MonitorFormulaAndFunctionAggregateFilteredQueryDefinition"
MonitorFormulaAndFunctionReferenceTableColumn:
@@ -9205,6 +9236,7 @@ components:
- "cost alert"
- "data-quality alert"
- "network-path alert"
+ - "data-jobs alert"
example: "query alert"
type: string
x-enum-varnames:
@@ -9229,6 +9261,7 @@ components:
- COST_ALERT
- DATA_QUALITY_ALERT
- NETWORK_PATH_ALERT
+ - DATA_JOBS_ALERT
MonitorUpdateRequest:
description: Object describing a monitor update request.
properties:
diff --git a/examples/v1/monitors/CreateMonitor_2589528326.java b/examples/v1/monitors/CreateMonitor_2589528326.java
new file mode 100644
index 00000000000..3756a73716a
--- /dev/null
+++ b/examples/v1/monitors/CreateMonitor_2589528326.java
@@ -0,0 +1,53 @@
+// Create a Data Jobs monitor returns "OK" response
+
+import com.datadog.api.client.ApiClient;
+import com.datadog.api.client.ApiException;
+import com.datadog.api.client.v1.api.MonitorsApi;
+import com.datadog.api.client.v1.model.Monitor;
+import com.datadog.api.client.v1.model.MonitorFormulaAndFunctionDataJobsQueryDefinition;
+import com.datadog.api.client.v1.model.MonitorFormulaAndFunctionQueryDefinition;
+import com.datadog.api.client.v1.model.MonitorOptions;
+import com.datadog.api.client.v1.model.MonitorThresholds;
+import com.datadog.api.client.v1.model.MonitorType;
+import java.util.Arrays;
+import java.util.Collections;
+
+public class Example {
+ public static void main(String[] args) {
+ ApiClient defaultClient = ApiClient.getDefaultApiClient();
+ MonitorsApi apiInstance = new MonitorsApi(defaultClient);
+
+ Monitor body =
+ new Monitor()
+ .name("Example-Monitor")
+ .type(MonitorType.DATA_JOBS_ALERT)
+ .query(
+ """
+formula("failed_runs(run_query)").by(job_name,workspace_name).last(10d) > 0
+""")
+ .message("Data jobs alert triggered")
+ .tags(Arrays.asList("test:examplemonitor", "env:ci"))
+ .options(
+ new MonitorOptions()
+ .thresholds(new MonitorThresholds())
+ .variables(
+ Collections.singletonList(
+ new MonitorFormulaAndFunctionQueryDefinition(
+ new MonitorFormulaAndFunctionDataJobsQueryDefinition()
+ .name("run_query")
+ .jobsQuery("job_name:*")
+ .jobType("databricks.job")
+ .queryDialect("metric")))));
+
+ try {
+ Monitor result = apiInstance.createMonitor(body);
+ System.out.println(result);
+ } catch (ApiException e) {
+ System.err.println("Exception when calling MonitorsApi#createMonitor");
+ System.err.println("Status code: " + e.getCode());
+ System.err.println("Reason: " + e.getResponseBody());
+ System.err.println("Response headers: " + e.getResponseHeaders());
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/main/java/com/datadog/api/client/v1/model/MonitorFormulaAndFunctionDataJobsQueryDefinition.java b/src/main/java/com/datadog/api/client/v1/model/MonitorFormulaAndFunctionDataJobsQueryDefinition.java
new file mode 100644
index 00000000000..4db89afd6fd
--- /dev/null
+++ b/src/main/java/com/datadog/api/client/v1/model/MonitorFormulaAndFunctionDataJobsQueryDefinition.java
@@ -0,0 +1,239 @@
+/*
+ * Unless explicitly stated otherwise all files in this repository are licensed under the Apache-2.0 License.
+ * This product includes software developed at Datadog (https://www.datadoghq.com/).
+ * Copyright 2019-Present Datadog, Inc.
+ */
+
+package com.datadog.api.client.v1.model;
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/** A formula and functions data jobs query. */
+@JsonPropertyOrder({
+ MonitorFormulaAndFunctionDataJobsQueryDefinition.JSON_PROPERTY_JOB_TYPE,
+ MonitorFormulaAndFunctionDataJobsQueryDefinition.JSON_PROPERTY_JOBS_QUERY,
+ MonitorFormulaAndFunctionDataJobsQueryDefinition.JSON_PROPERTY_NAME,
+ MonitorFormulaAndFunctionDataJobsQueryDefinition.JSON_PROPERTY_QUERY_DIALECT
+})
+@jakarta.annotation.Generated(
+ value = "https://github.com/DataDog/datadog-api-client-java/blob/master/.generator")
+public class MonitorFormulaAndFunctionDataJobsQueryDefinition {
+ @JsonIgnore public boolean unparsed = false;
+ public static final String JSON_PROPERTY_JOB_TYPE = "job_type";
+ private String jobType;
+
+ public static final String JSON_PROPERTY_JOBS_QUERY = "jobs_query";
+ private String jobsQuery;
+
+ public static final String JSON_PROPERTY_NAME = "name";
+ private String name;
+
+ public static final String JSON_PROPERTY_QUERY_DIALECT = "query_dialect";
+ private String queryDialect;
+
+ public MonitorFormulaAndFunctionDataJobsQueryDefinition() {}
+
+ @JsonCreator
+ public MonitorFormulaAndFunctionDataJobsQueryDefinition(
+ @JsonProperty(required = true, value = JSON_PROPERTY_JOB_TYPE) String jobType,
+ @JsonProperty(required = true, value = JSON_PROPERTY_JOBS_QUERY) String jobsQuery,
+ @JsonProperty(required = true, value = JSON_PROPERTY_NAME) String name,
+ @JsonProperty(required = true, value = JSON_PROPERTY_QUERY_DIALECT) String queryDialect) {
+ this.jobType = jobType;
+ this.jobsQuery = jobsQuery;
+ this.name = name;
+ this.queryDialect = queryDialect;
+ }
+
+ public MonitorFormulaAndFunctionDataJobsQueryDefinition jobType(String jobType) {
+ this.jobType = jobType;
+ return this;
+ }
+
+ /**
+ * The type of job being monitored. Valid values include: databricks.job,
+ * spark.application, airflow.dag, dbt.job, dbt.model
+ * , dbt.test, glue.job. Custom job types are supported with the
+ * custom.ol. prefix.
+ *
+ * @return jobType
+ */
+ @JsonProperty(JSON_PROPERTY_JOB_TYPE)
+ @JsonInclude(value = JsonInclude.Include.ALWAYS)
+ public String getJobType() {
+ return jobType;
+ }
+
+ public void setJobType(String jobType) {
+ this.jobType = jobType;
+ }
+
+ public MonitorFormulaAndFunctionDataJobsQueryDefinition jobsQuery(String jobsQuery) {
+ this.jobsQuery = jobsQuery;
+ return this;
+ }
+
+ /**
+ * Filter expression used to select the jobs to monitor.
+ *
+ * @return jobsQuery
+ */
+ @JsonProperty(JSON_PROPERTY_JOBS_QUERY)
+ @JsonInclude(value = JsonInclude.Include.ALWAYS)
+ public String getJobsQuery() {
+ return jobsQuery;
+ }
+
+ public void setJobsQuery(String jobsQuery) {
+ this.jobsQuery = jobsQuery;
+ }
+
+ public MonitorFormulaAndFunctionDataJobsQueryDefinition name(String name) {
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Name of the query for use in formulas. Must be run_query.
+ *
+ * @return name
+ */
+ @JsonProperty(JSON_PROPERTY_NAME)
+ @JsonInclude(value = JsonInclude.Include.ALWAYS)
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public MonitorFormulaAndFunctionDataJobsQueryDefinition queryDialect(String queryDialect) {
+ this.queryDialect = queryDialect;
+ return this;
+ }
+
+ /**
+ * Query dialect for data jobs queries. Currently only metric is supported.
+ *
+ * @return queryDialect
+ */
+ @JsonProperty(JSON_PROPERTY_QUERY_DIALECT)
+ @JsonInclude(value = JsonInclude.Include.ALWAYS)
+ public String getQueryDialect() {
+ return queryDialect;
+ }
+
+ public void setQueryDialect(String queryDialect) {
+ this.queryDialect = queryDialect;
+ }
+
+ /**
+ * A container for additional, undeclared properties. This is a holder for any undeclared
+ * properties as specified with the 'additionalProperties' keyword in the OAS document.
+ */
+ private Map additionalProperties;
+
+ /**
+ * Set the additional (undeclared) property with the specified name and value. If the property
+ * does not already exist, create it otherwise replace it.
+ *
+ * @param key The arbitrary key to set
+ * @param value The associated value
+ * @return MonitorFormulaAndFunctionDataJobsQueryDefinition
+ */
+ @JsonAnySetter
+ public MonitorFormulaAndFunctionDataJobsQueryDefinition putAdditionalProperty(
+ String key, Object value) {
+ if (this.additionalProperties == null) {
+ this.additionalProperties = new HashMap();
+ }
+ this.additionalProperties.put(key, value);
+ return this;
+ }
+
+ /**
+ * Return the additional (undeclared) property.
+ *
+ * @return The additional properties
+ */
+ @JsonAnyGetter
+ public Map getAdditionalProperties() {
+ return additionalProperties;
+ }
+
+ /**
+ * Return the additional (undeclared) property with the specified name.
+ *
+ * @param key The arbitrary key to get
+ * @return The specific additional property for the given key
+ */
+ public Object getAdditionalProperty(String key) {
+ if (this.additionalProperties == null) {
+ return null;
+ }
+ return this.additionalProperties.get(key);
+ }
+
+ /** Return true if this MonitorFormulaAndFunctionDataJobsQueryDefinition object is equal to o. */
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ MonitorFormulaAndFunctionDataJobsQueryDefinition
+ monitorFormulaAndFunctionDataJobsQueryDefinition =
+ (MonitorFormulaAndFunctionDataJobsQueryDefinition) o;
+ return Objects.equals(this.jobType, monitorFormulaAndFunctionDataJobsQueryDefinition.jobType)
+ && Objects.equals(
+ this.jobsQuery, monitorFormulaAndFunctionDataJobsQueryDefinition.jobsQuery)
+ && Objects.equals(this.name, monitorFormulaAndFunctionDataJobsQueryDefinition.name)
+ && Objects.equals(
+ this.queryDialect, monitorFormulaAndFunctionDataJobsQueryDefinition.queryDialect)
+ && Objects.equals(
+ this.additionalProperties,
+ monitorFormulaAndFunctionDataJobsQueryDefinition.additionalProperties);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(jobType, jobsQuery, name, queryDialect, additionalProperties);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("class MonitorFormulaAndFunctionDataJobsQueryDefinition {\n");
+ sb.append(" jobType: ").append(toIndentedString(jobType)).append("\n");
+ sb.append(" jobsQuery: ").append(toIndentedString(jobsQuery)).append("\n");
+ sb.append(" name: ").append(toIndentedString(name)).append("\n");
+ sb.append(" queryDialect: ").append(toIndentedString(queryDialect)).append("\n");
+ sb.append(" additionalProperties: ")
+ .append(toIndentedString(additionalProperties))
+ .append("\n");
+ sb.append('}');
+ return sb.toString();
+ }
+
+ /**
+ * Convert the given object to string with each line indented by 4 spaces (except the first line).
+ */
+ private String toIndentedString(Object o) {
+ if (o == null) {
+ return "null";
+ }
+ return o.toString().replace("\n", "\n ");
+ }
+}
diff --git a/src/main/java/com/datadog/api/client/v1/model/MonitorFormulaAndFunctionQueryDefinition.java b/src/main/java/com/datadog/api/client/v1/model/MonitorFormulaAndFunctionQueryDefinition.java
index 140eb085019..5901d6beb40 100644
--- a/src/main/java/com/datadog/api/client/v1/model/MonitorFormulaAndFunctionQueryDefinition.java
+++ b/src/main/java/com/datadog/api/client/v1/model/MonitorFormulaAndFunctionQueryDefinition.java
@@ -249,6 +249,60 @@ public MonitorFormulaAndFunctionQueryDefinition deserialize(
e);
}
+ // deserialize MonitorFormulaAndFunctionDataJobsQueryDefinition
+ try {
+ boolean attemptParsing = true;
+ // ensure that we respect type coercion as set on the client ObjectMapper
+ if (MonitorFormulaAndFunctionDataJobsQueryDefinition.class.equals(Integer.class)
+ || MonitorFormulaAndFunctionDataJobsQueryDefinition.class.equals(Long.class)
+ || MonitorFormulaAndFunctionDataJobsQueryDefinition.class.equals(Float.class)
+ || MonitorFormulaAndFunctionDataJobsQueryDefinition.class.equals(Double.class)
+ || MonitorFormulaAndFunctionDataJobsQueryDefinition.class.equals(Boolean.class)
+ || MonitorFormulaAndFunctionDataJobsQueryDefinition.class.equals(String.class)) {
+ attemptParsing = typeCoercion;
+ if (!attemptParsing) {
+ attemptParsing |=
+ ((MonitorFormulaAndFunctionDataJobsQueryDefinition.class.equals(Integer.class)
+ || MonitorFormulaAndFunctionDataJobsQueryDefinition.class.equals(
+ Long.class))
+ && token == JsonToken.VALUE_NUMBER_INT);
+ attemptParsing |=
+ ((MonitorFormulaAndFunctionDataJobsQueryDefinition.class.equals(Float.class)
+ || MonitorFormulaAndFunctionDataJobsQueryDefinition.class.equals(
+ Double.class))
+ && (token == JsonToken.VALUE_NUMBER_FLOAT
+ || token == JsonToken.VALUE_NUMBER_INT));
+ attemptParsing |=
+ (MonitorFormulaAndFunctionDataJobsQueryDefinition.class.equals(Boolean.class)
+ && (token == JsonToken.VALUE_FALSE || token == JsonToken.VALUE_TRUE));
+ attemptParsing |=
+ (MonitorFormulaAndFunctionDataJobsQueryDefinition.class.equals(String.class)
+ && token == JsonToken.VALUE_STRING);
+ }
+ }
+ if (attemptParsing) {
+ tmp =
+ tree.traverse(jp.getCodec())
+ .readValueAs(MonitorFormulaAndFunctionDataJobsQueryDefinition.class);
+ // TODO: there is no validation against JSON schema constraints
+ // (min, max, enum, pattern...), this does not perform a strict JSON
+ // validation, which means the 'match' count may be higher than it should be.
+ if (!((MonitorFormulaAndFunctionDataJobsQueryDefinition) tmp).unparsed) {
+ deserialized = tmp;
+ match++;
+ }
+ log.log(
+ Level.FINER,
+ "Input data matches schema 'MonitorFormulaAndFunctionDataJobsQueryDefinition'");
+ }
+ } catch (Exception e) {
+ // deserialization failed, continue
+ log.log(
+ Level.FINER,
+ "Input data does not match schema 'MonitorFormulaAndFunctionDataJobsQueryDefinition'",
+ e);
+ }
+
// deserialize MonitorFormulaAndFunctionAggregateAugmentedQueryDefinition
try {
boolean attemptParsing = true;
@@ -418,6 +472,12 @@ public MonitorFormulaAndFunctionQueryDefinition(
setActualInstance(o);
}
+ public MonitorFormulaAndFunctionQueryDefinition(
+ MonitorFormulaAndFunctionDataJobsQueryDefinition o) {
+ super("oneOf", Boolean.FALSE);
+ setActualInstance(o);
+ }
+
public MonitorFormulaAndFunctionQueryDefinition(
MonitorFormulaAndFunctionAggregateAugmentedQueryDefinition o) {
super("oneOf", Boolean.FALSE);
@@ -440,6 +500,9 @@ public MonitorFormulaAndFunctionQueryDefinition(
schemas.put(
"MonitorFormulaAndFunctionDataQualityQueryDefinition",
new GenericType() {});
+ schemas.put(
+ "MonitorFormulaAndFunctionDataJobsQueryDefinition",
+ new GenericType() {});
schemas.put(
"MonitorFormulaAndFunctionAggregateAugmentedQueryDefinition",
new GenericType() {});
@@ -460,6 +523,7 @@ public Map getSchemas() {
* against the oneOf child schemas: MonitorFormulaAndFunctionEventQueryDefinition,
* MonitorFormulaAndFunctionCostQueryDefinition,
* MonitorFormulaAndFunctionDataQualityQueryDefinition,
+ * MonitorFormulaAndFunctionDataJobsQueryDefinition,
* MonitorFormulaAndFunctionAggregateAugmentedQueryDefinition,
* MonitorFormulaAndFunctionAggregateFilteredQueryDefinition
*
@@ -485,6 +549,13 @@ public void setActualInstance(Object instance) {
super.setActualInstance(instance);
return;
}
+ if (JSON.isInstanceOf(
+ MonitorFormulaAndFunctionDataJobsQueryDefinition.class,
+ instance,
+ new HashSet>())) {
+ super.setActualInstance(instance);
+ return;
+ }
if (JSON.isInstanceOf(
MonitorFormulaAndFunctionAggregateAugmentedQueryDefinition.class,
instance,
@@ -508,6 +579,7 @@ public void setActualInstance(Object instance) {
"Invalid instance type. Must be MonitorFormulaAndFunctionEventQueryDefinition,"
+ " MonitorFormulaAndFunctionCostQueryDefinition,"
+ " MonitorFormulaAndFunctionDataQualityQueryDefinition,"
+ + " MonitorFormulaAndFunctionDataJobsQueryDefinition,"
+ " MonitorFormulaAndFunctionAggregateAugmentedQueryDefinition,"
+ " MonitorFormulaAndFunctionAggregateFilteredQueryDefinition");
}
@@ -516,12 +588,14 @@ public void setActualInstance(Object instance) {
* Get the actual instance, which can be the following:
* MonitorFormulaAndFunctionEventQueryDefinition, MonitorFormulaAndFunctionCostQueryDefinition,
* MonitorFormulaAndFunctionDataQualityQueryDefinition,
+ * MonitorFormulaAndFunctionDataJobsQueryDefinition,
* MonitorFormulaAndFunctionAggregateAugmentedQueryDefinition,
* MonitorFormulaAndFunctionAggregateFilteredQueryDefinition
*
* @return The actual instance (MonitorFormulaAndFunctionEventQueryDefinition,
* MonitorFormulaAndFunctionCostQueryDefinition,
* MonitorFormulaAndFunctionDataQualityQueryDefinition,
+ * MonitorFormulaAndFunctionDataJobsQueryDefinition,
* MonitorFormulaAndFunctionAggregateAugmentedQueryDefinition,
* MonitorFormulaAndFunctionAggregateFilteredQueryDefinition)
*/
@@ -572,6 +646,20 @@ public Object getActualInstance() {
return (MonitorFormulaAndFunctionDataQualityQueryDefinition) super.getActualInstance();
}
+ /**
+ * Get the actual instance of `MonitorFormulaAndFunctionDataJobsQueryDefinition`. If the actual
+ * instance is not `MonitorFormulaAndFunctionDataJobsQueryDefinition`, the ClassCastException will
+ * be thrown.
+ *
+ * @return The actual instance of `MonitorFormulaAndFunctionDataJobsQueryDefinition`
+ * @throws ClassCastException if the instance is not
+ * `MonitorFormulaAndFunctionDataJobsQueryDefinition`
+ */
+ public MonitorFormulaAndFunctionDataJobsQueryDefinition
+ getMonitorFormulaAndFunctionDataJobsQueryDefinition() throws ClassCastException {
+ return (MonitorFormulaAndFunctionDataJobsQueryDefinition) super.getActualInstance();
+ }
+
/**
* Get the actual instance of `MonitorFormulaAndFunctionAggregateAugmentedQueryDefinition`. If the
* actual instance is not `MonitorFormulaAndFunctionAggregateAugmentedQueryDefinition`, the
diff --git a/src/main/java/com/datadog/api/client/v1/model/MonitorType.java b/src/main/java/com/datadog/api/client/v1/model/MonitorType.java
index 06b258100fb..5e9087b8f15 100644
--- a/src/main/java/com/datadog/api/client/v1/model/MonitorType.java
+++ b/src/main/java/com/datadog/api/client/v1/model/MonitorType.java
@@ -48,7 +48,8 @@ public class MonitorType extends ModelEnum {
"network-performance alert",
"cost alert",
"data-quality alert",
- "network-path alert"));
+ "network-path alert",
+ "data-jobs alert"));
public static final MonitorType COMPOSITE = new MonitorType("composite");
public static final MonitorType EVENT_ALERT = new MonitorType("event alert");
@@ -73,6 +74,7 @@ public class MonitorType extends ModelEnum {
public static final MonitorType COST_ALERT = new MonitorType("cost alert");
public static final MonitorType DATA_QUALITY_ALERT = new MonitorType("data-quality alert");
public static final MonitorType NETWORK_PATH_ALERT = new MonitorType("network-path alert");
+ public static final MonitorType DATA_JOBS_ALERT = new MonitorType("data-jobs alert");
MonitorType(String value) {
super(value, allowedValues);
diff --git a/src/test/resources/cassettes/features/v1/Create_a_Data_Jobs_monitor_returns_OK_response.freeze b/src/test/resources/cassettes/features/v1/Create_a_Data_Jobs_monitor_returns_OK_response.freeze
new file mode 100644
index 00000000000..1665e973daf
--- /dev/null
+++ b/src/test/resources/cassettes/features/v1/Create_a_Data_Jobs_monitor_returns_OK_response.freeze
@@ -0,0 +1 @@
+2026-05-14T10:58:54.153Z
\ No newline at end of file
diff --git a/src/test/resources/cassettes/features/v1/Create_a_Data_Jobs_monitor_returns_OK_response.json b/src/test/resources/cassettes/features/v1/Create_a_Data_Jobs_monitor_returns_OK_response.json
new file mode 100644
index 00000000000..88a825ad3b8
--- /dev/null
+++ b/src/test/resources/cassettes/features/v1/Create_a_Data_Jobs_monitor_returns_OK_response.json
@@ -0,0 +1,58 @@
+[
+ {
+ "httpRequest": {
+ "body": {
+ "type": "JSON",
+ "json": "{\"message\": \"Data jobs alert triggered\", \"name\": \"Test-Create_a_Data_Jobs_monitor_returns_OK_response-1778756334\", \"options\": {\"thresholds\": {\"critical\": 0}, \"variables\": [{\"job_type\": \"databricks.job\", \"jobs_query\": \"job_name:*\", \"name\": \"run_query\", \"query_dialect\": \"metric\"}]}, \"query\": \"formula(\\\"failed_runs(run_query)\\\").by(job_name,workspace_name).last(10d) > 0\", \"tags\": [\"test:testcreateadatajobsmonitorreturnsokresponse1778756334\", \"env:ci\"], \"type\": \"data-jobs alert\"}"
+ },
+ "headers": {},
+ "method": "POST",
+ "path": "/api/v1/monitor",
+ "keepAlive": false,
+ "secure": true
+ },
+ "httpResponse": {
+ "body": "{\"id\":283063470,\"org_id\":321813,\"type\":\"data-jobs alert\",\"name\":\"Test-Create_a_Data_Jobs_monitor_returns_OK_response-1778756334\",\"message\":\"Data jobs alert triggered\",\"tags\":[\"test:testcreateadatajobsmonitorreturnsokresponse1778756334\",\"env:ci\"],\"query\":\"formula(\\\"failed_runs(run_query)\\\").by(job_name,workspace_name).last(10d) > 0\",\"options\":{\"thresholds\":{\"critical\":0.0},\"variables\":[{\"job_type\":\"databricks.job\",\"jobs_query\":\"job_name:*\",\"name\":\"run_query\",\"query_dialect\":\"metric\"}],\"notify_no_data\":false,\"notify_audit\":false,\"new_host_delay\":300,\"include_tags\":true,\"silenced\":{}},\"multi\":true,\"created_at\":1778756334000,\"created\":\"2026-05-14T10:58:54.236230+00:00\",\"modified\":\"2026-05-14T10:58:54.236230+00:00\",\"deleted\":null,\"priority\":null,\"restricted_roles\":null,\"restriction_policy\":null,\"draft_status\":\"published\",\"assets\":[],\"overall_state_modified\":null,\"overall_state\":\"No Data\",\"creator\":{\"name\":\"CI Account\",\"handle\":\"9919ec9b-ebc7-49ee-8dc8-03626e717cca\",\"email\":\"team-intg-tools-libs-spam@datadoghq.com\",\"id\":2320499}}\n",
+ "headers": {
+ "Content-Type": [
+ "application/json"
+ ]
+ },
+ "statusCode": 200,
+ "reasonPhrase": "OK"
+ },
+ "times": {
+ "remainingTimes": 1
+ },
+ "timeToLive": {
+ "unlimited": true
+ },
+ "id": "5857ee38-99e2-c44f-4e48-6dccc42f5278"
+ },
+ {
+ "httpRequest": {
+ "headers": {},
+ "method": "DELETE",
+ "path": "/api/v1/monitor/283063470",
+ "keepAlive": false,
+ "secure": true
+ },
+ "httpResponse": {
+ "body": "{\"deleted_monitor_id\":283063470}\n",
+ "headers": {
+ "Content-Type": [
+ "application/json"
+ ]
+ },
+ "statusCode": 200,
+ "reasonPhrase": "OK"
+ },
+ "times": {
+ "remainingTimes": 1
+ },
+ "timeToLive": {
+ "unlimited": true
+ },
+ "id": "c4dd945f-ac34-db64-2058-629ead8011d3"
+ }
+]
\ No newline at end of file
diff --git a/src/test/resources/com/datadog/api/client/v1/api/monitors.feature b/src/test/resources/com/datadog/api/client/v1/api/monitors.feature
index 63bb9f16b9a..f7fd40f4ede 100644
--- a/src/test/resources/com/datadog/api/client/v1/api/monitors.feature
+++ b/src/test/resources/com/datadog/api/client/v1/api/monitors.feature
@@ -42,6 +42,15 @@ Feature: Monitors
When the request is sent
Then the response status is 200 OK
+ @team:DataDog/monitor-app
+ Scenario: Create a Data Jobs monitor returns "OK" response
+ Given new "CreateMonitor" request
+ And body with value {"name": "{{ unique }}", "type": "data-jobs alert", "query": "formula(\"failed_runs(run_query)\").by(job_name,workspace_name).last(10d) > 0", "message": "Data jobs alert triggered", "tags": ["test:{{ unique_lower_alnum }}", "env:ci"], "options": {"thresholds": {"critical": 0}, "variables": [{"name": "run_query", "jobs_query": "job_name:*", "job_type": "databricks.job", "query_dialect": "metric"}]}}
+ When the request is sent
+ Then the response status is 200 OK
+ And the response "name" is equal to "{{ unique }}"
+ And the response "type" is equal to "data-jobs alert"
+
@team:DataDog/monitor-app
Scenario: Create a Data Quality monitor returns "OK" response
Given new "CreateMonitor" request