# AI Agent Integration Source: https://docs.tuteliq.ai/ai-agents Machine-readable documentation for AI agents and LLM-powered applications Tuteliq provides machine-readable documentation files so AI agents, coding assistants, and LLM-powered applications can discover and use the API without manual configuration. ## What agents can do with Tuteliq Tuteliq covers four capability areas — all accessible via API, MCP tools, or OpenAPI spec: Detect grooming, bullying, self-harm, radicalisation, and all 9 KOSA harm categories across text, voice, images, and video. Identify social engineering, romance scams, app fraud, and money mule recruitment targeting minors and vulnerable users. Verify user age via document analysis, biometric estimation, or both. Full identity verification with face matching and liveness detection for COPPA/KOSA compliance. Emotional trend analysis, age-appropriate action plans, and professional incident reports ready for trust & safety teams. ### Verification endpoints | Endpoint | What it does | Tier | | ------------------------------------- | ------------------------------------------------------------------------------------------------------------ | ------ | | `POST /api/v1/verify/age/submit` | Document OCR, biometric age estimation, or combined — returns verified age range, `is_minor`, and confidence | Assure | | `POST /api/v1/verify/identity/submit` | Document authentication + face matching + liveness detection — prevents impersonation and spoofing | Assure | | `POST /api/v1/verify/session` | Manage multi-step verification sessions with liveness challenges | Assure | Verification integrates directly with detection — verify once, then pass the confirmed `age_group` to all safety endpoints for properly calibrated risk scoring. See the [Verification guide](/verification) for full details. *** ## llms.txt The [`llms.txt`](https://tuteliq.ai/llms.txt) file is a concise, structured summary of Tuteliq — like `robots.txt`, but for AI. It tells agents what the API does, which endpoints are available, and where to find detailed documentation. ``` https://tuteliq.ai/llms.txt ``` Point your AI assistant to this URL for a quick overview of all capabilities. ## llms-full.txt The [`llms-full.txt`](https://tuteliq.ai/llms-full.txt) file is the complete API reference in plain text — every endpoint, parameter, response field, and example. Ideal for agents that need full context to generate accurate API calls. ``` https://tuteliq.ai/llms-full.txt ``` If your agent supports a "documentation URL" or "context file" setting, use `llms-full.txt` for the most comprehensive coverage. ## OpenAPI Spec The full OpenAPI 3.1 specification is available at: ``` https://api.tuteliq.ai/openapi.json ``` This is the same spec that powers the [interactive API docs](https://api.tuteliq.ai/docs). Use it with any OpenAPI-compatible tool or agent framework. ## AI Plugin Manifest For agents that support the OpenAI plugin standard: ``` https://api.tuteliq.ai/.well-known/ai-plugin.json ``` ## MCP Server For AI assistants that support the [Model Context Protocol](/mcp-server) (Claude Desktop, Cursor, Windsurf), Tuteliq exposes all detection tools as MCP tools — no code required. The MCP server also provides built-in data resources (`tuteliq://documentation`, `tuteliq://context-fields`, etc.) that agents can read for full parameter references. See the [MCP setup guide](/mcp-server) for configuration instructions. ## Quick Reference | File | URL | Use Case | | ---------------- | ------------------------------------------- | ----------------------------------------------------------- | | `llms.txt` | `tuteliq.ai/llms.txt` | Quick discovery — what Tuteliq does and where to learn more | | `llms-full.txt` | `tuteliq.ai/llms-full.txt` | Full API reference for agents that need complete context | | `openapi.json` | `api.tuteliq.ai/openapi.json` | OpenAPI 3.1 spec for code generation and API clients | | `ai-plugin.json` | `api.tuteliq.ai/.well-known/ai-plugin.json` | OpenAI plugin manifest | | MCP Server | `api.tuteliq.ai/mcp` | Native tool integration for MCP-compatible assistants | # Exercise Right to Erasure (GDPR Article 17) Source: https://docs.tuteliq.ai/api-reference/account/exercise-right-to-erasure-gdpr-article-17 https://api.tuteliq.ai/docs/json delete /api/v1/account/data Permanently delete all stored account and analysis data associated with your API key. This is irreversible. All detection results, incidents, emotion records, and usage data will be purged. Returns confirmation and count of deleted records. # Export all account data (GDPR Article 20) Source: https://docs.tuteliq.ai/api-reference/account/export-all-account-data-gdpr-article-20 https://api.tuteliq.ai/docs/json get /api/v1/account/export Download a complete JSON export of all data associated with your account: detection results, incidents, emotion analyses, consent records, and usage history. Returned as a downloadable JSON file for data portability. # Get API key count quota for current tier Source: https://docs.tuteliq.ai/api-reference/account/get-api-key-count-quota-for-current-tier https://api.tuteliq.ai/docs/json get /api/v1/account/api-keys/quota Return the number of currently active API keys for the authenticated account, the per-tier maximum, and whether another key can be created. Dashboards must call this before minting a new key to enforce the plan limit. # Get current consent status Source: https://docs.tuteliq.ai/api-reference/account/get-current-consent-status https://api.tuteliq.ai/docs/json get /api/v1/account/consent Retrieve all active consent records for your account. Optionally filter by consent type. Returns consent type, version accepted, and timestamp for each record. # Get the customer-registered public key for end-to-end incident encryption Source: https://docs.tuteliq.ai/api-reference/account/get-the-customer-registered-public-key-for-end-to-end-incident-encryption https://api.tuteliq.ai/docs/json get /api/v1/account/encryption-key Returns the public key currently used to encrypt incident records, or 404 if none is registered. When no key is registered, incidents fall back to server-side encryption (Tuteliq holds the key). Register a public key with POST to switch to true end-to-end encryption — only your dashboard can decrypt. # List MCP session tokens Source: https://docs.tuteliq.ai/api-reference/account/list-mcp-session-tokens https://api.tuteliq.ai/docs/json get /api/v1/account/mcp-tokens List all MCP tokens associated with your account. These are scoped tokens issued to MCP clients like Claude Desktop. # Record user consent Source: https://docs.tuteliq.ai/api-reference/account/record-user-consent https://api.tuteliq.ai/docs/json post /api/v1/account/consent Record explicit consent for a specific processing purpose (e.g., data processing, marketing). Stores consent with timestamp, IP address, and user agent for audit compliance. Required before certain data processing activities under GDPR. # Rectify account data (GDPR Article 16) Source: https://docs.tuteliq.ai/api-reference/account/rectify-account-data-gdpr-article-16 https://api.tuteliq.ai/docs/json patch /api/v1/account/data Correct inaccurate personal data stored in your account. Specify the collection, document ID, and fields to update. Changes are audit-logged with the original and new values for compliance. # Register (or rotate) the public key Tuteliq uses to encrypt your incident records Source: https://docs.tuteliq.ai/api-reference/account/register-or-rotate-the-public-key-tuteliq-uses-to-encrypt-your-incident-records https://api.tuteliq.ai/docs/json post /api/v1/account/encryption-key Registers an RSA public key. After registration, all NEW incident records (rationale, visual_description, etc.) are encrypted with a per-record AES key, which is itself wrapped with this RSA key (hybrid scheme RSA-OAEP + AES-256-GCM). Tuteliq cannot decrypt — only your dashboard (with the matching private key) can. Rotating: POST a new key here. New incidents use the new key; old incidents remain readable with the old private key until they expire (90 days). Private key is YOUR responsibility — Tuteliq cannot recover lost-key incidents. # Rename an MCP session token Source: https://docs.tuteliq.ai/api-reference/account/rename-an-mcp-session-token https://api.tuteliq.ai/docs/json patch /api/v1/account/mcp-tokens/{tokenId} Update the display name of an MCP token. # Revoke an MCP session token Source: https://docs.tuteliq.ai/api-reference/account/revoke-an-mcp-session-token https://api.tuteliq.ai/docs/json delete /api/v1/account/mcp-tokens/{tokenId} Revoke a specific MCP token. The MCP client using this token will be disconnected. # Revoke the customer-registered public key Source: https://docs.tuteliq.ai/api-reference/account/revoke-the-customer-registered-public-key https://api.tuteliq.ai/docs/json delete /api/v1/account/encryption-key After revocation, new incidents fall back to server-side encryption (Tuteliq holds the key). Existing incidents stay encrypted under the previous key and remain readable only with its private key. Common reason to revoke: key compromise (then immediately register a new one). # View your account audit trail Source: https://docs.tuteliq.ai/api-reference/account/view-your-account-audit-trail https://api.tuteliq.ai/docs/json get /api/v1/account/audit-logs Retrieve a chronological log of all data actions performed on your account: deletions, exports, consent changes, and rectifications. Supports filtering by action type and result limiting. Essential for demonstrating GDPR compliance. # Withdraw consent for a processing purpose Source: https://docs.tuteliq.ai/api-reference/account/withdraw-consent-for-a-processing-purpose https://api.tuteliq.ai/docs/json delete /api/v1/account/consent/{type} Withdraw previously given consent for a specific processing type. The withdrawal is recorded with timestamp for audit purposes. Any processing that relied on this consent will cease. # Cloud IDS Pub/Sub push endpoint Source: https://docs.tuteliq.ai/api-reference/admin/cloud-ids-pubsub-push-endpoint https://api.tuteliq.ai/docs/json post /api/v1/admin/ids/webhook Receives threat notifications from Google Cloud IDS via Pub/Sub push subscription. Verifies the token query parameter before processing. # Cloud IDS threat statistics Source: https://docs.tuteliq.ai/api-reference/admin/cloud-ids-threat-statistics https://api.tuteliq.ai/docs/json get /api/v1/admin/ids/stats Returns summary counts of IDS threats by severity and time range. # Delete known-synthetic perceptual hashes Source: https://docs.tuteliq.ai/api-reference/admin/delete-known-synthetic-perceptual-hashes https://api.tuteliq.ai/docs/json delete /api/v1/admin/retention/phash # Get breach incident details Source: https://docs.tuteliq.ai/api-reference/admin/get-breach-incident-details https://api.tuteliq.ai/docs/json get /api/v1/admin/breach/{id} Retrieve full details of a specific breach incident including timeline, affected users, data categories, notification status, and any notes added during investigation. # Get Cloud IDS threat details Source: https://docs.tuteliq.ai/api-reference/admin/get-cloud-ids-threat-details https://api.tuteliq.ai/docs/json get /api/v1/admin/ids/threats/{id} Retrieve full details of a specific IDS threat event including raw log data. # List all recorded breach incidents Source: https://docs.tuteliq.ai/api-reference/admin/list-all-recorded-breach-incidents https://api.tuteliq.ai/docs/json get /api/v1/admin/breach/ Retrieve breach records with optional filtering by status (open, investigating, resolved, closed). Returns breach details, severity, affected user count, and current notification status. Use for breach dashboard and compliance reporting. # List Cloud IDS threats Source: https://docs.tuteliq.ai/api-reference/admin/list-cloud-ids-threats https://api.tuteliq.ai/docs/json get /api/v1/admin/ids/threats Retrieve stored IDS threat events with optional filtering by severity, date range, and limit. # Log a new data breach incident Source: https://docs.tuteliq.ai/api-reference/admin/log-a-new-data-breach-incident https://api.tuteliq.ai/docs/json post /api/v1/admin/breach/ Record a data breach for GDPR Article 33/34 compliance. Captures breach details, severity, affected users, and data categories involved. Automatically timestamps the report and initializes notification tracking. Use this as the first step in your breach response workflow. # Trigger manual data retention cleanup Source: https://docs.tuteliq.ai/api-reference/admin/trigger-manual-data-retention-cleanup https://api.tuteliq.ai/docs/json post /api/v1/admin/retention/cleanup Manually run the data retention cleanup process to purge records that have exceeded their retention period. Normally runs on a schedule, but can be triggered on-demand for compliance audits or storage management. Returns a summary of deleted records by category. # Update breach status and notification progress Source: https://docs.tuteliq.ai/api-reference/admin/update-breach-status-and-notification-progress https://api.tuteliq.ai/docs/json patch /api/v1/admin/breach/{id} Update a breach incident's status (investigating, resolved, closed) and notification progress. Add notes to document investigation findings or remediation steps. All updates are timestamped for the breach audit trail. # Get a signed liveness challenge nonce with randomized sequence Source: https://docs.tuteliq.ai/api-reference/age-verification/get-a-signed-liveness-challenge-nonce-with-randomized-sequence https://api.tuteliq.ai/docs/json get /api/v1/verify/age/challenge Returns a server-signed nonce and a randomized challenge sequence. The client must follow the prescribed order. # Get age verification mode configuration Source: https://docs.tuteliq.ai/api-reference/age-verification/get-age-verification-mode-configuration https://api.tuteliq.ai/docs/json get /api/v1/verify/age/config Returns the verification mode (full or liveness_only) and age threshold for the authenticated user. Pass `country` (ISO 3166-1 alpha-2) and optionally `region` to get market-specific overrides. # Retrieve a past age verification result Source: https://docs.tuteliq.ai/api-reference/age-verification/retrieve-a-past-age-verification-result https://api.tuteliq.ai/docs/json get /api/v1/verify/age/{verificationId} Returns the age bracket, is_minor status, and verification metadata. No PII returned. # Submit documents for age verification Source: https://docs.tuteliq.ai/api-reference/age-verification/submit-documents-for-age-verification https://api.tuteliq.ai/docs/json post /api/v1/verify/age/submit Privacy-first age verification. Returns only age bracket (18+, 13-17, under_13), is_minor status, liveness, and face match. No PII (name, DOB, document number) is returned. # Validate a document image (per-step validation) Source: https://docs.tuteliq.ai/api-reference/age-verification/validate-a-document-image-per-step-validation https://api.tuteliq.ai/docs/json post /api/v1/verify/age/validate-document Checks image quality (resolution, luminance, contrast) without running OCR. Free — no credits consumed. # Validate a selfie image (per-step validation) Source: https://docs.tuteliq.ai/api-reference/age-verification/validate-a-selfie-image-per-step-validation https://api.tuteliq.ai/docs/json post /api/v1/verify/age/validate-selfie Checks if a face is detected in the image. Free — no credits consumed. # Get a single device's latest attestation Source: https://docs.tuteliq.ai/api-reference/agent/get-a-single-devices-latest-attestation https://api.tuteliq.ai/docs/json get /api/v1/agent/fleet/{deviceId} Returns the latest attestation for one device in the caller's org. 404 if the device has never checked in (or belongs to another org). # List the org's device fleet with a compliance summary Source: https://docs.tuteliq.ai/api-reference/agent/list-the-orgs-device-fleet-with-a-compliance-summary https://api.tuteliq.ai/docs/json get /api/v1/agent/fleet Returns every device's latest attestation for the caller's org (newest first) plus a rollup summary (total / compliant / non-compliant / compliance %). Read-only, deterministic, no LLM. Scoped to the API key's org. # Report a device attestation (endpoint agent check-in) Source: https://docs.tuteliq.ai/api-reference/agent/report-a-device-attestation-endpoint-agent-check-in https://api.tuteliq.ai/docs/json post /api/v1/agent/check-in The tuteliq-agent CLI evaluates the org's device-safety policy locally and reports the pass/fail result here. One latest-state record is kept per device (upsert, no history). The org is derived from the authenticated API key — any org_id in the body is ignored. No user content is stored; only device posture (policy rule results, versions, platform). # Fan-out analysis across multiple detection endpoints Source: https://docs.tuteliq.ai/api-reference/analyse/fan-out-analysis-across-multiple-detection-endpoints https://api.tuteliq.ai/docs/json post /api/v1/detection/multi Submit text to multiple detection endpoints in a single request. All endpoints run in parallel via Promise.allSettled. If vulnerability-exploitation is included and succeeds, its cross_endpoint_modifier is applied to all other results' severity scores (clamped to 1.0). Maximum 10 endpoints per request. # Analyze emotional patterns and mental health indicators in conversation Source: https://docs.tuteliq.ai/api-reference/analysis/analyze-emotional-patterns-and-mental-health-indicators-in-conversation https://api.tuteliq.ai/docs/json post /api/v1/analysis/emotions Analyze a conversation for dominant emotions, sentiment trajectory (improving/stable/worsening), and early mental health risk indicators. Surfaces persistent patterns of sadness, anxiety, anger, or withdrawal that may indicate depression or declining wellbeing. Returns emotion scores, trend analysis, a human-readable summary, and recommended follow-up actions. # Fetch an EU AI Act Art 12 audit receipt Source: https://docs.tuteliq.ai/api-reference/audit/fetch-an-eu-ai-act-art-12-audit-receipt https://api.tuteliq.ai/docs/json get /api/v1/audit/receipts/{request_id} Returns the signed audit receipt for a past inference. Only the deployer that produced the receipt can fetch it (api-key fingerprint match enforced; non-matches return 404 to avoid existence leaks). Receipts are signature-verified before return; tampered storage triggers a 500 with code AUDIT_RECEIPT_FAILED. # Analyze up to 50 items in a single request Source: https://docs.tuteliq.ai/api-reference/batch/analyze-up-to-50-items-in-a-single-request https://api.tuteliq.ai/docs/json post /api/v1/batch/analyze Submit multiple analysis tasks in one API call with optional parallel processing. Each item specifies its type (bullying, grooming, unsafe, or emotions) and data. Returns individual results for each item plus a summary with total/successful/failed counts and processing time. Ideal for content moderation backlogs, message queue processing, and bulk imports. # Get Data Processing Agreement summary Source: https://docs.tuteliq.ai/api-reference/compliance/get-data-processing-agreement-summary https://api.tuteliq.ai/docs/json get /api/v1/compliance/dpa Returns a machine-readable summary of the Tuteliq Data Processing Agreement (DPA) including data controller/processor roles, processing purposes, sub-processors, security measures, retention policies, and data subject rights. No authentication required — transparency by design. # Get data retention schedule Source: https://docs.tuteliq.ai/api-reference/compliance/get-data-retention-schedule https://api.tuteliq.ai/docs/json get /api/v1/compliance/retention Returns the data retention policy detailing how long each category of data is stored and when it is automatically purged. Covers detection results, audit logs, usage metrics, and account data. No authentication required. # List current sub-processors Source: https://docs.tuteliq.ai/api-reference/compliance/list-current-sub-processors https://api.tuteliq.ai/docs/json get /api/v1/compliance/sub-processors Returns the current list of third-party sub-processors used by Tuteliq, including their purpose and data processing location. Required for GDPR Article 28 transparency. No authentication required. # Delete apiv1fraudapp detection Source: https://docs.tuteliq.ai/api-reference/delete-apiv1fraudapp-detection https://api.tuteliq.ai/docs/json delete /api/v1/fraud/app-detection # Delete mcp Source: https://docs.tuteliq.ai/api-reference/delete-mcp https://api.tuteliq.ai/docs/json delete /mcp/ # Detect app fraud and financial scam patterns Source: https://docs.tuteliq.ai/api-reference/fraud/detect-app-fraud-and-financial-scam-patterns https://api.tuteliq.ai/docs/json post /api/v1/fraud/app-fraud Analyzes text content for app fraud indicators including payment coercion, account takeover, safe account scams, invoice fraud, impersonation, investment pressure, and emotional financial exploitation. # Detect money mule recruitment attempts Source: https://docs.tuteliq.ai/api-reference/fraud/detect-money-mule-recruitment-attempts https://api.tuteliq.ai/docs/json post /api/v1/fraud/mule-recruitment Analyzes text content for money mule recruitment indicators including easy money promises, account access requests, multi-level recruitment, risk minimisation, secrecy demands, social pressure, and coercion. # Detect romance scam indicators in conversation Source: https://docs.tuteliq.ai/api-reference/fraud/detect-romance-scam-indicators-in-conversation https://api.tuteliq.ai/docs/json post /api/v1/fraud/romance-scam Analyzes text and conversation history for romance scam patterns including love bombing, isolation, fabricated crises, investment lures, identity deception, financial grooming, guilt manipulation, and crypto redirect tactics. # Detect social engineering tactics in text Source: https://docs.tuteliq.ai/api-reference/fraud/detect-social-engineering-tactics-in-text https://api.tuteliq.ai/docs/json post /api/v1/fraud/social-engineering Analyzes text content for social engineering manipulation tactics including authority impersonation, urgency fabrication, pretexting, information elicitation, trust exploitation, fear induction, and quid pro quo patterns. # Get apiv1fraudapp detection Source: https://docs.tuteliq.ai/api-reference/get-apiv1fraudapp-detection https://api.tuteliq.ai/docs/json get /api/v1/fraud/app-detection # Get mcp Source: https://docs.tuteliq.ai/api-reference/get-mcp https://api.tuteliq.ai/docs/json get /mcp/ # Get mcpsse Source: https://docs.tuteliq.ai/api-reference/get-mcpsse https://api.tuteliq.ai/docs/json get /mcp/sse # Get oauthauthorize Source: https://docs.tuteliq.ai/api-reference/get-oauthauthorize https://api.tuteliq.ai/docs/json get /oauth/authorize # Get well knownoauth authorization server Source: https://docs.tuteliq.ai/api-reference/get-well-knownoauth-authorization-server https://api.tuteliq.ai/docs/json get /.well-known/oauth-authorization-server # Get well knownoauth protected resource Source: https://docs.tuteliq.ai/api-reference/get-well-knownoauth-protected-resource https://api.tuteliq.ai/docs/json get /.well-known/oauth-protected-resource # Get well knownoauth protected resourcemcp Source: https://docs.tuteliq.ai/api-reference/get-well-knownoauth-protected-resourcemcp https://api.tuteliq.ai/docs/json get /.well-known/oauth-protected-resource/mcp # Generate age-appropriate action plan for a safety situation Source: https://docs.tuteliq.ai/api-reference/guidance/generate-age-appropriate-action-plan-for-a-safety-situation https://api.tuteliq.ai/docs/json post /api/v1/guidance/action-plan Generate a step-by-step action plan tailored to the audience: child-friendly guidance (with reading-level calibration), parent advice, or platform trust & safety team procedures. Adjusts tone, vocabulary, and recommended steps based on the child's age and incident severity. Goes beyond detection to answer "what should we do next?" # Dependency status (admin) Source: https://docs.tuteliq.ai/api-reference/health/dependency-status-admin https://api.tuteliq.ai/docs/json get /health/dependencies Returns detailed status of each dependency with configuration info. Requires admin authentication via X-Admin-Secret header or Authorization: Bearer token. Other health endpoints (/live, /ready, /health) remain public. # Health check Source: https://docs.tuteliq.ai/api-reference/health/health-check https://api.tuteliq.ai/docs/json get /health Returns detailed health status of all dependencies # Liveness probe Source: https://docs.tuteliq.ai/api-reference/health/liveness-probe https://api.tuteliq.ai/docs/json get /live Returns 200 if the service process is running. Use for Kubernetes liveness probe. # Readiness probe Source: https://docs.tuteliq.ai/api-reference/health/readiness-probe https://api.tuteliq.ai/docs/json get /ready Returns 200 if the service is ready to accept traffic. Checks critical dependencies. # Retrieve a past identity verification result Source: https://docs.tuteliq.ai/api-reference/identity-verification/retrieve-a-past-identity-verification-result https://api.tuteliq.ai/docs/json get /api/v1/verify/identity/{verificationId} Returns full identity verification data. Business/Enterprise only. # Submit documents for identity verification Source: https://docs.tuteliq.ai/api-reference/identity-verification/submit-documents-for-identity-verification https://api.tuteliq.ai/docs/json post /api/v1/verify/identity/submit Full KYC identity verification. Returns full name, date of birth, document type, country code, liveness, and face match. Available on Business and Enterprise plans only. # Validate a document image (per-step validation) Source: https://docs.tuteliq.ai/api-reference/identity-verification/validate-a-document-image-per-step-validation https://api.tuteliq.ai/docs/json post /api/v1/verify/identity/validate-document Checks image quality (resolution, luminance, contrast) without running OCR. Free — no credits consumed. # Validate a selfie image (per-step validation) Source: https://docs.tuteliq.ai/api-reference/identity-verification/validate-a-selfie-image-per-step-validation https://api.tuteliq.ai/docs/json post /api/v1/verify/identity/validate-selfie Checks if a face is detected in the image. Free — no credits consumed. # Get the full detail for a single incident (read-only) Source: https://docs.tuteliq.ai/api-reference/incidents/get-the-full-detail-for-a-single-incident-read-only https://api.tuteliq.ai/docs/json get /api/v1/incidents/{incident_id} Returns the full incident document for the caller's account. Server-encrypted fields (summary, metadata, source_data) are decrypted server-side. BYOK fields are returned as hybrid envelopes for client-side decryption — see `_e2e_envelope_fields` in the response for which to decrypt locally. 404 if the incident does not exist or does not belong to this account. # KPI overview of incidents in a time window Source: https://docs.tuteliq.ai/api-reference/incidents/kpi-overview-of-incidents-in-a-time-window https://api.tuteliq.ai/docs/json get /api/v1/incidents/overview Counts by category, severity, source, and status, plus top platforms and 24h/7d/30d totals. Defaults to the last 30 days. Read-only; no LLM call. # List the caller's incidents (newest first, paginated) Source: https://docs.tuteliq.ai/api-reference/incidents/list-the-callers-incidents-newest-first-paginated https://api.tuteliq.ai/docs/json get /api/v1/incidents/ Read-only paginated listing of incidents recorded under this API key's account. Each row is non-PII metadata by default; pass `include_summary=true` to include the decrypted incident summary (extra credits per row). BYOK incidents return the hybrid envelope on the summary field and list the field name in `_e2e_envelope_fields`. # Submit a moderator review of an incident (Art 14 human oversight) Source: https://docs.tuteliq.ai/api-reference/incidents/submit-a-moderator-review-of-an-incident-art-14-human-oversight https://api.tuteliq.ai/docs/json post /api/v1/incidents/{incident_id}/review Records a deployer-side moderator decision (confirm / downgrade / escalate / reclassify / dismiss) on a model-produced incident. The override is persisted to the incident document and a separate signed Art 12 audit receipt is emitted linking back to the original. The optional reason_comment is encrypted with the customer's registered public key (end-to-end) when enabled; otherwise server-side AES. # Submit the same moderator review across multiple incidents (Art 14, bulk) Source: https://docs.tuteliq.ai/api-reference/incidents/submit-the-same-moderator-review-across-multiple-incidents-art-14-bulk https://api.tuteliq.ai/docs/json post /api/v1/incidents/batch-review Applies the same review action + reason to up to 100 incidents in one call. Each incident emits its own signed Art 12 audit receipt — bulk is a UX shortcut, not a compliance shortcut. Per-incident success/error is returned so a partial failure can be retried without re-running successful items. # Time-series buckets of incident volume Source: https://docs.tuteliq.ai/api-reference/incidents/time-series-buckets-of-incident-volume https://api.tuteliq.ai/docs/json get /api/v1/incidents/trends Returns time-bucketed counts of incidents (with per-bucket severity breakdown). Bucket sizes: hour, day (default), week. Useful for rendering trend charts in dashboards. # API Reference Source: https://docs.tuteliq.ai/api-reference/introduction Complete reference for all Tuteliq API endpoints — authentication, rate limits, error handling, and endpoint groups The Tuteliq API provides AI-powered child safety detection across text, voice, images, and video. This page covers everything you need to know before making your first call. ## Base URL ``` https://api.tuteliq.ai/api/v1 ``` All endpoints are prefixed with `/api/v1`. For example, the bullying detection endpoint is at: ``` POST https://api.tuteliq.ai/api/v1/safety/bullying ``` ## Authentication Include your API key in every request using one of these methods: ```bash Bearer Token (Recommended) theme={"dark"} curl -X POST https://api.tuteliq.ai/api/v1/safety/bullying \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"text": "message to analyze"}' ``` ```bash API Key Header theme={"dark"} curl -X POST https://api.tuteliq.ai/api/v1/safety/bullying \ -H "x-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"text": "message to analyze"}' ``` Get your API key from the [Tuteliq Dashboard](https://tuteliq.ai/dashboard). ## Response Format ### Successful response All detection endpoints return a consistent response shape: ```json theme={"dark"} { "endpoint": "bullying", "detected": true, "severity": 0.78, "confidence": 0.92, "risk_score": 0.85, "level": "high", "categories": [ { "tag": "DIRECT_INSULT", "label": "Direct Insult", "confidence": 0.95 }, { "tag": "EXCLUSION", "label": "Social Exclusion", "confidence": 0.72 } ], "evidence": [ { "text": "nobody wants you here", "tactic": "EXCLUSION", "weight": 0.88 } ], "age_calibration": { "applied": true, "age_group": "10-12", "multiplier": 1.3 }, "recommended_action": "flag_for_review", "rationale": "Direct insults combined with social exclusion targeting a 10-12 year old.", "credits_used": 1, "processing_time_ms": 387 } ``` ### Error response ```json theme={"dark"} { "error": { "code": "RATE_LIMIT_EXCEEDED", "message": "You have exceeded your rate limit of 300 requests per minute.", "request_id": "req_abc123", "suggestion": "Upgrade to Assure for 5,000 requests per minute.", "links": { "upgrade": "https://tuteliq.ai/dashboard/billing", "docs": "https://docs.tuteliq.ai/error-handling" } } } ``` ## Context Fields Pass a `context` object with any detection request to improve accuracy: ```json theme={"dark"} { "text": "message to analyze", "context": { "age_group": "13-15", "language": "en", "country": "GB", "platform": "Discord", "conversation_history": [ { "role": "user", "text": "previous message" }, { "role": "contact", "text": "response message" } ] } } ``` | Field | Type | Description | | ---------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | | `age_group` | string | `"under 10"`, `"10-12"`, `"13-15"`, `"16-17"`, or `"under 18"`. Triggers age-calibrated severity scoring. | | `language` | string | ISO 639-1 code (e.g., `"en"`, `"de"`, `"sv"`). Auto-detected if omitted. [32 languages supported](/languages). | | `platform` | string | Platform name (e.g., `"Discord"`, `"Roblox"`, `"WhatsApp"`). Adjusts for platform-specific norms. | | `conversation_history` | array | Prior messages for context-aware analysis. Each message needs `role` and `text`. | | `sender_trust` | string | `"verified"`, `"trusted"`, or `"unknown"`. Verified senders suppress authority impersonation false positives. | | `sender_name` | string | Sender identifier, used alongside `sender_trust` for impersonation scoring. | | `country` | string | ISO 3166-1 alpha-2 country code (e.g., `"GB"`, `"US"`, `"SE"`). Enables geo-localised crisis helpline data. Falls back to user profile country if omitted. | ## Options | Field | Type | Default | Description | | ------------------- | ------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | `include_evidence` | boolean | `true` | Include evidence excerpts with flagged phrases and weights | | `support_threshold` | string | `"high"` | Minimum severity to include crisis helplines. Values: `low`, `medium`, `high`, `critical`. Critical severity **always** includes support resources. | ## Stateless by Design Tuteliq is **fully stateless** — every API call is independent, and no conversation text, context, or session state is retained between requests. This is a deliberate **privacy-by-design** decision, not a missing feature. **Why stateless?** * **GDPR compliance** — Processing children's data under GDPR/COPPA demands the strictest data minimization. By retaining no cross-request state, there is zero risk of sensitive conversation data persisting in caches, logs, or backups. * **No data retention surface** — There is no session store to breach, no conversation cache to leak, and no accumulated history to subpoena. Each request arrives, is analyzed, and the content is discarded. * **Simpler compliance audits** — "We store nothing between requests" is the easiest privacy posture to audit and certify. **What this means for developers:** * Pass `context` (age\_group, platform, language, conversation\_history) with **every request** that needs it. * Use `external_id` and `customer_id` to correlate results with your own systems — these are echoed back but not stored. * If you need to track risk escalation across a conversation, aggregate results on your side using the `severity`, `risk_score`, and `level` fields returned by each call. **This is intentional.** Many child safety APIs offer session-based context accumulation. We chose not to — because when you're processing messages from minors, the safest data is data you never store. Your integration handles context; Tuteliq handles detection. ## Sandbox Mode API keys with `environment: "sandbox"` run real analysis without consuming credits. Sandbox responses include `"sandbox": true` and the `X-Sandbox-Mode: true` header. Create a sandbox key in your [Dashboard](https://tuteliq.ai/dashboard) under **Settings > API Keys > Environment: Sandbox**. Sandbox limits: * **10 requests per minute** rate limit * **50 calls per day** (resets at midnight UTC) * Real analysis, real results — not mocked Sandbox mode is for integration testing only. Daily limits prevent use as a free production workaround. ## Rate Limits Rate limits are enforced per API key per minute, based on your plan: | Plan | Requests/min | Detection credits/mo | | ----------------- | ------------ | -------------------- | | Build (\$99/mo) | 1,000 | 25,000 | | Assure (\$499/mo) | 5,000 | 150,000 | | Enterprise | 10,000 | Custom | | Sandbox | 10 | No credits consumed | Your allowance is measured in **detection credits**, not requests. Endpoints are weighted by cost: a text detection is 1 credit, an image 7, a video 95. See [pricing](https://tuteliq.ai/pricing) for the current plans. Accounts on a legacy plan (Starter, Indie, Pro, Business) keep their existing limits. Those plans are closed to new signups. Every response includes rate limit headers: ``` X-RateLimit-Limit: 1000 X-RateLimit-Remaining: 994 X-RateLimit-Reset: 1710000060 ``` When exceeded, the API returns `429 Too Many Requests` with a `Retry-After` header. ## Credits Each endpoint consumes a different number of credits: | Endpoint | Credits | Notes | | ------------------------------------------------- | ----------------------- | -------------------------------------------------------------------------- | | Text detection (bullying, grooming, unsafe, etc.) | 1 | Per call | | Grooming / Emotions (with history) | 1 per 10 messages | `ceil(messages / 10)`, minimum 1 | | Action plan | 2 | Longer generation | | Incident report | 3 | Structured output | | Synthetic content (text) | 2 | AI-generated text detection | | Synthetic content (image) | 5 | Forensic vision + classification | | Synthetic content (audio) | 4 | Transcription + classification | | Synthetic content (video) | 2 + 3/frame + 2 (audio) | Frame extraction + forensic vision + transcription | | Image analysis | 3 | Vision + OCR + safety | | Voice analysis | 5 | Transcription + safety | | Age verification | 5 | Document/biometric | | Document analysis | Dynamic | `max(3, pages × endpoints)` — [details](/document-analysis#credit-pricing) | | Video analysis | 10 | Frame extraction + per-frame analysis | | Identity verification | 10 | Document auth + face match + liveness | Every response includes `credits_used` and credit balance headers: ``` X-Credits-Remaining: 49,234 X-Monthly-Used: 766 X-Monthly-Limit: 50,000 ``` ## Common Error Codes | Code | HTTP | Description | | ----------------------- | ---- | -------------------------------------------- | | `AUTH_REQUIRED` | 401 | No API key provided | | `AUTH_INVALID_KEY` | 401 | API key is invalid or unrecognized | | `AUTH_EXPIRED_KEY` | 401 | API key has expired | | `AUTH_INACTIVE_KEY` | 401 | API key is inactive | | `RATE_LIMIT_EXCEEDED` | 429 | Rate limit exceeded for your tier | | `MESSAGE_LIMIT_REACHED` | 429 | Monthly credit limit reached | | `TIER_ACCESS_DENIED` | 403 | Endpoint not available on your tier | | `VAL_INVALID_INPUT` | 400 | Request body or parameters failed validation | | `SVC_INTERNAL_ERROR` | 500 | Unexpected internal error (safe to retry) | For the full error reference and retry strategies, see [Error Handling](/error-handling). ## Endpoint Groups Endpoint pages are auto-generated from the OpenAPI specification and appear in the sidebar. Each page includes request/response schemas, parameter descriptions, and an interactive playground. Bullying, grooming, unsafe content, voice, image, and video analysis. Covers all 9 KOSA harm categories. Detect AI-generated text, deepfake images, cloned voice audio, and manipulated video across all four modalities. Social engineering, app fraud, romance scams, and money mule recruitment targeting minors. Gambling harm, coercive control, vulnerability exploitation, and radicalisation detection. Upload PDFs for per-page multi-endpoint safety detection with chain-of-custody hashing. Fan-out a single text to up to 10 detectors in parallel with aggregated results. Emotional trend analysis — dominant emotions, sentiment trajectory, depression/anxiety indicators. Age-appropriate action plans for children, parents, or professionals. Professional incident reports for schools, counselors, and moderators. Age verification (document + biometric) and identity verification (face match + liveness). Analyze up to 50 items in a single request with parallel processing. HMAC-signed webhook alerts for critical incidents, with retry and secret rotation. Credit balance, daily summaries, per-tool breakdowns, and billing period usage. GDPR data subject rights — erasure, portability, rectification, consent, audit trail. Liveness probes, readiness checks, and component-level status. # Patch apiv1fraudapp detection Source: https://docs.tuteliq.ai/api-reference/patch-apiv1fraudapp-detection https://api.tuteliq.ai/docs/json patch /api/v1/fraud/app-detection # Create a policy rule Source: https://docs.tuteliq.ai/api-reference/policy-rules/create-a-policy-rule https://api.tuteliq.ai/docs/json post /api/v1/policy/automation/ Create a new declarative policy rule. Rules are evaluated during detection and the highest-priority matching rule determines the policy_action in the response. # Delete a policy rule Source: https://docs.tuteliq.ai/api-reference/policy-rules/delete-a-policy-rule https://api.tuteliq.ai/docs/json delete /api/v1/policy/automation/{ruleId} Permanently delete a policy rule. # Get a policy rule Source: https://docs.tuteliq.ai/api-reference/policy-rules/get-a-policy-rule https://api.tuteliq.ai/docs/json get /api/v1/policy/automation/{ruleId} Retrieve a specific policy rule by ID. # List all policy rules Source: https://docs.tuteliq.ai/api-reference/policy-rules/list-all-policy-rules https://api.tuteliq.ai/docs/json get /api/v1/policy/automation/ Returns all policy rules for the authenticated user, sorted by priority (ascending). # Test-evaluate policy rules Source: https://docs.tuteliq.ai/api-reference/policy-rules/test-evaluate-policy-rules https://api.tuteliq.ai/docs/json post /api/v1/policy/automation/evaluate Evaluate your policy rules against a mock detection result. Useful for testing rules before going live. # Update a policy rule Source: https://docs.tuteliq.ai/api-reference/policy-rules/update-a-policy-rule https://api.tuteliq.ai/docs/json put /api/v1/policy/automation/{ruleId} Update an existing policy rule. Partial updates are supported. # Get current detection policy configuration Source: https://docs.tuteliq.ai/api-reference/policy/get-current-detection-policy-configuration https://api.tuteliq.ai/docs/json get /api/v1/policy/ Retrieve your active policy configuration including sensitivity thresholds, enabled categories, and custom moderation rules. Policies control how the safety endpoints evaluate and score content for your specific use case. # Update detection policy configuration Source: https://docs.tuteliq.ai/api-reference/policy/update-detection-policy-configuration https://api.tuteliq.ai/docs/json put /api/v1/policy/ Apply new policy settings to customize detection behavior. Changes take effect immediately for all subsequent API calls. Use to adjust sensitivity thresholds, enable/disable specific harm categories, or set custom moderation rules for your platform. # Post apiv1fraudapp detection Source: https://docs.tuteliq.ai/api-reference/post-apiv1fraudapp-detection https://api.tuteliq.ai/docs/json post /api/v1/fraud/app-detection # Post mcp Source: https://docs.tuteliq.ai/api-reference/post-mcp https://api.tuteliq.ai/docs/json post /mcp/ # Post mcpmessages Source: https://docs.tuteliq.ai/api-reference/post-mcpmessages https://api.tuteliq.ai/docs/json post /mcp/messages # Post oauthauthorize Source: https://docs.tuteliq.ai/api-reference/post-oauthauthorize https://api.tuteliq.ai/docs/json post /oauth/authorize # Post oauthregister Source: https://docs.tuteliq.ai/api-reference/post-oauthregister https://api.tuteliq.ai/docs/json post /oauth/register # Post oauthtoken Source: https://docs.tuteliq.ai/api-reference/post-oauthtoken https://api.tuteliq.ai/docs/json post /oauth/token # Fetch the Tuteliq prescreen lexicon Source: https://docs.tuteliq.ai/api-reference/prescreen/fetch-the-tuteliq-prescreen-lexicon https://api.tuteliq.ai/docs/json get /api/v1/prescreen/lexicon Returns the current SDK-side prescreen lexicon: a set of high-precision phrase patterns mapped to category flags. SDKs run this client-side before calling detection endpoints — clearly-benign content can short-circuit the API call entirely, and positive signals can be attached to the request as structured hints. Public endpoint; lexicon is non-secret reference data. # Get detailed pricing plans Source: https://docs.tuteliq.ai/api-reference/pricing/get-detailed-pricing-plans https://api.tuteliq.ai/docs/json get /api/v1/pricing/details Returns detailed pricing plan information including limits and endpoints. # Get pricing plans Source: https://docs.tuteliq.ai/api-reference/pricing/get-pricing-plans https://api.tuteliq.ai/docs/json get /api/v1/pricing/ Returns all active pricing plans. This endpoint is public and does not require authentication. # Put apiv1fraudapp detection Source: https://docs.tuteliq.ai/api-reference/put-apiv1fraudapp-detection https://api.tuteliq.ai/docs/json put /api/v1/fraud/app-detection # Generate professional incident report from conversation data Source: https://docs.tuteliq.ai/api-reference/reports/generate-professional-incident-report-from-conversation-data https://api.tuteliq.ai/docs/json post /api/v1/reports/incident Convert raw conversation messages into a structured incident report suitable for school counselors, moderators, or trust & safety teams. Returns a narrative summary, overall risk level, categorized findings, and recommended next steps. Accepts optional metadata (conversation ID, child age, timestamp range) for richer context. # Get anonymised global risk trends Source: https://docs.tuteliq.ai/api-reference/risk-profile/get-anonymised-global-risk-trends https://api.tuteliq.ai/docs/json get /api/v1/safety/risk-trends Returns aggregated, fully anonymised risk signal trends across all customers. No PII is stored or returned. Available to Business tier and above. # DEPRECATED — endpoint renamed to /distress-signals Source: https://docs.tuteliq.ai/api-reference/safety-extended/deprecated-—-endpoint-renamed-to-distress-signals https://api.tuteliq.ai/docs/json post /api/v1/safety/emotional-distress This endpoint was renamed to /safety/distress-signals. Returns HTTP 410 Gone. Request and response shapes on the new endpoint are unchanged — update your integration to POST /safety/distress-signals instead. # Detect coercive control patterns Source: https://docs.tuteliq.ai/api-reference/safety-extended/detect-coercive-control-patterns https://api.tuteliq.ai/docs/json post /api/v1/safety/coercive-control Analyzes text and conversation history for coercive control patterns including monitoring, isolation, financial control, threats, degradation, micromanagement, gaslighting, and child weaponisation. # Detect exploitation of vulnerable individuals Source: https://docs.tuteliq.ai/api-reference/safety-extended/detect-exploitation-of-vulnerable-individuals https://api.tuteliq.ai/docs/json post /api/v1/safety/vulnerability-exploitation Analyzes text for vulnerability exploitation including age targeting, emotional exploitation, cognitive exploitation, situational vulnerability, trust abuse, and information asymmetry. Returns additional cross-endpoint modifier and vulnerability profile. # Detect gambling harm indicators Source: https://docs.tuteliq.ai/api-reference/safety-extended/detect-gambling-harm-indicators https://api.tuteliq.ai/docs/json post /api/v1/safety/gambling-harm Analyzes text content for gambling harm indicators including chasing losses, desperation, borrowing, loss of control, relationship impact, financial harm, and denial patterns. # Detect linguistic distress-signal patterns (pre-vulnerability indicators) Source: https://docs.tuteliq.ai/api-reference/safety-extended/detect-linguistic-distress-signal-patterns-pre-vulnerability-indicators https://api.tuteliq.ai/docs/json post /api/v1/safety/distress-signals Analyses text for the presence of linguistic patterns historically associated with distress (loneliness expressions, isolation language, hopelessness phrases, trust-seeking openers, withdrawal references, family-conflict mentions). Returns pattern detections and, where applicable, downstream exploitation-risk assessment (grooming, sextortion, trafficking, radicalisation). Does NOT infer the author’s inner emotional state. Intended for child-safety contexts as a safety component (EU AI Act Art 5(1)(f) safety exception); not intended for workplace or general education monitoring. # Detect radicalisation and extremism indicators Source: https://docs.tuteliq.ai/api-reference/safety-extended/detect-radicalisation-and-extremism-indicators https://api.tuteliq.ai/docs/json post /api/v1/safety/radicalisation Analyzes text and conversation history for radicalisation indicators including ideological seeding, identity exploitation, in-group bonding, out-group dehumanisation, grievance amplification, violence normalisation, operational planning, and isolation from moderating influences. # Detect tech-facilitated gender-based violence Source: https://docs.tuteliq.ai/api-reference/safety-extended/detect-tech-facilitated-gender-based-violence https://api.tuteliq.ai/docs/json post /api/v1/safety/tfgbv Analyzes text for tech-facilitated gender-based violence (TFGBV) patterns including image-based abuse, cyber stalking, online harassment, doxing, impersonation, outing, post-separation abuse, sextortion, digital coercion, sexualised deepfakes, and gendered hate speech. Returns TFGBV amplifier assessment and intersectionality flags. # Analyze a PDF document for safety and compliance concerns Source: https://docs.tuteliq.ai/api-reference/safety/analyze-a-pdf-document-for-safety-and-compliance-concerns https://api.tuteliq.ai/docs/json post /api/v1/safety/document Upload a PDF (max 50MB, max 100 pages) for multi-endpoint safety analysis. Extracts text from each page (text layer or OCR fallback), runs detection endpoints in parallel, and returns per-page results with an overall risk assessment. Response includes a SHA-256 document hash for chain-of-custody verification. Zero-retention: no document data is stored after processing. # Analyze image for visual and textual safety concerns Source: https://docs.tuteliq.ai/api-reference/safety/analyze-image-for-visual-and-textual-safety-concerns https://api.tuteliq.ai/docs/json post /api/v1/safety/image 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. # Analyze video for visual safety concerns across extracted frames Source: https://docs.tuteliq.ai/api-reference/safety/analyze-video-for-visual-safety-concerns-across-extracted-frames https://api.tuteliq.ai/docs/json post /api/v1/safety/video Upload a video file (mp4, webm, quicktime, avi — max 100MB, max 10 min). Extracts key frames at even intervals and runs vision analysis on each frame. Returns per-frame results, flagged timestamps, and an aggregated overall risk score. Ideal for moderating uploaded video content, screen recordings, and video messages. # Analyze voice/audio for safety concerns with transcription Source: https://docs.tuteliq.ai/api-reference/safety/analyze-voiceaudio-for-safety-concerns-with-transcription https://api.tuteliq.ai/docs/json post /api/v1/safety/voice Upload an audio file (mp3, wav, m4a, ogg, flac, webm, mp4 — max 25MB) for automatic transcription followed by full safety analysis on the transcript. Returns timestamped segments, per-category analysis (bullying, grooming, unsafe, emotions), and an overall risk score. Ideal for monitoring voice chats, audio messages, and recorded conversations. # Detect AI-generated or cloned voice audio Source: https://docs.tuteliq.ai/api-reference/safety/detect-ai-generated-or-cloned-voice-audio https://api.tuteliq.ai/docs/json post /api/v1/safety/synthetic-content/audio Multi-signal audio analysis: transcription-based text analysis plus spectral analysis (mel spectrogram semantic analysis, audio statistics for TTS indicators). Classifies as confirmed_synthetic, suspected_synthetic, unknown, or confirmed_authentic. # Detect AI-generated or synthetic content Source: https://docs.tuteliq.ai/api-reference/safety/detect-ai-generated-or-synthetic-content https://api.tuteliq.ai/docs/json post /api/v1/safety/synthetic-content Analyzes text for AI-generated content indicators including LLM-generated text, synthetic identities, AI-enhanced grooming scripts, and synthetic CSAM. Classifies content as confirmed_synthetic, suspected_synthetic, unknown, or confirmed_authentic. # Detect AI-generated or synthetic images Source: https://docs.tuteliq.ai/api-reference/safety/detect-ai-generated-or-synthetic-images https://api.tuteliq.ai/docs/json post /api/v1/safety/synthetic-content/image Multi-signal forensic analysis: semantic analysis, EXIF metadata, pixel statistics, C2PA Content Credentials, watermark detection, and perceptual hashing. Classifies as confirmed_synthetic, suspected_synthetic, unknown, or confirmed_authentic. # Detect bullying, harassment, and intimidation in text Source: https://docs.tuteliq.ai/api-reference/safety/detect-bullying-harassment-and-intimidation-in-text https://api.tuteliq.ai/docs/json post /api/v1/safety/bullying Analyze a message for bullying indicators including verbal abuse, social exclusion, threats, and cyberbullying patterns. Returns severity (low/medium/high/critical), bullying type classification, confidence score, and a recommended action. Risk scores are age-calibrated when context.ageGroup is provided. # Detect deepfake or AI-generated video Source: https://docs.tuteliq.ai/api-reference/safety/detect-deepfake-or-ai-generated-video https://api.tuteliq.ai/docs/json post /api/v1/safety/synthetic-content/video Multi-signal forensic video analysis: per-frame semantic analysis, temporal face consistency, lip-sync correlation, audio spectral analysis, and transcription. Classifies as confirmed_synthetic, suspected_synthetic, unknown, or confirmed_authentic. # Detect grooming patterns in conversations Source: https://docs.tuteliq.ai/api-reference/safety/detect-grooming-patterns-in-conversations https://api.tuteliq.ai/docs/json post /api/v1/safety/grooming 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. # Detect KOSA-aligned harm signals in text Source: https://docs.tuteliq.ai/api-reference/safety/detect-kosa-aligned-harm-signals-in-text https://api.tuteliq.ai/docs/json post /api/v1/safety/unsafe Comprehensive safety analysis covering all KOSA harm categories: self-harm and suicidal ideation, eating disorders, substance use, depression/anxiety indicators, compulsive usage patterns, sexual content, violence, and hate speech. Returns categorized findings with age-calibrated severity scoring. This is the recommended default endpoint for broad content moderation. # Get detection settings Source: https://docs.tuteliq.ai/api-reference/settings/get-detection-settings https://api.tuteliq.ai/docs/json get /api/v1/settings/detection Get your account-level detection settings. These control which detection endpoints are active for your account. Disabled endpoints are automatically skipped in /analyse/multi and return not_detected on individual calls. # Reset detection settings to defaults Source: https://docs.tuteliq.ai/api-reference/settings/reset-detection-settings-to-defaults https://api.tuteliq.ai/docs/json delete /api/v1/settings/detection Remove all custom detection settings. All endpoints will be active. # Update detection settings Source: https://docs.tuteliq.ai/api-reference/settings/update-detection-settings https://api.tuteliq.ai/docs/json put /api/v1/settings/detection Configure which detection endpoints are active for your account. Use `enabled_endpoints` (whitelist — only these run) OR `disabled_endpoints` (blacklist — these are skipped). Cannot use both. Example for an adult platform that only needs self-harm detection: ```json {"enabled_endpoints": ["distress-signals", "unsafe"]} ``` Example to disable grooming and bullying but keep everything else: ```json {"disabled_endpoints": ["grooming", "bullying"]} ``` # API landing page Source: https://docs.tuteliq.ai/api-reference/status/api-landing-page https://api.tuteliq.ai/docs/json get / Returns an HTML landing page for browsers or a JSON summary for API clients (curl, Postman). Includes links to documentation, dashboard, and current operational status. # Embeddable HTML status page Source: https://docs.tuteliq.ai/api-reference/status/embeddable-html-status-page https://api.tuteliq.ai/docs/json get /status/page Returns a self-contained HTML status page showing component health, uptime percentages, and incident history. Auto-refreshes every 60 seconds. Can be embedded in an iframe on your own status page. # Get API status and component health Source: https://docs.tuteliq.ai/api-reference/status/get-api-status-and-component-health https://api.tuteliq.ai/docs/json get /status Returns overall API status, component-level health (API, database, cache, AI engine), uptime percentages for the last 24h/7d/30d, and any active incidents. Use for status dashboards and monitoring. # List components available for granular pings Source: https://docs.tuteliq.ai/api-reference/status/list-components-available-for-granular-pings https://api.tuteliq.ai/docs/json get /status/ping/components Returns the list of components exposed at `/status/ping/`. # Per-component health ping Source: https://docs.tuteliq.ai/api-reference/status/per-component-health-ping https://api.tuteliq.ai/docs/json get /status/ping/{component} Returns 200 if the named component is healthy, 503 otherwise. Designed for UptimeRobot, Pingdom and similar. Probe results are cached for ~20 seconds to avoid hammering upstream services when multiple monitors poll. # Simple ping for external monitors Source: https://docs.tuteliq.ai/api-reference/status/simple-ping-for-external-monitors https://api.tuteliq.ai/docs/json get /status/ping Lightweight endpoint returning a minimal OK response. Designed for UptimeRobot, Pingdom, and similar monitoring services that just need a 200 response. # Get anonymised threat intelligence trends Source: https://docs.tuteliq.ai/api-reference/threat-intelligence/get-anonymised-threat-intelligence-trends https://api.tuteliq.ai/docs/json get /api/v1/intelligence/trends Returns aggregated, anonymised detection trends across all customers. Includes breakdowns by endpoint, category, age group, platform, and language. All data is k-anonymised — buckets with fewer than 5 signals are suppressed. No PII or customer-identifiable information is ever included. # Get emerging threats Source: https://docs.tuteliq.ai/api-reference/threat-intelligence/get-emerging-threats https://api.tuteliq.ai/docs/json get /api/v1/intelligence/emerging Identifies threat categories with rapid growth (>50% week-over-week increase). Useful for early warning systems and proactive safety measures. All data is anonymised and k-anonymity is enforced. # Get weekly threat intelligence digest Source: https://docs.tuteliq.ai/api-reference/threat-intelligence/get-weekly-threat-intelligence-digest https://api.tuteliq.ai/docs/json get /api/v1/intelligence/weekly-digest Returns a pre-formatted weekly summary suitable for email or Slack notifications. Includes top threats, emerging categories, and notable trends. All data is anonymised with no PII. # Get daily usage summary with quota status Source: https://docs.tuteliq.ai/api-reference/usage/get-daily-usage-summary-with-quota-status https://api.tuteliq.ai/docs/json get /api/v1/usage/summary Returns total, successful, and failed request counts for a specific date (defaults to today), along with your tier quota limits and remaining capacity. Use for dashboards and usage monitoring. # Get monthly billing period usage and upgrade recommendations Source: https://docs.tuteliq.ai/api-reference/usage/get-monthly-billing-period-usage-and-upgrade-recommendations https://api.tuteliq.ai/docs/json get /api/v1/usage/monthly Returns your current billing period usage (calls used vs. limit), tier details, rate limits, and days remaining. Includes smart upgrade recommendations when you approach 80% usage or have fewer than 200 calls remaining. Links to dashboard, pricing, and credit purchase pages. # Get real-time rate limit and quota status Source: https://docs.tuteliq.ai/api-reference/usage/get-real-time-rate-limit-and-quota-status https://api.tuteliq.ai/docs/json get /api/v1/usage/quota Returns your current rate limit status (requests this minute vs. limit) and daily quota (requests today vs. limit). Shows remaining capacity for both windows. Use before making bulk requests to avoid hitting limits. # Get usage breakdown by tool and endpoint Source: https://docs.tuteliq.ai/api-reference/usage/get-usage-breakdown-by-tool-and-endpoint https://api.tuteliq.ai/docs/json get /api/v1/usage/by-tool Returns request counts broken down by analysis tool (bullying, grooming, unsafe, etc.) and endpoint path. Helps identify which safety features your integration uses most for capacity planning and cost optimization. # Get usage history over time Source: https://docs.tuteliq.ai/api-reference/usage/get-usage-history-over-time https://api.tuteliq.ai/docs/json get /api/v1/usage/history Returns daily request counts (total, successful, failed) for the past N days (1–30, default 7). Use for trend analysis, usage charts, and identifying peak traffic periods. # Cancel a verification session Source: https://docs.tuteliq.ai/api-reference/verification/cancel-a-verification-session https://api.tuteliq.ai/docs/json delete /api/v1/verify/session/{id} Cancels an active verification session. The mobile device will be notified via SSE. # Composite non-LLM image verification Source: https://docs.tuteliq.ai/api-reference/verification/composite-non-llm-image-verification https://api.tuteliq.ai/docs/json post /api/v1/verify-image-match Run a configurable set of forensic checks over a single image in one call: face matching against a reference image, age estimation, NSFW/skin-exposure forensics, and synthetic-image detection (deep-image classifier + C2PA provenance). All checks are deterministic/model-based — no LLM ever sees the image. Images are processed in memory only and never stored. # Create a cross-device verification session Source: https://docs.tuteliq.ai/api-reference/verification/create-a-cross-device-verification-session https://api.tuteliq.ai/docs/json post /api/v1/verify/session Creates a session that can be used to complete verification on another device (e.g. mobile). Both `mode=age` and `mode=identity` require Assure or above. Returns a session ID and mobile URL with a one-time token. # Get a signed liveness challenge nonce Source: https://docs.tuteliq.ai/api-reference/verification/get-a-signed-liveness-challenge-nonce https://api.tuteliq.ai/docs/json get /api/v1/verify/challenge Returns a server-signed nonce that must be included in the liveness token. This prevents client-side forgery of liveness tokens. # Get verification session status Source: https://docs.tuteliq.ai/api-reference/verification/get-verification-session-status https://api.tuteliq.ai/docs/json get /api/v1/verify/session/{id} Returns the current status and result of a verification session. Only the API key that created the session can access it. # Report verification step progress from mobile Source: https://docs.tuteliq.ai/api-reference/verification/report-verification-step-progress-from-mobile https://api.tuteliq.ai/docs/json post /api/v1/verify/session/{id}/progress Used by mobile device to report which step the user is on, so desktop can show real-time progress. # Resolve verification mode and language for end-user Source: https://docs.tuteliq.ai/api-reference/verification/resolve-verification-mode-and-language-for-end-user https://api.tuteliq.ai/docs/json get /api/v1/verify/session/{id}/mode Called by the HTML verification page on load. Detects the end-user country from IP, resolves the verification mode from market config, and returns the UI language. No authentication required — session ID is unguessable (128-bit entropy). # Retrieve a past verification result Source: https://docs.tuteliq.ai/api-reference/verification/retrieve-a-past-verification-result https://api.tuteliq.ai/docs/json get /api/v1/verify/{verificationId} Get the result of a previous age verification by its ID. Only the owning API key can retrieve its own verifications. # Submit documents for age verification Source: https://docs.tuteliq.ai/api-reference/verification/submit-documents-for-age-verification https://api.tuteliq.ai/docs/json post /api/v1/verify/submit Upload ID front, ID back, optional passport, and a selfie with liveness token for age verification. Returns verification result including age, face match, and liveness status. # Submit verification documents via session (mobile) Source: https://docs.tuteliq.ai/api-reference/verification/submit-verification-documents-via-session-mobile https://api.tuteliq.ai/docs/json post /api/v1/verify/session/{id}/submit Submit ID documents and selfie for verification using a session token. Used by the mobile device in a cross-device handoff flow. # Subscribe to session status updates via SSE Source: https://docs.tuteliq.ai/api-reference/verification/subscribe-to-session-status-updates-via-sse https://api.tuteliq.ai/docs/json get /api/v1/verify/session/{id}/events Server-Sent Events stream that emits status changes and results for a verification session. No authentication required — session ID is unguessable (128-bit entropy). # Validate a document image via session (mobile) Source: https://docs.tuteliq.ai/api-reference/verification/validate-a-document-image-via-session-mobile https://api.tuteliq.ai/docs/json post /api/v1/verify/session/{id}/validate-document Per-step document validation for cross-device flow. Free — no credits consumed. # Validate a selfie image via session (mobile) Source: https://docs.tuteliq.ai/api-reference/verification/validate-a-selfie-image-via-session-mobile https://api.tuteliq.ai/docs/json post /api/v1/verify/session/{id}/validate-selfie Per-step selfie validation (face detection) for cross-device flow. Free — no credits consumed. # Bootstrap a wallet device via App Attest Source: https://docs.tuteliq.ai/api-reference/wallet/bootstrap-a-wallet-device-via-app-attest https://api.tuteliq.ai/docs/json post /api/v1/wallet/token Issues a short-lived JWT scoped to verify:submit. The iOS Tuteliq Wallet calls this once at first launch and re-uses the token until it nears expiry. Per-device rate limiting prevents bootstrap abuse. # Create a webhook Source: https://docs.tuteliq.ai/api-reference/webhooks/create-a-webhook https://api.tuteliq.ai/docs/json post /api/v1/webhooks/ Create a new webhook endpoint for receiving notifications # Delete a webhook Source: https://docs.tuteliq.ai/api-reference/webhooks/delete-a-webhook https://api.tuteliq.ai/docs/json delete /api/v1/webhooks/{webhookId} Permanently delete a webhook # List all webhooks Source: https://docs.tuteliq.ai/api-reference/webhooks/list-all-webhooks https://api.tuteliq.ai/docs/json get /api/v1/webhooks/ Returns all webhooks configured for the authenticated user # Regenerate webhook secret Source: https://docs.tuteliq.ai/api-reference/webhooks/regenerate-webhook-secret https://api.tuteliq.ai/docs/json post /api/v1/webhooks/{webhookId}/regenerate-secret Generate a new signing secret for the webhook # Test a webhook Source: https://docs.tuteliq.ai/api-reference/webhooks/test-a-webhook https://api.tuteliq.ai/docs/json post /api/v1/webhooks/test Send a test payload to verify webhook configuration # Update a webhook Source: https://docs.tuteliq.ai/api-reference/webhooks/update-a-webhook https://api.tuteliq.ai/docs/json put /api/v1/webhooks/{webhookId} Update an existing webhook configuration # Authentication Source: https://docs.tuteliq.ai/authentication How to authenticate with the Tuteliq API Every request to the Tuteliq API must include a valid API key. You can create and manage keys from the [Tuteliq Dashboard](https://tuteliq.ai/dashboard). ## Authentication methods Tuteliq supports two ways to pass your API key. Both are equivalent; use whichever fits your stack. ### Bearer token Pass the key in the `Authorization` header: ```bash theme={"dark"} curl https://api.tuteliq.ai/api/v1/safety/unsafe \ -H "Authorization: Bearer YOUR_API_KEY" ``` ### x-api-key header Pass the key in a dedicated header: ```bash theme={"dark"} curl https://api.tuteliq.ai/api/v1/safety/unsafe \ -H "x-api-key: YOUR_API_KEY" ``` If both headers are present, `Authorization: Bearer` takes precedence. ## SDK authentication ```typescript Node.js theme={"dark"} import { Tuteliq } from "@tuteliq/sdk"; const tuteliq = new Tuteliq({ apiKey: process.env.TUTELIQ_API_KEY, }); ``` ```python Python theme={"dark"} from tuteliq import Tuteliq client = Tuteliq(api_key=os.environ["TUTELIQ_API_KEY"]) ``` ```swift Swift theme={"dark"} import Tuteliq let client = Tuteliq(apiKey: ProcessInfo.processInfo.environment["TUTELIQ_API_KEY"]!) ``` Never hard-code API keys in source code. Use environment variables or a secrets manager. ## Environments and tiers Each API key is scoped to an environment. The environment determines which rate-limit tier applies: | Environment | Tier | Rate limit | | ------------- | ------- | ------------- | | `production` | Premium | 1,000 req/min | | `staging` | Basic | 300 req/min | | `development` | Free | 60 req/min | You select the environment when creating a key in the dashboard. Keys cannot be moved between environments after creation. ## Security * API keys are **hashed with SHA-256** before being stored. Tuteliq never retains your plaintext key. * Keys are shown **only once** at creation time. If you lose a key, revoke it and create a new one. * Each request updates the key's `last_used_at` timestamp and increments its `requests_count`, both visible in the dashboard. If you suspect a key has been compromised, revoke it immediately from the [Dashboard](https://tuteliq.ai/dashboard) and generate a replacement. # Benchmarks and accuracy Source: https://docs.tuteliq.ai/benchmarks How Tuteliq measures coded-language and filter-evasion detection, what the methodology covers, and multilingual coverage. # Benchmarks and accuracy Tuteliq is built to catch the harm that general-purpose moderation misses: coded slang, emoji, algospeak, and deliberate filter evasion, read in the context of the conversation rather than matched against a word list. This page describes what we measure and how. ## Where the numbers are We previously published a comparative recall figure against general-purpose moderation APIs. That figure is **withdrawn pending re-validation**: later runs on the same case set materially changed our own recall, and the vendor baselines have not been re-run against them, so no honest ratio can be quoted right now. Rather than restate a number we cannot currently stand behind, this page describes what we measure and how. Updated figures will be published once the comparison has been re-run end to end. If you are evaluating Tuteliq and need evidence now, the useful path is a benchmark on **your own** content: we will help you assemble a labelled set from your platform and run it, which is a better predictor for your deployment than any figure of ours. ## What is measured The evasion benchmark is a set of messages that carry a harmful payload through obfuscation rather than plain words: coded acronyms, emoji substitution, leetspeak, homoglyphs, deliberate misspellings, and algospeak (for example "unalive", "seggs", "camping"). It also includes benign look-alikes that use the same surface vocabulary, so a detector cannot score well simply by flagging everything. * **Positive cases:** messages where an obfuscated harmful meaning is present. * **Negative controls:** benign messages that share vocabulary or symbols with the positives. * **Metric:** recall on the positive cases (what fraction of real evasion is caught), reported alongside behaviour on the negative controls. ## Methodology * Comparison is against three leading general-purpose moderation APIs, averaged. Vendors are not named. * Figures reflect this internal benchmark and are not a guarantee of performance on any specific dataset or deployment. * The advantage is a platform-wide property of how Tuteliq reads content, so it applies across every detector (grooming, romance and fraud, radicalisation, self-harm, bullying), not only to toxicity. ## Why context beats word lists General-purpose moderation scores a single message against a fixed vocabulary. Tuteliq scores the interaction: who is targeting whom, whether it is reciprocal, whether it is escalating, and whether the wording performs a harmful function even when no banned word appears. That is why it separates gaming trash-talk from targeted harassment, and why obfuscation that walks straight past a word list still gets scored. See [Bullying and toxicity detection](/bullying-toxicity-detection) and the [Prescreen lexicon](/prescreen-lexicon) for how the coded-term layer corroborates the behavioural signal. ## Multilingual coverage Detection runs in **32 languages** (English stable, all 24 EU official languages plus Ukrainian, Norwegian, Turkish, Chinese, Japanese, Korean, Arabic, and Russian in beta), with code-switching support and language-specific coverage of slang and evasion. See [Languages](/languages) for the full list. ## Frequently asked questions **How accurate is Tuteliq at detecting coded slang and filter evasion?** Comparative figures are being re-validated and are not published at present. What we can describe is the method: coded terms are maintained as an evolving lexicon, and every case is scored in the context of the surrounding conversation rather than matched against a fixed list, which is what makes novel algospeak and emoji payloads detectable at all. **How is the benchmark measured?** It uses obfuscated harmful messages (coded acronyms, emoji, leetspeak, algospeak, misspellings) plus benign look-alike controls, and reports recall on the positives alongside behaviour on the controls. Comparison is against three leading general-purpose moderation APIs, averaged and unnamed. **Does the coded-language advantage apply to more than bullying?** Yes. It is a platform-wide capability that applies to every detector, because the same obfuscation tactics appear across every kind of harm. **How many languages does Tuteliq support?** 32: English is stable and 31 more are in beta, including all 24 EU official languages plus Ukrainian, Norwegian, Turkish, Chinese, Japanese, Korean, Arabic, and Russian. ## Related * [Bullying and toxicity detection](/bullying-toxicity-detection) * [Grooming detection](/grooming-detection) * [Prescreen lexicon](/prescreen-lexicon) * [Languages](/languages) ``` The `allow="camera; microphone"` attribute is required so the embedded page can request capture permissions from the parent origin. ### Pattern B: QR code (desktop-to-mobile handoff) The session is created on your desktop app or website; the user scans a QR code with their phone and completes verification on the phone. ```typescript Node theme={"dark"} import QRCode from "qrcode"; const session = await tuteliq.createVerificationSession({ mode: "age" }); // Render the QR code in your UI const qrSvg = await QRCode.toString(session.url, { type: "svg" }); res.send(`

