Skip to main content
First-party Python SDK for the Interhuman API. Quickstart:

Clients & helpers

AuthClient

Client for the token endpoints (/v1/auth and /v1/client_tokens). Args: environment: Named environment to call. Defaults to production. base_url: Explicit base URL override (e.g. http://localhost:8080). http_client: Optional shared httpx.AsyncClient. When omitted, a client is created per request. Constructor

AuthClient.base_url

The resolved HTTP base URL this client calls.

AuthClient.create_client_token()

Mint a short-lived, capped client token for direct end-user use. Call this from a trusted server: the full API key travels in the request body. Omitted options use the server defaults (scope interhumanai.stream, 300 second lifetime clamped to 60-3600). Args: api_key: The full API key (ih_...) minting the token. scopes: Scopes the client token should carry. expires_in: Requested lifetime in seconds (server clamps to 60-3600). max_duration_seconds: Cap on a single live session’s duration. max_bytes: Cap on bytes accepted across the token’s sessions. max_concurrent: Cap on concurrent sessions (server default 1). max_video_seconds: Video-seconds budget across all surfaces. allowed_origins: Browser origins allowed to use the token. Returns: The minted client token and its effective caps.

AuthClient.create_token()

Exchange API key credentials for a short-lived bearer access token. Args: key_id: The API key id. key_secret: The API key secret. scopes: Scopes to request; must be non-empty and held by the key. Returns: The minted token, its lifetime, and the granted scopes.

AuthClient.revoke_client_token()

Revoke a previously minted client token. Revoking an already-expired token is a no-op and also succeeds. Args: api_key: The API key that minted the token. token: The client token to revoke.

InterhumanClient

High-level client for the Interhuman API. Authenticate either with API key credentials (key_id + key_secret, exchanged for short-lived bearer tokens that are refreshed automatically) or with a pre-issued access_token used as-is. Exactly one of the two must be provided. The client exposes every public surface: auth for token endpoints, upload for complete files, and stream / realtime for live WebSocket sessions. Args: key_id: API key id (paired with key_secret). key_secret: API key secret. access_token: Pre-issued bearer token (JWT or client token). scopes: Scopes requested when exchanging credentials. Defaults to upload + stream. Ignored when access_token is used. environment: Named environment to call. Defaults to production. base_url: Explicit base URL override (e.g. http://localhost:8080). http_client: Optional shared httpx.AsyncClient for the HTTP surfaces. The caller owns its lifecycle. refresh_skew_seconds: How long before expiry managed tokens refresh. Constructor

InterhumanClient.get_token()

Return the bearer token the client is currently using. With managed credentials this mints or refreshes as needed; with a pre-issued access_token it returns that token unchanged.

InterhumanClient.realtime()

Create a client for one WS /v0/realtime/analyze session. Each call returns a fresh, unconnected client; a client handles a single session.

InterhumanClient.stream()

Create a client for one WS /v1/stream/analyze session. Each call returns a fresh, unconnected client; a client handles a single session.

RealtimeClient

One live session against WS /v0/realtime/analyze. The real-time endpoint is a temporary v0 public release; it accepts either the interhumanai.stream or the interhumanai.realtime scope. It never emits engagement.updated or conversation_quality.updated events, and adds transcript and feedback output on top of the stream protocol. The previous hyphenated spelling (/v0/real-time/analyze) still works as a temporary compatibility alias, but new integrations should use /v0/realtime/analyze.

RealtimeClient.send_transcript()

Send the latest client-side transcript of the conversation. Each call fully replaces any previously sent transcript; the latest transcript is rendered into subsequent feedback output. Args: transcript: Ordered transcript segments (speaker ids are zero-based).

RealtimeClient.update_config()

Replace the session configuration. Each update fully replaces the previous configuration; omitted options reset to their server defaults. The server acknowledges with a session.updated event. Args: analysis_groups: Analysis tracks to run (must be non-empty when provided). Server default when omitted: audio and visual. realtime_feedback_frequency: How often feedback output is generated. realtime_feedback_instructions: Non-empty instructions that enable feedback; when omitted or empty, feedback is disabled. goal_dimensions: Goal dimensions that enable feedback generation.

SessionSocketClient

One live analysis session over a WebSocket. Connect with connect (or async with), send binary video chunks with send_video, and consume typed server events by iterating the client with async for. Iteration ends when the connection closes; close_info then holds the close code and reason. Args: token_provider: Source of bearer tokens for authentication. environment: Named environment to connect to. Defaults to production. base_url: Explicit HTTP base URL override; converted to ws(s)://. Constructor

SessionSocketClient.close()

Close the WebSocket immediately, discarding in-flight analysis. Args: code: WebSocket close code to send. reason: Optional close reason.

SessionSocketClient.close_info

Close code and reason once the connection has ended, else None.

SessionSocketClient.connect()

Open the WebSocket connection and start receiving events. Returns: This client, for chaining. Raises: InterhumanConfigError: If the client was already connected. InterhumanError: If the handshake fails (bad credentials or scope, unreachable host).

SessionSocketClient.is_open

Whether the connection is currently open.

SessionSocketClient.request_close()

Ask the server to drain in-flight analysis and end the session. The server acknowledges with session.closing, emits any final events, sends session.ended, and closes the socket normally. Keep iterating to observe the drain; for an immediate teardown use close instead.

SessionSocketClient.send_video()

Send one binary video chunk. The first chunk must carry the container’s init header; later chunks are continuation fragments of the same WebM or fragmented-MP4 stream. The SDK does not enforce a chunk size; the server rejects chunks above its limit (32 MB by default, reported in session.ready as max_segment_size_bytes) with an ih6002 error. Args: chunk: The raw video bytes to send.

SessionSocketClient.url

The WebSocket URL this client connects to.

SessionSocketClient.wait_closed()

Wait until the connection has fully closed. Returns: The session’s close code and reason.

SessionSocketClient.wait_for_session_ready()

Wait for the server’s session.ready event. The event is also delivered through iteration; this helper simply awaits it (or returns it if it already arrived). Returns: The session.ready event. Raises: InterhumanError: If the connection closes before the session becomes ready (typically an auth or scope failure).

StaticTokenProvider

Token provider that always returns the same pre-issued token. Constructor

StaticTokenProvider.get_token()

Return the configured token.

StreamClient

One live session against WS /v1/stream/analyze. Requires the interhumanai.stream scope. Send WebM or fragmented-MP4 chunks with send_video; consume typed events with async for.

StreamClient.update_config()

Replace the session configuration. Each update fully replaces the previous configuration; omitted options reset to their server defaults. The server acknowledges with a session.updated event. Args: include: Optional sections to include in quality updates. goal_dimensions: Goal dimensions that enable feedback generation.

TokenManager

Mints bearer tokens from API key credentials and refreshes them early. Tokens are cached until expires_in - refresh_skew_seconds elapses; concurrent callers share a single in-flight mint. Args: auth_client: The AuthClient used to mint tokens. key_id: The API key id. key_secret: The API key secret. scopes: Scopes to request on every mint. refresh_skew_seconds: Seconds before expiry at which the cached token is considered stale. clock: Monotonic clock returning seconds; injectable for tests. Constructor

TokenManager.get_token()

Return a valid access token, minting or refreshing when needed.

TokenManager.invalidate()

Drop the cached token so the next call mints a fresh one.

TokenProvider

Anything that can produce a bearer access token on demand. Constructor

TokenProvider.get_token()

Return a currently valid bearer access token.

UploadClient

Client for analyzing complete video files. Args: token_provider: Source of bearer tokens for authentication. environment: Named environment to call. Defaults to production. base_url: Explicit base URL override. http_client: Optional shared httpx.AsyncClient. When omitted, a client is created per request. Constructor

UploadClient.analyze()

Analyze a complete video file and return the detected signals. The video must be at least 3 seconds long and at most 32 MB, in one of the supported containers (mp4, avi, mov, mkv, mpeg-ts, webm). Args: file: The video to analyze - raw bytes, an open binary file object, or a filesystem path. filename: Filename reported to the API. Defaults to the path or file object’s name, else video. content_type: MIME type of the file (e.g. video/mp4). include: Optional response sections to include (conversation quality overall and/or timeline). goal_dimensions: Goal dimensions that trigger interaction feedback. Ignored when conversation_context is set. conversation_context: Free-text description of the interaction; when set, it drives feedback generation. Returns: The analysis result. Optional sections are only present when requested.

Data models

AnalysisResult

Response of POST /v1/upload/analyze. Optional sections are only present when requested: feedback when goal dimensions or a conversation context were supplied, conversation_quality when requested via include flags.

ClientTokenResponse

Response of POST /v1/client_tokens.

CloseInfo

Close code and reason of a finished WebSocket session.

ConversationQuality

Conversation-quality section of an analysis result.

ConversationQualityTimelineEntry

Conversation-quality scores for one slice of the video.

ConversationQualityUpdatedData

Latest conversation-quality scores (sections follow the include flags).

ConversationQualityUpdatedEvent

New conversation-quality scores are available.

ConversationQualityValues

Conversation-quality scores (0-100; 50 means no evidence either way).

CoverageDroppedData

Video ranges dropped under backpressure (not billed).

CoverageDroppedEvent

Some video was dropped without being analyzed.

CoverageRange

A time range of video that was not analyzed.

EngagementStateEntry

An engagement state over a time range.

EngagementUpdatedData

The engagement state entered at start.

EngagementUpdatedEvent

The subject’s engagement state changed.

ErrorData

A session error notice (fatal errors also close the socket).

ErrorEvent

The server reported an error for this session.

Feedback

Actionable interaction feedback generated from the analysis.

FeedbackGeneratedData

Feedback text generated from the active goal dimensions.

FeedbackGeneratedEvent

Interaction feedback was generated.

NoFeedback

Explicit indication that no feedback was warranted, with the reason.

RealtimeFeedbackGeneratedData

Generated guidance for the analyzed window. text is the literal NO_GUIDANCE when the model had nothing to suggest for this window.

RealtimeFeedbackGeneratedEvent

New feedback output is available.

RealtimeSessionConfigOptions

Session-config options the real-time endpoint supports.

RealtimeSessionReadyData

Limits and supported options of a newly opened real-time session.

RealtimeSessionReadyEvent

The session is accepted and ready to receive video.

RealtimeSessionUpdatedData

The real-time session configuration now in effect.

RealtimeSessionUpdatedEvent

Acknowledgment of a session-config update.

SessionClosingData

Drain window granted after a graceful close request.

SessionClosingEvent

The server accepted a graceful close and is draining.

SessionConfigOptions

Session-config options the stream endpoint supports.

SessionEndedData

Why the session ended.

SessionEndedEvent

Final envelope of a gracefully ended session.

SessionReadyData

Limits and supported options of a newly opened stream session.

SessionReadyEvent

The session is accepted and ready to receive video.

SessionUpdatedData

The session configuration now in effect.

SessionUpdatedEvent

Acknowledgment of a session-config update.

Signal

A detected social signal over a time range.

SignalDetectedData

A newly detected signal (its end is not known yet).

SignalDetectedEvent

A social signal was detected.

SignalEndedData

End time of a signal that is no longer active.

SignalEndedEvent

An active signal ended.

SignalUpdatedData

Updated details for a signal that is still active.

SignalUpdatedEvent

An active signal’s details changed.

TokenResponse

Response of POST /v1/auth.

TranscriptGeneratedEvent

The server transcribed a slice of the session’s audio.

TranscriptSegment

One segment of a conversation transcript.

UnknownEvent

A server envelope whose type this SDK version does not know. Newer API versions may add event types; they are surfaced as-is instead of failing the session. Attributes: type: The envelope’s type discriminator. raw: The full envelope payload as received.

Enumerations

AnalysisGroup

Analysis track groups selectable on the real-time API.

EngagementLevel

Coarse engagement state of the analyzed subject.

GoalDimension

Interaction-goal dimensions used for feedback and conversation quality.

IncludeFlag

Optional response sections selectable on upload and stream analysis.

Probability

Confidence band attached to a detected signal.

RealtimeFeedbackFrequency

How often the real-time API generates feedback output. HIGH is roughly every 10 seconds of analyzed video, MEDIUM every 20 seconds, and LOW every 30 seconds.

Scope

OAuth-style scopes accepted by the Interhuman API.

SignalType

Social signals the Inter-1 model can detect.

Exceptions

InterhumanAPIError

An error response from the Interhuman API, or a transport failure. Attributes: status: HTTP status code, or 0 when the request never reached the API (network failure). error_id: Machine-readable error code from the response body (e.g. ih2001), when the API supplied one. correlation_id: Correlation id of the failed request, when supplied. link: Documentation link for the error, when supplied. body: The parsed JSON error body, when one was returned.

InterhumanConfigError

Raised for client-side misuse, before any network call is made. Examples: missing credentials, sending on a socket that is not open, or connecting a client that is already connected.

InterhumanError

Base class for every error raised by the Interhuman SDK.

Functions

http_to_ws_base_url()

Derive the WebSocket base URL from an HTTP base URL. https:// becomes wss:// and http:// becomes ws://; any path is preserved and a trailing slash is trimmed. Args: http_base_url: The HTTP base URL to convert. Returns: The WebSocket base URL without a trailing slash.

parse_realtime_event()

Parse one real-time envelope into its typed event model. Args: payload: The decoded JSON envelope (must carry a string type). Returns: The matching typed event, or UnknownEvent for a type this SDK version does not know.

parse_stream_event()

Parse one stream envelope into its typed event model. Args: payload: The decoded JSON envelope (must carry a string type). Returns: The matching typed event, or UnknownEvent for a type this SDK version does not know.

resolve_http_base_url()

Resolve the HTTP base URL from an explicit override or a named environment. Args: base_url: Explicit base URL (e.g. http://localhost:8080). Takes precedence over environment when provided. environment: Named environment. Defaults to production. Returns: The base URL without a trailing slash.

Constants

DEFAULT_REFRESH_SKEW_SECONDS

Type: float

DEFAULT_SCOPES

Type: tuple

Environment

Type: type alias

HTTP_BASE_URLS

Type: dict

InteractionFeedback

Type: type alias

NO_GUIDANCE

Type: str

RealtimeEvent

Type: type alias

StreamEvent

Type: type alias

VideoInput

Type: type alias