# Interaction Reporting API Contract **Name:** interaction-reporting **Version:** 1.0 **Date:** 2026-03-31 **Status:** Active **Layer:** Functional **Maturity:** Stable --- ## Purpose Defines the REST API surface for external systems (non-IHP adapters, domain hubs, third-party tools) to submit interaction events and annotations to the IHF without coupling to the IHP server-side implementation. --- ## Canonical Source of Truth The authoritative runtime contract is the active row in the `interaction_reporting_contracts` table. This file is the discoverable human-readable declaration. In case of conflict, the database row governs. --- ## Endpoint ``` POST /api/v1/interaction-events ``` Authentication: `Authorization: Bearer ` The `hub-api-key` must match the `api_key` column of a registered hub. --- ## Required Request Fields | Field | Type | Description | |---|---|---| | `widget_id` | UUID | The governed widget's stable ID | | `event_type` | TEXT | Must exist in `event_type_registry` with `status = 'active'` | | `occurred_at` | ISO 8601 timestamp | When the event occurred on the client | --- ## Optional Request Fields | Field | Type | Description | |---|---|---| | `actor_id` | UUID | The acting user's ID | | `actor_type` | TEXT | `user`, `agent`, `automation`, `external_adapter` | | `view_context_ref` | TEXT | View path where event occurred | | `metadata` | JSON object | Arbitrary additional context | --- ## Response — Success (201 Created) ```json { "id": "", "widget_id": "", "event_type": "clicked", "occurred_at": "2026-03-31T12:00:00Z" } ``` --- ## Response — Validation Error (422 Unprocessable Entity) ```json { "error": "event_type 'pipeline_started' not registered", "help": "Register this event type via the Type Registry admin UI or hub capability manifest before submitting." } ``` --- ## Response — Auth Error (401 Unauthorized) ```json { "error": "Authorization: Bearer required" } ``` --- ## Accepted Event Types Accepted event types are all entries in `event_type_registry` with `status = 'active'`. The framework-level seed vocabulary: `viewed`, `focused`, `clicked`, `submitted`, `abandoned`, `retried`, `failed`, `commented`, `flagged_confusing`, `flagged_helpful`, `blocked_by_policy`, `escalated`, `accepted_recommendation`, `rejected_recommendation` Domain hubs may register additional event types via `HubCapabilityManifest`. --- ## Versioning Policy - v1.0: current version. Stable. - Adding new optional request fields: minor version (v1.1), no breaking change. - Changing required fields, response shape, or auth scheme: major version (v2.0). - Phase 9 will introduce `/api/v2/` with OAuth 2.0 replacing per-hub Bearer tokens. v1.0 will remain supported during the migration window. --- ## Implementation Reference - Controller: `Web/Controller/ApiInteractionEvents.hs` - Route: `Web/Routes.hs` (`CanRoute ApiInteractionEventsController`) - DB record: `interaction_reporting_contracts` (contract_version = '1.0')