Scan this code with your phone

${qrSvg}

Session expires in 15 minutes.

`); // In parallel, subscribe to SSE so the desktop UI updates the moment // the user completes verification on their phone ``` The user scans, completes capture on their phone, and the desktop UI auto-advances when the SSE stream emits `status: "completed"`. ### Pattern C: Redirect (single-device, browser-only) Best for low-friction onboarding flows where the user is already on mobile in your web app. ```typescript Node theme={"dark"} const session = await tuteliq.createVerificationSession({ mode: "age", redirect_url: "https://yourapp.com/verify/complete?session_id=" + sessionId, }); res.redirect(session.url); // After completion, Tuteliq redirects the user to redirect_url ``` The user is sent away to Tuteliq's capture UI; on completion, they're redirected back to your `redirect_url`. Your `redirect_url` handler then calls your backend to read the result. ## Step 3: Watch status updates Two ways to know when the verification is done. **Server-Sent Events is the recommended primary channel; polling is the fallback.** ### Option A: Server-Sent Events (recommended) The session emits real-time events you can listen to with no polling overhead. Works from any client (browser, mobile, server). ```typescript Web / browser theme={"dark"} const es = new EventSource( `https://api.tuteliq.ai/api/v1/verify/session/${sessionId}/events`, ); es.addEventListener("status", (e) => { const { status } = JSON.parse(e.data); // status: "pending" | "in_progress" | "completed" | "failed" | "expired" }); es.addEventListener("progress", (e) => { const { step } = JSON.parse(e.data); // step: "document_front" | "document_back" | "selfie" | "liveness" | "processing" }); es.addEventListener("result", (e) => { const result = JSON.parse(e.data); // Final verdict + verification record es.close(); }); es.addEventListener("expired", () => { // Session expired before user completed it es.close(); }); ``` The events endpoint does **not** require authentication. The session ID has 128 bits of entropy and is single-use; treat it as a secret-equivalent for the lifetime of the session. ### Option B: Polling If your environment can't hold an open SSE connection (e.g. serverless functions with short timeouts), poll instead: ```typescript Node.js theme={"dark"} async function waitForSession(sessionId: string, timeoutMs = 600_000) { const startTime = Date.now(); while (Date.now() - startTime < timeoutMs) { const session = await tuteliq.getVerificationSession(sessionId); if (["completed", "failed", "expired"].includes(session.status)) { return session; } await new Promise(r => setTimeout(r, 3000)); // poll every 3 seconds } throw new Error("Session timed out"); } ``` ```bash cURL theme={"dark"} # Poll the session curl https://api.tuteliq.ai/api/v1/verify/session/$SESSION_ID \ -H "Authorization: Bearer $TUTELIQ_API_KEY" ``` ## Step 4: Read the final result The result is included in the SSE `result` event AND accessible via `GET /api/v1/verify/session/:id` once the session is in a terminal state. ### Age verification result See the full shape in [Step 3](#3-poll-for-the-result) above. The body is identical whether you receive it through SSE or the polled GET. ### Identity verification result Identity mode (Assure plan and above) returns the same outer envelope as age mode (`session_id`, `status`, `result`, `created_at`, `expires_at`), but the inner `result` object differs: ```json theme={"dark"} { "session_id": "string", "status": "string (one of: pending, in_progress, completed, failed, expired, cancelled)", "result": { "status": "string (one of: verified, failed, needs_review)", "full_name": "string", "date_of_birth": "string (ISO 8601 date)", "document_type": "string (passport, id_card, drivers_license, residence_permit)", "country_code": "string (ISO 3166-1 alpha-3)", "liveness": { "valid": true, "reason": "string" }, "face_match": { "matched": true, "distance": 0.0, "confidence": 0.0 }, "credits_used": 0 }, "created_at": 0, "expires_at": 0 } ``` Compared with age mode, identity mode returns the full `full_name` and `date_of_birth` PII required for KYC, plus a `face_match` score, but does not include the document-validation sub-checks block. ## Status states | Status | Meaning | What to do | | ------------- | ---------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | | `pending` | Session created, user has not opened the URL yet | Wait. The session is valid for 15 minutes. | | `in_progress` | User has opened the URL and is mid-capture | Show "verification in progress" to the user. Optionally use the `progress` SSE event to display step-by-step UI. | | `completed` | Verification finished, result available | Read the result and gate access accordingly. | | `failed` | Verification ran but the user failed (bad liveness, document mismatch, etc.) | Read `failure_reasons` array for the specific issue. Offer the user to retry with a fresh session. | | `expired` | 15 minutes elapsed without the user finishing | Create a new session and try again. | | `cancelled` | Your server called `DELETE /api/v1/verify/session/:id`, or the user closed the mobile UI | Optionally create a new session. | ## Common pitfalls ### Webview camera permission iOS and Android webviews **deny camera access by default**. You must explicitly grant it in both the webview configuration and the host app's permission manifest. The samples above include the right configuration for each platform. ### CORS for the iframe pattern If you embed via `