---
title: "Evaluate every enabled rule set against a content row"
method: POST
path: "/content/{id}/evaluate-rules"
tags: ["Rules"]
---

# Evaluate every enabled rule set against a content row

`POST /content/{id}/evaluate-rules`

## Request

- Base URL: `https://next.frase.io/api/v1`
- URL: `https://next.frase.io/api/v1/content/{id}/evaluate-rules`
- Auth: API key in header `X-API-KEY`

Run every enabled rule set (org-wide plus the content's site) against an existing Frase content row, mirroring the in-app governance agent. Unlike the stateless `POST /rules/evaluate`, this endpoint persists the outcome by default so the content's governance status stays current; pass `save_results: false` to evaluate without writing.

## Path parameters

- `id` string, uuid, required

## Request body

- object
  - `site_id` string, uuid: Optional. Scopes site-scoped rule sets and score computation.
  - `save_results` boolean: Persist the evaluation to the content's governance status. Defaults to true; pass false for a preview.

## Response `200`

Evaluation result across every applied rule set

- object
  - `data` object
    - `content_id` string, uuid
    - `overall_status` 'pass' | 'warning' | 'fail'
    - `rule_set_results` object[]
      - `rule_set_id` string, uuid
      - `rule_set_name` string
      - `overall_status` 'pass' | 'warning' | 'fail'
      - `summary` unknown
      - `results` object[]
        - `rule_id` string, uuid
        - `rule_name` string
        - `condition_type` string
        - `severity` 'error' | 'warning' | 'info'
        - `passed` boolean
        - `skipped` boolean: The rule could not run (e.g. a score_threshold rule with no target keywords). A skipped rule is neither a pass nor a failure - never read it as a genuine pass.
        - `value` unknown
        - `threshold` unknown
        - `message` string, nullable
        - `fix_hint` string, nullable
  - `request_id` string

## Other responses

- `400`: Validation failed
- `401`: Authentication failed
- `404`: Resource not found
- `429`: Rate limited, or the org's monthly brief limit blocked minting the refreshed brief (only the FIRST supersession of a brief is billing-exempt; repeats meter normally)

---

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