Sign Customiser

Navigation

Dark mode

Pricing

update_customiser_length_pricing

destructive write

Update customiser length pricing

Copy page

Change the name, letter pricing, shipping settings or boundary rows of one length pricing.

Overview

Changes one length pricing of an advanced_letter or frame_fit customiser with a JSON merge patch: fields you omit stay as they are, shipping merges member by member, and sending rows replaces every boundary row. base_price and price_per_letter are integer minor units of the Store currency; dimensions accept centimetres or inch twins. The patch is judged against the state it would leave, so a change of shipping calculation or letter pricing method that the rows cannot carry is refused. Signs priced by this list use the new prices on the storefront. It requires the pricing:write scope, takes an optional idempotency_key for replay, and supports dry_run.

Permission

Requires thepricing:writepermission. A connection without it answersinsufficient_scopenaming the permission to approve.

Annotations

readOnlyHintfalse
destructiveHinttrue
idempotentHintfalse
openWorldHintfalse

Prerequisites

  • A customiser id from list_customisers and a length pricing id from list_customiser_length_pricings.
  • The current price list from get_customiser_length_pricing, because rows is replaced whole.
  • The Store unit_revision from get_store when sending inch twins.
  • A merchant has connected this store and approved the pricing:write scope.

Side effects

  • Changes what every sign priced by this list costs on the storefront.
  • Clears the customiser cached storefront configuration.
  • Spends one unit of the store option-write budget.

Arguments

customiser_idintegerrequired

The customiser id, from list_customisers.

length_pricing_idintegerrequired

The length pricing id, from list_customiser_length_pricings.

namestring

The price list display name.

letter_pricing_modestring

How letters are charged (closed set): every_letter_cost charges each letter the same, price_by_position charges by letter position from the per-position schedule.

One of: every_letter_cost, price_by_position

letter_pricing_methodstring

What each row charges letters by (closed set): material_length charges price_per_cm of material, fixed_letter charges price_per_letter.

One of: material_length, fixed_letter

shippingobject

The shipping members to change. Members you omit are left as they are.

shipping.calculationstring

physical measures the sign; volumetric measures the box and needs volumetric_divisor (closed set).

One of: physical, volumetric

shipping.volumetric_divisorinteger or null

The divisor the boxed volume is divided by. Required when calculation is volumetric.

shipping.volumetric_divisor_authoredinteger or null

The divisor as the merchant authored it, in volumetric_divisor_unit.

shipping.volumetric_divisor_unitstring or null

The unit volumetric_divisor_authored is in.

One of: cm3_per_kg, in3_per_kg, cm3_per_lb, in3_per_lb

shipping.volumetric_divisor_canonicalnumber or null

The divisor converted to cubic centimetres per kilogram. Must be greater than 0.

shipping.authored_unitsobject

The unit the merchant authored the divisor in.

shipping.authored_units.volumetric_divisorstring

One of: cm3_per_kg, in3_per_kg, cm3_per_lb, in3_per_lb

shipping.add_weight_to_productboolean

Whether the calculated weight is written onto the created product.

unit_revisioninteger

The Store unit revision from get_store. The write is refused with stale_revision if the Store unit preferences changed after it was read.

rows_revisioninteger

The rows_revision from the last read of this price list. The write is refused with stale_revision if the rows changed after that read.

rowsarray of object

Every boundary row of the price list. Sending rows replaces the whole set, and an empty list clears it. A row sent without price_per_letter_by_position keeps the schedule it already had; send null to clear one.

rows[].idstring

The stable row id from a previous read. Send it back to keep the row identity.

rows[].base_priceintegerrequired

The flat amount a sign in this band costs, in integer minor units of the Store currency.

rows[].price_per_letterinteger or null

The amount each letter adds, in integer minor units. Required on a fixed_letter list outside frame_fit.

rows[].price_per_letter_by_positionarray of integer

Only on a price_by_position fixed_letter list: 1 to 100 per-letter prices in integer minor units, the first entry being the first letter.

rows[].price_per_cmnumber or null

The amount each centimetre of material adds, in decimal major currency units. Required on a material_length list outside frame_fit.

rows[].price_per_innumber or null

The inch twin of price_per_cm, in decimal major currency units per inch.

rows[].price_per_sq_cmnumber or null

