# POST Create a mounting

Adds a mounting to the customiser, at the end of the current presentation order. Only `name` is required; every other field has a documented default (`visualisation` none, no letter parts, both exclusion arrays empty, `base_price` 0, `price_multiplier` 1, `price_multiplier_target` base_letter_price). The `*_pct` proportions belong to one visualisation each, so a body naming one the mounting's visualisation would never read is a 422 on that field. `excluded_colour_ids` and `excluded_backboard_ids` must name the customiser's own colours and backboards — an id from another customiser or another store is a 422 on the offending element. Image fields are read-only until the upload surface ships, and `sort_order` moves only through the reorder operation; naming either is a 422. 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-mounting/
- Markdown URL: https://www.signcustomiser.com/help/api/v3-post-create-a-mounting.md
- Group: Customiser mountings
- Method: POST
- Path: /api/v3/customisers/{customiser_id}/mountings
- Auth: Bearer token
- Required scopes: `customisers:write`

## Path parameters

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

## Body parameters

- visualisation (string, optional): No description provided.
- letter_parts (array, optional): No description provided.
- price_multiplier_target (string, optional): No description provided.
- name (string, optional): No description provided.
- description (string, optional): No description provided.
- pedestal_pole_width_pct (integer, optional): No description provided.
- pedestal_base_depth_pct (integer, optional): No description provided.
- sign_feet_base_depth_pct (integer, optional): No description provided.
- sign_feet_post_height_pct (integer, optional): No description provided.
- sign_feet_inset_pct (integer, optional): No description provided.
- excluded_colour_ids (array, optional): No description provided.
- excluded_backboard_ids (array, optional): No description provided.
- base_price (integer, optional): No description provided.
- price_multiplier (number, optional): No description provided.

## Request body example

```json
{
  "visualisation": "screw",
  "letter_parts": [
    "top"
  ],
  "price_multiplier_target": "base_letter_price",
  "name": "Wall Screws",
  "description": "Four stainless screws and wall plugs",
  "pedestal_pole_width_pct": 18,
  "pedestal_base_depth_pct": 100,
  "sign_feet_base_depth_pct": 180,
  "sign_feet_post_height_pct": 10,
  "sign_feet_inset_pct": 15,
  "excluded_colour_ids": [
    3
  ],
  "excluded_backboard_ids": [
    11
  ],
  "base_price": 500,
  "price_multiplier": 1.2
}
```

## cURL example

```bash
curl https://web.signcustomiser.com/api/v3/customisers/1/mountings \
  --request POST \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "visualisation": "screw",
  "letter_parts": [
    "top"
  ],
  "price_multiplier_target": "base_letter_price",
  "name": "Wall Screws",
  "description": "Four stainless screws and wall plugs",
  "pedestal_pole_width_pct": 18,
  "pedestal_base_depth_pct": 100,
  "sign_feet_base_depth_pct": 180,
  "sign_feet_post_height_pct": 10,
  "sign_feet_inset_pct": 15,
  "excluded_colour_ids": [
    3
  ],
  "excluded_backboard_ids": [
    11
  ],
  "base_price": 500,
  "price_multiplier": 1.2
}'
```

## Response examples

### 201 POST 201 example 1

```json
{
  "data": {
    "object": "mounting",
    "id": 8,
    "customiser_id": 42,
    "name": "Wall Screws",
    "description": null,
    "visualisation": "screw",
    "pedestal_pole_width_pct": null,
    "pedestal_base_depth_pct": null,
    "sign_feet_base_depth_pct": null,
    "sign_feet_post_height_pct": null,
    "sign_feet_inset_pct": null,
    "letter_parts": [],
    "excluded_colour_ids": [],
    "excluded_backboard_ids": [],
    "base_price": 0,
    "currency": "USD",
    "price_multiplier": 1,
    "price_multiplier_target": "base_letter_price",
    "sort_order": 1,
    "image_url": null,
    "button_image_url": 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/mountings/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 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 Proportion the visualisation never reads

```json
{
  "type": "https://www.signcustomiser.com/help/api/problems/validation_failed",
  "title": "Validation failed",
  "status": 422,
  "code": "validation_failed",
  "detail": "The screw visualisation is not drawn from pedestal_pole_width_pct, so the value would never be read. Omit the field, or set the visualisation that reads it.",
  "errors": [
    {
      "pointer": "/pedestal_pole_width_pct",
      "code": "field_not_used_by_visualisation",
      "detail": "The pedestal_pole_width_pct field is not used by this mounting's visualisation."
    }
  ],
  "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"
}
```
