publ betaReference (MCP guide)
Open publ console

publ Reference

commerce_product_settings_apply

Edit supported fields of an existing X00004 product in one source REVISE dispatch. Read the shop product guide for the required COMMERCE_V2 configuration, exact installed-store/channel scope, current delegate policy and recovery. These prerequisites apply to reads as well as writes.

Require channelCode, observed productId, requestId, fresh expectedRevision from commerce_product_settings_get, a nonempty strict settings object and optional dryRun (default false). Omitted fields are preserved; unknown fields fail.

settings field Accepted value
name Trimmed 2–50 UTF-16 units.
oneLiner Empty string to clear, or trimmed 2–100 units.
price Decimal string in the verified channel currency.
originalPrice Same price rules, or null to clear to zero.
enableReviewFeature / enableQuestionFeature / searchIndexable Boolean.
seoTitle / seoDescription / seoImgAltText Strings up to 100 / 5000 / 300 units respectively; empty strings allowed.
seoKeywords Array of trimmed nonempty strings whose comma-joined total is at most 5000 units; empty array clears it.
orderQuantityLimit Integer 1–9999, or null to disable. Disabling preserves the old numeric value but turns off its feature flag.
categoryIds / labelIds / badgeIds Complete replacement arrays, at most five distinct observed IDs each; empty array clears that association set.
shippingPolicyId One existing observed shipping-policy ID; no null/clear or policy creation.
inputOption Create/edit/remove for one buyer-entered field; see the contract and integration limits below.
addons edit/removeItems/disable for an existing group; also create/addItem under the single-receipt constraints below.

Price strings have no signs, separators, exponent or rounding, at most ten whole digits and at most two fraction digits. KRW allows 100 through 9999999990 in multiples of 10; KRW decimal notation is accepted only when its value satisfies the integer/step rule. The currency comes from the selected channel, not input. The resulting sale price cannot exceed a nonzero retained/requested original price; equality is allowed. Null originalPrice removes that comparison ceiling by clearing it to zero.

Requested category/label/badge and shipping links are checked against the same store and unavailable/purged targets fail. This does not expose a catalog or shipping-policy writer. The source requires existing option-group/value identity mappings in every REVISE body; unknown option fields that cannot be preserved cause COMMERCE_PRODUCT_OPTIONS_UNSUPPORTED. Variant/option-group restructuring is not allowed; the later single buyer-input field action below has a separate contract. Images, variants, omitted add-ons, stock and other omitted product-owned fields must remain unchanged; a parent-name change may update the variant's embedded parent name. insertedAt/updatedAt fields are excluded from business-state comparison.

Dry run returns COMMERCE_OPERATION_PLAN with the source request and observed product, not a saved product. Confirmed readback returns COMMERCE_OPERATION_COMPLETE; related descriptive catalog/shipping projections are outside preservation. Use taskType commerce-product-settings with the original input. Central status is historical and resume only observes sent effects; identical apply may continue prepared work. Uncertain dispatch is never resent and no rollback is promised. Completed replay has no current verification/link. See the guide for shared error and context boundaries.

Product creation/deletion, uploads, detailed-page editing, variant/option-group changes and scheduled status changes are outside this method. Price configuration is not a charge or verified checkout.

Example

{"channelCode":"selected-channel","productId":"observed-product","requestId":"product-settings-001","expectedRevision":"0000000000000000000000000000000000000000000000000000000000000000","settings":{"name":"Community notebook","oneLiner":"Member edition","enableReviewFeature":true,"orderQuantityLimit":2},"dryRun":true}

Replace the selectors/revision with a current settings read and inspect the plan. This example performs no live save.

One buyer input field

It configures one buyer-entered field on an existing product, separate from variants and paid add-ons. It does not edit existing order answers or purchases. That evidence remains specific to standalone fields.

