Skip to main content

EU AI Act — Article 50 Transparency

Article 50 of the EU AI Act requires that a person be informed when they are interacting with an AI system (unless this is obvious from the context), and that AI-generated or synthetically-modified audio, image, video, or text content be marked as such. The obligation applies from August 2, 2026. This page documents the AI-disclosure controls Devotel Orbit already ships that satisfy this obligation for AI voice and chat agents, how to enable them, and how to export evidence for a regulator or enterprise buyer.

Overview

AI disclosure is a tenant-scoped, per-regulation opt-in. A single settings surface drives the same behavior for four regulations that share the same shape: the EU AI Act Article 50, Korea’s AI Basic Act (live since 2026-01-22), California SB 243 (live since 2026-01-01), and the Utah AI Policy Act. Configure it under Settings → Compliance → AI Disclosure in the dashboard, or via the API described below. Disclosure is off by default for every workspace. A tenant operator turns on the rules that apply to their traffic.
Not automatic geo-detection. Orbit does not infer a contact’s jurisdiction from a phone number, address, or IP — enabling a rule applies it workspace-wide to every AI interaction, it does not switch on or off per contact based on location. If your organization’s traffic touches the EU, enable the eu_ai_act_enabled rule for the whole workspace. The one exception is the California SB 243 minor reminder, which fires only for contacts you have explicitly flagged as a minor — Orbit never infers minor status from a birth date or other signal.

What ships today

  1. Chat notice — a configurable notice (“You are chatting with an AI assistant…”) is prepended to an AI agent’s first reply in a conversation. It is sent once per conversation — it does not repeat on every turn.
  2. Voice intro — a configurable spoken introduction (“This call is being handled by an AI agent…”) is played before an AI voice agent begins a call. You can supply a pre-recorded audio URL or let Orbit synthesize the text.
  3. AI-generated content marking — messages sent by an AI agent are stamped with metadata.ai_generated: true. Recorded calls with any AI involvement are stamped with EU AI Act Article 50 provenance metadata on the archived recording. Where the configured text-to-speech provider embeds an inaudible content-provenance watermark, that support is recorded per call — watermarking coverage varies by TTS provider today, so treat it as an additional signal rather than a universal guarantee.
  4. California SB 243 minor reminder — when enabled, contacts explicitly flagged as a minor get a periodic “you’re talking to an AI” reminder during long-running sessions, on a configurable interval.
  5. Conformity dossier export — a one-click, per-agent evidence pack that maps the agent’s transparency configuration, evaluation/red-team results, human-oversight approvals, and decision audit log to EU AI Act Articles 12, 14, 15, and 50.
  6. AI-disclosure ledger export — a privacy-preserving, tamper-evident, cryptographically signed ledger proving when and where an AI (not a human) handled an interaction, independently verifiable without trusting Orbit’s UI.

Configuring AI disclosure

Dashboard

Navigate to Settings → Compliance → AI Disclosure. Edit the chat notice and voice intro copy, then turn on EU AI Act §50 (and any other applicable jurisdiction rules) under “Jurisdiction rules”. Turn on Enabled by default so the notices are actually presented — the jurisdiction toggles alone only mark which regulations apply; Enabled by default is what activates stamping and notice delivery.

API

Returns the tenant’s current singleton settings row (or { "settings": null } if never configured):
Accepts a partial update — only the supplied keys change. Requires the owner or admin role.
Every update is written to the audit log (compliance.ai_disclosure_updated) and invalidates the in-process settings cache immediately, so a toggle takes effect on the very next agent turn.

Verifying it’s working

  1. Live check — with default_enabled and eu_ai_act_enabled on, start a new chat session with an AI agent and confirm the configured chat_notice_text appears on the first reply; place a test call to an AI voice agent and confirm the voice intro plays before the agent speaks.
  2. Per-turn metadata — inspect a chat message sent by the agent and confirm metadata.ai_generated is true.
  3. Conformity dossier — export the evidence pack for an agent:
    Add ?format=html for a downloadable, human-readable evidence pack suitable for an auditor or enterprise security questionnaire. Each section reports present, partial, absent, or unavailable — a legacy tenant missing a backing table degrades that one section rather than failing the whole export.
  4. AI-disclosure ledger — export the signed, tamper-evident ledger for an agent:
    The ledger carries provenance metadata only (agent id, model, outcome, timestamps, aggregate counts) — never verbatim prompt/response text — and is signed with a detached content credential so a copy handed to a regulator or partner can be verified without trusting Orbit’s UI.
