# POST 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. 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.

- Source URL: https://www.signcustomiser.com/help/api/v3-post-duplicate-a-font-tier/
- Markdown URL: https://www.signcustomiser.com/help/api/v3-post-duplicate-a-font-tier.md
- Group: Customiser font tiers
- Method: POST
- Path: /api/v3/customisers/{customiser_id}/font-tiers/{font_tier_id}/duplicate
- Auth: Bearer token
- Required scopes: `pricing:write`

## Path parameters

- customiser_id (string, required): The customiser id. Example: 1
- font_tier_id (string, required): The id of the font tier to copy. Example: 1

## Body parameters

- name (string, optional): No description provided.

## Request body example

```json
{
  "name": "Premium"
}
```

## cURL example

```bash
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"
}'
```

## Response examples

### 201 POST 201 example 1

```json
{
  "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"
  }
}
```

### 400 Missing idempotency key

```json
{
  "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"
}
```

### 401 Missing API key

```json
{
  "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"
}
```

### 403 Insufficient scope

```json
{
  "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"
}
```

### 404 Unknown font tier

```json
{
  "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"
}
```

### 409 Idempotency conflict

```json
{
  "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"
}
```

### 413 Request body too large

```json
{
  "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"
}
```

### 422 Wrong pricing model

```json
{
  "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"
}
```

### 422 Name too long

```json
{
  "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"
}
```

### 429 Option write budget exhausted

```json
{
  "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"
}
```
