Skip to content
Start here

Update flag

flagship.apps.flags.update(strflag_key, FlagUpdateParams**kwargs) -> FlagUpdateResponse
PUT/accounts/{account_id}/flagship/apps/{app_id}/flags/{flag_key}

Replaces the entire flag definition. Omitted fields are dropped, not preserved — read before writing. Each update appends a changelog entry.

Security
API Token

The preferred authorization scheme for interacting with the Cloudflare API. Create a token.

Example:Authorization: Bearer Sn3lZJTBX6kkg7OdcBUAxOO963GEIyGQqnFTOFYY
API Email + API Key

The previous authorization scheme for interacting with the Cloudflare API, used in conjunction with a Global API key.

Example:X-Auth-Email: user@example.com

The previous authorization scheme for interacting with the Cloudflare API. When possible, use API tokens instead of Global API keys.

Example:X-Auth-Key: 144c9defac04969c7bfad8efaa8ea194
ParametersExpand Collapse
account_id: str

Cloudflare account ID.

app_id: str

App identifier.

flag_key: str

Flag key (slug).

default_variation: str

Variation served when no rule matches or the flag is disabled. Must be a key in variations.

minLength1
enabled: bool

When false, the flag bypasses all rules and always serves default_variation.

key: str

Unique identifier for the flag within an app. Used in all evaluation and SDK calls.

maxLength64
minLength1
rules: Iterable[Rule]

Targeting rules evaluated in ascending priority; the first matching rule wins. An empty array means the flag always serves default_variation.

conditions: Iterable[RuleCondition]

Conditions the context must satisfy for this rule to match. An empty array matches all contexts.

One of the following:
class RuleConditionUnionMember0:
attribute: str
maxLength64
minLength1
operator: Literal["equals", "not_equals", "greater_than", 8 more]
One of the following:
"equals"
"not_equals"
"greater_than"
"less_than"
"greater_than_or_equals"
"less_than_or_equals"
"contains"
"starts_with"
"ends_with"
"in"
"not_in"
value: object

Value to compare against the context attribute. Must be an array for in and not_in; numeric and ISO-8601 datetime strings are accepted by the ordering operators.

class RuleConditionUnionMember1:
clauses: Iterable[RuleConditionUnionMember1Clause]
One of the following:
class RuleConditionUnionMember1ClauseUnionMember0:
attribute: str
maxLength64
minLength1
operator: Literal["equals", "not_equals", "greater_than", 8 more]
One of the following:
"equals"
"not_equals"
"greater_than"
"less_than"
"greater_than_or_equals"
"less_than_or_equals"
"contains"
"starts_with"
"ends_with"
"in"
"not_in"
value: object

Value to compare against the context attribute. Must be an array for in and not_in; numeric and ISO-8601 datetime strings are accepted by the ordering operators.

class RuleConditionUnionMember1ClauseUnionMember1:
clauses: Iterable[RuleConditionUnionMember1ClauseUnionMember1Clause]
One of the following:
class RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember0:
attribute: str
maxLength64
minLength1
operator: Literal["equals", "not_equals", "greater_than", 8 more]
One of the following:
"equals"
"not_equals"
"greater_than"
"less_than"
"greater_than_or_equals"
"less_than_or_equals"
"contains"
"starts_with"
"ends_with"
"in"
"not_in"
value: object

Value to compare against the context attribute. Must be an array for in and not_in; numeric and ISO-8601 datetime strings are accepted by the ordering operators.

class RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1:
clauses: Iterable[RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1Clause]
One of the following:
class RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember0:
attribute: str
maxLength64
minLength1
operator: Literal["equals", "not_equals", "greater_than", 8 more]
One of the following:
"equals"
"not_equals"
"greater_than"
"less_than"
"greater_than_or_equals"
"less_than_or_equals"
"contains"
"starts_with"
"ends_with"
"in"
"not_in"
value: object

Value to compare against the context attribute. Must be an array for in and not_in; numeric and ISO-8601 datetime strings are accepted by the ordering operators.

class RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1:
clauses: Iterable[RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1Clause]
One of the following:
class RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember0:
attribute: str
maxLength64
minLength1
operator: Literal["equals", "not_equals", "greater_than", 8 more]
One of the following:
"equals"
"not_equals"
"greater_than"
"less_than"
"greater_than_or_equals"
"less_than_or_equals"
"contains"
"starts_with"
"ends_with"
"in"
"not_in"
value: object

Value to compare against the context attribute. Must be an array for in and not_in; numeric and ISO-8601 datetime strings are accepted by the ordering operators.

class RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1:
clauses: Iterable[RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1Clause]
One of the following:
class RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember0:
attribute: str
maxLength64
minLength1
operator: Literal["equals", "not_equals", "greater_than", 8 more]
One of the following:
"equals"
"not_equals"
"greater_than"
"less_than"
"greater_than_or_equals"
"less_than_or_equals"
"contains"
"starts_with"
"ends_with"
"in"
"not_in"
value: object

