# POST Duplicate a length pricing

Copies one length pricing, with its shipping settings and every row and price, into a new length pricing 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. Nothing uses the copy until a font or the settings point at it, so the duplicate changes no storefront price. On an `advanced_letter` customiser, to give AI Sign Designer its own prices, duplicate the price list that AI designs pay from, then set the settings `icon_length_pricing_id` to the copy. Sheet pricing belongs to the pricing document and cannot be duplicated here: its id is a 404. The customiser must price by `advanced_letter` or `frame_fit`, as for a create, or the duplicate is refused with a 422 `pricing_model_mismatch`. Through the API a `frame_fit` customiser holds one price list, because the pricing document holds exactly one, so its duplicate is refused with `price_list_limit_reached`. 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-length-pricing/
- Markdown URL: https://www.signcustomiser.com/help/api/v3-post-duplicate-a-length-pricing.md
- Group: Customiser length pricings
- Method: POST
- Path: /api/v3/customisers/{customiser_id}/length-pricings/{length_pricing_id}/duplicate
- Auth: Bearer token
- Required scopes: `pricing:write`

## Path parameters

- customiser_id (string, required): The customiser id. Example: 1
- length_pricing_id (string, required): The id of the length pricing to copy. Example: 1

## Body parameters

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

## Request body example

```json
{
  "name": "Standard (AI Sign Designer)"
}
```

## cURL example

```bash
curl https://web.signcustomiser.com/api/v3/customisers/1/length-pricings/1/duplicate \
  --request POST \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "Standard (AI Sign Designer)"
}'
```

## Response examples

### 201 POST 201 example 1

```json
{
  "data": {
    "object": "length_pricing",
    "id": 10,
    "customiser_id": 42,
    "name": "Standard (AI Sign Designer)",
    "letter_pricing_mode": "every_letter_cost",
    "letter_pricing_method": "material_length",
    "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,
        "price_per_sq_cm_basis": "per_sq_cm",
        "fixed_length_cm": null,
        "width_modifier": null,
        "height_modifier": null,
        "length_modifier": null,
        "max_price_multiplier": null,
        "price_per_cm": 1.25,
        "price_per_letter": null,
        "price_per_letter_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/length-pricings/10",
    "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 length pricing

```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 Frame fit already has its price list

```json
{
  "type": "https://www.signcustomiser.com/help/api/problems/validation_failed",
  "title": "Validation failed",
  "status": 422,
  "code": "validation_failed",
  "detail": "Through the API a frame-fit customiser holds one price list, because the customiser pricing document holds exactly one. Update the existing one instead.",
  "errors": [
    {
      "pointer": "",
      "code": "price_list_limit_reached",
      "detail": "This customiser already has the one price list the API allows for its pricing model."
    }
  ],
  "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 length pricing is used only by a customiser that prices by advanced_letter or frame_fit, and this customiser prices by simple_letter.",
  "errors": [
    {
      "pointer": "",
      "code": "pricing_model_mismatch",
      "detail": "This customiser's pricing model does not use length pricing 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"
}
```
