Skip to main content

Grooming detection

Most safety APIs answer “is this content sexual?” Tuteliq answers a stronger question: is this person being groomed — and how? Grooming is rarely a single message. It’s a structured sequence of tactics applied over time, each one independently low-severity but together unmistakable. Tuteliq’s detect_grooming endpoint identifies six distinct tactics across a conversation, returns a per-message trajectory of risk score evolution, and produces a composite verdict with evidence-grounded flags. This page is the deep-dive on what we detect and why each tactic matters.

The six tactics

Each tactic below maps to a flags value returned by detect_grooming. Multiple tactics often co-occur — that co-occurrence is itself a strong predictor and a moderator’s most actionable signal. meeting_request is the newest tactic in the taxonomy (added in V3.15.0) — earlier versions of the detector subsumed it under boundary_pushing. We separated it because the legal and operational response to a meeting attempt is materially different from boundary pushing: most platforms route meeting indications to immediate human review and trigger external reporting workflows, not just internal moderation.

Why the sequence matters

A single isolated flattery flag from one message is rarely actionable on its own. The same flag combined with secrecy_request and isolation across a conversation is a near-certain grooming pattern that warrants immediate moderation. Tuteliq surfaces this in two ways: 1. Per-message trajectory. The response includes a message_analysis array with risk_score per message — allowing dashboards to plot the trajectory and surface the moment the pattern becomes unambiguous. A textbook grooming conversation shows a steady ramp from 0.1 to 0.9+ across rapport → secrecy → photo request → meeting attempt. 2. Multi-flag composite. Multiple flags on the same conversation are evidence of a pattern, not a noisy classifier. The endpoint’s risk_score reflects compounding when multiple tactics co-occur — the same content with two flags scores higher than the sum of two single-flag verdicts.

Conversation length

detect_grooming accepts up to 50 turns in a single call. Beyond that the engine returns a graceful analysis_status: "engine_error" envelope with recommended_action: "flag_for_moderator". The error envelope is the correct response: a moderator must NOT treat an engine error as “no grooming detected”. For conversations longer than ~30 turns, use chunked sliding windows of 10–15 turns and pass the continuation_token from each call back into the next so trajectory state is preserved across windows. See Continuation tokens.

Age signals strengthen the verdict

Pass age information when you have it:
  • context.child_age — the minor’s age (if known)
  • context.participant_age — the non-minor counterpart’s age (if known, e.g. on age-verified platforms)
  • messages[].sender_age — per-message age tag when conversations have more than two parties
When two or more age signals are provided AND all are ≥18, the endpoint short-circuits with grooming_risk: "none" and analysis_status: "out_of_scope_adults". This is a precision floor: adult-to-adult interactions with grooming-shaped content should be routed to /safety/coercive-control or /safety/social-engineering, not flagged as child grooming.

When not to use it

detect_grooming is purpose-built for adult-to-minor patterns in 1:1 or small-group conversations. It is not the right endpoint for:
  • Peer-to-peer minor conversations. Use /safety/bullying or /safety/coercive-control instead — the prompt is calibrated for an age gap.
  • Romance scams targeting adults. Use /fraud/romance-scam — the playbook overlaps superficially (rapport → isolation → ask) but the tactic vocabulary and intervention path are different.
  • Single-message analysis. detect_grooming reasons over a conversation; a single message is rarely sufficient context. For single-message decisions, use /safety/unsafe.

Tactic mapping by severity

When designing moderator workflows, this severity ladder is a reasonable default: Your specific routing should match your platform’s policy and the legal jurisdictions you operate in. The compound scoring in risk_score already reflects this severity ranking — recommended_action is the operational shortcut.
  • Composable safety primitives — combine detect_grooming with detect_vulnerability_exploitation for vulnerability-amplified verdicts.
  • Continuation tokens — preserve trajectory state across chunked windows for long conversations.
  • KOSA compliance — full mapping of detected tactics to KOSA harm categories.
  • Languages — supported languages for detect_grooming (currently 6+ at near-English parity).