---
title: "Evaluate text against a rule set. Works with no key (10 a day, inputs up to 2,000 characters, prebuilt rule sets); a key lifts the limits"
method: POST
path: "/api/v1/evaluate"
tags: ["Evaluate"]
---

# Evaluate text against a rule set. Works with no key (10 a day, inputs up to 2,000 characters, prebuilt rule sets); a key lifts the limits

`POST /api/v1/evaluate`

## Request

- Base URL: `https://overwing.ai`
- URL: `https://overwing.ai/api/v1/evaluate`
- Auth: one of:
  - none
  - HTTP bearer

## Headers

- `Idempotency-Key` string

## Request body

- EvaluateRequest
  - `input` string, required: The LLM output (or any text) to evaluate. The input can be in any language the model reads. Tested on 2026-09-29 in Spanish, Portuguese, French, German, Japanese, Chinese (Simplified), Korean, Arabic and Hindi: 7 checks in each, and every verdict matched the English one. A small test, not a benchmark: the texts were written by a model and have not been reviewed by native speakers. Responses are in English whatever the input language.
  - `rule_set` string, required: Rule set slug. Prebuilt: content-safety (toxicity, PII, self-harm, sexual content, severity) and outbound-message (adds unauthorized_pii and confidential_leak, and reads the context object)
  - `metadata` object: Opaque context echoed back and stored with the evaluation
  - `context` object: Structured facts about the situation, passed to the model as state next to the text so rules can reference them: e.g. { recipient: "known customer", channel: "email", owns_contact_info: true }. Max 8 KB.
  - `store` boolean: False runs the check without keeping the input text or the context: the record holds the verdict, scores and metadata only. It cannot turn storage back on when the organization has store_inputs off (PATCH /api/v1/org). The response header X-Input-Stored says which happened.

## Response `200`

Verdict

- Evaluation
  - `id` string, required
  - `verdict` 'pass' | 'fail' | 'review', required: fail: a rule's fail condition matched. review: a rule's confidence was below its review threshold and nothing failed. pass: otherwise.
  - `recommended_action` 'block' | 'redact' | 'review' | 'allow', required: One word to act on, derived from the failed rules' actions: block if any failed rule says block, else redact, else review (a review verdict or a review-action fail), else allow.
  - `aggregate_score` number, required: Weighted score: pass=1, review=0.5, fail=0 per rule, weighted by rule weight. A ranking signal for sorting or thresholds, not a decision: use verdict and recommended_action to act.
  - `confidence` number, required: Minimum confidence across rules
  - `latency_ms` integer, required
  - `results` RuleResult[], required
    - `rule` string, required
    - `action` 'block' | 'redact' | 'review', required: The rule's declared action: what to do when this rule fails
    - `type` 'choice' | 'score' | 'noul', required
    - `answer` union, required: choice: selected option; score: position on the level scale (may be fractional); noul: boolean
      - string
      - number
      - boolean
    - `probability` number, required
    - `confidence` number, required
    - `verdict` 'pass' | 'fail' | 'review', required: fail: a rule's fail condition matched. review: a rule's confidence was below its review threshold and nothing failed. pass: otherwise.

## Other responses

- `400`: Invalid input
- `401`: Missing or invalid API key
- `404`: Rule set not found
- `409`: Idempotency-Key still in progress
- `422`: Idempotency-Key reused with a different body
- `429`: Daily quota and prepaid credits exhausted, or per-minute burst limit reached (see Retry-After and the X-RateLimit-* / X-Burst-* headers)
- `502`: Evaluation engine error

---

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