# POST Create a size

Adds a size to the customiser, at the end of the current presentation order. Only `name` is required on a simple-letter customiser; the other models add what they price by — `width_multiplier` on advanced letter, `width_cm` and `height_cm` on frame fit. A field the customiser's pricing model never reads is refused with a 422 pointer rather than stored where nothing would read it, and `sort_order` moves only through the reorder operation. On a customiser still using the deprecated fixed-height pricing model the create is refused: its current sizes live in the legacy fixed-height sizes resource, so a row created here would never be offered. Sizes are dual-surfaced. A full replace of the pricing document stays authoritative over this family and deletes any size its payload omits, so a size created here disappears if the next pricing write does not carry it. Read the pricing document first and echo the sizes it reports. Requires `customisers:write` and an `Idempotency-Key`. 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-size/
- Markdown URL: https://www.signcustomiser.com/help/api/v3-post-create-a-size.md
- Group: Customiser sizes
- Method: POST
- Path: /api/v3/customisers/{customiser_id}/sizes
- Auth: Bearer token
- Required scopes: `customisers:write`

## Path parameters

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

## Body parameters

- sizing_strategy (string, optional): No description provided.
- height_measurement_mode (string, optional): No description provided.
- name (string, optional): No description provided.
- description (string, optional): No description provided.
- char_limit (integer, optional): No description provided.
- line_limit (integer, optional): No description provided.
- min_char (integer, optional): No description provided.
- width_cm (integer, optional): No description provided.
- height_cm (integer, optional): No description provided.
- line_height_cm (integer, optional): No description provided.
- length_cm (integer, optional): No description provided.
- width_multiplier (number, optional): No description provided.
- border_margin_cm (number, optional): No description provided.

## Request body example

```json
{
  "sizing_strategy": "fixed_width",
  "height_measurement_mode": "line_height",
  "name": "Small",
  "description": "Fits a shop window",
  "char_limit": 12,
  "line_limit": 1,
  "min_char": 1,
  "width_cm": 40,
  "height_cm": 20,
  "line_height_cm": 10,
  "length_cm": 120,
  "width_multiplier": 1.5,
  "border_margin_cm": 5.08
}
```

## cURL example

```bash
curl https://web.signcustomiser.com/api/v3/customisers/1/sizes \
  --request POST \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "sizing_strategy": "fixed_width",
  "height_measurement_mode": "line_height",
  "name": "Small",
  "description": "Fits a shop window",
  "char_limit": 12,
  "line_limit": 1,
  "min_char": 1,
  "width_cm": 40,
  "height_cm": 20,
  "line_height_cm": 10,
  "length_cm": 120,
  "width_multiplier": 1.5,
  "border_margin_cm": 5.08
}'
```

## Response examples

### 201 POST 201 example 1

```json
{
  "data": {
    "object": "size",
    "id": 7,
    "customiser_id": 42,
    "name": "Small",
    "description": null,
    "char_limit": null,
    "line_limit": null,
    "min_char": null,
    "width_cm": 40,
    "height_cm": null,
    "line_height_cm": null,
    "length_cm": null,
    "width_multiplier": null,
    "sizing_strategy": "fixed_width",
    "height_measurement_mode": "line_height",
    "border_margin_cm": null,
    "sort_order": 1,
    "created_at": "2026-08-13T00:00:00Z",
    "updated_at": "2026-08-13T00:00:00Z"
  },
  "links": {
    "self": "https://web.signcustomiser.com/api/v3/customisers/42/sizes/7",
    "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 customisers:write scope.",
  "required_scopes": [
    "customisers:write"
  ],
  "granted_scopes": [
    "customisers: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 Field the pricing model does not read

```json
{
  "type": "https://www.signcustomiser.com/help/api/problems/validation_failed",
  "title": "Validation failed",
  "status": 422,
  "code": "validation_failed",
  "detail": "This customiser's pricing model does not price sizes by width_multiplier, so the value would never be read. Omit the field.",
  "errors": [
    {
      "pointer": "/width_multiplier",
      "code": "field_not_used_by_pricing_model",
      "detail": "The width_multiplier field is not used by this customiser's pricing model."
    }
  ],
  "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"
}
```
