> ## Documentation Index
> Fetch the complete documentation index at: https://docs.60db.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Update rubric

> Patch a saved rubric — only the fields you send change

Update a rubric in place. **Only the fields present in the body are touched** — omitting `model` leaves the stored model alone rather than resetting it to a default.

## Request

### Headers

<ParamField header="Authorization" type="string" required>
  Bearer token — **your standard 60db API key** (`sk_…`), or a user JWT. There is no separate Judge credential.
</ParamField>

<ParamField header="Content-Type" type="string" required>
  application/json
</ParamField>

### Path parameters

<ParamField path="id" type="string" required>
  Rubric UUID.
</ParamField>

### Body

At least one field is required.

<ParamField body="name" type="string">
  Still unique per workspace.
</ParamField>

<ParamField body="description" type="string">
  Send an empty string to clear it.
</ParamField>

<ParamField body="model" type="string" />

<ParamField body="questions" type="object">
  Replaces the whole map; `question_count` is recomputed.
</ParamField>

<ParamField body="shared" type="boolean">
  Promoting a rubric to shared requires **owner or admin**, exactly like creating one.
</ParamField>

## Response

<ResponseField name="data" type="object">
  The updated rubric.
</ResponseField>

## Errors

| Status | Meaning                                                                                  |
| ------ | ---------------------------------------------------------------------------------------- |
| `400`  | Empty body, or invalid questions.                                                        |
| `403`  | Not your rubric (and you are not owner/admin), or `shared: true` without the right role. |
| `404`  | No such rubric.                                                                          |
| `409`  | The new name is already taken.                                                           |

## Example

<RequestExample>
  ```bash cURL theme={null}
  curl -X PATCH https://api.60db.ai/judge/rubrics/{id} \
    -H "Authorization: Bearer your-api-key" \
    -H "Content-Type: application/json" \
    -d '{
        "description": "Updated after the Q3 rubric review"
    }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://api.60db.ai/judge/rubrics/{id}', {
    method: 'PATCH',
    headers: {
      'Authorization': 'Bearer your-api-key',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      "description": "Updated after the Q3 rubric review"
    }),
  });
  const data = await response.json();
  ```

  ```python Python theme={null}
  import requests

  response = requests.patch(
      "https://api.60db.ai/judge/rubrics/{id}",
      headers={
          "Authorization": "Bearer your-api-key",
          "Content-Type": "application/json",
      },
      json={
          "description": "Updated after the Q3 rubric review"
      },
  )
  data = response.json()
  ```
</RequestExample>

<ResponseExample>
  ```json Response theme={null}
  {
    "success": true,
    "data": {
      "id": "a1b2c3d4-e5f6-4789-abcd-ef0123456789",
      "name": "Docs sample 22592",
      "description": "updated",
      "model": "jev-latest",
      "questions": {
        "tone": {
          "type": "choice",
          "criteria": {
            "unknown": "Unclear",
            "dismissive": "Brushes off",
            "professional": "Calm"
          }
        }
      },
      "question_count": 1,
      "shared": false,
      "is_mine": true,
      "created_at": "2026-09-28T13:19:50.210Z",
      "updated_at": "2026-09-28T13:19:50.340Z"
    }
  }
  ```
</ResponseExample>
