Skip to content
Start here

Get flag changelog

client.flagship.apps.flags.changelog.list(stringappId, stringflagKey, ChangelogListParams { account_id, cursor, limit } params, RequestOptionsoptions?): CursorPaginationAfter<ChangelogListResponse>
GET/accounts/{account_id}/flagship/apps/{app_id}/flags/{flag_key}/changelog

Returns the audit history for a flag, newest first. Each entry includes the event type and full flag state after the change; update entries include a field-level diff. Capped at 200 entries per flag.

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
Accepted Permissions (at least one required)
Flagship Read
ParametersExpand Collapse
appId: string

App identifier.

flagKey: string

Flag key (slug).

params: ChangelogListParams { account_id, cursor, limit }
account_id: string

Path param: Cloudflare account ID.

cursor?: string

Query param: Pagination cursor from a previous response.

limit?: string

Query param: Max items to return (1–200).

ReturnsExpand Collapse
ChangelogListResponse = UnionMember0 { after, event, flag_key } | UnionMember1 { after, event, flag_key } | UnionMember2 { after, diff, event, flag_key }
One of the following:
UnionMember0 { after, event, flag_key }
after: After { default_variation, enabled, key, 6 more }
default_variation: string

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

minLength1
enabled: boolean

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

key: string

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

maxLength64
minLength1
rules: Array<Rule>

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

conditions: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >

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

One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >
One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >
One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >
One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >
One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >
One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<string | null | number | boolean | 2 more>
One of the following:
string | null
number
boolean
Record<string, unknown>
Array<unknown>
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
priority: number

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

minimum1
serve_variation: string

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

minLength1
rollout?: Rollout { percentage, attribute }
percentage: number

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?: string

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

minLength1
variations: Record<string, string | null | number | boolean | 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:
string | null
number
boolean
Record<string, unknown>
Array<unknown>
description?: string | null
maxLength512
type?: "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?: string
updated_by?: string
event: "create"
flag_key: string
UnionMember1 { after, event, flag_key }
after: After { default_variation, enabled, key, 6 more }
default_variation: string

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

minLength1
enabled: boolean

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

key: string

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

maxLength64
minLength1
rules: Array<Rule>

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

conditions: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >

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

One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >
One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >
One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >
One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >
One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >
One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<string | null | number | boolean | 2 more>
One of the following:
string | null
number
boolean
Record<string, unknown>
Array<unknown>
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
priority: number

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

minimum1
serve_variation: string

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

minLength1
rollout?: Rollout { percentage, attribute }
percentage: number

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?: string

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

minLength1
variations: Record<string, string | null | number | boolean | 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:
string | null
number
boolean
Record<string, unknown>
Array<unknown>
description?: string | null
maxLength512
type?: "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?: string
updated_by?: string
event: "delete"
flag_key: string
UnionMember2 { after, diff, event, flag_key }
after: After { default_variation, enabled, key, 6 more }
default_variation: string

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

minLength1
enabled: boolean

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

key: string

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

maxLength64
minLength1
rules: Array<Rule>

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

conditions: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >

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

One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >
One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >
One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >
One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >
One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<UnionMember0 { attribute, operator, value } | UnionMember1 { clauses, logical_operator } >
One of the following:
UnionMember0 { attribute, operator, value }
attribute: string
maxLength64
minLength1
operator: "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: unknown

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.

UnionMember1 { clauses, logical_operator }
clauses: Array<string | null | number | boolean | 2 more>
One of the following:
string | null
number
boolean
Record<string, unknown>
Array<unknown>
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
logical_operator: "AND" | "OR"
One of the following:
"AND"
"OR"
priority: number

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

minimum1
serve_variation: string

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

minLength1
rollout?: Rollout { percentage, attribute }
percentage: number

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?: string

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

minLength1
variations: Record<string, string | null | number | boolean | 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:
string | null
number
boolean
Record<string, unknown>
Array<unknown>
description?: string | null
maxLength512
type?: "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?: string
updated_by?: string
diff: Record<string, Diff>
from?: string | null | number | boolean | 2 more
One of the following:
string | null
number
boolean
Record<string, unknown>
Array<unknown>
to?: string | null | number | boolean | 2 more
One of the following:
string | null
number
boolean
Record<string, unknown>
Array<unknown>
event: "update"
flag_key: string

Get flag changelog

import Cloudflare from 'cloudflare';

const client = new Cloudflare({
  apiToken: process.env['CLOUDFLARE_API_TOKEN'], // This is the default and can be omitted
});

// Automatically fetches more pages as needed.
for await (const changelogListResponse of client.flagship.apps.flags.changelog.list(
  'app_id',
  'flag_key',
  { account_id: 'account_id' },
)) {
  console.log(changelogListResponse);
}
{
  "errors": [
    {
      "message": "message"
    }
  ],
  "messages": [
    {
      "message": "message"
    }
  ],
  "result": [
    {
      "after": {
        "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"
      },
      "event": "create",
      "flag_key": "flag_key"
    }
  ],
  "result_info": {
    "count": 0,
    "cursor": "cursor"
  },
  "success": true
}
Returns Examples
{
  "errors": [
    {
      "message": "message"
    }
  ],
  "messages": [
    {
      "message": "message"
    }
  ],
  "result": [
    {
      "after": {
        "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"
      },
      "event": "create",
      "flag_key": "flag_key"
    }
  ],
  "result_info": {
    "count": 0,
    "cursor": "cursor"
  },
  "success": true
}