Both exports require the owner, admin, or developer role and are themselves audit-logged.

Remediating a degraded dossier section

Each dossier section reports one of four statuses, shown in both the JSON (sections[].status) and the HTML pack’s section badge. Treat anything other than present as a to-do, not a verdict:

Verifying the signed ledger

The AI-disclosure ledger’s signature covers every byte of the ledger body, so “independently verifiable” is mechanical: recompute the digest and MAC over what you received and compare.
  1. Export the JSON ledger (this is the payload to verify):
    The response wraps the ledger in data.ledger. Its shape: ledger_version, generated_at, tenant_id, agent, disclosure_posture, jurisdiction_resolution, summary, entries, note, disclaimer, and a detached signature object:
  2. Post the ledger to the verifier endpoint. The detached credential lives inside the JSON itself — nothing else to download:
    reason is one of ok, content_mismatch (body edited after signing), signature_invalid (MAC does not match the content), unsupported_version (unknown credential version), or malformed_ledger.
  3. Verify offline if you want the check independent of Orbit’s API: strip the signature field, serialize the remaining body as canonical JSON (object keys sorted recursively), and SHA-256 the result — it must equal signature.content_sha256. The MAC additionally requires the workspace’s signing key, so a tampered ledger can be detected by anyone, but producing the MAC is Orbit-side only.

Confirming the notice fired on a conversation

The per-turn metadata.ai_generated: true flag proves the reply was AI-authored; it does not prove the disclosure notice was shown. Three surfaces answer “did the notice fire on this conversation?”:
  1. Read the conversation — on a text channel the chat notice is prepended to the agent’s first reply, so the notice text is visible verbatim in the conversation’s message list in the dashboard and via the conversations API. The same property holds for voice: the intro plays before the agent speaks, so a recorded call carries it at the start.
  2. Check the per-conversation timestamp — once the chat notice is delivered, the platform stamps first_disclosure_sent_at on that conversation and the notice never repeats there. If you (or your compliance tooling) retain exports or warehouse snapshots of conversation records, a non-null value is durable proof the notice fired for that conversation.
  3. Check the audit log for configuration changes — every change to the disclosure settings is recorded under the audit action compliance.ai_disclosure_updated, and each dossier or ledger export is logged as agent.conformity_dossier.exported or agent.ai_disclosure_ledger.exported. If a notice did not fire on a conversation you expected it to, the audit trail for those actions plus the conversation timestamp above isolates whether disclosure was off at the time, or the notice genuinely failed to send.

Posture matrix per regulation

All four regulations are tenant-owned configuration: Orbit ships the controls and the evidence exports; you decide which toggles apply to your traffic. Since the rules are workspace-wide opt-ins, enable every regulation your traffic plausibly touches. Two cautions that apply to every row: the jurisdiction toggles do not geolocate contacts — they apply the rule workspace-wide — and the SB 243 reminder only ever fires for contacts you have explicitly flagged as a minor. Orbit never infers jurisdiction or minor status.

Known limitations

  • Jurisdiction rules are workspace-wide opt-ins, not automatic per-contact geolocation — see the note above.
  • TTS-embedded audio watermarking depends on the configured voice provider; not every provider supports it as of mid-2026.
  • This page describes the transparency (Article 50) surface. It does not cover the EU AI Act’s separate high-risk-system (Annex III) obligations — see the pointer below.

Annex III high-risk obligations

The EU AI Act’s high-risk-system obligations (Annex III use cases — for example the emotion-recognition, biometric-categorization, and credit-scoring classes) sit outside this page. Article 50 transparency applies to every AI agent regardless of risk class; Annex III adds a separate compliance tier — risk management, data governance, technical documentation, and conformity assessment — on a later timeline than the August 2, 2026 transparency date. Classify your deployment against Annex III first; an agent in a listed use case needs that posture work on top of the disclosure controls described here. The Compliance Posture FAQ carries a matching entry on where the split between tenant-owned Annex III work and Orbit’s transparency controls falls. Orbit’s role stays the same either way: the platform ships the transparency and evidence surface; the classification and the Annex III obligations are yours to own with qualified counsel. If you have a requirement this page doesn’t cover, contact trust@devotel.io.