# POST Validate a letter part colour image attach

Dry-runs the attach: the slot must exist on this colour, the upload must exist for this store and this API key, and its purpose must be the slot's. Nothing is written, the upload is not consumed, and no idempotency key is spent. Requires `customisers:write`. The staged bytes are deliberately not read, so this cannot tell you whether the file is a usable image — that verdict only exists once the attach reads the object, and reading it here would let a preflight mark a good upload rejected. Treat a valid verdict as "the upload is attachable", not "the file is sound".

- Source URL: https://www.signcustomiser.com/help/api/v3-post-validate-a-letter-part-colour-image-attach/
- Markdown URL: https://www.signcustomiser.com/help/api/v3-post-validate-a-letter-part-colour-image-attach.md
- Group: Customiser letter parts
- Method: POST
- Path: /api/v3/customisers/{customiser_id}/letter-types/{letter_type_id}/letter-parts/{letter_part}/colours/{colour_id}/images/{image_slot}/validate-update
- 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: 3
- letter_part (string, required): The letter part the colour belongs to. Example: face
- colour_id (string, required): The colour id. Example: 7
- image_slot (string, required): Which image to write: `image`, `example_image` or `texture_image`. Example: image

## Body parameters

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

## Request body example

```json
{
  "upload_id": "upl_9f2c4b7ad13e6058ba41cd"
}
```

## cURL example

```bash
curl https://web.signcustomiser.com/api/v3/customisers/1/letter-types/3/letter-parts/face/colours/7/images/image/validate-update \
  --request POST \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "upload_id": "upl_9f2c4b7ad13e6058ba41cd"
}'
```

## Response examples

### 200 POST 200 example 1

```json
{
  "data": {
    "object": "letter_part_colour_image_validation",
    "operation": "update",
    "customiser_id": 42,
    "letter_type_id": 3,
    "letter_part": "face",
    "colour_id": 7,
    "image_slot": "image",
    "valid": true
  },
  "links": {
    "self": "https://web.signcustomiser.com/api/v3/customisers/42/letter-types/3/letter-parts/face/colours/7/images/image/validate-update",
    "documentation": "https://www.signcustomiser.com/help/api/"
  },
  "meta": {
    "api_version": "v3",
    "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 part, colour, slot or upload

```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"
}
```

### 422 Purpose mismatch

```json
{
  "type": "https://www.signcustomiser.com/help/api/problems/upload_purpose_mismatch",
  "title": "Upload purpose mismatch",
  "status": 422,
  "code": "upload_purpose_mismatch",
  "detail": "This slot accepts uploads created with purpose option_image, and this upload was created with purpose font_ttf. Create a new upload with the slot's purpose.",
  "errors": [
    {
      "pointer": "/upload_id",
      "code": "upload_purpose_mismatch",
      "detail": "The upload's purpose is font_ttf.",
      "allowed_values": [
        "option_image"
      ]
    }
  ],
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
```

### 422 Letter types not supported

```json
{
  "type": "https://www.signcustomiser.com/help/api/problems/letter_types_not_supported",
  "title": "Letter types not supported",
  "status": 422,
  "code": "letter_types_not_supported",
  "detail": "This customiser cuts its sign from a single sheet, so it offers no letter types and none can be created. Read the customiser to see which families it supports.",
  "errors": [
    {
      "pointer": "",
      "code": "letter_types_not_supported",
      "detail": "This customiser category does not offer letter types."
    }
  ],
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
```

### 429 Rate limited

```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": 60,
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
```
