Customiser length pricings
Create a length pricing
Adds a length pricing to the customiser. Only name is required; every
other field has a documented default (letter_pricing_mode
every_letter_cost, letter_pricing_method fixed_letter,
shipping.calculation physical, shipping.add_weight_to_product false,
rows empty).
Overview
Every row needs a base_price, and the dimension limits its shipping
calculation needs: physical measures the sign, so it needs
width_limit_cm and height_limit_cm; volumetric measures the box, so it
needs at least one of the three limits and a
shipping.volumetric_divisor. Outside a frame-fit customiser each row
also needs the rate its letter pricing method charges by —
price_per_cm for material_length, price_per_letter for
fixed_letter. A write that would leave a row without them is refused
rather than creating a price list the storefront cannot resolve, and the
pricing document requires exactly the same of these rows.
The customiser must price by advanced_letter or frame_fit: a length
pricing on any other pricing model is unreachable, and the write is
refused with a 422 pricing_model_mismatch. A frame-fit customiser
prices every sign from exactly one price list, so a second create on one
is refused too — update the existing list instead. Sheet pricing is not
part of this family and cannot be created through it.
Requires pricing:write and an Idempotency-Key. The pricing document
publishes the same price lists and its full replace deletes any one the
payload omits, so pick one surface per workflow rather than interleaving
the two.
The write clears the customiser's cached storefront configuration and
runs the advisory language sync. It never regenerates Shopify products,
product images, or the product cache, so live listings are untouched.
Option writes also spend one unit of a separate per-key option-write
budget; exhausting it returns a 429 with retry_after.
Authorisation
Bearer token required. Include it in theAuthorization header.
Required scope: pricing:write
Path parameters
The customiser id.
Example: 1
Request body
Request body example
{
"letter_pricing_mode": "every_letter_cost",
"letter_pricing_method": "fixed_letter",
"name": "Standard",
"shipping": {
"calculation": "physical",
"add_weight_to_product": false,
"volumetric_divisor": 5000
},
"rows": [
{
"base_price": 4500,
"width_limit_cm": 120,
"height_limit_cm": 60,
"price_per_letter": 600
}
]
}curl https://web.signcustomiser.com/api/v3/customisers/1/length-pricings \
--request POST \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"letter_pricing_mode": "every_letter_cost",
"letter_pricing_method": "fixed_letter",
"name": "Standard",
"shipping": {
"calculation": "physical",
"add_weight_to_product": false,
"volumetric_divisor": 5000
},
"rows": [
{
"base_price": 4500,
"width_limit_cm": 120,
"height_limit_cm": 60,
"price_per_letter": 600
}
]
}'{
"data": {
"object": "length_pricing",
"id": 9,
"customiser_id": 42,
"name": "Standard",
"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": [
{
"base_price": 4500,
"width_limit_cm": 120,
"height_limit_cm": 60,
"length_limit_cm": null,
"price_per_sq_cm": null,
"fixed_length_cm": null,
"width_modifier": null,
"height_modifier": null,
"length_modifier": null,
"max_price_multiplier": null,
"price_per_cm": null,
"price_per_letter": 600,
"price_per_letter_by_position": null
}
],
"created_at": "2026-08-13T00:00:00Z",
"updated_at": "2026-08-13T00:00:00Z"
},
"links": {
"self": "https://web.signcustomiser.com/api/v3/customisers/42/length-pricings/9",
"documentation": "https://www.signcustomiser.com/help/api/"
},
"meta": {
"api_version": "v3",
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
}{
"type": "https://www.signcustomiser.com/help/api/problems/missing_idempotency_key",
"title": "Missing idempotency key",
"status": 400,
"code": "missing_idempotency_key",
"detail": "Provide an Idempotency-Key header for this write.",
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/missing_api_key",
"title": "Missing API key",
"status": 401,
"code": "missing_api_key",
"detail": "Provide a store API key as a bearer token.",
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/insufficient_scope",
"title": "Insufficient scope",
"status": 403,
"code": "insufficient_scope",
"detail": "This operation requires the pricing:write scope.",
"required_scopes": [
"pricing:write"
],
"granted_scopes": [
"pricing:read"
],
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/resource_not_found",
"title": "Resource not found",
"status": 404,
"code": "resource_not_found",
"detail": "The requested resource does not exist or does not belong to the authenticated store.",
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/idempotency_key_conflict",
"title": "Idempotency key conflict",
"status": 409,
"code": "idempotency_key_conflict",
"detail": "This Idempotency-Key was already used for a different request body on this operation.",
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/request_too_large",
"title": "Request too large",
"status": 413,
"code": "request_too_large",
"detail": "The request body must not exceed 2 MiB.",
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/validation_failed",
"title": "Validation failed",
"status": 422,
"code": "validation_failed",
"detail": "Physical shipping measures the sign itself, so every row needs both width_limit_cm and height_limit_cm.",
"errors": [
{
"pointer": "/rows/0",
"code": "dimension_limits_required",
"detail": "This row does not carry the dimension limits its shipping calculation needs."
}
],
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/rate_limited",
"title": "Too many requests",
"status": 429,
"code": "rate_limited",
"detail": "You have exceeded the request limit for this API key.",
"retry_after": 37,
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}