# POST Validate customiser pricing

Dry-run a pricing replacement without persisting anything. The request body is the full canonical document, exactly as the replace operation accepts it, and the response is exactly what that replace would produce: on an invalid document, the identical 422 problem (`validation_failed` with pointers and `allowed_values`, `unknown_field`, or `legacy_pricing_model`); on a document whose omissions would delete referenced records, the identical 409 `resource_in_use` problem; and on a valid document, a 200 `pricing_validation` confirmation — the same validation code path runs, only persistence is skipped. Nothing is written, no caches are touched, and no idempotency key is consumed, so the operation is always safe to repeat. To dry-run a PATCH, fetch the document, apply your merge patch locally (RFC 7396), and validate the result. Requires the `pricing:write` scope (it is the write's dry-run twin). A 400 problem means the body is not valid JSON; a 422 problem with code `invalid_document` means the body is not a JSON object. 401/403/404/429 behave as on the read operation.

- Source URL: https://www.signcustomiser.com/help/api/v3-post-validate-customiser-pricing/
- Markdown URL: https://www.signcustomiser.com/help/api/v3-post-validate-customiser-pricing.md
- Group: Pricing
- Method: POST
- Path: /api/v3/customisers/{customiser_id}/pricing/validate
- Auth: Bearer token

## Path parameters

- customiser_id (string, required): The customiser id, from the list customisers operation. Example: 1

## Body parameters

- sizes (array, optional): No description provided.
- base_pricing (object, optional): No description provided.
- price_lists (array, optional): No description provided.

## Request body example

```json
{
  "sizes": [],
  "base_pricing": {
    "mode": "included_in_price_lists",
    "rows": []
  },
  "price_lists": []
}
```

## cURL example

```bash
curl https://web.signcustomiser.com/api/v3/customisers/1/pricing/validate \
  --request POST \
  --header 'Accept: application/json' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "sizes": [],
  "base_pricing": {
    "mode": "included_in_price_lists",
    "rows": []
  },
  "price_lists": []
}'
```

## Response examples

### 200 Document is valid

```json
{
  "data": {
    "object": "pricing_validation",
    "customiser_id": 42,
    "valid": true
  },
  "links": {
    "self": "https://web.signcustomiser.com/api/v3/customisers/42/pricing/validate",
    "documentation": "https://www.signcustomiser.com/help/api/"
  },
  "meta": {
    "api_version": "v3",
    "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
  }
}
```

### 400 Malformed JSON body

```json
{
  "type": "https://www.signcustomiser.com/help/api/problems/malformed_json",
  "title": "Malformed JSON",
  "status": 400,
  "code": "malformed_json",
  "detail": "The request body is not valid JSON: Syntax error.",
  "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: Authorization: Bearer <api key>. Keys are created in the merchant admin under Integrate → API Tokens.",
  "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 pricing:write scope, but the API key grants the following scopes: pricing:read. Create a key that includes the required scope in the merchant admin under Integrate → API Tokens.",
  "required_scopes": [
    "pricing:write"
  ],
  "granted_scopes": [
    "pricing: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 Records still referenced

```json
{
  "type": "https://www.signcustomiser.com/help/api/problems/resource_in_use",
  "title": "Resource in use",
  "status": 409,
  "code": "resource_in_use",
  "detail": "The document omits sizes that fonts still reference, so the write would delete records in use. Keep those sizes in the document, or update the fonts that reference them first.",
  "errors": [
    {
      "pointer": "/sizes",
      "code": "resource_in_use",
      "detail": "The document omits sizes that fonts still reference, so the write would delete records in use. Keep those sizes in the document, or update the fonts that reference them first."
    }
  ],
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
```

### 422 Validation failed

```json
{
  "type": "https://www.signcustomiser.com/help/api/problems/validation_failed",
  "title": "Validation failed",
  "status": 422,
  "code": "validation_failed",
  "detail": "The request payload failed validation. Correct the fields listed in errors and retry.",
  "errors": [
    {
      "pointer": "/sizes/0/sizing_strategy",
      "code": "unsupported_value",
      "detail": "The selected sizes.0.sizing_strategy is invalid.",
      "allowed_values": [
        "fixed_width",
        "fixed_height"
      ]
    }
  ],
  "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. Wait 60 seconds, then retry.",
  "retry_after": 60,
  "request_id": "req_01jz9x2k7c8f3m5n6p7q8r9s0t"
}
```