Value to compare against the context attribute. Must be an array for in and not_in; numeric and ISO-8601 datetime strings are accepted by the ordering operators.

class RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1:
clauses: Sequence[Union[Optional[str], float, bool, 2 more]]
One of the following:
Optional[str]
float
bool
Dict[str, object]
Iterable[object]
logical_operator: Literal["AND", "OR"]
One of the following:
"AND"
"OR"
logical_operator: Literal["AND", "OR"]
One of the following:
"AND"
"OR"
logical_operator: Literal["AND", "OR"]
One of the following:
"AND"
"OR"
logical_operator: Literal["AND", "OR"]
One of the following:
"AND"
"OR"
logical_operator: Literal["AND", "OR"]
One of the following:
"AND"
"OR"
logical_operator: Literal["AND", "OR"]
One of the following:
"AND"
"OR"
priority: int

Evaluation order; lower numbers are evaluated first. Must be unique across the flag’s rules.

minimum1
serve_variation: str

Variation served when this rule matches. Must be a key in variations.

minLength1
rollout: Optional[RuleRollout]
percentage: float

Percentage of matching traffic (0–100) served this variation. For multi-way splits, use cumulative upper bounds across rules (e.g. 30, 70, 100).

maximum100
minimum0
attribute: Optional[str]

Context attribute used for sticky bucketing. Defaults to targetingKey. If absent at evaluation time, bucketing is random per request.

minLength1
variations: Dict[str, Union[Optional[str], float, bool, 2 more]]

Map of variation name to value. All values must be the same type (boolean, string, number, or JSON object/array). Each serialized value must be 10KB or smaller.

One of the following:
Optional[str]
float
bool
Dict[str, object]
Iterable[object]
description: Optional[str]
maxLength512
type: Optional[Literal["boolean", "string", "number", "json"]]

Value type of the flag’s variations. Inferred from the variation values on write, so it may be omitted in requests.

One of the following:
"boolean"
"string"
"number"
"json"
ReturnsExpand Collapse
class FlagUpdateResponse:
default_variation: str

Variation served when no rule matches or the flag is disabled. Must be a key in variations.

minLength1
enabled: bool

When false, the flag bypasses all rules and always serves default_variation.

key: str

Unique identifier for the flag within an app. Used in all evaluation and SDK calls.

maxLength64
minLength1
rules: List[Rule]

Targeting rules evaluated in ascending priority; the first matching rule wins. An empty array means the flag always serves default_variation.

conditions: List[RuleCondition]

Conditions the context must satisfy for this rule to match. An empty array matches all contexts.

One of the following:
class RuleConditionUnionMember0:
attribute: str
maxLength64
minLength1
operator: Literal["equals", "not_equals", "greater_than", 8 more]
One of the following:
"equals"
"not_equals"
"greater_than"
"less_than"
"greater_than_or_equals"
"less_than_or_equals"
"contains"
"starts_with"
"ends_with"
"in"
"not_in"
value: object

Value to compare against the context attribute. Must be an array for in and not_in; numeric and ISO-8601 datetime strings are accepted by the ordering operators.

class RuleConditionUnionMember1:
clauses: List[RuleConditionUnionMember1Clause]
One of the following:
class RuleConditionUnionMember1ClauseUnionMember0:
attribute: str
maxLength64
minLength1
operator: Literal["equals", "not_equals", "greater_than", 8 more]
One of the following:
"equals"
"not_equals"
"greater_than"
"less_than"
"greater_than_or_equals"
"less_than_or_equals"
"contains"
"starts_with"
"ends_with"
"in"
"not_in"
value: object

Value to compare against the context attribute. Must be an array for in and not_in; numeric and ISO-8601 datetime strings are accepted by the ordering operators.

class RuleConditionUnionMember1ClauseUnionMember1:
clauses: List[RuleConditionUnionMember1ClauseUnionMember1Clause]
One of the following:
class RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember0:
attribute: str
maxLength64
minLength1
operator: Literal["equals", "not_equals", "greater_than", 8 more]
One of the following:
"equals"
"not_equals"
"greater_than"
"less_than"
"greater_than_or_equals"
"less_than_or_equals"
"contains"
"starts_with"
"ends_with"
"in"
"not_in"
value: object

Value to compare against the context attribute. Must be an array for in and not_in; numeric and ISO-8601 datetime strings are accepted by the ordering operators.

class RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1:
clauses: List[RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1Clause]
One of the following:
class RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember0:
attribute: str
maxLength64
minLength1
operator: Literal["equals", "not_equals", "greater_than", 8 more]
One of the following:
"equals"
"not_equals"
"greater_than"
"less_than"
"greater_than_or_equals"
"less_than_or_equals"
"contains"
"starts_with"
"ends_with"
"in"
"not_in"
value: object

Value to compare against the context attribute. Must be an array for in and not_in; numeric and ISO-8601 datetime strings are accepted by the ordering operators.

class RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1:
clauses: List[RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1Clause]
One of the following:
class RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember0:
attribute: str
maxLength64
minLength1
operator: Literal["equals", "not_equals", "greater_than", 8 more]
One of the following:
"equals"
"not_equals"
"greater_than"
"less_than"
"greater_than_or_equals"
"less_than_or_equals"
"contains"
"starts_with"
"ends_with"
"in"
"not_in"
value: object

Value to compare against the context attribute. Must be an array for in and not_in; numeric and ISO-8601 datetime strings are accepted by the ordering operators.

class RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1:
clauses: List[RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1Clause]
One of the following:
class RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember0:
attribute: str
maxLength64
minLength1
operator: Literal["equals", "not_equals", "greater_than", 8 more]
One of the following:
"equals"
"not_equals"
"greater_than"
"less_than"
"greater_than_or_equals"
"less_than_or_equals"
"contains"
"starts_with"
"ends_with"
"in"
"not_in"
value: object

Value to compare against the context attribute. Must be an array for in and not_in; numeric and ISO-8601 datetime strings are accepted by the ordering operators.

class RuleConditionUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1ClauseUnionMember1:
clauses: List[Union[Optional[str], float, bool, 2 more]]
One of the following:
Optional[str]
float
bool
Dict[str, object]
List[object]
logical_operator: Literal["AND", "OR"]
One of the following:
"AND"
"OR"
logical_operator: Literal["AND", "OR"]
One of the following:
"AND"
"OR"
logical_operator: Literal["AND", "OR"]
One of the following:
"AND"
"OR"
logical_operator: Literal["AND", "OR"]
One of the following:
"AND"
"OR"
logical_operator: Literal["AND", "OR"]
One of the following:
"AND"
"OR"
logical_operator: Literal["AND", "OR"]
One of the following:
"AND"
"OR"
priority: int

Evaluation order; lower numbers are evaluated first. Must be unique across the flag’s rules.

minimum1
serve_variation: str

Variation served when this rule matches. Must be a key in variations.

minLength1
rollout: Optional[RuleRollout]
percentage: float

Percentage of matching traffic (0–100) served this variation. For multi-way splits, use cumulative upper bounds across rules (e.g. 30, 70, 100).

maximum100
minimum0
attribute: Optional[str]

Context attribute used for sticky bucketing. Defaults to targetingKey. If absent at evaluation time, bucketing is random per request.

minLength1
variations: Dict[str, Union[Optional[str], float, bool, 2 more]]

Map of variation name to value. All values must be the same type (boolean, string, number, or JSON object/array). Each serialized value must be 10KB or smaller.

One of the following:
Optional[str]
float
bool
Dict[str, object]
List[object]
description: Optional[str]
maxLength512
type: Optional[Literal["boolean", "string", "number", "json"]]

Value type of the flag’s variations. Inferred from the variation values on write, so it may be omitted in requests.

One of the following:
"boolean"
"string"
"number"
"json"
updated_at: Optional[str]
updated_by: Optional[str]

Update flag

import os
from cloudflare import Cloudflare

client = Cloudflare(
    api_token=os.environ.get("CLOUDFLARE_API_TOKEN"),  # This is the default and can be omitted
)
flag = client.flagship.apps.flags.update(
    flag_key="flag_key",
    account_id="account_id",
    app_id="app_id",
    default_variation="x",
    enabled=True,
    key="x",
    rules=[{
        "conditions": [{
            "attribute": "x",
            "operator": "equals",
            "value": {},
        }],
        "priority": 1,
        "serve_variation": "x",
    }],
    variations={
        "foo": "string"
    },
)
print(flag.default_variation)
{
  "errors": [
    {
      "message": "message"
    }
  ],
  "messages": [
    {
      "message": "message"
    }
  ],
  "result": {
    "default_variation": "x",
    "enabled": true,
    "key": "x",
    "rules": [
      {
        "conditions": [
          {
            "attribute": "x",
            "operator": "equals",
            "value": {}
          }
        ],
        "priority": 1,
        "serve_variation": "x",
        "rollout": {
          "percentage": 0,
          "attribute": "x"
        }
      }
    ],
    "variations": {
      "foo": "string"
    },
    "description": "description",
    "type": "boolean",
    "updated_at": "updated_at",
    "updated_by": "updated_by"
  },
  "success": true
}
Returns Examples
{
  "errors": [
    {
      "message": "message"
    }
  ],
  "messages": [
    {
      "message": "message"
    }
  ],
  "result": {
    "default_variation": "x",
    "enabled": true,
    "key": "x",
    "rules": [
      {
        "conditions": [
          {
            "attribute": "x",
            "operator": "equals",
            "value": {}
          }
        ],
        "priority": 1,
        "serve_variation": "x",
        "rollout": {
          "percentage": 0,
          "attribute": "x"
        }
      }
    ],
    "variations": {
      "foo": "string"
    },
    "description": "description",
    "type": "boolean",
    "updated_at": "updated_at",
    "updated_by": "updated_by"
  },
  "success": true
}