The connector is inbound only (read-side) — Velatir never writes back to your tenant.
What it pulls
Auth
- Admin grants consent to Velatir’s dedicated Entra app (“Velatir Connector”). The consent URL is the same shape as the existing Entra directory-consent flow (
/adminconsent?...&state=<orgId>&redirect_uri=...). - Backend records the consented tenant id on the organisation’s existing
EntraConnectionrow (no new table). - The connector mints app-only client-credentials tokens at sync time against the dedicated app, with the tenant id from step 2 and the dedicated app’s
ClientId/ClientSecret(held in Scaleway Secret Manager).
Scopes requested
All application permissions (admin consent; no usable delegated equivalents):AiEnterpriseInteraction.Read.All— content viaaiInteractionHistoryAuditLogsQuery.Read.All— events via the Graph Audit Query APIOrganization.Read.All— posture:/organization,/subscribedSkusReportSettings.Read.All— posture:/admin/reportSettings.displayConcealedNamesUser.Read.All— content fallback (UPN resolution, licensed-user sweep)
What lands on the Activity surface
EveryCopilotInteraction audit record becomes a ServiceEvent with:
- Vendor type —
microsoftcopilot.CopilotInteraction - Actor — the audit record’s
userPrincipalName(anduserIdfor the Entra object id) - Target — the Copilot surface (
BizChat,Word,Teams, …) joined to the agent name when one is present - Payload (verbatim) — the full
auditDataobject, including:AccessedResources[]— the files Copilot grounded on, with their sensitivity labels, the policy decision, and whether a cross-prompt-injection attack was detectedAISystemPlugin[]— plugins used (includingBingWebSearchfor public-web answers)AgentId/AgentName— agent identity (Microsoft first-party or Copilot Studio)JailbreakDetectedper-messageDLPEvaluationDeferred— bitmask of what Microsoft DLP could not evaluateisCopilotStudio(added by the connector) — distinguishes first-party from Studio-sourced events
Audit-record availability lags the event. The connector trails the window end by 30 minutes and
accepts overlap; the sink’s
(org, VendorEventId) idempotency guard absorbs re-pulls.Conversation content
The connector pulls per-useraiInteractionHistory records for each ContentResourceId surfaced by an audit event. The connector extracts the adaptive-card text per the Graph API contract:
body.contentType == "text"→ usebody.contentdirectlybody.contentType == "html"with an<attachment id="…"/>→ resolve the matchingattachments[]entry, take the firstTextBlock.text- Otherwise strip tags
Trace.Metadata for re-classification and audit.
Per-connector content toggle
Some organisations want Activity (the event stream) but not Content (the per-message text — e.g. for confidentiality or scope reasons). The connector exposes anisContentEnabled toggle on the connector DTO; when off, the sync worker skips the PullContentAsync lane entirely while the event lane still runs. Toggle via PATCH .../connectors/{id} with {"isContentEnabled": false}.
Deduplication
The connector and the browser extension / desktop agent both surface Copilot under themicrosoft-copilot source slug. The connector records carry the audit UPN into TraceContext.Ldap.EmailHash; the existing cross-service dedup (VEL-897) matches connector and device traces on the identity × ±5-minute symmetric window and marks the connector rows as superseded by the device trace. Endpoint wins; the connector row stays on disk for retrospective Data Protector monitoring.
What the connector does not pull
AIAppInteraction(third-party AI apps) — opt-in only, pay-as-you-go billed to the customer at 180-day retentionConnectedAIAppInteraction(Copilot Studio / third-party AI apps) — M5, opt-in- Copilot usage reports (
getMicrosoft365CopilotUsageUserDetail) — noUsageMetricstore yet CopilotSettings-LimitedMode— delegated-only API, unreachable app-onlyCopilotPackages(agent inventory) — requires Microsoft Agent 365 licence, degrades to “unavailable” on 403
Limits
- Audit results are retrievable for 30 days after the job finishes — a checkpointed job id stays valid across many sync passes.
- Records per page: 500.
- Filter window: 6h default, bounded by the 30 min record-availability lag.
- Default backfill on first sync: 7 days.