@tuteliq/sdk 2.3.0 → 2.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +462 -67
- package/dist/cjs/client.js +25 -5
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/constants.js +17 -0
- package/dist/cjs/constants.js.map +1 -1
- package/dist/client.d.ts +1 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +25 -5
- package/dist/client.js.map +1 -1
- package/dist/constants.d.ts +18 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +17 -0
- package/dist/constants.js.map +1 -1
- package/dist/types/detection.d.ts +4 -0
- package/dist/types/detection.d.ts.map +1 -1
- package/dist/types/safety.d.ts +6 -0
- package/dist/types/safety.d.ts.map +1 -1
- package/dist/types/verification.d.ts +5 -7
- package/dist/types/verification.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
8
|
<strong>Official TypeScript/JavaScript SDK for the Tuteliq API</strong><br>
|
|
9
|
-
AI-powered child safety
|
|
9
|
+
AI-powered child safety, fraud detection, and content moderation for modern applications
|
|
10
10
|
</p>
|
|
11
11
|
|
|
12
12
|
<p align="center">
|
|
@@ -29,15 +29,25 @@
|
|
|
29
29
|
|
|
30
30
|
## Overview
|
|
31
31
|
|
|
32
|
-
Tuteliq provides AI-powered content analysis to help protect children in digital environments. This SDK makes it easy to integrate Tuteliq's capabilities into your Node.js, browser, or edge runtime applications.
|
|
32
|
+
Tuteliq provides AI-powered content analysis to help protect children and vulnerable users in digital environments. This SDK makes it easy to integrate Tuteliq's capabilities into your Node.js, browser, or edge runtime applications.
|
|
33
33
|
|
|
34
34
|
### Key Features
|
|
35
35
|
|
|
36
36
|
- **Bullying Detection** — Identify verbal abuse, exclusion, and harassment patterns
|
|
37
37
|
- **Grooming Risk Analysis** — Detect predatory behavior across conversation threads
|
|
38
38
|
- **Unsafe Content Detection** — Flag self-harm, violence, hate speech, and age-inappropriate content
|
|
39
|
+
- **Social Engineering Detection** — Detect pretexting, urgency fabrication, trust exploitation, and authority impersonation
|
|
40
|
+
- **App Fraud Detection** — Identify fake investment platforms, phishing apps, subscription traps, and malicious links
|
|
41
|
+
- **Romance Scam Detection** — Detect love-bombing, financial requests, and identity deception
|
|
42
|
+
- **Mule Recruitment Detection** — Identify money mule recruitment and laundering facilitation
|
|
43
|
+
- **Gambling Harm Detection** — Detect chasing losses, concealment behavior, and gambling-related distress
|
|
44
|
+
- **Coercive Control Detection** — Identify isolation tactics, financial control, monitoring, and threats
|
|
45
|
+
- **Vulnerability Exploitation Detection** — Detect targeting of the elderly, disabled, or emotionally vulnerable
|
|
46
|
+
- **Radicalisation Detection** — Identify extremist rhetoric, us-vs-them framing, and ideological grooming
|
|
47
|
+
- **Multi-Endpoint Analysis** — Run multiple detection types on a single piece of content in one call
|
|
39
48
|
- **Voice Analysis** — Transcribe audio and run safety analysis on the transcript with timestamped segments
|
|
40
49
|
- **Image Analysis** — Visual safety classification with OCR text extraction and text safety analysis
|
|
50
|
+
- **Video Analysis** — Analyze video files for safety concerns via key frame extraction
|
|
41
51
|
- **Emotional State Analysis** — Understand emotional signals and concerning trends
|
|
42
52
|
- **Action Guidance** — Generate age-appropriate response recommendations
|
|
43
53
|
- **Incident Reports** — Create professional summaries for review
|
|
@@ -117,7 +127,9 @@ const tuteliq = new Tuteliq('your-api-key', {
|
|
|
117
127
|
|
|
118
128
|
---
|
|
119
129
|
|
|
120
|
-
###
|
|
130
|
+
### Common Parameters
|
|
131
|
+
|
|
132
|
+
#### Tracking Fields
|
|
121
133
|
|
|
122
134
|
All detection methods accept optional tracking fields for correlation, multi-tenant routing, and custom metadata:
|
|
123
135
|
|
|
@@ -149,6 +161,24 @@ These fields are:
|
|
|
149
161
|
- **Included** in webhook payloads, enabling you to route alerts to the correct customer from a single webhook endpoint
|
|
150
162
|
- **Stored** with the incident in Firestore for audit trail
|
|
151
163
|
|
|
164
|
+
#### Support Threshold
|
|
165
|
+
|
|
166
|
+
All detection methods accept an optional `supportThreshold` parameter that controls when crisis support resources are included in the response:
|
|
167
|
+
|
|
168
|
+
```typescript
|
|
169
|
+
const result = await tuteliq.detectUnsafe({
|
|
170
|
+
content: "I don't want to be here anymore",
|
|
171
|
+
supportThreshold: 'medium' // 'low' | 'medium' | 'high' (default) | 'critical'
|
|
172
|
+
})
|
|
173
|
+
|
|
174
|
+
// When severity meets or exceeds the threshold, result.support will contain:
|
|
175
|
+
// - helpline phone numbers (region-aware)
|
|
176
|
+
// - crisis text lines
|
|
177
|
+
// - relevant web resources
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
> **Note:** `critical` severity always includes support resources regardless of the threshold setting.
|
|
181
|
+
|
|
152
182
|
---
|
|
153
183
|
|
|
154
184
|
### Safety Detection
|
|
@@ -244,6 +274,191 @@ console.log(result.recommended_action) // Combined recommendation
|
|
|
244
274
|
|
|
245
275
|
---
|
|
246
276
|
|
|
277
|
+
### Fraud & Harm Detection
|
|
278
|
+
|
|
279
|
+
All fraud and harm detection methods share the same `DetectionInput` and return a unified `DetectionResult`:
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
import type { DetectionInput, DetectionResult } from '@tuteliq/sdk'
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**Input:**
|
|
286
|
+
|
|
287
|
+
```typescript
|
|
288
|
+
{
|
|
289
|
+
content: string, // Text content to analyze
|
|
290
|
+
context?: ContextInput, // Optional analysis context
|
|
291
|
+
includeEvidence?: boolean, // Include evidence excerpts
|
|
292
|
+
supportThreshold?: 'low' | 'medium' | 'high' | 'critical', // Crisis support threshold
|
|
293
|
+
external_id?: string, // Tracking ID
|
|
294
|
+
customer_id?: string, // Customer ID
|
|
295
|
+
metadata?: Record<string, unknown>, // Custom metadata
|
|
296
|
+
}
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
**Result:**
|
|
300
|
+
|
|
301
|
+
```typescript
|
|
302
|
+
{
|
|
303
|
+
endpoint: string, // e.g., 'social-engineering'
|
|
304
|
+
detected: boolean, // Whether a threat was detected
|
|
305
|
+
severity: number, // 0.0 - 1.0
|
|
306
|
+
confidence: number, // 0.0 - 1.0
|
|
307
|
+
risk_score: number, // Age-adjusted risk score (0.0 - 1.0)
|
|
308
|
+
level: 'none' | 'low' | 'medium' | 'high' | 'critical',
|
|
309
|
+
categories: DetectionCategory[], // Detected categories with tags and confidence
|
|
310
|
+
evidence?: DetectionEvidence[], // Evidence excerpts (if includeEvidence was true)
|
|
311
|
+
age_calibration?: AgeCalibration, // Age calibration details
|
|
312
|
+
recommended_action: string,
|
|
313
|
+
rationale: string,
|
|
314
|
+
language: string, // Detected language code
|
|
315
|
+
language_status: LanguageStatus, // 'stable' | 'beta'
|
|
316
|
+
credits_used?: number,
|
|
317
|
+
processing_time_ms?: number,
|
|
318
|
+
}
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
#### `detectSocialEngineering(input)`
|
|
322
|
+
|
|
323
|
+
Detects social engineering tactics such as pretexting, urgency fabrication, trust exploitation, and authority impersonation.
|
|
324
|
+
|
|
325
|
+
```typescript
|
|
326
|
+
const result = await tuteliq.detectSocialEngineering({
|
|
327
|
+
content: "Your account will be suspended unless you verify your details immediately",
|
|
328
|
+
includeEvidence: true,
|
|
329
|
+
context: { sender_trust: 'unknown' }
|
|
330
|
+
})
|
|
331
|
+
|
|
332
|
+
console.log(result.detected) // true
|
|
333
|
+
console.log(result.level) // 'high'
|
|
334
|
+
console.log(result.categories) // [{ tag: 'URGENCY_FABRICATION', label: 'Urgency Fabrication', confidence: 0.9 }]
|
|
335
|
+
console.log(result.evidence) // [{ text: 'suspended unless', tactic: 'URGENCY_FABRICATION', weight: 0.9 }]
|
|
336
|
+
console.log(result.rationale) // "Classic urgency-based social engineering..."
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
#### `detectAppFraud(input)`
|
|
340
|
+
|
|
341
|
+
Detects app-based fraud patterns such as fake investment platforms, phishing apps, subscription traps, and malicious download links.
|
|
342
|
+
|
|
343
|
+
```typescript
|
|
344
|
+
const result = await tuteliq.detectAppFraud({
|
|
345
|
+
content: "Download this app to earn $500/day with guaranteed returns!"
|
|
346
|
+
})
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
#### `detectRomanceScam(input)`
|
|
350
|
+
|
|
351
|
+
Detects romance scam patterns such as love-bombing, financial requests, identity deception, and emotional manipulation.
|
|
352
|
+
|
|
353
|
+
```typescript
|
|
354
|
+
const result = await tuteliq.detectRomanceScam({
|
|
355
|
+
content: "I know we just met online but I need help with a medical bill. I'll pay you back, I promise."
|
|
356
|
+
})
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
#### `detectMuleRecruitment(input)`
|
|
360
|
+
|
|
361
|
+
Detects money mule recruitment tactics such as easy-money offers, bank account sharing requests, and laundering facilitation.
|
|
362
|
+
|
|
363
|
+
```typescript
|
|
364
|
+
const result = await tuteliq.detectMuleRecruitment({
|
|
365
|
+
content: "Easy job, just receive money in your bank and forward 90% to this account"
|
|
366
|
+
})
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
#### `detectGamblingHarm(input)`
|
|
370
|
+
|
|
371
|
+
Detects gambling-related harm indicators such as chasing losses, borrowing to gamble, concealment behavior, and emotional distress.
|
|
372
|
+
|
|
373
|
+
```typescript
|
|
374
|
+
const result = await tuteliq.detectGamblingHarm({
|
|
375
|
+
content: "I lost everything again but I know if I just bet one more time I can win it all back"
|
|
376
|
+
})
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
#### `detectCoerciveControl(input)`
|
|
380
|
+
|
|
381
|
+
Detects coercive control patterns such as isolation tactics, financial control, monitoring behavior, threats, and emotional manipulation.
|
|
382
|
+
|
|
383
|
+
```typescript
|
|
384
|
+
const result = await tuteliq.detectCoerciveControl({
|
|
385
|
+
content: "You're not allowed to see your friends anymore. Give me your phone, I need to check your messages."
|
|
386
|
+
})
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
#### `detectVulnerabilityExploitation(input)`
|
|
390
|
+
|
|
391
|
+
Detects exploitation of vulnerable individuals including targeting the elderly, disabled, financially distressed, or emotionally vulnerable. Returns a `cross_endpoint_modifier` (1.0-2.0) when used with `analyseMulti`.
|
|
392
|
+
|
|
393
|
+
```typescript
|
|
394
|
+
const result = await tuteliq.detectVulnerabilityExploitation({
|
|
395
|
+
content: "Since your husband passed, you must be so lonely. I can help manage your finances."
|
|
396
|
+
})
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
#### `detectRadicalisation(input)`
|
|
400
|
+
|
|
401
|
+
Detects radicalisation indicators such as extremist rhetoric, us-vs-them framing, calls to action, conspiracy narratives, and ideological grooming.
|
|
402
|
+
|
|
403
|
+
```typescript
|
|
404
|
+
const result = await tuteliq.detectRadicalisation({
|
|
405
|
+
content: "They are the enemy. Only we understand the truth. It's time to take action."
|
|
406
|
+
})
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
---
|
|
410
|
+
|
|
411
|
+
### Multi-Endpoint Analysis
|
|
412
|
+
|
|
413
|
+
#### `analyseMulti(input)`
|
|
414
|
+
|
|
415
|
+
Run multiple detection endpoints on a single piece of content in one API call. When `vulnerability-exploitation` is included, its cross-endpoint modifier automatically adjusts severity scores across all other results.
|
|
416
|
+
|
|
417
|
+
```typescript
|
|
418
|
+
import { Detection } from '@tuteliq/sdk'
|
|
419
|
+
|
|
420
|
+
const result = await tuteliq.analyseMulti({
|
|
421
|
+
content: "Suspicious message content",
|
|
422
|
+
detections: [
|
|
423
|
+
Detection.SOCIAL_ENGINEERING,
|
|
424
|
+
Detection.ROMANCE_SCAM,
|
|
425
|
+
Detection.VULNERABILITY_EXPLOITATION
|
|
426
|
+
],
|
|
427
|
+
includeEvidence: true,
|
|
428
|
+
supportThreshold: 'medium',
|
|
429
|
+
})
|
|
430
|
+
|
|
431
|
+
console.log(result.summary.total_endpoints) // 3
|
|
432
|
+
console.log(result.summary.detected_count) // 2
|
|
433
|
+
console.log(result.summary.highest_risk) // { endpoint: 'romance-scam', risk_score: 0.85 }
|
|
434
|
+
console.log(result.summary.overall_risk_level) // 'high'
|
|
435
|
+
console.log(result.cross_endpoint_modifier) // 1.3 (vulnerability modifier)
|
|
436
|
+
console.log(result.credits_used) // 3
|
|
437
|
+
|
|
438
|
+
// Individual results
|
|
439
|
+
for (const r of result.results) {
|
|
440
|
+
console.log(`${r.endpoint}: detected=${r.detected}, risk=${r.risk_score}, level=${r.level}`)
|
|
441
|
+
}
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
**Available detection endpoints:**
|
|
445
|
+
|
|
446
|
+
| Endpoint ID | Method |
|
|
447
|
+
|-------------|--------|
|
|
448
|
+
| `bullying` | `detectBullying` |
|
|
449
|
+
| `grooming` | `detectGrooming` |
|
|
450
|
+
| `unsafe` | `detectUnsafe` |
|
|
451
|
+
| `social-engineering` | `detectSocialEngineering` |
|
|
452
|
+
| `app-fraud` | `detectAppFraud` |
|
|
453
|
+
| `romance-scam` | `detectRomanceScam` |
|
|
454
|
+
| `mule-recruitment` | `detectMuleRecruitment` |
|
|
455
|
+
| `gambling-harm` | `detectGamblingHarm` |
|
|
456
|
+
| `coercive-control` | `detectCoerciveControl` |
|
|
457
|
+
| `vulnerability-exploitation` | `detectVulnerabilityExploitation` |
|
|
458
|
+
| `radicalisation` | `detectRadicalisation` |
|
|
459
|
+
|
|
460
|
+
---
|
|
461
|
+
|
|
247
462
|
### Media Analysis
|
|
248
463
|
|
|
249
464
|
#### `analyzeVoice(input)`
|
|
@@ -440,37 +655,30 @@ const session = await tuteliq.createVerificationSession({
|
|
|
440
655
|
|
|
441
656
|
#### `getVerificationSession(sessionId)`
|
|
442
657
|
|
|
443
|
-
Polls the status of a verification session. When `status` is `completed`, the result is available in `
|
|
658
|
+
Polls the status of a verification session. When `status` is `completed`, the result is available in the `result` field.
|
|
444
659
|
|
|
445
660
|
```typescript
|
|
446
661
|
import { VerificationSessionStatus } from '@tuteliq/sdk'
|
|
447
662
|
|
|
448
|
-
const
|
|
449
|
-
|
|
450
|
-
console.log(
|
|
451
|
-
console.log(
|
|
452
|
-
|
|
453
|
-
if (
|
|
454
|
-
// Age verification result
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
//
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
console.log(result.identity_result.date_of_birth) // '1990-01-15'
|
|
468
|
-
console.log(result.identity_result.document_type) // 'passport'
|
|
469
|
-
console.log(result.identity_result.country_code) // 'US'
|
|
470
|
-
console.log(result.identity_result.face_match) // { matched: true, distance: 0.2, confidence: 0.98 }
|
|
471
|
-
console.log(result.identity_result.liveness) // { valid: true }
|
|
472
|
-
console.log(result.identity_result.credits_used) // 15
|
|
473
|
-
}
|
|
663
|
+
const session = await tuteliq.getVerificationSession('abc123...')
|
|
664
|
+
|
|
665
|
+
console.log(session.status) // VerificationSessionStatus.COMPLETED
|
|
666
|
+
console.log(session.mode) // VerificationMode.AGE
|
|
667
|
+
|
|
668
|
+
if (session.status === VerificationSessionStatus.COMPLETED && session.result) {
|
|
669
|
+
// Age verification result (when mode is AGE)
|
|
670
|
+
console.log(session.result.is_minor) // false
|
|
671
|
+
console.log(session.result.age_bracket) // '18-25'
|
|
672
|
+
console.log(session.result.face_match) // { matched: true, distance: 0.3, confidence: 0.95 }
|
|
673
|
+
console.log(session.result.liveness) // { valid: true }
|
|
674
|
+
console.log(session.result.failure_reasons) // []
|
|
675
|
+
console.log(session.result.credits_used) // 10
|
|
676
|
+
|
|
677
|
+
// Identity verification result (when mode is IDENTITY) also includes:
|
|
678
|
+
// session.result.full_name // 'John Doe'
|
|
679
|
+
// session.result.date_of_birth // '1990-01-15'
|
|
680
|
+
// session.result.document_type // 'passport'
|
|
681
|
+
// session.result.country_code // 'US'
|
|
474
682
|
}
|
|
475
683
|
```
|
|
476
684
|
|
|
@@ -535,15 +743,15 @@ const session = await tuteliq.createVerificationSession({
|
|
|
535
743
|
|
|
536
744
|
// Poll until complete
|
|
537
745
|
const poll = setInterval(async () => {
|
|
538
|
-
const
|
|
746
|
+
const status = await tuteliq.getVerificationSession(session.session_id)
|
|
539
747
|
|
|
540
|
-
if (
|
|
748
|
+
if (status.status === VerificationSessionStatus.COMPLETED) {
|
|
541
749
|
clearInterval(poll)
|
|
542
|
-
console.log('Verified! Is minor:', result
|
|
750
|
+
console.log('Verified! Is minor:', status.result?.is_minor)
|
|
543
751
|
}
|
|
544
752
|
|
|
545
|
-
if (
|
|
546
|
-
|
|
753
|
+
if (status.status === VerificationSessionStatus.FAILED ||
|
|
754
|
+
status.status === VerificationSessionStatus.EXPIRED) {
|
|
547
755
|
clearInterval(poll)
|
|
548
756
|
console.log('Verification failed or expired')
|
|
549
757
|
}
|
|
@@ -699,6 +907,106 @@ console.log(Object.keys(data.data)) // ['api_keys', 'incidents', ...]
|
|
|
699
907
|
console.log(data.data.incidents.length) // 5
|
|
700
908
|
```
|
|
701
909
|
|
|
910
|
+
#### `recordConsent(input)`
|
|
911
|
+
|
|
912
|
+
Record user consent for data processing (GDPR Article 6).
|
|
913
|
+
|
|
914
|
+
```typescript
|
|
915
|
+
const result = await tuteliq.recordConsent({
|
|
916
|
+
consentType: 'data_processing',
|
|
917
|
+
granted: true,
|
|
918
|
+
})
|
|
919
|
+
```
|
|
920
|
+
|
|
921
|
+
#### `getConsentStatus(consentType)`
|
|
922
|
+
|
|
923
|
+
Get current consent status for a specific consent type.
|
|
924
|
+
|
|
925
|
+
```typescript
|
|
926
|
+
const status = await tuteliq.getConsentStatus('data_processing')
|
|
927
|
+
console.log(status.granted) // true
|
|
928
|
+
console.log(status.granted_at) // '2026-01-15T...'
|
|
929
|
+
```
|
|
930
|
+
|
|
931
|
+
#### `withdrawConsent(consentType)`
|
|
932
|
+
|
|
933
|
+
Withdraw a previously granted consent.
|
|
934
|
+
|
|
935
|
+
```typescript
|
|
936
|
+
await tuteliq.withdrawConsent('data_processing')
|
|
937
|
+
```
|
|
938
|
+
|
|
939
|
+
#### `rectifyData(input)`
|
|
940
|
+
|
|
941
|
+
Correct personal data (Right to Rectification, GDPR Article 16).
|
|
942
|
+
|
|
943
|
+
```typescript
|
|
944
|
+
const result = await tuteliq.rectifyData({
|
|
945
|
+
field: 'email',
|
|
946
|
+
newValue: 'new@example.com',
|
|
947
|
+
})
|
|
948
|
+
```
|
|
949
|
+
|
|
950
|
+
#### `getAuditLogs(options?)`
|
|
951
|
+
|
|
952
|
+
Get audit trail of all data operations.
|
|
953
|
+
|
|
954
|
+
```typescript
|
|
955
|
+
const logs = await tuteliq.getAuditLogs({ limit: 50 })
|
|
956
|
+
logs.entries.forEach(entry => {
|
|
957
|
+
console.log(entry.action, entry.timestamp, entry.details)
|
|
958
|
+
})
|
|
959
|
+
```
|
|
960
|
+
|
|
961
|
+
---
|
|
962
|
+
|
|
963
|
+
### Breach Management
|
|
964
|
+
|
|
965
|
+
#### `logBreach(input)`
|
|
966
|
+
|
|
967
|
+
Log a new data breach. Starts the 72-hour GDPR notification clock.
|
|
968
|
+
|
|
969
|
+
```typescript
|
|
970
|
+
const result = await tuteliq.logBreach({
|
|
971
|
+
title: 'Unauthorized access to user data',
|
|
972
|
+
description: 'API key was exposed in a public repository',
|
|
973
|
+
severity: 'high',
|
|
974
|
+
affected_users: 150,
|
|
975
|
+
})
|
|
976
|
+
|
|
977
|
+
console.log(result.breach_id) // 'breach_001'
|
|
978
|
+
console.log(result.notification_deadline) // ISO timestamp (72 hours from now)
|
|
979
|
+
```
|
|
980
|
+
|
|
981
|
+
#### `listBreaches(options?)`
|
|
982
|
+
|
|
983
|
+
List all data breaches, optionally filtered by status.
|
|
984
|
+
|
|
985
|
+
```typescript
|
|
986
|
+
const { breaches } = await tuteliq.listBreaches({ status: 'open' })
|
|
987
|
+
breaches.forEach(b => console.log(b.title, b.status, b.created_at))
|
|
988
|
+
```
|
|
989
|
+
|
|
990
|
+
#### `getBreach(breachId)`
|
|
991
|
+
|
|
992
|
+
Get details of a specific data breach.
|
|
993
|
+
|
|
994
|
+
```typescript
|
|
995
|
+
const breach = await tuteliq.getBreach('breach_001')
|
|
996
|
+
console.log(breach.title, breach.status, breach.affected_users)
|
|
997
|
+
```
|
|
998
|
+
|
|
999
|
+
#### `updateBreachStatus(breachId, input)`
|
|
1000
|
+
|
|
1001
|
+
Update breach status and notification progress.
|
|
1002
|
+
|
|
1003
|
+
```typescript
|
|
1004
|
+
await tuteliq.updateBreachStatus('breach_001', {
|
|
1005
|
+
status: 'resolved',
|
|
1006
|
+
resolution_notes: 'API key rotated, affected users notified',
|
|
1007
|
+
})
|
|
1008
|
+
```
|
|
1009
|
+
|
|
702
1010
|
---
|
|
703
1011
|
|
|
704
1012
|
## Usage Tracking
|
|
@@ -729,11 +1037,21 @@ Different endpoints consume different amounts of credits based on complexity:
|
|
|
729
1037
|
| `detectBullying()` | 1 | Single text analysis |
|
|
730
1038
|
| `detectUnsafe()` | 1 | Single text analysis |
|
|
731
1039
|
| `detectGrooming()` | 1 per 10 msgs | `ceil(messages / 10)`, min 1 |
|
|
1040
|
+
| `detectSocialEngineering()` | 1 | Single text analysis |
|
|
1041
|
+
| `detectAppFraud()` | 1 | Single text analysis |
|
|
1042
|
+
| `detectRomanceScam()` | 1 | Single text analysis |
|
|
1043
|
+
| `detectMuleRecruitment()` | 1 | Single text analysis |
|
|
1044
|
+
| `detectGamblingHarm()` | 1 | Single text analysis |
|
|
1045
|
+
| `detectCoerciveControl()` | 1 | Single text analysis |
|
|
1046
|
+
| `detectVulnerabilityExploitation()` | 1 | Single text analysis |
|
|
1047
|
+
| `detectRadicalisation()` | 1 | Single text analysis |
|
|
1048
|
+
| `analyseMulti()` | 1 per endpoint | Sum of individual endpoint costs |
|
|
732
1049
|
| `analyzeEmotions()` | 1 per 10 msgs | `ceil(messages / 10)`, min 1 |
|
|
733
1050
|
| `getActionPlan()` | 2 | Longer generation |
|
|
734
1051
|
| `generateReport()` | 3 | Structured output |
|
|
735
1052
|
| `analyzeVoice()` | 5 | Transcription + analysis |
|
|
736
1053
|
| `analyzeImage()` | 3 | Vision + OCR + analysis |
|
|
1054
|
+
| `analyzeVideo()` | 10 | Key frame extraction + analysis |
|
|
737
1055
|
| `createVerificationSession()` (age) | 10 | Charged on completion |
|
|
738
1056
|
| `createVerificationSession()` (identity) | 15 | Charged on completion |
|
|
739
1057
|
|
|
@@ -856,6 +1174,44 @@ try {
|
|
|
856
1174
|
|
|
857
1175
|
---
|
|
858
1176
|
|
|
1177
|
+
## Supported Languages (27)
|
|
1178
|
+
|
|
1179
|
+
Language is auto-detected when not specified. Beta languages have good accuracy but may have edge cases compared to English. All 24 EU official languages + Ukrainian, Norwegian, and Turkish.
|
|
1180
|
+
|
|
1181
|
+
| Language | Code | Status |
|
|
1182
|
+
|----------|------|--------|
|
|
1183
|
+
| English | `en` | Stable |
|
|
1184
|
+
| Spanish | `es` | Beta |
|
|
1185
|
+
| Portuguese | `pt` | Beta |
|
|
1186
|
+
| French | `fr` | Beta |
|
|
1187
|
+
| German | `de` | Beta |
|
|
1188
|
+
| Italian | `it` | Beta |
|
|
1189
|
+
| Dutch | `nl` | Beta |
|
|
1190
|
+
| Polish | `pl` | Beta |
|
|
1191
|
+
| Romanian | `ro` | Beta |
|
|
1192
|
+
| Turkish | `tr` | Beta |
|
|
1193
|
+
| Greek | `el` | Beta |
|
|
1194
|
+
| Czech | `cs` | Beta |
|
|
1195
|
+
| Hungarian | `hu` | Beta |
|
|
1196
|
+
| Bulgarian | `bg` | Beta |
|
|
1197
|
+
| Croatian | `hr` | Beta |
|
|
1198
|
+
| Slovak | `sk` | Beta |
|
|
1199
|
+
| Slovenian | `sl` | Beta |
|
|
1200
|
+
| Lithuanian | `lt` | Beta |
|
|
1201
|
+
| Latvian | `lv` | Beta |
|
|
1202
|
+
| Estonian | `et` | Beta |
|
|
1203
|
+
| Maltese | `mt` | Beta |
|
|
1204
|
+
| Irish | `ga` | Beta |
|
|
1205
|
+
| Swedish | `sv` | Beta |
|
|
1206
|
+
| Norwegian | `no` | Beta |
|
|
1207
|
+
| Danish | `da` | Beta |
|
|
1208
|
+
| Finnish | `fi` | Beta |
|
|
1209
|
+
| Ukrainian | `uk` | Beta |
|
|
1210
|
+
|
|
1211
|
+
Each language includes culture-specific safety guidelines covering local slang, grooming patterns, self-harm coded vocabulary, and filter evasion techniques.
|
|
1212
|
+
|
|
1213
|
+
---
|
|
1214
|
+
|
|
859
1215
|
## TypeScript Support
|
|
860
1216
|
|
|
861
1217
|
Full TypeScript support with comprehensive type definitions:
|
|
@@ -872,6 +1228,17 @@ import type {
|
|
|
872
1228
|
ReportResult,
|
|
873
1229
|
AnalyzeResult,
|
|
874
1230
|
|
|
1231
|
+
// Detection Results (Fraud & Safety Extended)
|
|
1232
|
+
DetectionInput,
|
|
1233
|
+
DetectionResult,
|
|
1234
|
+
DetectionCategory,
|
|
1235
|
+
DetectionEvidence,
|
|
1236
|
+
AgeCalibration,
|
|
1237
|
+
MessageAnalysis,
|
|
1238
|
+
AnalyseMultiInput,
|
|
1239
|
+
AnalyseMultiResult,
|
|
1240
|
+
AnalyseMultiSummary,
|
|
1241
|
+
|
|
875
1242
|
// Media Results
|
|
876
1243
|
VoiceAnalysisResult,
|
|
877
1244
|
ImageAnalysisResult,
|
|
@@ -897,7 +1264,7 @@ import type {
|
|
|
897
1264
|
UsageByToolResult,
|
|
898
1265
|
UsageMonthlyResult,
|
|
899
1266
|
|
|
900
|
-
// Inputs
|
|
1267
|
+
// Safety Inputs
|
|
901
1268
|
DetectBullyingInput,
|
|
902
1269
|
DetectGroomingInput,
|
|
903
1270
|
DetectUnsafeInput,
|
|
@@ -910,6 +1277,19 @@ import type {
|
|
|
910
1277
|
// Account (GDPR)
|
|
911
1278
|
AccountDeletionResult,
|
|
912
1279
|
AccountExportResult,
|
|
1280
|
+
RecordConsentInput,
|
|
1281
|
+
ConsentStatusResult,
|
|
1282
|
+
ConsentActionResult,
|
|
1283
|
+
RectifyDataInput,
|
|
1284
|
+
RectifyDataResult,
|
|
1285
|
+
AuditLogsResult,
|
|
1286
|
+
|
|
1287
|
+
// Breach Management
|
|
1288
|
+
LogBreachInput,
|
|
1289
|
+
LogBreachResult,
|
|
1290
|
+
BreachListResult,
|
|
1291
|
+
BreachResult,
|
|
1292
|
+
UpdateBreachInput,
|
|
913
1293
|
|
|
914
1294
|
// Verification
|
|
915
1295
|
CreateVerificationSessionInput,
|
|
@@ -947,6 +1327,9 @@ import {
|
|
|
947
1327
|
WebhookEventType,
|
|
948
1328
|
IncidentStatus,
|
|
949
1329
|
ErrorCode,
|
|
1330
|
+
Language,
|
|
1331
|
+
LanguageStatus,
|
|
1332
|
+
Detection,
|
|
950
1333
|
VerificationMode,
|
|
951
1334
|
DocumentType,
|
|
952
1335
|
VerificationStatus,
|
|
@@ -963,6 +1346,16 @@ if (result.grooming_risk === GroomingRisk.HIGH) {
|
|
|
963
1346
|
// Handle high grooming risk
|
|
964
1347
|
}
|
|
965
1348
|
|
|
1349
|
+
// Detection endpoint IDs for multi-endpoint analysis
|
|
1350
|
+
const result = await tuteliq.analyseMulti({
|
|
1351
|
+
content: "Message to analyze",
|
|
1352
|
+
detections: [Detection.SOCIAL_ENGINEERING, Detection.ROMANCE_SCAM],
|
|
1353
|
+
})
|
|
1354
|
+
|
|
1355
|
+
// Language codes
|
|
1356
|
+
console.log(Language.EN) // 'en'
|
|
1357
|
+
console.log(Language.PT) // 'pt'
|
|
1358
|
+
|
|
966
1359
|
// Verification mode
|
|
967
1360
|
const session = await tuteliq.createVerificationSession({
|
|
968
1361
|
mode: VerificationMode.AGE,
|
|
@@ -1106,34 +1499,7 @@ The SDK works in browsers that support the Fetch API:
|
|
|
1106
1499
|
|
|
1107
1500
|
---
|
|
1108
1501
|
|
|
1109
|
-
##
|
|
1110
|
-
|
|
1111
|
-
We welcome contributions! Please see our [Contributing Guide](https://github.com/Tuteliq/node/blob/main/CONTRIBUTING.md) for details.
|
|
1112
|
-
|
|
1113
|
-
```bash
|
|
1114
|
-
# Clone the repo
|
|
1115
|
-
git clone https://github.com/Tuteliq/node.git
|
|
1116
|
-
cd node
|
|
1117
|
-
|
|
1118
|
-
# Install dependencies
|
|
1119
|
-
npm install
|
|
1120
|
-
|
|
1121
|
-
# Run tests
|
|
1122
|
-
npm test
|
|
1123
|
-
|
|
1124
|
-
# Build
|
|
1125
|
-
npm run build
|
|
1126
|
-
```
|
|
1127
|
-
|
|
1128
|
-
---
|
|
1129
|
-
|
|
1130
|
-
## API Documentation
|
|
1131
|
-
|
|
1132
|
-
- **Base URL**: `https://api.tuteliq.ai`
|
|
1133
|
-
- **Swagger UI**: [docs.tuteliq.ai](https://docs.tuteliq.ai)
|
|
1134
|
-
- **OpenAPI JSON**: [docs.tuteliq.ai/json](https://docs.tuteliq.ai/json)
|
|
1135
|
-
|
|
1136
|
-
### Rate Limits
|
|
1502
|
+
## Rate Limits & Pricing
|
|
1137
1503
|
|
|
1138
1504
|
Rate limits depend on your subscription tier:
|
|
1139
1505
|
|
|
@@ -1176,6 +1542,35 @@ PII redaction is **enabled by default** on the Tuteliq API. It automatically str
|
|
|
1176
1542
|
|
|
1177
1543
|
---
|
|
1178
1544
|
|
|
1545
|
+
## API Documentation
|
|
1546
|
+
|
|
1547
|
+
- **Base URL**: `https://api.tuteliq.ai`
|
|
1548
|
+
- **Swagger UI**: [docs.tuteliq.ai](https://docs.tuteliq.ai)
|
|
1549
|
+
- **OpenAPI JSON**: [docs.tuteliq.ai/json](https://docs.tuteliq.ai/json)
|
|
1550
|
+
|
|
1551
|
+
---
|
|
1552
|
+
|
|
1553
|
+
## Contributing
|
|
1554
|
+
|
|
1555
|
+
We welcome contributions! Please see our [Contributing Guide](https://github.com/Tuteliq/node/blob/main/CONTRIBUTING.md) for details.
|
|
1556
|
+
|
|
1557
|
+
```bash
|
|
1558
|
+
# Clone the repo
|
|
1559
|
+
git clone https://github.com/Tuteliq/node.git
|
|
1560
|
+
cd node
|
|
1561
|
+
|
|
1562
|
+
# Install dependencies
|
|
1563
|
+
npm install
|
|
1564
|
+
|
|
1565
|
+
# Run tests
|
|
1566
|
+
npm test
|
|
1567
|
+
|
|
1568
|
+
# Build
|
|
1569
|
+
npm run build
|
|
1570
|
+
```
|
|
1571
|
+
|
|
1572
|
+
---
|
|
1573
|
+
|
|
1179
1574
|
## Support
|
|
1180
1575
|
|
|
1181
1576
|
- **Documentation**: [docs.tuteliq.ai](https://docs.tuteliq.ai)
|
|
@@ -1200,10 +1595,10 @@ Tuteliq offers a **free certification program** for anyone who wants to deepen t
|
|
|
1200
1595
|
| Track | Who it's for | Duration |
|
|
1201
1596
|
|-------|-------------|----------|
|
|
1202
1597
|
| **Parents & Caregivers** | Parents, guardians, grandparents, teachers, coaches | ~90 min |
|
|
1203
|
-
| **Young People (10
|
|
1598
|
+
| **Young People (10-16)** | Young people who want to learn to spot manipulation | ~60 min |
|
|
1204
1599
|
| **Companies & Platforms** | Product managers, trust & safety teams, CTOs, compliance officers | ~120 min |
|
|
1205
1600
|
|
|
1206
|
-
**Start here
|
|
1601
|
+
**Start here:** [tuteliq.ai/certify](https://tuteliq.ai/certify)
|
|
1207
1602
|
|
|
1208
1603
|
- 100% Free — no login required
|
|
1209
1604
|
- Verifiable certificate on completion
|
|
@@ -1217,7 +1612,7 @@ Before you decide to contribute or sponsor, read these numbers. They are not pro
|
|
|
1217
1612
|
|
|
1218
1613
|
- **302 million** children are victims of online sexual exploitation and abuse every year. That is **10 children every second**. *(Childlight / University of Edinburgh, 2024)*
|
|
1219
1614
|
- **1 in 8** children globally have been victims of non-consensual sexual imagery in the past year. *(Childlight, 2024)*
|
|
1220
|
-
- **370 million** girls and women alive today experienced rape or sexual assault in childhood. An estimated **240
|
|
1615
|
+
- **370 million** girls and women alive today experienced rape or sexual assault in childhood. An estimated **240-310 million** boys and men experienced the same. *(UNICEF, 2024)*
|
|
1221
1616
|
- **29.2 million** incidents of suspected child sexual exploitation were reported to NCMEC's CyberTipline in 2024 alone — containing **62.9 million files** (images, videos). *(NCMEC, 2025)*
|
|
1222
1617
|
- **546,000** reports of online enticement (adults grooming children) in 2024 — a **192% increase** from the year before. *(NCMEC, 2025)*
|
|
1223
1618
|
- **1,325% increase** in AI-generated child sexual abuse material reports between 2023 and 2024. The technology that should protect children is being weaponized against them. *(NCMEC, 2025)*
|