inputOption.kind Required fields and condition
create title and placeholder, each trimmed 1–50 UTF-16 units. The current productInputOptionFields array must be empty. No caller-created field ID is accepted.
edit Exact productInputOptionFieldId, title and placeholder. The sole current field must match the selected product/store/ID.
remove Exact productInputOptionFieldId and confirmation:REMOVE_PRODUCT_INPUT_OPTION. Sends the empty field array.

The business ID follows the existing 1–160-character rule. Multiple current fields, foreign parent/store identities or unknown field metadata fail closed. The source body uses sequentialRank:1. Equal edits are no-ops. Dry run sends nothing and creates no new journal. Required option-group mappings and association arrays remain in the REVISE body. Omitted images, variants, paid add-ons, stock, prices, schedules and other product-owned fields are preserved.

Child-field creation additionally requires success:true, action:REVISE and result:ProductDto from the source response. That response must identify the new field business ID, requested title/example/rank and preserved product state. Persist the identity before independent stable readback; the later record must contain the same ID. Only its newly generated numeric row ID and ordinary timestamps are excluded from creation comparison; existing field row IDs and unrequested metadata remain strict. Missing response/durable identity stays pending; matching title is not adopted and no sent request is repeated. Earlier settings journals without this action retain their original receipt requirements.

The exact existing product detail remains the destination. Removal establishes configuration-array removal, not physical erasure, deletion of old order answers or old-ID restoration. Initial buyer options are separately covered by the later whole-product creation extension.

Illustrative create plan for an existing product whose observed field array is empty:

{"channelCode":"selected-channel","productId":"observed-product","requestId":"product-input-create-001","expectedRevision":"0000000000000000000000000000000000000000000000000000000000000000","settings":{"inputOption":{"kind":"create","title":"Gift message","placeholder":"Enter your message"}},"dryRun":true}

Illustrative edit plan for the exact sole field returned by the product reader:

{"channelCode":"selected-channel","productId":"observed-product","requestId":"product-input-edit-001","expectedRevision":"0000000000000000000000000000000000000000000000000000000000000000","settings":{"inputOption":{"kind":"edit","productInputOptionFieldId":"observed-input-field","title":"Gift message","placeholder":"Write a short message"}},"dryRun":true}

Illustrative explicit removal plan; replace all IDs and the settings revision:

{"channelCode":"selected-channel","productId":"observed-product","requestId":"product-input-remove-001","expectedRevision":"0000000000000000000000000000000000000000000000000000000000000000","settings":{"inputOption":{"kind":"remove","productInputOptionFieldId":"observed-input-field","confirmation":"REMOVE_PRODUCT_INPUT_OPTION"}},"dryRun":true}

Existing paid add-on options

Read the exact existing product and settings revision first. The bounded rewrite requires one existing productAddonGroups entry with one to three ordered items, exact group/item business IDs and matching product/store/currency. the later create/addItem extension supplies those operations.

addons.kind Required input and effects
edit productAddonGroupId plus title and/or items. title and each supplied item name are trimmed 1–50 UTF-16 units. items has 1–3 distinct productAddonItemIds, each with at least one of name, additionalPrice or saleStatus (ACTIVE/DISCONTINUED). Omitted fields and unselected items are preserved.
removeItems productAddonGroupId, 1–2 distinct productAddonItemIds and confirmation:REMOVE_PRODUCT_ADDON_ITEMS. Every ID must belong to that group; at least one item must remain. Survivors keep their identities and values, with sequentialRank renumbered from one.
disable productAddonGroupId and confirmation:DISABLE_PRODUCT_ADDONS. Sends productAddonGroups:[] to remove the whole product configuration.

Use business IDs under the shared 1–160-character rule, not numeric row IDs, display names or guessed IDs. The existing isRequired flag is preserved and cannot be edited here. Multiple groups, unknown group/item/price metadata, foreign identities and noncanonical item order fail closed. Every retained title/name must satisfy the source text bound before rewriting.

