Ocular Beta
Behavioral risk assessment for human–AI conversations. Returns a verdict, eight user-risk axes, four AI-concern axes, fiction strength, authenticity, and optional per-turn trajectory.
Beta endpoint. Response shape may evolve. Rate-limited under the standard /v1/* limiter. See dashboard.nope.net/ocular for
per-call analytics.
What Ocular is
Ocular is a probe-based behavioral classifier. Instead of producing a single severity rating like Evaluate, it returns axis-level signals so you can route differently for, say, harm to others vs self-neglect, or for AI-side concerns like manipulation or safeguarding failure.
Ocular is fiction-aware. A roleplay scene that mentions self-harm without genuine distress will
score high fiction and the verdict will reflect that. Use it on the full
conversation (assistant + user turns) rather than single messages — the trajectory and AI-concern
signals require both sides.
Quickstart
curl -X POST https://api.nope.net/v1/ocular \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"messages": [
{"role": "user", "content": "I feel really hopeless lately"},
{"role": "assistant", "content": "I hear you. That sounds really painful."}
]
}'Response
verdict is the headline decision surface (clear / watch / danger). For finer routing, key off risks.<axis>.level and ai_concerns.<axis>.level.
{
"verdict": "watch",
"subject": "self",
"imminence": { "level": "subacute", "score": 0.42 },
"fiction": 0.08,
"authenticity": 0.81,
"risks": {
"suicide": { "level": "moderate", "score": 0.55 },
"self_harm": { "level": "low", "score": 0.21 },
"harm_to_others": { "level": "minimal", "score": 0.02 },
"abuse": { "level": "minimal", "score": 0.01 },
"sexual_violence": { "level": "minimal", "score": 0.00 },
"exploitation": { "level": "minimal", "score": 0.00 },
"stalking": { "level": "minimal", "score": 0.00 },
"self_neglect": { "level": "low", "score": 0.18 }
},
"ai_concerns": {
"harm_provision": { "level": "minimal", "score": 0.03 },
"emotional_failure": { "level": "minimal", "score": 0.07 },
"manipulation": { "level": "minimal", "score": 0.01 },
"safeguarding_failure": { "level": "minimal", "score": 0.05 }
},
"effort": 1,
"stability": null,
"meta": {
"version": "H_c49_1_hybridseeds_v1_vllm",
"inference_ms": 175
}
} Fields
| Field | Description |
|---|---|
verdict | clear | watch | danger — the authoritative
decision. Key off this field for routing logic. |
subject | self (speaker themselves) | other (third party) | unknown. |
imminence | { level, score } — how soon (not_applicable, chronic, subacute, urgent, emergency). |
fiction | 0..1 — how strongly the message reads as fiction / roleplay. High fiction
modulates verdict thresholds upward. |
authenticity | 0..1 — how strongly the message reads as genuine first-person disclosure. |
risks | Eight user-risk axes, each { level, score }: suicide, self_harm, harm_to_others, abuse, sexual_violence, exploitation, stalking, self_neglect. |
ai_concerns | Four AI-concern axes, each { level, score }: harm_provision, emotional_failure, manipulation, safeguarding_failure. |
effort | Inference effort tier (1–3). Higher tiers run perturbation analysis for stability scoring. |
stability | Per-axis robustness scores when effort > 1. null at default
effort. |
trajectory | Per-turn array [{role, turn, verdict}] when per_turn=true is requested. Capped at 200 turns. |
meta | { version, inference_ms }. The model version is opaque — pin or alert
on changes if your scoring is calibrated to a specific release. |
Level values
Both risks and ai_concerns levels are drawn from a fixed ladder: minimal, low, moderate, high, critical. Calibrate your routing thresholds against the level value rather than raw score — the level mapping has been tuned
against clinical and red-team fixtures.
Identity fields (optional)
Three opaque string fields let you tie calls back to your own analytics in the dashboard:
user_id— your identifier for the end-usersession_id— your identifier for the conversationagent_id— your identifier for the AI agent / persona
Each is optional, 1–256 characters. We do not parse, hash, or interpret these values — they're stored alongside the call metadata so the dashboard can show per-user and per-agent breakdowns.
Privacy: identity values stay on the NOPE side. They are not forwarded to the underlying classifier model and are never shared between customers. To rotate, change the identifier — old rows retain the prior value.
Pricing
$0.0001 per call. Deducted from prepaid balance like every other /v1/* endpoint. The X-Cost and X-Balance response headers report the cost and remaining
balance.
What Ocular is not
- Not predictive or diagnostic. Ocular is a measurement layer, not a clinical tool. Verdicts indicate signal, not prognosis.
- Not a moderation pipeline. Use Ocular signals to decide which conversations deserve human attention, not as automated takedowns.
- Not a replacement for Evaluate. Evaluate returns clinically-grounded severity + features (C-SSRS, HCR-20, DASH). Ocular returns axis signals from a behavioral embedding classifier. They're complementary.
Next steps
- View your Ocular analytics — per-call drill-downs, axis distributions, fiction histogram
- Evaluate guide — when to use which
- API reference — full endpoint catalog