---
title: "Register a compose critic"
method: POST
path: "/v1/critics"
tags: ["critics"]
---

# Register a compose critic

`POST /v1/critics`

## Request

- Base URL: `https://api.cueframe.ai`
- URL: `https://api.cueframe.ai/v1/critics`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://api.cueframe.ai/api/auth/mcp/authorize`, token URL `https://api.cueframe.ai/api/auth/mcp/token`, scopes: `projects:write`)
  - API key in header `PAYMENT-SIGNATURE`

Required permission: projects:write

## Request body

- CriticCreateRequest: Register a custom compose critic.
  - `criticId` string, required: Stable client id; re-registering the same id UPSERTS.
  - `label` string, required
  - `tier` 'rules' | 'rubric' | 'evaluator', required
  - `floor` number: Score below this routes a refine like a built-in criterion. Defaults to 6.
  - `rules` object[]: tier "rules": declarative ClientRule[] (data).
  - `rubric` string: tier "rubric": your criterion + description; scored as an extra column.
  - `referenceMediaIds` string[]: tier "rubric"/"evaluator": up to 6 org media ids whose thumbnails the judge sees as YOUR reference standard — "looks like mine" becomes a machine check. Each must be an org-owned media item with a visual thumbnail (422 names any that is not).
  - `url` string, uri: tier "evaluator": your HTTPS webhook; CueFrame POSTs the artifact.

## Response `201`

Critic registered.

- CriticResponse: POST /critics response (evaluator secret present exactly once).
  - `id` string, required
  - `criticId` string, required
  - `tier` 'rules' | 'rubric' | 'evaluator', required
  - `secret` string: evaluator tier: Standard-Webhooks signing secret, returned ONCE.

## Other responses

- `400`: Bad request — validation_error / invalid_cursor / invalid_query.
- `401`: Missing or invalid Authorization header.
- `402`: Payment required. Returned when the caller presents no API key on a priced operation: the body AND the `Payment-Required` header carry the x402 v2 challenge (accepted scheme, network, USDC asset, amount, payTo). Sign the EIP-3009 authorization and retry with a `PAYMENT-SIGNATURE` header. A KEYED caller sees this status instead when their plan lacks or has exhausted the feature (`billing_required`).
- `403`: Forbidden — permission insufficient.
- `422`: Unprocessable — invalid_composition / media_in_use / session_in_use / render_not_cancellable.
- `429`: Rate limited. Retry-After header present.
- `500`: Internal error.

---

[API](https://skmtc.dev/cueframe/apis/cueframe-api.md) · [All operations](https://skmtc.dev/cueframe/apis/cueframe-api/llms.txt) · [OpenAPI document](https://skmtc.dev/cueframe/apis/cueframe-api/revisions/8f9bfe362b4a?raw)
