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

# Validate Content

> Validate content with the Anchor 3.0 SLM — async or sync

Submit content for compliance validation with the Anchor 3.0 engine.
Requests require `mode` and `model_engine`. With `mode: "async"`, the endpoint
returns a `job_id` you poll via
[Get Validation Results](/api-reference/validate/get-results). Set
`mode: "sync"` to run the validation inline and receive the completed result in
a single response.

## Request Body

<ParamField body="content" type="string" required default="Guaranteed 15% returns, no risk. Act now — this opportunity wont last!">
  Plain text content to validate. Required unless the request sends the
  deprecated `email_text` instead.
</ParamField>

<ParamField body="email_text" type="string" deprecated>
  Deprecated alias for `content`, kept for callers written before the rename.
  Still accepted in place of `content`, but read only when `content` is absent
  from the request — send `content` instead.
</ParamField>

<ParamField body="model_engine" type="string" required default="anchor_3_0">
  Validation engine. Use `anchor_3_0` to run the Anchor 3.0 compliance SLM —
  carrying a sentinel-head detection adapter (per-line, per-rule calibrated
  probabilities over the deployed checkpoint's frozen 235-rule vocabulary)
  and a judge-rewarded rewrite adapter. Results include `relevant_rule_ids`
  and input/output token counts.
</ParamField>

<ParamField body="mode" type="string" required default="async">
  Execution mode: `async` returns `202` with a `job_id` to poll; `sync` runs
  inline for short content and returns the completed result with `200`,
  falling back to async if it would exceed the inline budget.
</ParamField>

<ParamField body="metadata" type="object">
  Optional metadata merged into the job. `document_type` is always forced to
  `email`.
</ParamField>

<ParamField body="document_category" type="string">
  Optional explicit scenario id to validate against, e.g.
  `scenario_email_general` (the default when omitted). Your account's active
  custom rules (from policy imports) are evaluated as well.
</ParamField>

<ParamField body="validation_scope" type="object">
  Optional nested form to narrow live validation to a subset of already-active
  rules, rule packs, and imports.

  <Expandable title="validation_scope properties">
    <ParamField body="rules" type="array">
      Rule IDs to evaluate.
    </ParamField>

    <ParamField body="rulepacks" type="array">
      Rule pack IDs to evaluate.
    </ParamField>

    <ParamField body="imports" type="array">
      Import IDs to evaluate.
    </ParamField>
  </Expandable>
</ParamField>

## Response

Returns `202 Accepted` for async submissions. Poll
[Get Validation Results](/api-reference/validate/get-results) for the outcome.

<ResponseField name="api_version" type="string">
  Always `v3`.
</ResponseField>

<ResponseField name="job_id" type="string">
  Unique identifier for the validation job.
</ResponseField>

<ResponseField name="status" type="string">
  `queued` for async submissions. For `sync` responses the completed result
  envelope is returned inline (`status: done`).
</ResponseField>

<ResponseField name="mode" type="string">
  Mode the request was actually processed in: `async` or `sync`. A `sync`
  request that fell back returns `async`.
</ResponseField>

<ResponseField name="model_engine" type="string">
  Supported engine value: `anchor_3_0`.
</ResponseField>

<ResponseField name="poll" type="object">
  Where to poll for the result (async only).

  <Expandable title="poll properties">
    <ResponseField name="method" type="string">
      Always `GET`.
    </ResponseField>

    <ResponseField name="url" type="string">
      Poll URL, e.g. `/api/v3/jobs/{job_id}`.
    </ResponseField>
  </Expandable>
</ResponseField>

<Note>
  For the `sync` response body (HTTP 200), the envelope is identical to a
  **done** poll — see
  [Get Validation Results](/api-reference/validate/get-results) — with
  `"mode": "sync"` added.
</Note>

## Error Responses

| Status | Description                                                    |
| ------ | -------------------------------------------------------------- |
| 400    | Bad Request — invalid `model_engine` or unsupported parameters |
| 403    | Forbidden — missing, invalid, inactive, or unresolved API key  |
| 422    | Unprocessable Entity                                           |

<ResponseExample>
  ```json 202 Accepted (async) theme={null}
  {
    "api_version": "v3",
    "job_id": "a1b2c3",
    "status": "queued",
    "mode": "async",
    "model_engine": "anchor_3_0",
    "poll": { "method": "GET", "url": "/api/v3/jobs/a1b2c3" }
  }
  ```
</ResponseExample>
