Skip to content

Update a feature

The features.update operation: PATCH /api/v1/features/{id} in the REST API and the features_update tool in the MCP server.

PATCH/api/v1/features/{id}

Changes a feature's name, combine rule, default value, perUnit (limits) or (for enum features) its values. Send only the fields to change. The key and type never change, and enum values can be added but not removed, so values products already grant stay valid. Customers' entitlements are recomputed after a change of the combine rule, default value or perUnit (customer.entitlements.updated for each customer whose values move).

At a glance

  • REST: PATCH /api/v1/features/{id}
  • MCP tool: features_update
  • Operation ID: features.update
  • Scope: Brand
  • Permission: catalog:write
  • Risk tier: write
  • Dry run: Supported (send Ownrecord-Dry-Run: true)
  • Idempotency: Idempotency-Key optional
  • Modes: Test and live
  • Authentication: API key with the catalog:write scope
  • Since: M4

Request

Path parameters

FieldTypeDescription
idfeat_… ID

Body

A JSON object (Content-Type: application/json):

FieldTypeRequiredDescription
namestringNo
combineone of max, sum, or, firstNoHow values from several products combine: or or first for booleans, max, sum or first for limits, first for enums.
defaultValueboolean or number or stringNotrue/false for a boolean feature, a whole number for a limit, one of the values for an enum.
enumValuesarray of stringNoEnum features: the full list of values; existing values must stay (new ones can be added).
perUnitbooleanNoLimit features only: multiply granted values by the quantity. Customers' entitlements follow.

Response

200 OK with a JSON object:

FieldTypeDescription
idfeat_… ID
object"feature"
brandIdbrd_… ID
livemodeboolean
keystring
namestring
typeone of boolean, limit, enum
enumValuesarray of string or null
combineone of max, sum, or, first
defaultValueboolean or number or string
perUnitbooleanLimit features only: values are multiplied by the item's or purchase's quantity (spec §36.1).
createdAtdate-time
updatedAtdate-time

Examples

Rename a feature

HTTP
PATCH /api/v1/features/feat_01m4tx5nj8emwbyf7y9vcf47y6
Authorization: Bearer or_test_…
Content-Type: application/json

{
  "name": "Team seats"
}

Response (200):

JSON
{
  "id": "feat_01m4tx5nj8emwbyf7y9vcf47y6",
  "object": "feature",
  "brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
  "livemode": false,
  "key": "seats.max",
  "name": "Team seats",
  "type": "limit",
  "enumValues": null,
  "combine": "max",
  "defaultValue": 1,
  "perUnit": true,
  "createdAt": "2026-10-13T12:00:00.000Z",
  "updatedAt": "2026-10-14T09:30:00.000Z"
}

Errors

CodeHTTP statusWhenWhat to do
validation_failed400No field to change was sent, or the new definition breaks a rule (e.g. perUnit on a boolean).Fix the fields listed in details.issues and send the request again.
feature_change_not_allowed409The change removes enum values.Create a new feature with the new definition, and grant it from your products instead.
resource_not_found404No feature with this ID is visible to the request.Check the ID and that your credentials are scoped to the right organization, entity, brand and mode.
version_conflict409The feature changed at the same time; retry.Fetch the object again and retry the change.
permission_denied403You can't change this brand's catalog.Ask an organization owner or admin for a role or scope that allows this action.

It can also return these common errors: api_version_unsupported, invalid_json, unsupported_media_type, authentication_required, api_key_invalid, scope_required, idempotency_key_reused, idempotency_in_progress, approval_required, approval_rejected, approval_expired, stale_approval, approval_policy_denied, rate_limited, internal_error.