# POST Validate a letter part default upload image attach

Dry-runs the attach: the slot must exist on this letter part, 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-default-upload-image-attach/
- Markdown URL: https://www.signcustomiser.com/help/api/v3-post-validate-a-letter-part-default-upload-image-attach.md
- Group: Customiser letter parts
- Method: POST
- Path: /api/v3/customisers/{customiser_id}/letter-types/{letter_type_id}/letter-parts/{letter_part}/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: 7
- letter_part (string, required): The letter part. Example: face
- image_slot (string, required): Which image to write: default_upload_image. Example: default_upload_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/7/letter-parts/face/images/default_upload_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_selection_image_validation",
    "operation": "update",
    "customiser_id": 42,
    "letter_type_id": 7,
    "letter_part": "face",
    "image_slot": "default_upload_image",
    "valid": true
  },
  "links": {
    "self": "https://web.signcustomiser.com/api/v3/customisers/42/letter-types/7/letter-parts/face/images/default_upload_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, 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"
}
```

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