A decimal major-currency rate: per square centimetre for physical shipping, per kilogram of volumetric weight for volumetric shipping.

rows[].price_per_sq_innumber or null

The square-inch twin of price_per_sq_cm.

rows[].price_per_lbnumber or null

The per-pound twin of price_per_sq_cm on a volumetric list.

rows[].price_per_sq_cm_basisstring

Whether price_per_sq_cm applies to physical area or volumetric weight (closed set).

One of: per_sq_cm, per_kg_volumetric

rows[].max_price_multipliernumber or null

The ceiling the row computed price is capped at, as a multiple.

rows[].width_limit_cmnumber or null

The widest sign this row covers, in centimetres.

rows[].width_limit_innumber or null

The inch twin of width_limit_cm.

rows[].height_limit_cmnumber or null

The tallest sign this row covers, in centimetres.

rows[].height_limit_innumber or null

The inch twin of height_limit_cm.

rows[].length_limit_cmnumber or null

The depth boundary this row covers, in centimetres.

rows[].length_limit_innumber or null

The inch twin of length_limit_cm.

rows[].fixed_length_cmnumber or null

The fixed sign depth in centimetres for non-Lightbox volumetric shipping.

rows[].fixed_length_innumber or null

The inch twin of fixed_length_cm.

rows[].width_modifiernumber or null

Adjusts the measured width before pricing, in centimetres.

rows[].width_modifier_innumber or null

The inch twin of width_modifier.

rows[].height_modifiernumber or null

Adjusts the measured height before pricing, in centimetres.

rows[].height_modifier_innumber or null

The inch twin of height_modifier.

rows[].length_modifiernumber or null

Lightbox-only extra parcel depth added for packaging, in centimetres.

rows[].length_modifier_innumber or null

The inch twin of length_modifier.

rows[].authored_unitsobject

The unit the merchant authored each quantity in, keyed by its centimetre field name.

rows[].authored_units.width_limit_cmstring

One of: centimetres, inches

rows[].authored_units.height_limit_cmstring

One of: centimetres, inches

rows[].authored_units.length_limit_cmstring

One of: centimetres, inches

rows[].authored_units.fixed_length_cmstring

One of: centimetres, inches

rows[].authored_units.width_modifierstring

One of: centimetres, inches

rows[].authored_units.height_modifierstring

One of: centimetres, inches

rows[].authored_units.length_modifierstring

One of: centimetres, inches

rows[].authored_units.price_per_cmstring

One of: centimetres, inches

rows[].authored_units.price_per_sq_cmstring

One of: centimetres, inches, kilograms, pounds

idempotency_keystring

An optional client-generated key unique to this logical write, such as a UUID. Repeating the call with the same key and the same arguments replays the original result; the route does not require one.

dry_runboolean

When true, the patch is checked against the state it would leave is checked and nothing is written: the result is the same verdict the apply would have reached, and a problem the apply would have raised comes back as the same tool error. Defaults to false. A dry run claims no key.

Result

The length pricing as it now stands, with every row. A dry run returns the update verdict instead and writes nothing.

request_idstringalways present
storeobjectalways present
store.idintegeralways present
store.namestringalways present
customiser_idintegeralways present
length_pricingobject

The length pricing as it now stands, with every row. Absent on a dry run.

length_pricing.idintegeralways present
length_pricing.customiser_idintegeralways present
length_pricing.namestring or null
length_pricing.letter_pricing_modestring or null

One of: every_letter_cost, price_by_position

length_pricing.letter_pricing_methodstring or null

One of: material_length, fixed_letter

length_pricing.shippingobject
length_pricing.shipping.calculationstring or null
length_pricing.shipping.volumetric_divisorinteger or null
length_pricing.shipping.volumetric_divisor_authoredinteger or null
length_pricing.shipping.volumetric_divisor_unitstring or null
length_pricing.shipping.volumetric_divisor_canonicalnumber or null
length_pricing.shipping.authored_unitsobject
length_pricing.shipping.add_weight_to_productboolean
length_pricing.currencystring or null

The ISO 4217 currency of every integer minor-unit amount on the record.

