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

# Detect grooming patterns in conversations

> Analyze a sequence of messages for multi-stage grooming tactics: trust building, isolation, secrecy requests, boundary testing, and sexual escalation. Accepts full conversation history with sender roles to detect patterns that single-message analysis would miss. Returns grooming risk level, identified tactics as flags, and recommended intervention actions.



## OpenAPI

````yaml https://api.tuteliq.ai/docs/json post /api/v1/safety/grooming
openapi: 3.1.0
info:
  title: Tuteliq API
  description: >
    # AI-Powered Child Safety API


    You're building a chat feature for a kids' learning app. A user sends a
    message that looks innocuous on the surface but contains subtle grooming
    escalation patterns. Tuteliq catches it, scores the risk by the child's age
    group, and gives your trust & safety team an actionable report — all in
    under 400ms. One API call replaces months of in-house ML work.


    ---


    ## KOSA Harm Categories Coverage


    | Harm Category | Endpoint | Status |

    |--------------|----------|--------|

    | Eating Disorders | `/safety/unsafe` | ✅ Covered |

    | Substance Use | `/safety/unsafe` | ✅ Covered |

    | Suicidal Behaviors | `/safety/unsafe` | ✅ Covered |

    | Depression & Anxiety | `/safety/unsafe` + `/analysis/emotions` | ✅ Covered
    |

    | Compulsive Usage | `/safety/unsafe` | ✅ Covered |

    | Harassment & Bullying | `/safety/bullying` | ✅ Covered |

    | Sexual Exploitation | `/safety/grooming` + `/safety/unsafe` | ✅ Covered |

    | Voice & Audio Threats | `/safety/voice` | ✅ Covered |

    | Visual Content Risks | `/safety/image` | ✅ Covered |


    ---


    ## Key Features


    - **Age-Calibrated Severity** — Risk scores adjust across four age brackets
    (under 10, 10–12, 13–15, 16–17) so moderation matches developmental context.


    - **Nuanced Context Recognition** — Distinguishes hyperbolic teen language
    from genuine crisis signals, dramatically reducing false positives.


    - **Grooming Pattern Detection** — Identifies multi-stage grooming tactics:
    trust escalation, secrecy requests, isolation attempts, and boundary
    violations.


    - **Emotional Trend Analysis** — Tracks persistent mood patterns across
    conversations to surface early indicators of declining mental health.


    - **Voice & Image Analysis** — Upload audio or images for transcription,
    OCR, and full safety analysis in a single call.


    - **Real-time Voice Streaming** — WebSocket endpoint for live audio
    moderation with configurable flush intervals and per-category alerts.


    - **Guidance & Reports** — Generate age-appropriate action plans and
    professional incident reports ready for handoff to human reviewers.


    - **Batch Processing & Webhooks** — Analyze up to 50 items per batch call,
    with HMAC-signed webhook alerts for critical incidents.


    ---


    ## Credits per Action


    | Endpoint | Credits | Notes |

    |----------|---------|-------|

    | `detectBullying` | 1 | Single text analysis |

    | `detectUnsafe` | 1 | Single text analysis |

    | `detectGrooming` | 1 per 10 msgs | `ceil(messages / 10)`, min 1 |

    | `analyzeEmotions` | 1 per 10 msgs | `ceil(messages / 10)`, min 1 |

    | `getActionPlan` | 2 | Longer generation |

    | `generateReport` | 3 | Structured output |

    | `analyzeVoice` | 5 | Transcription + analysis |

    | `analyzeImage` | 3 | Vision + OCR + analysis |


    Every response includes a `credits_used` field. Credit balance is also
    available via the `X-Credits-Remaining` response header.


    ---


    ## Quick Start


    **1.** Get your API key at
    [tuteliq.ai/dashboard](https://tuteliq.ai/dashboard)


    **2.** Install the SDK:


    ```bash

    npm install @tuteliq/sdk

    ```


    **3.** Make your first call:


    ```typescript

    import Tuteliq from '@tuteliq/sdk'


    const tuteliq = new Tuteliq({ apiKey: 'YOUR_API_KEY' })


    const result = await tuteliq.detectUnsafe({
      content: "Don't talk to your parents about us meeting up",
      context: { age_group: "13-15" }
    })


    console.log(result.unsafe)              // true

    console.log(result.categories)          // ["grooming_adjacent", "secrecy"]

    console.log(result.severity)            // "high"

    console.log(result.recommended_action)  // "Escalate to moderator"

    ```


    ---


    ## Performance


    | Metric | Value |

    |--------|-------|

    | Average latency | ~400ms |

    | p95 latency | ~800ms |

    | Uptime SLA | 99.9% |


    Check real-time status at [tuteliq.ai/status](https://tuteliq.ai/status)
  version: 1.0.0
  contact:
    name: Tuteliq Support
    url: https://tuteliq.ai
    email: support@tuteliq.ai
  license:
    name: Proprietary
    url: https://tuteliq.ai/terms
servers:
  - url: https://api.tuteliq.ai
    description: Production server
  - url: http://localhost:3000
    description: Development server
security:
  - bearerAuth: []
  - apiKeyHeader: []
tags:
  - name: Safety
    description: >-
      Core detection endpoints for all nine KOSA harm categories. Supports text,
      voice, and image input with age-calibrated severity scoring.
  - name: Fraud
    description: >-
      Financial and social fraud detection — social engineering, app fraud,
      romance scams, and money mule recruitment. Identifies tactics targeting
      minors and vulnerable users with evidence-based scoring.
  - name: Safety Extended
    description: >-
      Extended safety detection — gambling harm, coercive control, vulnerability
      exploitation with cross-endpoint modifiers, and radicalisation. Requires
      Indie tier or above.
  - name: Analyse
    description: >-
      Multi-endpoint analysis. Fan-out a single text to up to 10 detection
      endpoints in parallel with aggregated results, vulnerability modifier
      support, and per-endpoint breakdowns.
  - name: Analysis
    description: >-
      Emotional intelligence endpoints. Analyze conversations for dominant
      emotions, sentiment trends (improving/stable/worsening), and early
      indicators of depression or anxiety. Designed to surface mental health
      risks before they escalate.
  - name: Guidance
    description: >-
      Post-detection action plans tailored by audience. Generate age-appropriate
      guidance for children, parents, or platform trust & safety teams —
      complete with reading-level calibration and tone adjustment. Goes beyond
      "here's a risk score" to answer "what do we do about it?"
  - name: Reports
    description: >-
      Professional incident report generation for schools, counselors, and
      moderators. Converts raw conversation data into structured reports with
      risk levels, categorized findings, and recommended next steps — ready for
      handoff to human reviewers.
  - name: Batch
    description: >-
      Analyze up to 50 items in a single request with optional parallel
      processing. Supports all analysis types (bullying, grooming, unsafe,
      emotions). Built for production pipelines that need to process backlogs or
      moderate content in bulk.
  - name: Webhooks
    description: >-
      Real-time notification endpoints for receiving alerts when critical
      incidents are detected. Full CRUD management with HMAC-SHA256 signed
      payloads, automatic retry on failure, secret regeneration, and test
      delivery — everything you need for production event-driven architectures.
  - name: Usage
    description: >-
      API usage tracking, quota monitoring, and rate limit status. View daily
      summaries, historical trends, per-tool breakdowns, and monthly billing
      period usage. Includes upgrade recommendations when approaching limits.
  - name: Policy
    description: >-
      Customize detection behavior for your use case. Configure sensitivity
      thresholds, category weights, and moderation rules without changing your
      integration code.
  - name: Pricing
    description: >-
      Public pricing plan information. Browse available tiers, features, and
      limits. The public endpoint requires no authentication; detailed plan info
      requires an API key.
  - name: Account
    description: >-
      GDPR-compliant account data management. Exercise the Right to Erasure
      (Article 17), Right to Data Portability (Article 20), and Right to
      Rectification (Article 16). Manage consent records and access your full
      audit trail. Available to all tiers — privacy is not a premium feature.
  - name: Compliance
    description: >-
      Public transparency endpoints for GDPR compliance. Machine-readable Data
      Processing Agreement (DPA), current sub-processor list, and data retention
      schedules. No authentication required — anyone can verify our data
      practices.
  - name: Admin
    description: >-
      Administrative endpoints for breach management and data retention. Log,
      track, and manage data breach incidents with full audit trails and
      notification status tracking. Trigger manual data retention cleanup when
      needed.
  - name: Health
    description: >-
      Health check and monitoring endpoints. Liveness and readiness probes for
      Kubernetes/Cloud Run, full dependency health checks, and detailed
      component status for debugging.
  - name: Status
    description: >-
      Public API status and uptime monitoring. Component-level health (API,
      database, cache, AI engine), uptime percentages, and an embeddable status
      page. Use /status/ping for external monitoring services like UptimeRobot.
externalDocs:
  description: KOSA Compliance Documentation
  url: https://tuteliq.ai/docs/kosa-compliance
paths:
  /api/v1/safety/grooming:
    post:
      tags:
        - Safety
      summary: Detect grooming patterns in conversations
      description: >-
        Analyze a sequence of messages for multi-stage grooming tactics: trust
        building, isolation, secrecy requests, boundary testing, and sexual
        escalation. Accepts full conversation history with sender roles to
        detect patterns that single-message analysis would miss. Returns
        grooming risk level, identified tactics as flags, and recommended
        intervention actions.
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required:
                - messages
              properties:
                messages:
                  type: array
                  maxItems: 100
                  items:
                    type: object
                    required:
                      - sender_role
                      - text
                    properties:
                      sender_role:
                        type: string
                        description: Role of sender (e.g., "adult", "child")
                      text:
                        type: string
                        maxLength: 10000
                        description: Message text
                      sender_age:
                        type: number
                        description: >-
                          Optional numeric age of THIS message's sender.
                          Strengthens age-gap analysis without forcing the model
                          to infer it from the role label.
                  description: >-
                    Sequence of messages to analyze. Consecutive same-role
                    messages of ≤3 characters are automatically defragmented
                    before tactic analysis to prevent letter-by-letter evasion.
                continuation_token:
                  type: string
                  description: >-
                    Opaque signed token from a previous /grooming call. Carries
                    derived analysis state across calls without server-side
                    storage.
                reset_conversation:
                  type: boolean
                  description: >-
                    Discard any continuation_token and start a fresh
                    conversation.
                message_id:
                  type: string
                  maxLength: 128
                  description: >-
                    Optional customer-side identifier for this batch (used as
                    the evidence pointer in the issued continuation_token).
                context:
                  type: object
                  properties:
                    child_age:
                      type: number
                      description: Age of the child / minor in the conversation.
                    participant_age:
                      type: number
                      description: >-
                        Optional age of the non-minor participant. When known
                        (e.g. on age-verified platforms), this lets the model
                        compute the actual age gap rather than infer it.
                    platform:
                      type: string
                      description: Platform name
                    language:
                      type: string
                      description: Language code (e.g., "en")
                options:
                  type: object
                  properties:
                    support_threshold:
                      type: string
                      enum:
                        - low
                        - medium
                        - high
                        - critical
                      description: >-
                        Minimum severity to show crisis support resources
                        (default: high). Critical always shows.
                    verdict_only:
                      type: boolean
                      default: false
                      description: >-
                        Fast mode: omit the per-message `message_analysis` array
                        from the response, reducing output length and latency.
                        All other fields are unchanged.
                support_threshold:
                  type: string
                  enum:
                    - low
                    - medium
                    - high
                    - critical
                  description: >-
                    Top-level alias for options.support_threshold. Minimum
                    severity to show crisis support resources (default: high).
                    Critical always shows.
                external_id:
                  type: string
                  maxLength: 255
                  description: >-
                    Your unique identifier (e.g. message ID, content ID) for
                    correlating Tuteliq results with your own system. Echoed
                    back in the response and included in webhook payloads so you
                    can match alerts to the original content.
                customer_id:
                  type: string
                  maxLength: 255
                  description: >-
                    Your end-customer identifier for multi-tenant / B2B2C
                    scenarios. If you serve multiple customers (schools, apps,
                    brands) from a single API key, set this to route webhook
                    alerts to the correct customer. Echoed back in the response
                    and included in webhook payloads as "customerId".
                metadata:
                  type: object
                  additionalProperties: true
                  maxProperties: 20
                  description: >-
                    Arbitrary key-value pairs for additional context (e.g. {
                    "channel": "discord", "region": "eu" }). Stored with the
                    detection result, echoed in the response, and included in
                    webhook payloads. Maximum 20 properties.
                incident_moderation_enabled:
                  type: boolean
                  description: >-
                    Per-call override of your account incident logging setting.
                    When set, it takes precedence over the account-level flag
                    for THIS request: true forces the incident to be persisted,
                    false suppresses persistence. Omit to use your account
                    default (which itself defaults to enabled). Lets you control
                    incident logging per request, e.g. suppress logging for test
                    traffic.
        required: true
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  grooming_risk:
                    type: string
                    enum:
                      - none
                      - low
                      - medium
                      - high
                      - critical
                    description: >-
                      Grooming-risk level. "low" indicates a signal worth
                      monitoring but no action required; branch your alerting on
                      `recommended_action` (`flag_for_review` / `block` /
                      `immediate_intervention`), not the bare presence of a
                      low-level risk.
                  confidence:
                    type: number
                  flags:
                    type: array
                    items:
                      type: string
                  rationale:
                    type: string
                  risk_score:
                    type: number
                  recommended_action:
                    type: string
                    enum:
                      - none
                      - monitor
                      - flag_for_review
                      - block
                      - immediate_intervention
                    description: >-
                      Routing key — a single stable token, safe to switch on.
                      Ordered weakest to strongest: `none` (no signal),
                      `monitor` (log, no human needed), `flag_for_review` (queue
                      for a moderator), `block` (withhold or limit the content),
                      `immediate_intervention` (crisis path). Human-readable
                      guidance is in `action_detail`, not here.
                  action_detail:
                    type: string
                    description: >-
                      Optional one-to-two-sentence explanation of
                      `recommended_action`, intended for a moderator UI. Never
                      branch on this field — it is free text and its wording is
                      not stable across releases.
                  message_analysis:
                    type: array
                    description: >-
                      Per-message risk breakdown showing how risk escalates
                      across the conversation
                    items:
                      type: object
                      properties:
                        message_index:
                          type: number
                          description: 1-based index of the message
                        risk_score:
                          type: number
                          description: Individual risk score (0.0-1.0)
                        flags:
                          type: array
                          items:
                            type: string
                          description: Tactics detected in this message
                        summary:
                          type: string
                          description: Brief explanation of risk contribution
                  language:
                    type: string
                    description: >-
                      Language code used for analysis (auto-detected or
                      provided)
                  language_status:
                    type: string
                    enum:
                      - stable
                      - beta
                    description: >-
                      Language support maturity: "stable" (en) or "beta" (all
                      others)
                  credits_used:
                    type: number
                    description: Number of credits consumed by this request
                  continuation_token:
                    type: string
                    description: >-
                      Privacy-first signed token carrying derived analysis state
                      across calls. Pass back on the next /grooming request.
                  continuation_expires_at:
                    type: string
                    description: ISO 8601 expiry timestamp of the continuation_token.
                  state_source:
                    type: string
                    enum:
                      - token
                      - fresh
                      - reset
                    description: How prior state was sourced for this call.
                  analysis_status:
                    type: string
                    enum:
                      - ok
                      - engine_error
                      - out_of_scope_adults
                    description: >-
                      Status of the analysis. `ok` is the default.
                      `engine_error` means the analysis engine could not produce
                      a verdict (malformed/adversarial input) and
                      `recommended_action` is forced to `flag_for_review`.
                      `out_of_scope_adults` means the caller provided 2+ adult
                      ages (via `context.participant_age`, `context.child_age`,
                      or per-message `sender_age`) and the call was
                      short-circuited as out of scope for grooming — consider
                      /safety/coercive-control or /safety/social-engineering for
                      adult-adult dynamics.
                  external_id:
                    type: string
                    description: Echo of the external_id you provided in the request
                  customer_id:
                    type: string
                    description: Echo of the customer_id you provided in the request
                  metadata:
                    type: object
                    additionalProperties: true
                    description: Echo of the metadata you provided in the request
                  support:
                    type: object
                    description: >-
                      Country-specific crisis helplines and response guidance
                      (only included for high/critical severity)
                    properties:
                      country:
                        type: string
                      country_name:
                        type: string
                      emergency_number:
                        type: string
                      helplines:
                        type: array
                        items:
                          type: object
                          properties:
                            name:
                              type: string
                            number:
                              type: string
                            description:
                              type: string
                            category:
                              type: string
                            available:
                              type: string
                      response_guide:
                        type: object
                        properties:
                          category:
                            type: string
                          immediateActions:
                            type: array
                            items:
                              type: string
                          resources:
                            type: array
                            items:
                              type: object
                              properties:
                                name:
                                  type: string
                                description:
                                  type: string
                                url:
                                  type: string
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: API key as Bearer token
    apiKeyHeader:
      type: apiKey
      in: header
      name: x-api-key
      description: API key in header

````