---
title: "Analyze image for visual and textual safety concerns"
method: POST
path: "/api/v1/safety/image"
tags: ["Safety"]
---

# Analyze image for visual and textual safety concerns

`POST /api/v1/safety/image`

## Request

- Base URL: `https://api.tuteliq.ai`
- URL: `https://api.tuteliq.ai/api/v1/safety/image`
- Auth: one of:
  - HTTP bearer
  - API key in header `x-api-key`

Upload an image (png, jpg, gif, webp — max 10MB) for dual-layer analysis: Vision AI classifies visual content (nudity, violence, weapons, drugs, self-harm imagery) while OCR extracts embedded text for separate safety analysis. Returns visual categories, extracted text, face detection, and combined overall risk score. Covers screenshots, memes, shared photos, and profile images.

## Response `200`

Default Response

- object
  - `file_id` string
  - `vision` object
    - `extracted_text` string
    - `visual_categories` string[]
    - `visual_severity` string
    - `visual_confidence` number
    - `visual_description` string
    - `contains_text` boolean
    - `contains_faces` boolean
  - `text_analysis` object
  - `overall_risk_score` number
  - `overall_severity` 'none' | 'low' | 'medium' | 'high' | 'critical'
  - `detected` boolean: A concern was observed at ANY severity, including monitor-only cases. For production branching prefer `recommended_action`.
  - `confidence` number: Confidence in the overall verdict (0-1).
  - `recommended_action` 'none' | 'monitor' | 'flag_for_review' | 'block' | 'immediate_intervention': Routing key, weakest to strongest: `none`, `monitor`, `flag_for_review`, `block`, `immediate_intervention`. Derived from the stronger of the visual verdict and the OCR text verdict, so harmful text in a visually benign image still routes correctly. Safe to switch on.
  - `action_detail` string: Human-readable expansion of `recommended_action` for a moderator UI. Free text: do not branch on it.
  - `rationale` string: Why this verdict was reached. Built from category and severity labels only; never contains the image description or its extracted text.
  - `credits_used` number: Number of credits consumed by this request
  - `external_id` string
  - `incident_moderation_enabled` string: Per-call override of account incident logging: "true" forces persistence, "false" suppresses it. Omit for account default.
  - `customer_id` string
  - `metadata` object: Echo of the metadata you provided in the request
  - `profanity` object, nullable: Present only when the flag_profanity form field (or the account-level default_flag_profanity setting) is true, and only when the image contained OCR text. Deterministic word-list result over the extracted text — additive, never affects vision/text_analysis/overall_severity/recommended_action.
    - `detected` boolean
    - `matches` string[]
  - `risk_terms` object, nullable: Present only when the flag_risk_terms form field (or the account-level default_flag_risk_terms setting) is true, and only when the image contained OCR text. Deterministic drug/violence word-list result over the extracted text — additive, never affects vision/text_analysis/overall_severity/recommended_action.
    - `detected` boolean
    - `matches` object[]
      - `term` string
      - `category` 'drug' | 'violence'

---

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