length_pricing.rows_revisioninteger
length_pricing.rowsarray of object
length_pricing.rows[].idstring
length_pricing.rows[].base_pricenumber or null
length_pricing.rows[].price_per_letternumber or null
length_pricing.rows[].price_per_cmnumber or null
length_pricing.rows[].price_per_innumber or null
length_pricing.rows[].price_per_sq_cmnumber or null
length_pricing.rows[].price_per_sq_innumber or null
length_pricing.rows[].price_per_lbnumber or null
length_pricing.rows[].max_price_multipliernumber or null
length_pricing.rows[].width_limit_cmnumber or null
length_pricing.rows[].width_limit_innumber or null
length_pricing.rows[].height_limit_cmnumber or null
length_pricing.rows[].height_limit_innumber or null
length_pricing.rows[].length_limit_cmnumber or null
length_pricing.rows[].length_limit_innumber or null
length_pricing.rows[].fixed_length_cmnumber or null
length_pricing.rows[].fixed_length_innumber or null
length_pricing.rows[].width_modifiernumber or null
length_pricing.rows[].width_modifier_innumber or null
length_pricing.rows[].height_modifiernumber or null
length_pricing.rows[].height_modifier_innumber or null
length_pricing.rows[].length_modifiernumber or null
length_pricing.rows[].length_modifier_innumber or null
length_pricing.rows[].price_per_sq_cm_basisstring

One of: per_sq_cm, per_kg_volumetric

length_pricing.rows[].price_per_letter_by_positionarray of integer
length_pricing.rows[].authored_unitsobject
length_pricing.created_atstring or null
length_pricing.updated_atstring or null
idempotent_replayboolean

True when this call replayed a previously recorded response for the same idempotency_key instead of applying the write again.

dry_runboolean

Present and true only when dry_run was requested.

validboolean

Present only on a dry run, and always true: a failing dry run returns a tool error instead.

verdictobject

Present only on a dry run: the update verdict.

Error cases

conflicting_units

A centimetre field and its inch twin disagree. Send one of them.

idempotency_subject_changed

The price list was deleted after the recorded update. Issue a new key and re-check the resource before writing again.

insufficient_scope

The connection was approved without pricing:write.

pricing_model_mismatch

The customiser no longer prices by advanced_letter or frame_fit, so its length pricings cannot be changed.

rate_limited

The store option-write budget is spent. Wait retry_after seconds.

resource_not_found

No length pricing with that id belongs to that customiser in this store.

stale_revision

The Store units or the rows changed after they were read. Read them again and rebuild the patch.

unknown_field

Remove the field named by pointer; it is not part of a length pricing.

validation_failed

A field is out of range, or a row would lack the dimension limits, divisor or rate the resulting settings need. The pointer and the row code name it.

Rename a price list

tools/call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "update_customiser_length_pricing",
    "arguments": {
      "customiser_id": 42,
      "length_pricing_id": 9,
      "name": "Trade"
    }
  }
}
result
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "structuredContent": {
      "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t",
      "store": {
        "id": 12,
        "name": "Demo Signs"
      },
      "customiser_id": 42,
      "length_pricing": {
        "id": 9,
        "customiser_id": 42,
        "name": "Trade",
        "letter_pricing_mode": "every_letter_cost",
        "letter_pricing_method": "fixed_letter",
        "shipping": {
          "calculation": "physical",
          "volumetric_divisor": null,
          "add_weight_to_product": false
        },
        "currency": "USD",
        "rows": [],
        "created_at": "2026-08-13T00:00:00Z",
        "updated_at": "2026-08-13T00:05:00Z"
      },
      "idempotent_replay": false
    }
  }
}

Volumetric shipping without a divisor (error)

tools/call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "update_customiser_length_pricing",
    "arguments": {
      "customiser_id": 42,
      "length_pricing_id": 9,
      "shipping": {
        "calculation": "volumetric"
      },
      "dry_run": true
    }
  }
}
result
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "isError": true,
    "structuredContent": {
      "error": {
        "code": "validation_failed",
        "title": "Validation failed",
        "detail": "Volumetric shipping divides the boxed volume by a divisor, so shipping.volumetric_divisor is required whenever the calculation is volumetric.",
        "recovery": "Correct every field listed in errors, using its pointer to locate the value and allowed_values where one is given, then call the tool again.",
        "pointer": "/shipping/volumetric_divisor"
      }
    }
  }
}

Type a question and press Enter. Use the arrow keys to move between the results.