Add-on additionalPrice has its own source rules, distinct from the product price and variant adjustment above. Supply an exact nonnegative decimal string without a sign, separators, exponent or rounding. The component permits zero through 9,999,999,990 inclusive in both KRW and USD. KRW input has no decimal part and uses steps of 100; USD permits up to two decimals in steps of 0.01. Currency comes from the verified channel. Omitted stored prices must also satisfy the known bounds; unchanged stored representations remain preserved without rounding.

The REVISE body keeps the complete known group/item form, business identities, requiredness, unselected items, required option mappings and unrelated product state. Numeric row identities remain strict in preservation. A no-op/dry run dispatches nothing. Existing add-on edits need no new identity receipt; they may compose with inputOption.create, which still requires its independently persisted response-returned field ID. The returned input identity must survive transport and durable journaling with add-on IDs, requiredness, unselected items and unrelated product fields preserved. Missing/lost/foreign or contradictory input receipts cannot become complete merely because add-on values match. A durable receipt may recover the full change after read loss without another REVISE; drift in either part remains pending. This adds shared verification evidence without changing the domain contract, and does not approve every add-on operation/combination or actual checkout, orders or restoration. Unknown/partial saves or failed completion persistence remain pending; sent effects never repeat. Old journals and the exact product-detail destination keep their existing rules.

Configuration-array removal is not physical deletion, modification of historical order selections or restoration of removed IDs. New groups/items are described in the later extension below; initial add-ons at whole-product creation use a different parent-receipt contract.

Illustrative plans only; copy group/item/product IDs and the settings revision from the exact observed product. The removal example requires another item to survive.

{
  "channelCode": "selected-channel",
  "productId": "observed-product",
  "requestId": "product-addon-example-001",
  "expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
  "settings": {
    "addons": {
      "kind": "edit",
      "productAddonGroupId": "observed-addon-group",
      "title": "Gift options",
      "items": [
        {
          "productAddonItemId": "observed-addon-item",
          "name": "Gift wrapping",
          "additionalPrice": "100",
          "saleStatus": "ACTIVE"
        }
      ]
    }
  },
  "dryRun": true
}
{
  "channelCode": "selected-channel",
  "productId": "observed-product",
  "requestId": "product-addon-example-002",
  "expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
  "settings": {
    "addons": {
      "kind": "removeItems",
      "productAddonGroupId": "observed-addon-group",
      "productAddonItemIds": [
        "observed-addon-item"
      ],
      "confirmation": "REMOVE_PRODUCT_ADDON_ITEMS"
    }
  },
  "dryRun": true
}
{
  "channelCode": "selected-channel",
  "productId": "observed-product",
  "requestId": "product-addon-example-003",
  "expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
  "settings": {
    "addons": {
      "kind": "disable",
      "productAddonGroupId": "observed-addon-group",
      "confirmation": "DISABLE_PRODUCT_ADDONS"
    }
  },
  "dryRun": true
}

Create an add-on group or append one item

Read the current product/settings revision first. New options use one REVISE dispatch and its successful complete ProductDto response; they do not introduce a child-create endpoint or a new method.

addons.kind Required fields and current-state condition
create title and items containing one to three complete items. The current productAddonGroups array must be empty. The new group uses sequentialRank:1 and isRequired:false.
addItem Exact existing productAddonGroupId and one complete item. One matching group with one or two items must exist; append at the next sequential rank and retain all existing items.

A complete new item requires name, additionalPrice and saleStatus:ACTIVE or DISCONTINUED. Title/name are trimmed 1–50 UTF-16 units. Prices use the add-on rules above: zero through9,999,999,990 in either channel currency, KRW integer strings in100-unit steps and USD in0.01 steps with at most two decimals. Caller-created group/item IDs, requiredness, row IDs or ranks are rejected. Append preserves existing group requiredness, title/rank and every old item identity, price and status; unsupported metadata, invalid retained names/prices, foreign identities or three existing items stop the change.

