# POST Create a length pricing

Adds a length pricing to the customiser. Only `name` is required; every other field has a documented default (`letter_pricing_mode` every_letter_cost, `letter_pricing_method` fixed_letter, `shipping.calculation` physical, `shipping.add_weight_to_product` false, `rows` empty). Every row needs a `base_price`, and the dimension limits its shipping calculation needs: physical measures the sign, so it needs `width_limit_cm` and `height_limit_cm`; volumetric measures the box, so it needs at least one of the three limits and a `shipping.volumetric_divisor`. Outside a frame-fit customiser each row also needs the rate its letter pricing method charges by — `price_per_cm` for `material_length`, `price_per_letter` for `fixed_letter`. A write that would leave a row without them is refused rather than creating a price list the storefront cannot resolve, and the pricing document requires exactly the same of these rows. The customiser must price by `advanced_letter` or `frame_fit`: a length pricing on any other pricing model is unreachable, and the write is refused with a 422 `pricing_model_mismatch`. A frame-fit customiser prices every sign from exactly one price list, so a second create on one is refused too — update the existing list instead. Sheet pricing is not part of this family and cannot be created through it. Requires `pricing:write` and an `Idempotency-Key`. The pricing document publishes the same price lists and its full replace deletes any one the payload omits, so pick one surface per workflow rather than interleaving the two. The write clears the customiser's cached storefront configuration and runs the advisory language sync. It never regenerates Shopify products, product images, or the product cache, so live listings are untouched. Option writes also spend one unit of a separate per-key option-write budget; exhausting it returns a 429 with `retry_after`.

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

## Path parameters

- customiser_id (string, required): The customiser id. Example: 1

## Body parameters

- letter_pricing_mode (string, optional): No description provided.
- letter_pricing_method (string, optional): No description provided.
- name (string, optional): No description provided.
- shipping (object, optional): No description provided.
- rows (array, optional): No description provided.

## Request body example

```json
{
  "letter_pricing_mode": "every_letter_cost",
  "letter_pricing_method": "fixed_letter",
  "name": "Standard",
  "shipping": {
    "calculation": "physical",
    "add_weight_to_product": false,
    "volumetric_divisor": 5000
  },
  "rows": [
    {
      "base_price": 4500,
      "width_limit_cm": 120,
      "height_limit_cm": 60,
      "price_per_letter": 600
    }
  ]
}
```

## cURL example

```bash
curl https://web.signcustomiser.com/api/v3/customisers/1/length-pricings \
  --request POST \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "letter_pricing_mode": "every_letter_cost",
  "letter_pricing_method": "fixed_letter",
  "name": "Standard",
  "shipping": {
    "calculation": "physical",
    "add_weight_to_product": false,
    "volumetric_divisor": 5000
  },
  "rows": [
    {
      "base_price": 4500,
      "width_limit_cm": 120,
      "height_limit_cm": 60,
      "price_per_letter": 600
    }
  ]
}'
```

## Response examples

### 201 POST 201 example 1

```json
{
  "data": {
    "object": "length_pricing",
    "id": 9,
    "customiser_id": 42,
    "name": "Standard",
    "letter_pricing_mode": "every_letter_cost",
    "letter_pricing_method": "fixed_letter",
    "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,
        "fixed_length_cm": null,
        "width_modifier": null,
        "height_modifier": null,
        "length_modifier": null,
        "max_price_multiplier": null,
        "price_per_cm": null,
        "price_per_letter": 600,
        "price_per_letter_by_position": null
      }
    ],
    "created_at": "2026-08-13T00:00:00Z",
    "updated_at": "2026-08-13T00:00:00Z"
  },
  "links": {
    "self": "https://web.signcustomiser.com/api/v3/customisers/42/length-pricings/9",
    "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 customiser

```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 Missing dimension limits

```json
{
  "type": "https://www.signcustomiser.com/help/api/problems/validation_failed",
  "title": "Validation failed",
  "status": 422,
  "code": "validation_failed",
  "detail": "Physical shipping measures the sign itself, so every row needs both width_limit_cm and height_limit_cm.",
  "errors": [
    {
      "pointer": "/rows/0",
      "code": "dimension_limits_required",
      "detail": "This row does not carry the dimension limits its shipping calculation needs."
    }
  ],
  "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"
}
```
