Customiser font tiers
Duplicate a font tier
Copies one font tier, with every row and price, into a new font tier on
the same customiser, the same as the merchant admin's Duplicate. The copy
is named name, or "Copy of <name>" when the body has no name, cut to
255 characters.
Overview
No font uses the copy until a font write points
font_tier_id at it, so the duplicate changes no storefront price.
The customiser must price by simple_letter or legacy_fixed_height,
as for a create; otherwise the duplicate is refused with a 422
pricing_model_mismatch. Requires pricing:write and an
Idempotency-Key; retrying the same request and key replays the
original response and makes no second copy. The write clears the
customiser's cached storefront configuration and runs the advisory
language sync, spends one unit of the option-write budget, and never
regenerates Shopify products.
Authorisation
Bearer token required. Include it in the Authorization header.
Required scope: pricing:write
Path parameters
The customiser id.
Example: 1
The id of the font tier to copy.
Example: 1
Request body
Request body example
{
"name": "Premium"
}curl https://web.signcustomiser.com/api/v3/customisers/1/font-tiers/1/duplicate \
--request POST \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"name": "Premium"
}'{
"data": {
"object": "font_tier",
"id": 8,
"customiser_id": 42,
"name": "Copy of Standard",
"letter_pricing_mode": "every_letter_cost",
"currency": "USD",
"rows": [
{
"size_id": 3,
"base_price": {
"line_1": 2500,
"line_2": 3000,
"line_3": 3500,
"line_4": null,
"line_5": null,
"line_6": null,
"line_7": null,
"line_8": null,
"line_9": null,
"line_10": null
},
"letter_price": {
"line_1": 400,
"line_2": 450,
"line_3": 500,
"line_4": null,
"line_5": null,
"line_6": null,
"line_7": null,
"line_8": null,
"line_9": null,
"line_10": null
},
"letter_price_by_position": null
}
],
"created_at": "2026-11-14T00:00:00Z",
"updated_at": "2026-11-14T00:00:00Z"
},
"links": {
"self": "https://web.signcustomiser.com/api/v3/customisers/42/font-tiers/8",
"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/pricing_model_mismatch",
"title": "Pricing model mismatch",
"status": 422,
"code": "pricing_model_mismatch",
"detail": "A font tier is used only by a customiser that prices by simple_letter or legacy_fixed_height, and this customiser prices by advanced_letter.",
"errors": [
{
"pointer": "",
"code": "pricing_model_mismatch",
"detail": "This customiser's pricing model does not use font tier rows."
}
],
"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.",
"errors": [
{
"pointer": "/name",
"code": "max",
"detail": "The name field must not be greater than 255 characters."
}
],
"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"
}