One task stores one durable new identity. settings.inputOption.kind:create cannot be combined with addons.create or addons.addItem; use separate requests and a fresh product revision for the second request. Existing input edits/removal can compose with these new add-on operations. Input creation combined with existing add-on edit/removeItems/disable keeps its earlier receipt rules. This does not guarantee that every combination has shared-host or actual-service verification.

The response must have success:true, action:REVISE and a complete result matching the requested change and preserved product. Creating a group requires its returned business productAddonGroupId. Appending requires exactly one new productAddonItemId relative to the complete prior item set. The workflow persists that receipt before independent stable readback. An appended item must keep that exact received business ID and all old identities remain strict. A new group's children must be valid and stable within the exact returned group; their business IDs are not independently compared to every original response child ID. Newly generated numeric row IDs and ordinary timestamps have the existing creation-comparison exclusions; full stable observations still retain identities.

Lost response or failed receipt persistence never permits matching by title, adopting a later item or repeating REVISE. Missing receipts, partial saves, changed reads, foreign/duplicate identities or unrelated drift remain pending. A persisted receipt allows readback recovery without another dispatch, but failed terminal persistence cannot confirm completion. Dry run sends nothing. Completion establishes product configuration only, not checkout charges, existing-order changes, physical cleanup or exact original-ID restoration. The existing exact product detail is the destination; no child-specific console path is introduced.

Completion still requires success:true, action:REVISE, the full matching result, one durably saved group/item identity and two stable reads of the exact product. Independent inputOption.create remains rejected in the same request. Missing receipts never permit resend or adoption by matching name; saved receipts permit read-only recovery after read loss. Completed historical results have no current verification or link, and only eligible fresh results identify the exact product. Fixture cleanup compared the resulting configuration, not physical deletion or restoration of original child IDs.

Illustrative dry runs for an observed product with, respectively, no group or a matching group below the three-item limit. Replace product/group IDs and the settings revision:

{
  "channelCode": "selected-channel",
  "productId": "observed-product",
  "requestId": "product-addon-create-001",
  "expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
  "settings": {
    "addons": {
      "kind": "create",
      "title": "Gift options",
      "items": [ { "name": "Gift wrapping", "additionalPrice": "100", "saleStatus": "ACTIVE" } ]
    }
  },
  "dryRun": true
}
{
  "channelCode": "selected-channel",
  "productId": "observed-product",
  "requestId": "product-addon-append-001",
  "expectedRevision": "0000000000000000000000000000000000000000000000000000000000000000",
  "settings": {
    "addons": {
      "kind": "addItem",
      "productAddonGroupId": "observed-addon-group",
      "item": { "name": "Greeting card", "additionalPrice": "0", "saleStatus": "ACTIVE" }
    }
  },
  "dryRun": true
}

Inputs

