Pricing
Update customiser pricing
Partially update the customiser's pricing with a JSON Merge Patch
(RFC 7396) of the canonical document: the request body is a JSON
object containing only the properties to change. Properties omitted
from the patch are unchanged; a null value removes a property (for
example {"sheet_pricing": null} removes the backing-sheet section);
arrays are replaced wholesale — to change one size or price list row,
send the complete new array (each entry carrying its size_id or
price_list_id to update in place). A merge patch can never edit one
array element by itself. The patched result is validated and persisted
as a full replacement, so the field rules, read-only descriptor
guards, deletion semantics, and error catalogue are exactly those of
the replace operation; field semantics and per-model document shapes
are documented on the read operation. An empty object {} is a valid
no-op. Requires the pricing:write scope.
A successful update immediately reprices the storefront: the
customiser's cached configuration is invalidated and translated
language content is resynchronised. Send an Idempotency-Key header
(1-255 visible ASCII characters, e.g. a UUID) to make the write safe
to retry: repeating the same key with the same body replays the
original response (marked Idempotency-Replay: true) without
executing again; the same key with a different body is a 409 problem
with code idempotency_key_conflict; keys are retained for at least
24 hours and are scoped to your credential, the HTTP method, and the
path.
A 422 problem with code invalid_document means the patch body is not
a JSON object. All other failures match the replace operation:
validation_failed (pointers into the patched document plus
allowed_values on enum violations), unknown_field,
legacy_pricing_model, 409 resource_in_use, 409 idempotency
conflicts, 400 malformed_json, and 401/403/404/429.
Authorisation
Bearer token required. Include in the
Authorization header.
Path parameters
The customiser id, from the list customisers operation.
Example: 1
Request body
Request body example
{
"base_pricing": {
"mode": "included_in_price_lists"
}
} curl https://web.signcustomiser.com/api/v3/customisers/1/pricing \
--request PATCH \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"base_pricing": {
"mode": "included_in_price_lists"
}
}'{
"data": {
"object": "customiser_pricing",
"customiser_id": 42,
"pricing_model": "simple_letter",
"pricing_model_display_name": "Simple Letter",
"currency": "USD",
"sizes": [
{
"size_id": 7,
"client_key": null,
"name": "Small",
"description": "Up to 50cm wide",
"sort_order": 1,
"char_limit": 20,
"line_limit": 3,
"min_char": 1,
"width_cm": 50,
"height_cm": null,
"line_height_cm": 12,
"width_multiplier": null,
"length_cm": null,
"sizing_strategy": "fixed_width",
"height_measurement_mode": "line_height"
}
],
"base_pricing": {
"mode": "included_in_price_lists",
"rows": []
},
"price_lists": [
{
"price_list_id": 10,
"name": "Standard",
"rows": [
{
"size_id": 7,
"size_key": null,
"base_price": {
"line_1": 1000,
"line_2": 1200,
"line_3": 1400
},
"letter_price": {
"line_1": 100,
"line_2": 120,
"line_3": 140
}
}
]
}
],
"sheet_pricing": null
},
"links": {
"self": "https://web.signcustomiser.com/api/v3/customisers/42/pricing",
"documentation": "https://www.signcustomiser.com/help/api/"
},
"meta": {
"api_version": "v3",
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
}{
"type": "https://www.signcustomiser.com/help/api/problems/malformed_json",
"title": "Malformed JSON",
"status": 400,
"code": "malformed_json",
"detail": "The request body is not valid JSON: Syntax error.",
"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: Authorization: Bearer <api key>. Keys are created in the merchant admin under Integrate → API Tokens.",
"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, but the API key grants the following scopes: pricing:read. Create a key that includes the required scope in the merchant admin under Integrate → API Tokens.",
"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. An idempotency key identifies one exact request: retry the original body to replay its response, or send the new body with a fresh key.",
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/invalid_document",
"title": "Invalid document",
"status": 422,
"code": "invalid_document",
"detail": "The merge patch must be a JSON object containing the pricing document properties to change (RFC 7396): omitted properties are unchanged, null removes a property, and arrays replace the current value wholesale.",
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}{
"type": "https://www.signcustomiser.com/help/api/problems/validation_failed",
"title": "Validation failed",
"status": 422,
"code": "validation_failed",
"detail": "The request payload failed validation. Correct the fields listed in errors and retry.",
"errors": [
{
"pointer": "/base_pricing",
"code": "required",
"detail": "The base pricing field is required."
}
],
"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. Wait 60 seconds, then retry.",
"retry_after": 60,
"request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}