Create experiment protocol
https://api.datadoghq.com/api/v2/experiments/protocolshttps://api.us3.datadoghq.com/api/v2/experiments/protocolshttps://api.us5.datadoghq.com/api/v2/experiments/protocolshttps://api.datadoghq.eu/api/v2/experiments/protocolshttps://api.ap1.datadoghq.com/api/v2/experiments/protocolshttps://api.ap2.datadoghq.com/api/v2/experiments/protocolshttps://api.uk1.datadoghq.com/api/v2/experiments/protocolshttps://api.ddog-gov.com/api/v2/experiments/protocolshttps://api.us2.ddog-gov.com/api/v2/experiments/protocolsDescripción general
Create a draft protocol with a name and optional description and migration metadata. The organization's default subject type is selected. Use PATCH to configure the draft, then publish it before creating experiments from it.
OAuth apps require the product_analytics_experiments_write authorization scope to access this endpoint.
Solicitud
Body Data (required)
data [required]JSON:API protocol request resource.
attributes [required]Create a draft protocol with the organization default subject type.
descriptionOptional text that explains the protocol.
migration_metadataMetadata for imported resources. Must encode to at most 4096 bytes. Null clears it; omission preserves it on update.
name [required]Protocol name. Leading and trailing spaces are removed. The trimmed name must contain 1 to 255 characters.
type [required]Protocols resource type.
protocolsprotocols{
"data": {
"attributes": {
"description": "string",
"migration_metadata": {},
"name": "Checkout conversion"
},
"type": "protocols"
}
}Respuesta
Created
Response containing the protocol.
data [required]JSON:API resource containing the protocol identity and fields.
attributesSettings and defaults supplied by the protocol.
analysis_planDefault statistical settings supplied by the protocol.
compute_cupedWhether to use pre-experiment data to reduce variance with CUPED.
confidence_interval_methodStatistical method used to calculate confidence intervals.
confidence_levelConfidence level used by the statistical analysis.
multiple_testing_correction_methodMethod used to adjust for testing multiple metrics.
archived_atTime when the protocol was archived. Omitted if it has not been archived.
assignment_source_default_propertiesDefault properties supplied by the protocol's assignment source.
column_nameSource column that supplies this assignment property.
column_typeData type of the source column.
nameDisplay name of the assignment source property.
assignment_source_idID of the assignment source selected by the protocol.
created_at [required]Time when the protocol was created.
default_duration_daysDefault experiment duration supplied by the protocol, in days.
descriptionText that explains the protocol.
enforcementControls that determine which protocol settings can be changed in an experiment.
confidence_interval_methodAlways LOCKED. The server keeps this setting locked regardless of the supplied value.
confidence_levelLOCKED prevents changes to confidence level. EDITABLE permits changes.
cuped_calculationLOCKED prevents changes to CUPED variance reduction. EDITABLE permits changes.
default_durationLOCKED prevents changes to default duration. EDITABLE permits changes.
environmentLOCKED prevents changes to environment. EDITABLE permits changes.
flag_sourceAlways LOCKED. The server keeps this setting locked regardless of the supplied value.
multiple_testing_correctionLOCKED prevents changes to multiple testing correction. EDITABLE permits changes.
notificationsLOCKED prevents changes to notifications. EDITABLE permits changes.
primary_metricLOCKED prevents changes to primary metric. EDITABLE permits changes.
secondary_metricsLOCKED prevents changes to secondary metrics. EDITABLE permits changes.
split_by_exploration_dimensionsLOCKED prevents changes to result exploration dimensions. EDITABLE permits changes.
subject_typeAlways LOCKED. The server keeps this setting locked regardless of the supplied value.
targeting_rulesLOCKED prevents changes to targeting rules. EDITABLE permits changes.
traffic_exposureLOCKED prevents changes to traffic exposure. EDITABLE permits changes.
warehouse_exposure_sourceLOCKED prevents changes to warehouse exposure source. EDITABLE permits changes.
environment_idID of the feature flag environment used by the experiment.
experiment_countNumber of experiments in the organization that use this protocol, excluding deleted experiments. Omitted if the count cannot be retrieved. An omitted count does not mean zero.
exposure_scheduleSchedule that controls traffic exposure for experiments created from the protocol.
autostartWhether the exposure schedule starts automatically.
guardrail_triggered_actionAction taken when a guardrail triggers during the exposure schedule.
rollout_stepsOrdered steps that define changes in traffic exposure.
exposure_ratioFraction of traffic exposed during this rollout step.
grouped_step_indexIndex of the group that contains this rollout step.
interval_msDuration of this rollout step, in milliseconds.
is_pause_recordWhether this schedule entry represents a pause.
order_positionPosition of this entry in the ordered configuration.
selection_interval_msInterval between traffic selections, in milliseconds.
strategyMethod used to increase traffic exposure over the schedule.
is_duration_required_to_start [required]Whether the protocol requires a duration before an experiment can start.
is_equal_split_enforced [required]Whether the protocol requires equal traffic allocation across variants.
is_metric_limit_enabled [required]Whether the protocol limits the number of metrics.
is_minimum_duration_enabled [required]Whether the protocol enforces a minimum experiment duration.
metric_groups [required]Metric groups supplied by the protocol.
is_decisionWhether the group contains decision metrics.
metricsMetrics included in this group.
metric_id [required]Identifier of the metric to include in the collection.
nameDisplay name of the metric group.
metric_limitMaximum number of metrics allowed by the protocol.
migration_metadataMetadata retained for resources imported from another system.
minimum_duration_unitUnit used to express the protocol's minimum duration.
minimum_duration_valueMinimum experiment duration in the specified unit.
name [required]Display name of the protocol.
primary_metricSubject type selected by the protocol.
idID of the subject type.
nameDisplay name of the subject type.
primary_metric_idID of the primary metric supplied by the protocol.
published_atTime when the protocol was published.
status [required]Publication status of the protocol.
DRAFT, PUBLISHED, ARCHIVEDsubject_typeSubject type selected by the protocol.
idID of the subject type.
nameDisplay name of the subject type.
subject_type_idID of the subject type used by this configuration.
targeting_rulesRules that select subjects for the experiment.
conditionsConditions that define this targeting rule.
attributeSubject attribute evaluated by the targeting condition.
operatorComparison applied to the subject attribute.
order_positionPosition of this entry in the ordered configuration.
saved_filter_idID of the saved filter used by this targeting condition.
valueValues compared with the subject attribute in this condition.
updated_at [required]RFC3339 update time. Preserve all fractional seconds when passing this value as
expected_updated_at.
id [required]ID of the protocol.
type [required]Protocols resource type.
protocolsprotocols{
"data": {
"attributes": {
"analysis_plan": {
"compute_cuped": false,
"confidence_interval_method": "string",
"confidence_level": "number",
"multiple_testing_correction_method": "string"
},
"archived_at": "2026-07-31T14:00:00Z",
"assignment_source_default_properties": [
{
"column_name": "string",
"column_type": "string",
"name": "string"
}
],
"assignment_source_id": "string",
"created_at": "2026-07-31T12:00:00Z",
"default_duration_days": "integer",
"description": "string",
"enforcement": {
"confidence_interval_method": "string",
"confidence_level": "string",
"cuped_calculation": "string",
"default_duration": "string",
"environment": "string",
"flag_source": "string",
"multiple_testing_correction": "string",
"notifications": "string",
"primary_metric": "string",
"secondary_metrics": "string",
"split_by_exploration_dimensions": "string",
"subject_type": "string",
"targeting_rules": "string",
"traffic_exposure": "string",
"warehouse_exposure_source": "string"
},
"environment_id": "string",
"experiment_count": 0,
"exposure_schedule": {
"autostart": false,
"guardrail_triggered_action": "string",
"rollout_steps": [
{
"exposure_ratio": "number",
"grouped_step_index": "integer",
"interval_ms": "integer",
"is_pause_record": false,
"order_position": "integer"
}
],
"selection_interval_ms": "integer",
"strategy": "string"
},
"is_duration_required_to_start": false,
"is_equal_split_enforced": false,
"is_metric_limit_enabled": false,
"is_minimum_duration_enabled": false,
"metric_groups": [
{
"is_decision": false,
"metrics": [
{
"metric_id": "550e8400-e29b-41d4-a716-446655440000"
}
],
"name": "string"
}
],
"metric_limit": "integer",
"migration_metadata": "undefined",
"minimum_duration_unit": "string",
"minimum_duration_value": "integer",
"name": "Checkout conversion",
"primary_metric": {
"id": "string",
"name": "string"
},
"primary_metric_id": "string",
"published_at": "2019-09-19T10:00:00.000Z",
"status": "PUBLISHED",
"subject_type": {
"id": "string",
"name": "string"
},
"subject_type_id": "string",
"targeting_rules": [
{
"conditions": [
{
"attribute": "string",
"operator": "string",
"order_position": "integer",
"saved_filter_id": "string",
"value": []
}
]
}
],
"updated_at": "2026-01-01T00:00:00Z"
},
"id": "550e8400-e29b-41d4-a716-446655440000",
"type": "protocols"
}
}Invalid request or protocol settings.
API error response.
errors [required]A list of errors.
detailA human-readable explanation specific to this occurrence of the error.
metaNon-standard meta-information about the error
sourceReferences to the source of the error.
headerA string indicating the name of a single request header which caused the error.
parameterA string indicating which URI query parameter caused the error.
pointerA JSON pointer to the value in the request document that caused the error.
statusStatus code of the response.
titleShort human-readable summary of the error.
{
"errors": [
{
"detail": "Missing required attribute in body",
"meta": {},
"source": {
"header": "Authorization",
"parameter": "limit",
"pointer": "/data/attributes/title"
},
"status": "400",
"title": "Bad Request"
}
]
}Missing or invalid authentication.
API error response.
errors [required]A list of errors.
detailA human-readable explanation specific to this occurrence of the error.
metaNon-standard meta-information about the error
sourceReferences to the source of the error.
headerA string indicating the name of a single request header which caused the error.
parameterA string indicating which URI query parameter caused the error.
pointerA JSON pointer to the value in the request document that caused the error.
statusStatus code of the response.
titleShort human-readable summary of the error.
{
"errors": [
{
"detail": "Missing required attribute in body",
"meta": {},
"source": {
"header": "Authorization",
"parameter": "limit",
"pointer": "/data/attributes/title"
},
"status": "400",
"title": "Bad Request"
}
]
}The caller lacks the product_analytics_experiments_write permission.
API error response.
errors [required]A list of errors.
detailA human-readable explanation specific to this occurrence of the error.
metaNon-standard meta-information about the error
sourceReferences to the source of the error.
headerA string indicating the name of a single request header which caused the error.
parameterA string indicating which URI query parameter caused the error.
pointerA JSON pointer to the value in the request document that caused the error.
statusStatus code of the response.
titleShort human-readable summary of the error.
{
"errors": [
{
"detail": "Missing required attribute in body",
"meta": {},
"source": {
"header": "Authorization",
"parameter": "limit",
"pointer": "/data/attributes/title"
},
"status": "400",
"title": "Bad Request"
}
]
}A protocol with this name already exists.
API error response.
errors [required]A list of errors.
detailA human-readable explanation specific to this occurrence of the error.
metaNon-standard meta-information about the error
sourceReferences to the source of the error.
headerA string indicating the name of a single request header which caused the error.
parameterA string indicating which URI query parameter caused the error.
pointerA JSON pointer to the value in the request document that caused the error.
statusStatus code of the response.
titleShort human-readable summary of the error.
{
"errors": [
{
"detail": "Missing required attribute in body",
"meta": {},
"source": {
"header": "Authorization",
"parameter": "limit",
"pointer": "/data/attributes/title"
},
"status": "400",
"title": "Bad Request"
}
]
}Unsupported request content type.
API error response.
errors [required]A list of errors.
detailA human-readable explanation specific to this occurrence of the error.
metaNon-standard meta-information about the error
sourceReferences to the source of the error.
headerA string indicating the name of a single request header which caused the error.
parameterA string indicating which URI query parameter caused the error.
pointerA JSON pointer to the value in the request document that caused the error.
statusStatus code of the response.
titleShort human-readable summary of the error.
{
"errors": [
{
"detail": "Missing required attribute in body",
"meta": {},
"source": {
"header": "Authorization",
"parameter": "limit",
"pointer": "/data/attributes/title"
},
"status": "400",
"title": "Bad Request"
}
]
}Too many requests
API error response.
errors [required]A list of errors.
{
"errors": [
"Bad Request"
]
}Internal Server Error
API error response.
errors [required]A list of errors.
detailA human-readable explanation specific to this occurrence of the error.
metaNon-standard meta-information about the error
sourceReferences to the source of the error.
headerA string indicating the name of a single request header which caused the error.
parameterA string indicating which URI query parameter caused the error.
pointerA JSON pointer to the value in the request document that caused the error.
statusStatus code of the response.
titleShort human-readable summary of the error.
{
"errors": [
{
"detail": "Missing required attribute in body",
"meta": {},
"source": {
"header": "Authorization",
"parameter": "limit",
"pointer": "/data/attributes/title"
},
"status": "400",
"title": "Bad Request"
}
]
}Ejemplo de código
# Set your Datadog site and credentials
export DD_SITE="datadoghq.com"
# Use a Personal Access Token or Service Access Token
export DD_BEARER_TOKEN="<PERSONAL_ACCESS_TOKEN OR SERVICE_ACCESS_TOKEN>"
curl -X POST "https://api.${DD_SITE}/api/v2/experiments/protocols" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${DD_BEARER_TOKEN}" \
-d @- << EOF
{
"data": {
"attributes": {
"description": "Defaults for checkout experiments.",
"name": "Checkout protocol"
},
"type": "protocols"
}
}
EOF# Set your Datadog site and credentials
export DD_SITE="us3.datadoghq.com"
# Use a Personal Access Token or Service Access Token
export DD_BEARER_TOKEN="<PERSONAL_ACCESS_TOKEN OR SERVICE_ACCESS_TOKEN>"
curl -X POST "https://api.${DD_SITE}/api/v2/experiments/protocols" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${DD_BEARER_TOKEN}" \
-d @- << EOF
{
"data": {
"attributes": {
"description": "Defaults for checkout experiments.",
"name": "Checkout protocol"
},
"type": "protocols"
}
}
EOF# Set your Datadog site and credentials
export DD_SITE="us5.datadoghq.com"
# Use a Personal Access Token or Service Access Token
export DD_BEARER_TOKEN="<PERSONAL_ACCESS_TOKEN OR SERVICE_ACCESS_TOKEN>"
curl -X POST "https://api.${DD_SITE}/api/v2/experiments/protocols" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${DD_BEARER_TOKEN}" \
-d @- << EOF
{
"data": {
"attributes": {
"description": "Defaults for checkout experiments.",
"name": "Checkout protocol"
},
"type": "protocols"
}
}
EOF# Set your Datadog site and credentials
export DD_SITE="datadoghq.eu"
# Use a Personal Access Token or Service Access Token
export DD_BEARER_TOKEN="<PERSONAL_ACCESS_TOKEN OR SERVICE_ACCESS_TOKEN>"
curl -X POST "https://api.${DD_SITE}/api/v2/experiments/protocols" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${DD_BEARER_TOKEN}" \
-d @- << EOF
{
"data": {
"attributes": {
"description": "Defaults for checkout experiments.",
"name": "Checkout protocol"
},
"type": "protocols"
}
}
EOF# Set your Datadog site and credentials
export DD_SITE="ap1.datadoghq.com"
# Use a Personal Access Token or Service Access Token
export DD_BEARER_TOKEN="<PERSONAL_ACCESS_TOKEN OR SERVICE_ACCESS_TOKEN>"
curl -X POST "https://api.${DD_SITE}/api/v2/experiments/protocols" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${DD_BEARER_TOKEN}" \
-d @- << EOF
{
"data": {
"attributes": {
"description": "Defaults for checkout experiments.",
"name": "Checkout protocol"
},
"type": "protocols"
}
}
EOF# Set your Datadog site and credentials
export DD_SITE="ap2.datadoghq.com"
# Use a Personal Access Token or Service Access Token
export DD_BEARER_TOKEN="<PERSONAL_ACCESS_TOKEN OR SERVICE_ACCESS_TOKEN>"
curl -X POST "https://api.${DD_SITE}/api/v2/experiments/protocols" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${DD_BEARER_TOKEN}" \
-d @- << EOF
{
"data": {
"attributes": {
"description": "Defaults for checkout experiments.",
"name": "Checkout protocol"
},
"type": "protocols"
}
}
EOF# Set your Datadog site and credentials
export DD_SITE="uk1.datadoghq.com"
# Use a Personal Access Token or Service Access Token
export DD_BEARER_TOKEN="<PERSONAL_ACCESS_TOKEN OR SERVICE_ACCESS_TOKEN>"
curl -X POST "https://api.${DD_SITE}/api/v2/experiments/protocols" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${DD_BEARER_TOKEN}" \
-d @- << EOF
{
"data": {
"attributes": {
"description": "Defaults for checkout experiments.",
"name": "Checkout protocol"
},
"type": "protocols"
}
}
EOF# Set your Datadog site and credentials
export DD_SITE="ddog-gov.com"
# Use a Personal Access Token or Service Access Token
export DD_BEARER_TOKEN="<PERSONAL_ACCESS_TOKEN OR SERVICE_ACCESS_TOKEN>"
curl -X POST "https://api.${DD_SITE}/api/v2/experiments/protocols" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${DD_BEARER_TOKEN}" \
-d @- << EOF
{
"data": {
"attributes": {
"description": "Defaults for checkout experiments.",
"name": "Checkout protocol"
},
"type": "protocols"
}
}
EOF# Set your Datadog site and credentials
export DD_SITE="us2.ddog-gov.com"
# Use a Personal Access Token or Service Access Token
export DD_BEARER_TOKEN="<PERSONAL_ACCESS_TOKEN OR SERVICE_ACCESS_TOKEN>"
curl -X POST "https://api.${DD_SITE}/api/v2/experiments/protocols" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${DD_BEARER_TOKEN}" \
-d @- << EOF
{
"data": {
"attributes": {
"description": "Defaults for checkout experiments.",
"name": "Checkout protocol"
},
"type": "protocols"
}
}
EOF