Field Required here Contract
channelCode Yes string; min length 1; max length 512; The exact channelCode selected through channel discovery. Do not supply a URL, channel numeric ID, account ID or credentials.
productId Yes string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.
requestId Yes string; pattern ^[A-Za-z0-9_-]{8,80}$; Reuse this requestId and the exact original input after interruption. Never change requestId to retry an uncertain write.
expectedRevision Yes string; pattern ^[a-f0-9]{64}$; Exact revision returned by the matching read for this channel, installed pApp and resource.
settings Yes object
settings.name No string; min length 2; max length 50
settings.oneLiner No `` or string; min length 2; max length 100
settings.price No string; pattern ^(0|[1-9]\d{0,9})(\.\d{1,2})?$; Decimal currency units as text, without separators or rounding. Currency comes from the verified channel.
settings.originalPrice No string; pattern ^(0|[1-9]\d{0,9})(\.\d{1,2})?$; Decimal currency units as text, without separators or rounding. Currency comes from the verified channel. or null
settings.enableReviewFeature No boolean
settings.enableQuestionFeature No boolean
settings.searchIndexable No boolean
settings.seoTitle No string; max length 100
settings.seoDescription No string; max length 5000
settings.seoKeywords No array; items: string; min length 1
settings.seoImgAltText No string; max length 300
settings.orderQuantityLimit No integer; minimum 1; maximum 9999 or null
settings.categoryIds No array; items: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; max items 5
settings.labelIds No array; items: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; max items 5
settings.badgeIds No array; items: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; max items 5
settings.shippingPolicyId No string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.
settings.inputOption No one of: create, edit, remove (by kind)
settings.inputOption.title Yes When settings.inputOption.kind is create: string; min length 1; max length 50
settings.inputOption.placeholder Yes When settings.inputOption.kind is create: string; min length 1; max length 50
settings.inputOption.productInputOptionFieldId Yes When settings.inputOption.kind is edit: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.
settings.inputOption.title Yes When settings.inputOption.kind is edit: string; min length 1; max length 50
settings.inputOption.placeholder Yes When settings.inputOption.kind is edit: string; min length 1; max length 50
settings.inputOption.productInputOptionFieldId Yes When settings.inputOption.kind is remove: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.
settings.inputOption.confirmation Yes When settings.inputOption.kind is remove: REMOVE_PRODUCT_INPUT_OPTION
settings.addons No one of: create, addItem, edit, removeItems, disable (by kind)
settings.addons.title Yes When settings.addons.kind is create: string; min length 1; max length 50
settings.addons.items Yes When settings.addons.kind is create: array; min items 1; max items 3
settings.addons.items[].name Yes When settings.addons.kind is create: string; min length 1; max length 50
settings.addons.items[].additionalPrice Yes When settings.addons.kind is create: string; pattern ^(0|[1-9]\d{0,9})(\.\d{1,2})?$
settings.addons.items[].saleStatus Yes When settings.addons.kind is create: ACTIVE, DISCONTINUED
settings.addons.productAddonGroupId Yes When settings.addons.kind is addItem: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.
settings.addons.item Yes When settings.addons.kind is addItem: object
settings.addons.item.name Yes When settings.addons.kind is addItem: string; min length 1; max length 50
settings.addons.item.additionalPrice Yes When settings.addons.kind is addItem: string; pattern ^(0|[1-9]\d{0,9})(\.\d{1,2})?$
settings.addons.item.saleStatus Yes When settings.addons.kind is addItem: ACTIVE, DISCONTINUED
settings.addons.productAddonGroupId Yes When settings.addons.kind is edit: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.
settings.addons.title No When settings.addons.kind is edit: string; min length 1; max length 50
settings.addons.items No When settings.addons.kind is edit: array; min items 1; max items 3
settings.addons.items[].productAddonItemId Yes When settings.addons.kind is edit: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.
settings.addons.items[].name No When settings.addons.kind is edit: string; min length 1; max length 50
settings.addons.items[].additionalPrice No When settings.addons.kind is edit: string; pattern ^(0|[1-9]\d{0,9})(\.\d{1,2})?$
settings.addons.items[].saleStatus No When settings.addons.kind is edit: ACTIVE, DISCONTINUED
settings.addons.productAddonGroupId Yes When settings.addons.kind is removeItems: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.
settings.addons.productAddonItemIds Yes When settings.addons.kind is removeItems: array; items: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.; min items 1; max items 2
settings.addons.confirmation Yes When settings.addons.kind is removeItems: REMOVE_PRODUCT_ADDON_ITEMS
settings.addons.productAddonGroupId Yes When settings.addons.kind is disable: string; min length 1; max length 160; pattern ^[A-Za-z0-9_-]+$; Exact resource identifier returned by this operation, never a title, unrelated row ID or URL.
settings.addons.confirmation Yes When settings.addons.kind is disable: DISABLE_PRODUCT_ADDONS
dryRun No boolean; default false