# POST Add a letter part's demo colours

Fills an empty letter part with the demo colours Sign Customiser offers for its sign category, the starter palette the merchant admin offers on an empty letter part. The colours are created in their demo order, and the response lists every created colour in the projection the colours list uses. The letter part must be declared in the letter type's `letter_parts` (422 `letter_part_not_declared`). The part does not need a colour selection yet: the operation creates one when it is missing. A letter part that already holds colours is refused with a 409 `letter_part_colours_not_empty`, because demo colours would mix into the merchant's own; delete the colours first, or add colours one at a time. A sign category and letter part with no demo colours, such as the side of a neon sign, is refused with a 422 `demo_colours_not_available`. A cut-out metal or stencil customiser refuses the operation with a 422 `letter_types_not_supported`. Requires `customisers:write` and an `Idempotency-Key`; the request takes no body. 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. It reads only Sign Customiser's own demo data, and it spends one unit of the per-key option-write budget.

- Source URL: https://www.signcustomiser.com/help/api/v3-post-add-a-letter-part-s-demo-colours/
- Markdown URL: https://www.signcustomiser.com/help/api/v3-post-add-a-letter-part-s-demo-colours.md
- Group: Customiser letter parts
- Method: POST
- Path: /api/v3/customisers/{customiser_id}/letter-types/{letter_type_id}/letter-parts/{letter_part}/colours/populate-demo
- Auth: Bearer token
- Required scopes: `customisers:write`

## Path parameters

- customiser_id (string, required): The customiser id. Example: 1
- letter_type_id (string, required): The letter type id. Example: 7
- letter_part (string, required): The letter part. Example: face

## cURL example

```bash
curl https://web.signcustomiser.com/api/v3/customisers/1/letter-types/7/letter-parts/face/colours/populate-demo \
  --request POST \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_TOKEN'
```

## Response examples

### 201 POST 201 example 1

```json
{
  "data": [
    {
      "object": "colour",
      "id": 31,
      "customiser_id": 42,
      "name": "White",
      "description": null,
      "colour_type": "single",
      "hexcode": "#ffffff",
      "multi_colour_hexcodes": null,
      "texture": "flat",
      "min_width_cm": null,
      "min_height_cm": null,
      "min_size_rule": "any",
      "base_price": 0,
      "currency": "USD",
      "price_multiplier": 1,
      "price_multiplier_target": "base_letter_price",
      "sort_order": 1,
      "image_url": "https://cdn.example.com/demo/white.png",
      "example_image_url": null,
      "texture_image_url": null,
      "created_at": "2026-08-13T00:00:00Z",
      "updated_at": "2026-08-13T00:00:00Z"
    }
  ],
  "pagination": {
    "has_more": false,
    "next_cursor": null
  },
  "links": {
    "self": "https://web.signcustomiser.com/api/v3/customisers/42/letter-types/7/letter-parts/face/colours/populate-demo",
    "documentation": "https://www.signcustomiser.com/help/api/",
    "next": null
  },
  "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 letter type

```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 Letter part already has colours

```json
{
  "type": "https://www.signcustomiser.com/help/api/problems/letter_part_colours_not_empty",
  "title": "Letter part colours not empty",
  "status": 409,
  "code": "letter_part_colours_not_empty",
  "detail": "The face letter part already holds colours, so demo colours would mix into them. Delete its colours first, or add colours one at a time.",
  "errors": [
    {
      "pointer": "",
      "code": "letter_part_colours_not_empty",
      "detail": "The face letter part already holds colours."
    }
  ],
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
```

### 422 No demo colours for this part

```json
{
  "type": "https://www.signcustomiser.com/help/api/problems/demo_colours_not_available",
  "title": "Demo colours not available",
  "status": 422,
  "code": "demo_colours_not_available",
  "detail": "Sign Customiser has no demo colours for the side letter part of this sign category. Add colours one at a time instead.",
  "errors": [
    {
      "pointer": "",
      "code": "demo_colours_not_available",
      "detail": "No demo colours exist for this sign category and letter part."
    }
  ],
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
```

### 422 Letter part not declared

```json
{
  "type": "https://www.signcustomiser.com/help/api/problems/letter_part_not_declared",
  "title": "Letter part not declared",
  "status": 422,
  "code": "letter_part_not_declared",
  "detail": "This letter type does not declare the halo letter part. Add it to letter_parts before creating its colour selection.",
  "errors": [
    {
      "pointer": "/letter_part",
      "code": "letter_part_not_declared",
      "detail": "The halo letter part is not declared by this letter type."
    }
  ],
  "declared_letter_parts": [
    "face"
  ],
  "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 option-write budget for this API key.",
  "retry_after": 60,
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
```
