Sign Customiser

Applies an RFC 7396 JSON Merge Patch to one font: properties omitted from the body are unchanged, and null clears a nullable property (line_height, the minimum letter heights, and every reference). Setting line_height to null returns the font to its typeface's own line height, which uses_default_line_height then reports as true.

PATCH/api/v3/customisers/{customiser_id}/fonts/{font_id}

Overview

Read-only and unknown fields are rejected. An empty object {} is a valid no-op. Requires customisers:write. A patch that would leave the font without the pricing reference its customiser's pricing model needs is refused with a 422, and every reference must name one of this customiser's own rows. An Idempotency-Key is optional here: sending one makes the update safe to retry (an exact repeat replays the original response; the same key with a different body is a 409). The update clears the customiser's cached storefront configuration and runs the advisory language sync, and never regenerates Shopify products, product images, or the product cache.

Authorisation

Bearer token required. Include it in theAuthorization header.

Required scope: customisers:write

Path parameters

customiser_idstringpathrequired

The customiser id.

Example: 1

font_idstringpathrequired

The font id.

Example: 11

Request body

namestringbody
line_heightnumberbody
stencil_safebooleanbody
min_height_smallest_letter_cmnumberbody
min_height_uppercase_letter_cmintegerbody
font_tier_idintegerbody
length_pricing_idintegerbody
minimum_size_idintegerbody
minimum_legacy_fixed_height_size_idintegerbody

Request body example

application/json
{
  "name": "Neon Script",
  "line_height": 1.2,
  "stencil_safe": false,
  "min_height_smallest_letter_cm": 4.5,
  "min_height_uppercase_letter_cm": 6,
  "font_tier_id": 7,
  "length_pricing_id": 4,
  "minimum_size_id": 3,
  "minimum_legacy_fixed_height_size_id": 5
}
Update a font
curl https://web.signcustomiser.com/api/v3/customisers/1/fonts/11 \
  --request PATCH \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "Neon Script",
  "line_height": 1.2,
  "stencil_safe": false,
  "min_height_smallest_letter_cm": 4.5,
  "min_height_uppercase_letter_cm": 6,
  "font_tier_id": 7,
  "length_pricing_id": 4,
  "minimum_size_id": 3,
  "minimum_legacy_fixed_height_size_id": 5
}'
Response200
{
  "data": {
    "object": "font",
    "id": 11,
    "customiser_id": 42,
    "name": "Neon Script",
    "line_height": 1.2,
    "uses_default_line_height": false,
    "stencil_safe": true,
    "min_height_smallest_letter_cm": 4.5,
    "min_height_uppercase_letter_cm": null,
    "font_tier_id": 7,
    "length_pricing_id": null,
    "minimum_size_id": null,
    "minimum_legacy_fixed_height_size_id": null,
    "sort_order": 1,
    "font_file": {
      "has_font_file": true,
      "family_name": "neon-script",
      "ttf_url": "https://cdn.example.com/files/neon-script.ttf"
    },
    "created_at": "2026-08-13T00:00:00Z",
    "updated_at": "2026-08-13T00:05:00Z"
  },
  "links": {
    "self": "https://web.signcustomiser.com/api/v3/customisers/42/fonts/11",
    "documentation": "https://www.signcustomiser.com/help/api/"
  },
  "meta": {
    "api_version": "v3",
    "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
  }
}
Response400
{
  "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"
}
Response401
{
  "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"
}
Response403
{
  "type": "https://www.signcustomiser.com/help/api/problems/insufficient_scope",
  "title": "Insufficient scope",
  "status": 403,
  "code": "insufficient_scope",
  "detail": "This operation requires the customisers:write scope.",
  "required_scopes": [
    "customisers:write"
  ],
  "granted_scopes": [
    "customisers:read"
  ],
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response404
{
  "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"
}
Response409
{
  "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"
}
Response413
{
  "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"
}
Response422
{
  "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": "/font_file",
      "code": "prohibited",
      "detail": "The font_file field is prohibited."
    }
  ],
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
Response429
{
  "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"
}