Versioning. From v2.4.0 the version here is the release tag of the API
itself, and it follows semantic versioning: a major bump
for a breaking change, a minor for backwards-compatible additions, a patch for
fixes. The jump from v1.18.0 to v2.4.0 is that alignment, not eighteen missing
releases.Entries below v2.4.0 used a separate product numbering that did not follow
semver strictly. Two of them contain breaking changes that a major bump should
have signalled: v1.14.0 (
recommended_action values, removal of the
normalized block) and v1.8.0 (endpoint rename, removed synthetic profile
endpoint). They are left as published rather than renumbered, so anything that
already cites them still resolves.v2.4.0 (14 August 2026)
Added: csam_assessment.sources reports which detection layers ran
POST /safety/synthetic-content/image now returns a sources array inside
csam_assessment, naming the detection layers that produced the assessment.
tuteliq_compositional is our own compositional analysis and runs on every
request. iwf_hash_list appears only for customers who are IWF members and
have the hash list enabled; if you are not a member, it will never appear.
Membership is arranged directly with the Internet Watch Foundation.
The field is additive. Existing integrations are unaffected.
Changed: verification keeps the result, not the identity data
Age and identity verification now persist the outcome only: status, estimated age,is_minor, confidence scores and failure reasons. Name, date of birth and
document number are no longer written to our datastore in any form.
The document image, the selfie and the liveness frames were already held in
memory for the duration of the request and discarded; this closes the gap on
the extracted fields. No API response shape changes.
Fixed: Russian text is no longer labelled Bulgarian
Russian was intermittently reported as Bulgarian (bg), which meant Russian
conversations were analysed against the wrong culture-specific guidelines. The
correction now applies at every layer that can resolve a language, so the
reported language and the guidelines that were actually applied always agree.
Fixed: the OpenAPI specification is available again
GET /docs/json was returning a 500, which also left the interactive API
reference blank. A single endpoint referenced a security scheme that was never
declared, and that one omission invalidated the entire document rather than
just that path. The scheme is now declared, and a regression test covers spec
generation so a future undeclared scheme fails in CI instead of in production.
Changed: status components are named by what they do
The per-component checks under/status/ping/ are named for their function
(database, cache, face-matching, image-analysis and so on) rather than
for the technology behind them. GET /status/ping/components returns the
current list.
Previously published component names continue to resolve, so existing monitors
keep working without changes.
Fixed: the GDPR sub-processor list was inaccurate
GET /compliance/gdpr listed two model vendors as sub-processors. Neither
processes any customer data, so both have been removed. Retention periods in
the same response are now read from the values the platform actually enforces,
rather than being maintained separately, which had let them drift apart.
SDK releases
@tuteliq/mcp@3.22.2
v1.18.0 (13 August 2026)
Added: Arabic and Russian, bringing supported languages to 32
ar (Arabic) and ru (Russian) are now supported beta languages, joining
Chinese, Japanese and Korean. Both were validated against an English control
before release, checking two things: that real harm is caught, and that
protective speech (a parent warning a child) is not flagged.
Arabic covers Modern Standard Arabic plus Egyptian, Levantine, Gulf and
Maghrebi dialects, since everyday conversation happens in dialect rather than
MSA. Arabizi (Arabic written in Latin letters and numerals, such as “7abibi”)
is recognised, as is Russian translit (Russian written in Latin characters).
Improved: culture-specific guidelines for Chinese, Japanese and Korean
The Chinese, Japanese and Korean profiles now carry full culture-specific guidance rather than baseline coverage: region-specific grooming and exploitation vocabulary, script-specific evasion handling, and, most importantly for false positives, carve-outs for ordinary speech that resembles harmful vocabulary. Everyday affectionate address between family members, fandom and gaming hyperbole, and child-protection education material are recognised as benign. Chinese covers Simplified and Traditional script, with mainland, Taiwan, Hong Kong and Singapore usage differences, including written Cantonese.v1.17.0 (August 2026)
Improved: grooming detection recognises protective and educational speech
detect_grooming now more reliably distinguishes speech that warns about or
teaches grooming tactics from grooming itself. A parent telling a child “if
someone asks you to keep secrets from us, tell me”, a teacher’s lesson on
recognising grooming, and a survivor sharing their experience to help others
are treated as safe, where before they were sometimes flagged for review.
Detection of actual grooming is unchanged, including attempts wrapped in an
“I’m just teaching you” framing that still ask the child to keep secrets, meet,
or hide from their guardians. Those remain flagged.
Added: control incident logging per call
Incident logging could already be switched off for a whole account. Every detection endpoint now also accepts an optionalincident_moderation_enabled
field that overrides that account setting for a single request: true forces
the incident to be logged, false suppresses it, and omitting it uses your
account default. Precedence is per-call, then account, then the built-in
default (true).
Use it to suppress logging for test traffic, or to opt individual calls in or
out without changing your account setting. The field sits alongside the other
tracking fields (external_id, customer_id, metadata) and is available
across the REST API, the Node SDK (2.23.0) and the
MCP tools (3.21.7). See
incident logging control.
v1.16.0 (August 2026)
Added: MCP connections refresh themselves
Access tokens for the MCP server last 30 days, and until now there was no way to renew one: the token response carried neither an expiry nor a refresh token, so a connection stopped working a month after it was made with nothing to indicate why. Token responses now includeexpires_in and a refresh_token, and the
refresh_token grant is supported. Refresh tokens rotate: each refresh
consumes the presented token and issues a new one, as OAuth 2.1 requires for
public clients. Presenting a refresh token twice revokes every token descended
from that grant, on the basis that a replayed token has either leaked or the
client has raced itself.
Refresh tokens are valid for 90 days, so a client that idles for a month still
reconnects without sending the user back through the browser. See
MCP authentication.
Added: incident logging can be switched off
incident_moderation_enabled on your account controls whether Tuteliq writes
any detection record at all. With it off, incidents, grooming assessments,
in-app notifications and alert emails are all suppressed, while detection
responses stay identical. Retention is also configurable, from 7 days to 2
years, defaulting to 90. See incident logging control.
Added: moderation through an AI agent
The MCP server exposes the incident queue, so an agent can size a backlog, triage by severity, inspect what matters and record decisions into the same audit trail a human moderator’s land in. Agents are limited toconfirm. An MCP token identifies an account rather than
an individual, so escalation, resolution and reopening stay with a human
moderator, and a restricted action returns 403. Every state-changing call now
requires moderator_external_id, and MCP-authenticated calls must use the form
mcp:<agent-name>, so agent and human decisions stay distinguishable in the
trail. See moderation workflows.
Requires @tuteliq/mcp 3.21.1+;
earlier versions send the attribution field unprefixed and the call is refused.
Changed: incident lifecycle matches the moderator dashboard
escalate previously produced a record indistinguishable from confirm, and
resolved was unreachable through the API despite existing in the status enum.
Both are fixed, and resolve and reopen are now available: resolve stamps
resolved_at and marks linked notifications read, reopen returns an incident
to new while preserving resolved_at as history.
Changed: retention now matches the Trust Center
Analysis results and detection records are retained for 90 days and API logs for 30, matching what the Trust Center publishes. Incidents and grooming assessments were previously kept for 365 days and API usage for 90.v1.15.0 (August 2026)
Changed: new plans, and the free tier is retired
Tuteliq now has three plans: Build (499/mo, 150,000 credits) and Enterprise (custom). Every plan starts with a 14-day free trial. The previous Starter, Indie, Pro and Business plans are closed to new signups. If you are on a legacy plan, nothing changes. Your limits, endpoint access and price stay exactly as they are. The/api/v1/pricing endpoint now returns
only the plans available to new customers, so a legacy plan will not appear
there even though your account continues on it.
Allowances are measured in detection credits, not request counts. Endpoints
are weighted by cost: a text detection is 1 credit, an image 7, a video 95.
Improved: animated GIFs are analysed frame by frame
/safety/image previously rejected animated GIFs with a retryable error, and
flattening one to a still only ever exposed its first frame. GIFs are now
decoded and up to four evenly-spaced frames are analysed, always including the
first and last, then folded into a single worst-case verdict. Send the original
GIF rather than a still. Cost is unchanged at image rates.
Requires @tuteliq/sdk 2.21+ if you
upload from a Buffer; earlier versions sent uploads without a MIME type.
v1.14.0 (August 2026)
Breaking: recommended_action is now a fixed set of values
On /safety/grooming, recommended_action previously returned a full sentence, for example "monitor the conversation for further signs of grooming, such as...". It now returns exactly one of five tokens, ordered weakest to strongest:
none · monitor · flag_for_review · block · immediate_intervention
This makes the field safe to switch on directly. The descriptive sentence has moved to a new optional action_detail field, intended for display in a moderator UI. If you were rendering recommended_action as text, read action_detail instead.
Two legacy values were folded into the set at the same time: no_action is now none, and flag_for_moderator is now flag_for_review.
Breaking: the normalized block has been removed
Responses from /safety/bullying, /safety/grooming and /safety/unsafe no longer include the normalized object. It existed so that callers could branch on normalized.actionable at a time when recommended_action returned free text and could not be relied on. Now that recommended_action is a stable enum, the block only repeated fields already present at the top level, adding roughly 900 bytes to every response.
Migrate by branching on recommended_action (flag_for_review, block or immediate_intervention indicate a case needing attention). The per-message detail previously projected into normalized.evidence is available in full as message_analysis.
Improved: 404 responses suggest the endpoint you meant
A mistyped path now returns a correction alongside the error, for exampleDid you mean POST /api/v1/safety/grooming? for /api/v1/safety/groomin. Calling a valid path with the wrong HTTP method is reported as such. The available_endpoints listing is now generated from the live route table, so it always reflects what the API actually serves.
v1.13.0 (July 2026)
Removed: model-based document authenticity and field extraction
On 2 July 2026 we removed every path that sent a verification image to a language or vision model. Three capabilities announced in earlier releases were withdrawn:- Model-based document authenticity checks, which analysed document layout, security features, fonts and colour consistency against known templates, and claimed to detect screen photos, printout recaptures and digital manipulation (announced in v1.6.0, and as “hologram detection, tamper analysis” in v1.4.0).
- Model-based OCR fallback, which extracted name, date of birth and document number when local OCR failed (announced in v1.6.1).
- The
document_authenticatedsignal that depended on them.
document_authenticated, treat MRZ or barcode validation as
the equivalent assurance signal.
New: Fast mode (verdict-only)
Every detection endpoint now acceptsoptions.verdict_only: true. In fast mode the response returns only the conversation-level verdict (risk level, categories, recommended action) and omits the per-message message_analysis breakdown. Because the engine no longer generates that breakdown, fast mode is meaningfully lower latency, which makes it the right choice for screening live chat in real time. Screen everything in fast mode, then re-run only the messages that flag through standard mode for the full per-message detail. See Fast mode.
Available in @tuteliq/sdk 2.16+ (verdictOnly: true) and @tuteliq/mcp 3.18+ (verdict_only on detect_grooming and detect_bullying).
Improved: include_evidence now controls generation, not just output
Setting include_evidence: false (at the top level or inside options) now tells the engine to skip generating the per-quote evidence array altogether, instead of stripping it after the fact. The result is a smaller response and roughly a third lower latency, with the verdict, severity, categories and rationale unchanged. Use it when you need the decision but not the supporting quotes. The default remains true.
Fixed: include_evidence was previously accepted without effect
On the fraud and safety-extended endpoints, include_evidence: false was validated but never applied, so evidence came back regardless. The flag is now honored on every detection endpoint, and is accepted both at the top level and inside options.
Improved: Age- and role-aware grooming precision
detect_grooming now reasons about the actual age gap and role of each participant. Openly-arranged meet-ups and task-specific photo requests between similar-age peers are no longer flagged as grooming, while adult-to-minor and coercive same-age patterns (including peer sextortion) continue to fire at full severity. Pass sender_age per message, and context.child_age / context.participant_age when known, for the sharpest results.
New: Bullying, gaming toxicity, and coded-language detection
A new Bullying and toxicity detection page documents how Tuteliq reads context rather than keywords: gaming trash-talk versus targeted harassment, coded slang, emoji, algospeak, and deliberate filter evasion. This coded-language and evasion resilience is a platform-wide capability that applies to every detector, not just bullying.SDK releases
@tuteliq/sdk2.16.0: addsverdictOnlyfast mode across detection methods@tuteliq/mcp3.18.0: addsverdict_onlytodetect_groominganddetect_bullying
v1.12.0 — May 2026
New — Read-only dashboard surface
Four new endpoints under/api/v1/incidents give programmatic access to the same data a moderator sees in the Tuteliq dashboard, scoped per API key:
GET /api/v1/incidents— paginated, filterable listing (category, severity, status, source, platform, external_id, customer_id, time-window). Cursor-based pagination. Optionalinclude_summary=truedecrypts the summary text per row (extra credit per row).GET /api/v1/incidents/:id— full incident detail. Server-encrypted fields decrypted server-side; BYOK fields returned as hybrid envelopes for client-side decryption with the customer’s RSA private key.GET /api/v1/incidents/overview— KPI snapshot over a time window (total, requires-review queue size, 24h/7d/30d totals, counts by category/severity/source/status, top 5 platforms).GET /api/v1/incidents/trends— time-bucketed counts with per-bucket severity breakdown. Buckets: hour, day (default), week.
listIncidents, getIncident, getIncidentsOverview, getIncidentTrends) and @tuteliq/mcp 3.15.4+ (the four matching tools render as interactive dashboard widgets in MCP hosts).
Updated — detect_grooming 50-turn ceiling
Multi-turn detect_grooming calls have a documented ceiling of ~50 turns per request. Earlier this month a regression dropped the effective ceiling below 20 turns (the output-token budget was clipping the JSON response mid-message_analysis array, causing a parse failure that surfaced as analysis_status: "engine_error"). Fixed via an adaptive output budget that scales with conversation length (base + N × per-turn, capped at the model’s safe output ceiling).
The graceful engine_error envelope still exists — beyond the ceiling, callers receive recommended_action: "flag_for_moderator" rather than a silent pass. For conversations beyond ~30 turns we recommend chunked sliding windows of 10–15 turns with continuation_token carrying trajectory state across calls. See Grooming detection for the tactic taxonomy and the long-conversation pattern.
Updated — meeting_request as a first-class grooming tactic
detect_grooming now returns meeting_request as a distinct flag (previously subsumed under boundary_pushing). Meeting attempts convert online risk into physical-safety risk and warrant a different operational response — most platforms route them directly to law-enforcement-aware workflows. The full six-tactic taxonomy is documented at Grooming detection.
New — Composable safety primitives
Documentedcross_endpoint_modifier and vulnerability_profile on detect_vulnerability_exploitation. Both fields have been returning real data for months but were undocumented — they let agents amplify sibling detectors’ verdicts when a target is identified as vulnerable, and route to vulnerability-dimension-specific intervention workflows. See Composable safety primitives for the worked TypeScript + Python examples.
Fixed — Account observability endpoints
/account/consent and /account/audit-logs now respond reliably for accounts with larger or filtered datasets. Both endpoints are part of the GDPR / SOC 2 observability surface and should be considered stable for compliance workflows.
Fixed — Response key consistency across usage and pricing endpoints
/usage/monthly, /usage/history, and /pricing/details now return snake_case keys consistent with the rest of the API. SDK consumers no longer need to alias field names; existing snake_case-aware code works directly.
v1.11.0 — May 2026
Updated — Credit costs
Per-endpoint credit costs for text-detection endpoints have been updated. See Pricing & Credits for the full table./analyse/multi now uses a 1 base + 1 per endpoint formula instead of summing per-endpoint costs (e.g. 3 endpoints = 4 credits, 7 endpoints = 8 credits). Server-side execution is parallel via Promise.allSettled, so the price reflects the actual wall-clock cost rather than the sum of individual calls.
v1.10.0 — May 2026
New — Prescreen lexicon for SDK-side filtering
Public endpointGET /v1/prescreen/lexicon returns Tuteliq’s curated set of high-precision phrase patterns mapped to category flags. SDKs fetch it on startup, cache by version, and run it client-side against content before making an API call. Two wins:
- Clearly-benign content never leaves the device (greetings, thanks, small talk → SDK skips the API call entirely)
- Positive matches are attached as structured hints on the request via the new
prescreen_flagsfield, giving the server a strong prior
Improved — Continuation tokens now feed conversation trajectory into the LLM
When acontinuation_token is supplied, the LLM now receives the derived conversation state (turn count, accumulated categories with max confidence, severity trajectory, last recommended action) as injected context for the new turn. Translation: the model considers escalation patterns across the whole conversation when scoring the new message — without us ever storing the conversation.
This closes the gap between v1.9 (token carries state across calls; response shows trajectory) and the full conversation-aware analysis that was previously only available by re-sending conversation_history on every call.
Same five endpoints: /safety/grooming, /safety/distress-signals, /safety/bullying, /safety/coercive-control, /safety/vulnerability-exploitation.
v1.9.0 — May 2026
New — Continuation tokens (privacy-first conversation memory)
Five safety endpoints now return a signed, opaquecontinuation_token in every response. Pass it back on the next call to get conversation-aware analysis without re-sending the conversation history and without Tuteliq ever storing it. The token IS the analysis state — you hold it, we hold the signature.
- Supported:
/safety/grooming,/safety/distress-signals,/safety/bullying,/safety/coercive-control,/safety/vulnerability-exploitation - What’s in the token: derived signals only — turn count, accumulated category confidences, severity trajectory, recommended actions
- What’s NOT in the token: raw text, PII, anything we couldn’t already return in the public API response
- Properties enforced by construction: per-key binding (cannot be replayed across customers), per-endpoint binding, tamper-evident HMAC, 24h default lifetime, bounded payload size
- New request fields:
continuation_token,reset_conversation,message_id - New response fields:
continuation_token,continuation_expires_at,state_source(token/fresh/reset) - See the new Continuation Tokens page for usage, errors, and best practices
/safety/grooming’s legacy session_id continues to work but is scheduled for deprecation — the continuation token is the privacy-first replacement.
Backwards compatible
- All existing requests work exactly as before. The new fields are optional.
- If you send a stale or scope-mismatched token, you get a structured
CONTINUATION_TOKEN_*error and can fall back to one call withconversation_historyto re-seed.
v1.8.0 — May 2026
Breaking — Endpoint renamed: emotional-distress → distress-signals
POST /v1/safety/emotional-distress is removed. The endpoint is now POST /v1/safety/distress-signals — request and response shapes are unchanged. Calls to the legacy path return HTTP 410 Gone with a JSON body pointing to the new endpoint.
Why: EU AI Act Article 5(1)(f) framing. The detector is and always was a content classifier — it identifies linguistic patterns in text that are historically associated with distress. The old name implied emotion recognition, which is prohibited in workplaces and educational institutions outside child-safety contexts. The rename, an updated prompt that explicitly disclaims emotion inference, and a published intended-use scope (safety component for child-safety; not for workplace or general-purpose education monitoring) keep the endpoint inside the Art 5(1)(f) safety exception.
Action required:
- Update integrations to call
POST /v1/safety/distress-signals - In
/analyse/multi, change endpoint IDemotional-distress→distress-signals - MCP tool renamed:
detect_emotional_distress→detect_distress_signals - Settings keys (
enabled_endpoints/disabled_endpoints) renamed accordingly
LONELINESS, FEELING_UNHEARD, OVERWHELM, etc.), exploitation-risk fields, and the 5-credit cost are unchanged.
Breaking — Removed: per-customer synthetic profile endpoint
GET /v1/safety/synthetic-content/profile/:customer_id is removed. The endpoint and the underlying per-customer aggregation have been deleted; stored aggregates have been purged from cache.
Why: EU AI Act Article 5(1)(c) social-scoring concern and GDPR data minimisation. A per-natural-person aggregated synthetic-content score retained across detections resembles social scoring when used across unrelated contexts. Removing both the endpoint and the storage closes the retrieval surface and the stored artefact.
Action required: If you were polling the profile endpoint, aggregate detection responses on your side instead. The per-call detection endpoints (/safety/synthetic-content, /image, /audio, /video) continue to return classifications unchanged.
v1.7.0 — May 2026
Emotional Distress Detection (Early Warning)
POST /v1/safety/emotional-distress— detects pre-vulnerability emotional distress signals before exploitation begins- Based on criminological research: emotional distress is both a consequence AND a driver of vulnerability to child sexual exploitation
- 12 distress signal categories: loneliness, feeling unheard, overwhelm, low self-worth, trust-seeking, withdrawal, family conflict, identity distress, academic pressure, sleep disturbance, appetite change, emotional numbing
- Exploitation risk assessment — returns per-type vulnerability scores for grooming, sextortion, trafficking, radicalisation, self-harm, and substance use
- Vulnerability level scoring — none, low, elevated, high, critical
- Key risk combinations: loneliness + trust-seeking = HIGH grooming risk; family conflict + withdrawal = HIGH trafficking risk; low self-worth + overwhelm = HIGH sextortion risk
- 5 credits per call
Tech-Facilitated Gender-Based Violence (TFGBV) Detection
POST /v1/safety/tfgbv— detects technology-facilitated gender-based violence, rooted in gender inequalities and power imbalances- 13 TFGBV categories: image-based abuse, cyber stalking, online harassment, doxing, impersonation, outing, post-separation abuse, sextortion, digital coercion, sexualised deepfakes, gendered hate speech, reproductive surveillance, economic abuse digital
- TFGBV amplifier assessment — identifies which technology amplifiers are active: scale, speed, anonymity, permanence, cross-border reach
- Intersectionality flags — identifies compounding discrimination factors (LGBTQIA+, disability, racial, etc.)
- Child-specific detection with heightened sensitivity for minors
- 5 credits per call
Multi-Endpoint Support
- Both new endpoints available in
/analyse/multi— use endpoint IDsemotional-distressandtfgbv - MCP tools:
detect_emotional_distressanddetect_tfgbv
v1.6.1 — April 2026
Credit Pricing Update
All per-endpoint credit costs have been revised to reflect processing complexity more accurately. See Pricing & Credits for the full breakdown. Text & Safety Detections: 5 credits per call (was 1)detectBullying,detectUnsafe,detectSocialEngineering,detectAppFraud,detectRomanceScam,detectMuleRecruitment,detectGamblingHarm,detectCoerciveControl,detectVulnerabilityExploitation,detectRadicalisation
detectGrooming,analyzeEmotions
getActionPlan: 9 credits (was 2)generateReport: 13 credits (was 3)
analyzeImage: 7 credits (was 3)analyzeVoice: 21 credits base + 15 per extra minute over 60s (was flat 5)analyzeVideo: 95 credits (was 10)- Voice stream (per flush): 7 credits (was 1)
- Video stream (per frame): 7 credits (was 3)
detectSyntheticContent: 5 credits (was 2)
verifyAge(full): 20 credits (was 5)verifyAge(liveness only): 10 credits (new)verifyIdentity: 25 credits (was 10)
analyzeDocument: minimum 10 credits (was 3)
Age & Identity Verification Improvements
- Liveness-only mode now charged at 10 credits (reduced from full verification cost)
- Passport number validation — passport document numbers are no longer incorrectly validated against national ID formats (e.g., Swedish personnummer)
- Vision AI OCR fallback — when Tesseract OCR fails, document fields (name, DOB, document number) are extracted via vision AI and the confidence score reflects the extraction quality
Withdrawn 2 July 2026. No verification image reaches a model. See v1.13.0. - i18n for camera overlay — all liveness challenge text (instructions, blink/smile prompts) now translates correctly when switching languages
v1.6.0 — April 2026
Multi-Signal Forensic Synthetic Content Detection
The synthetic content detection pipeline has been completely rebuilt into a multi-signal forensic system that runs up to 6 independent analysis engines in parallel for images and 5 for video — replacing the previous single-model approach. Image Detection — 6-Signal Pipeline:- EXIF Metadata Extraction — Detects AI generator signatures in EXIF tags, XMP data, and PNG tEXt chunks (Stable Diffusion parameters). Flags suspicious absence of camera metadata (no camera model + no GPS + high resolution).
- Pixel Statistics — Shannon entropy, Laplacian edge density, and channel uniformity analysis. GAN images produce distinctive statistical signatures.
- C2PA Content Credentials — Detects and validates C2PA manifests from DALL-E 3, Adobe Firefly, Google Imagen. When C2PA declares AI generation, the result is forced to
confirmed_syntheticwith confidence ≥ 0.95. - Invisible Watermark Detection — High-frequency energy analysis, periodic pattern detection at known watermark frequencies, LSB distribution analysis, and corner entropy checks.
- Perceptual Hashing (pHash) — DCT-based 64-bit perceptual hash compared against a Redis-backed database of known synthetic content via Hamming distance. Matches force
confirmed_synthetic. - Weighted Signal Aggregation — All signals aggregated into a weighted ensemble (vision 30%, metadata 15%, pixel stats 15%, C2PA 15%, watermarks 10%, pHash 15%) with fault isolation via
Promise.allSettled.
- Mel Spectrogram Analysis — FFmpeg generates a mel spectrogram image, analyzed by a dedicated vision prompt for frequency band uniformity, harmonic anomalies, missing breath noise, onset/offset patterns, and aliasing artifacts.
- Quantitative Audio Statistics — RMS mean/peak, dynamic range, silence ratio, flat factor, and DC offset extracted via FFmpeg
astatsfilter. - Spectral analysis runs in parallel with transcription. Even speech-free audio can be flagged if spectral patterns indicate synthesis.
- Temporal Consistency Analysis — face-api.js tracks face identity across frames via 128-dimensional descriptor Euclidean distance. Real faces: < 0.4, deepfakes: spikes > 0.6. Landmark stability measured via eye-to-nose ratio variance.
- Lip-Sync Correlation — Mouth openness from 68-point face landmarks correlated against frame-aligned audio energy. Pearson correlation > 0.5 = authentic, < 0.3 = deepfake. Detects silent mouth movement and voice-without-movement.
- All 5 video analysis tracks (per-frame vision, temporal consistency, lip-sync, spectral, transcription) run via fault-isolated
Promise.allSettled.
GET /v1/safety/synthetic-content/profile/:customer_id— 30-day rolling window with synthetic count, account score, trend detection (increasing/stable/decreasing), and category distribution.- Automatic, zero-cost profiling when
customer_idis provided on any detection request.
- Image:
metadata_analysis,provenance,forensic_signals,perceptual_hash,known_synthetic_match - Audio:
audio_stats,spectral_signals - Video:
temporal_consistency,lip_sync,audio_stats,spectral_signals
Age & Identity Verification Improvements
- ICAO 9303 MRZ Validator — Full check digit validation for TD1 (ID cards, 3×30), TD2 (ID cards, 2×36), and TD3 (passports, 2×44) Machine Readable Zones with weighted mod-7 algorithm
- PDF417 Barcode Reader — Decodes AAMVA-structured data from US/Canadian driver’s licenses via
zxing-wasm— extracts name, DOB, expiry, document number, address, and more - 45-Country Document Number Validator — Algorithmic check digit verification for CPF (Brazil), personnummer (Sweden), Aadhaar (India), Codice Fiscale (Italy), CURP (Mexico), SSN (US), SIN (Canada), TFN (Australia), and 37 more country-specific document formats
- Visual Liveness Analyzer — Multi-signal liveness detection: landmark motion analysis, texture analysis (Laplacian variance + moire detection), depth cue analysis (face/background sharpness ratio), and cross-frame consistency checks
- AI-Powered Document Authenticator — Vision model analyzes document layout, security features, fonts, color consistency, and photo integration against known templates. Detects screen photos, printout recaptures, and digital manipulation.
Withdrawn 2 July 2026. No verification image reaches a model. See v1.13.0. - MRZ/OCR/Barcode Cross-Referencing — Compares name, DOB, and document number between MRZ, OCR text, barcode data, front and back sides, flagging any inconsistency as potential tampering
v1.5.0 — March 2026
Document Analysis
POST /v1/safety/document— Upload a PDF (max 50 MB, 100 pages) for multi-endpoint safety analysis with per-page detection results- Supports 8 detection endpoints:
unsafe,bullying,grooming,social-engineering,coercive-control,radicalisation,romance-scam,mule-recruitment - SHA-256 document hashing for chain-of-custody verification in compliance audits
- Zero-retention processing — no document data stored after response
- Bounded concurrency (3 pages at a time) with text chunking for long pages
Dynamic Credit Pricing for Documents
- Document analysis uses per-page, per-endpoint pricing:
max(10, pages_analyzed × endpoint_count)(minimum updated in v1.6.1) - Each page-endpoint combination costs 1 credit
- Minimum charge of 10 credits covers extraction overhead
- Examples: 5 pages × 3 endpoints = 15 credits; 20 pages × 8 endpoints = 160 credits
Model Refinements
- TCO Regulation classification — Radicalisation responses now include EU Regulation 2021/784 Art. 2(7) content classification
- Self-harm CONTAGION sub-category — Detects suicide pacts, method sharing, cluster effects, and gateway escalation
- PII/Doxxing detection — New PII_DOXXING category for doxxing threats and digital footprint weaponisation
- Legacy response normalization — Bullying, grooming, and unsafe endpoints now include a
normalizedblock with a unified response shape matching newer endpoints
v1.4.4 — March 2026
New Features
countrycontext field — Pass an ISO 3166-1 alpha-2 country code (e.g.,"GB","US","SE") in thecontextobject to receive geo-localised crisis helpline data in detection responses. Falls back to user profile country if omitted.- Improved action escalation for minors — All detection endpoints now enforce a minimum
flag_for_reviewaction when harm is detected and the subject is a minor. Criminal indicators (SEXTORTION, TRAFFICKING, CSAM, DEBT_BONDAGE, FORCED_CRIMINALITY, HONOUR_ESCALATION) targeting minors automatically escalate toimmediate_intervention. - Graduated risk scoring — Risk scores now use the full 0.0–1.0 range with graduated bands instead of clustering around a single value.
- Evidence tactic normalization — Evidence tactic fields are now always returned in SCREAMING_SNAKE_CASE format (e.g.,
"EMOTIONAL_MANIPULATION"instead of"Emotional Manipulation").
SDK Releases
@tuteliq/sdkv2.5.0 — addscountrycontext field, graduated risk scoring, tactic normalization@tuteliq/mcpv3.7.0 — addscountrycontext field, minor action escalation, tactic normalization
v1.4.3 — March 2026
Bug Fixes & Improvements
support_thresholdnow works correctly across all 11 detection endpoints — setting"critical"correctly suppresses crisis helplines for High severity results. Previously the parameter was accepted without error but had no effect on the response.sender_trust: "verified"fully suppressesAUTH_IMPERSONATION— verified senders no longer trigger impersonation detection. Routine urgency (schedules, deadlines, appointments) is also suppressed. Only genuinely malicious elements (credential theft, phishing links, financial demands) will flag a verified sender.- Empty
categoriesfield indetect_unsafefixed — stronger prompt enforcement and code-level fallback extraction ensure the categories array is populated when the rationale references specific harms. - MCP session recovery — stale MCP sessions (after Cloud Run deployment or instance recycling) now recover transparently without requiring the client to reconnect.
Documentation
- Added
support_thresholdbehaviour reference to API docs, Node SDK, and MCP README - Added
sender_trusteffect on scoring to all documentation - Added
analyse_multiaccepted endpoint values to MCP README and API docs - Added complete context field reference across all packages
SDK Releases
@tuteliq/sdkv2.4.0 — addsconfidencetoAnalyzeResult, optionalrisk_leveltoUnsafeResult@tuteliq/mcpv3.5.0 — wiressupport_thresholdthrough all detection MCP tools, shows confidence and support in analyze tool
v1.4.2 — March 2026
Full EU Language Coverage
- Added 13 new languages: Romanian (
ro), Greek (el), Czech (cs), Hungarian (hu), Bulgarian (bg), Croatian (hr), Slovak (sk), Lithuanian (lt), Latvian (lv), Estonian (et), Slovenian (sl), Maltese (mt), Irish (ga) - Tuteliq now supports 27 languages — all 24 EU official languages + Ukrainian, Norwegian, and Turkish
- Enhanced all language entries with grooming indicators, self-harm coded vocabulary, filter evasion techniques, and youth slang coverage
- All new languages are in Beta status
v1.4.1 — March 2026
Language Support Expansion
- Added 4 new languages: Dutch (
nl), Polish (pl), Italian (it), Turkish (tr) - Tuteliq now supports 14 languages with auto-detection and culture-aware analysis
- Each language includes culturally-specific safety guidelines, slur databases, and prompt calibration
- All new languages are in Beta status
v1.4.0 — March 2026
Age Verification (Beta)
POST /v1/verification/age— verify user age through document analysis and biometric age estimation- Supports government-issued ID documents (passport, driving licence, national ID)
- Biometric age estimation from selfie photo
- Returns
verified,estimated_age,age_range,confidence, anddocument_type - 20 credits per verification (updated in v1.6.1)
- Available on Pro tier and above
Identity Verification (Beta)
POST /v1/verification/identity— confirm user identity with document verification and liveness detection- Document authenticity checks (MRZ validation, hologram detection, tamper analysis)
MRZ validation still runs and is now check-digit validated. Hologram and tamper analysis were withdrawn 2 July 2026; see v1.13.0. - Liveness detection to prevent spoofing (photo-of-photo, screen replay, mask attacks)
- Face matching between document photo and selfie
- Returns
verified,match_score,liveness_passed,document_authenticated, andflags - 25 credits per verification (updated in v1.6.1)
- Available on Business tier and above
Tier Access
- Age Verification requires Pro tier ($99/mo) or above
- Identity Verification requires Business tier ($349/mo) or above
- Both features are in Beta — endpoints and response schemas may evolve
v1.3.0 — February 2026
Fraud Detection Endpoints
POST /v1/fraud/social-engineering— detect social engineering tactics: pretexting, impersonation, urgency manipulation, authority exploitationPOST /v1/fraud/app-fraud— identify fraudulent app promotion, fake reviews, malicious download links, and clone app distributionPOST /v1/fraud/romance-scam— detect romance scam patterns: love-bombing, financial requests, identity fabrication, isolation tacticsPOST /v1/fraud/mule-recruitment— flag money mule recruitment: easy money offers, account sharing requests, laundering language
Safety Extended Endpoints
POST /v1/safety/gambling-harm— detect gambling harm: underage gambling promotion, addiction patterns, predatory odds, bet pressurePOST /v1/safety/coercive-control— identify coercive control: isolation tactics, financial control, monitoring/surveillance, threat patternsPOST /v1/safety/vulnerability-exploitation— detect exploitation of vulnerable individuals with cross-endpoint vulnerability modifier and vulnerability profile scoringPOST /v1/safety/radicalisation— flag radicalisation indicators: extremist rhetoric, us-vs-them framing, recruitment patterns, dehumanisation
Multi-Endpoint Analysis
POST /v1/analyse/multi— fan-out a single text to up to 10 detection endpoints in parallel- Automatic vulnerability modifier: when
vulnerability-exploitationis included, its cross-endpoint modifier adjusts severity scores across all other results - Aggregated response with
summary.highest_severity,summary.total_credits_used, and per-endpoint breakdown - Supports both legacy (bullying, grooming, unsafe) and new detection endpoints
SDK & Tool Support
- All new endpoints available across all SDKs: Node.js, Python, Swift, Kotlin, Flutter, React Native, .NET, Unity
- CLI — new
detect social-engineering,detect app-fraud,detect romance-scam,detect mule-recruitment,detect gambling-harm,detect coercive-control,detect vulnerability-exploitation,detect radicalisation, anddetect multicommands - MCP Server — 10 new tools for fraud, extended safety, multi-endpoint analysis, and video analysis
Tier Access
- New endpoints require Indie tier or above (Starter tier retains access to bullying, grooming, and unsafe only)
- All new endpoints cost 5 credits per call (updated in v1.6.1); multi-endpoint costs the sum of individual endpoints
v1.2.0 — February 2026
Video Analysis
POST /v1/safety/video— upload a video file (mp4, webm, quicktime, avi — max 100MB, 10 min) and receive per-frame vision analysis with flagged timestamps- Frame extraction powered by ffmpeg with configurable
max_frames(default 10, max 20) - Aggregated
overall_risk_scoreandoverall_severityacross all frames - Automatic incident recording and webhook alerts for flagged videos
- 95 credits per video analysis (updated in v1.6.1)
Video Streaming
- WebSocket voice streaming now supports video frames alongside audio
- Send video frames as binary with a
0x01prefix byte; audio uses0x00or no prefix (backward compatible) - New
frame_analysisserver event with per-frame vision results - New config options:
enable_video,frame_interval_seconds(min 3s, default 5s) session_summaryevent now includesvideo_frames_analyzedcount- 7 credits per video frame analysis (updated in v1.6.1)
Voice Streaming Enhancements
- Updated authentication:
?api_key=query param orAuthorization: Bearerheader - Tier-based connection limits (1 for Starter, up to unlimited for Enterprise)
- Subscription-aware credit tracking per flush
- Heartbeat ping/pong every 30 seconds for stale connection detection
v1.1.0 — February 2026
Multilingual Support
- 27 languages supported — English (stable), all 24 EU official languages + Ukrainian, Norwegian, Turkish (beta)
- Layered auto-detection — Trigram analysis (franc) confirmed by LLM-based detection for maximum reliability
- Culture-aware analysis — Language-specific guidelines for local slang, idioms, and harmful terms injected into classification prompts
- All safety endpoints now return
language,language_status, anddetected_languagefields in responses - No explicit
languageparameter required — detection is fully automatic
v1.0.0 — February 2026
Initial public release of the Tuteliq API.Safety Endpoints
POST /v1/safety/unsafe— detect harmful content across all nine KOSA categoriesPOST /v1/safety/bullying— dedicated bullying and harassment detectionPOST /v1/safety/grooming— conversation-level grooming pattern analysisPOST /v1/safety/voice— audio file transcription and safety analysisPOST /v1/safety/image— image analysis for visual content risks
Analysis & Guidance Endpoints
POST /v1/analysis/emotions— emotional well-being analysis from text and conversationsPOST /v1/guidance/action-plan— age-appropriate guidance and intervention recommendationsPOST /v1/reports/incident— structured safety report generation
Voice Streaming
WSS /v1/safety/voice/stream— real-time voice moderation via WebSocket with configurable severity thresholds
Webhooks
POST /v1/webhooks— register webhook endpoints for safety alerts and batch events- HMAC-SHA256 signature verification on all webhook deliveries
- Automatic retry with exponential backoff (3 attempts)
GDPR Compliance
DELETE /v1/account/data— right to erasure (Article 17)GET /v1/account/data/export— right to data portability (Article 20)PATCH /v1/account/data— right to rectification (Article 16)- Consent management endpoints for granular data processing consent
- Public transparency endpoints: DPA, sub-processors, retention policy
SDKs & Tools
- Node.js SDK —
@tuteliq/sdkon npm - Python SDK —
tuteliqon PyPI - Swift SDK — via Swift Package Manager
- Kotlin SDK — via Maven Central
- Flutter SDK —
tuteliqon pub.dev - React Native SDK —
@tuteliq/react-nativeon npm - .NET SDK —
Tuteliqon NuGet - Unity SDK — via Unity Package Manager
- CLI —
@tuteliq/clion npm / Homebrew - MCP Server —
@tuteliq/mcpon npm
Platform
- Credit-based billing with per-endpoint pricing
- Tier-based rate limiting (Free, Basic, Premium, Enterprise)
- API key authentication via Bearer token or
x-api-keyheader - Full KOSA harm category coverage with age-calibrated severity scoring