July 13, 2026

Kiosk channel and Napster Station, text-only WebSocket sessions, pre-recorded video clips, v2 avatars from a still image, and clearer connection errors

Deploy to a Napster Station with the Kiosk channel

You can now deploy your Omniagent to a Napster Station — a dedicated device for in-person, walk-up conversations in lobbies, retail floors, showrooms, and events. The Station pairs a small screen showing the agent's avatar with a large screen that runs your custom experience, which the agent drives as it talks. You configure it through the kiosk channel.

  • PUT /public/agents/{agentId}/channels/kiosk — configure the kiosk channel (the experience URL, opening instructions, tools, knowledge, FAQs)
  • Kiosk conversations are recorded as sessions with sessionType: "kiosk"

Kiosk requires a Napster Station. See napster.com/station for more details, and contact us to get set up.

See the Kiosk guide for details.

Text-only conversations over WebSocket

WebSocket sessions can now run in a text-only modality — a typed chat with no voice and no avatar. Set modality to "text" when you create a WebSocket connection: the user's messages go in and the agent's text replies come back over the same connection, with no audio streaming.

curl -X POST https://companion-api.napster.com/public/agents/agent_abc123/connections \
  -H "X-Api-Key: $NAPSTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "channelType": "websocket",
    "modality": "text"
  }'

modality accepts audio (the default) or text, and is also available on POST /public/ws-connections. Text-only is a WebSocket modality, not a separate channel.

See WebSockets — Text sessions and Choosing a Channel for details.

Generate a v2 avatar from a still image

The v2 avatar model now accepts a still image, not only a video. If you don't have a reference video of the person, set version to "v2" and provide a pictureUrl — you get the v2 rendering model without needing to capture and upload video. A reference video (videoUrl) still produces the best lip sync and expressions.

curl -X POST https://companion-api.napster.com/public/digital-twins \
  -H "X-Api-Key: $NAPSTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "firstName": "Sarah",
    "lastName": "Johnson",
    "description": "VP of Customer Success at Acme Corp.",
    "gender": "female",
    "ethnicity": "Caucasian",
    "externalClientId": "sarah-johnson-001",
    "pictureUrl": "https://example.com/images/sarah.png",
    "version": "v2"
  }'

See Avatar Models for the full comparison.

Pre-recorded video clips

You can now generate a pre-recorded video of your Omniagent's avatar speaking text you provide — a video greeting, a training clip, an onboarding walkthrough, or an announcement. Give it the text and a voice; the API renders a lip-synced, voiced video you can preview, download, and reuse.

curl -X POST https://companion-api.napster.com/public/companions/comp_abc123/recordings \
  -H "X-Api-Key: $NAPSTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "provider": "openAi",
    "voiceId": "alloy",
    "text": "Welcome to Acme. Here is everything you need to get started."
  }'

Recordings are generated asynchronously — poll the recording until its status is completed, then request a time-limited download URL for the video.

  • POST /public/companions/{companionId}/recordings — start a recording
  • GET /public/companions/{companionId}/recordings and …/{recordingId} — list and check status
  • GET …/{recordingId}/download-url — get the video file
  • DELETE …/{recordingId} — remove it

See the Video Recordings guide for details.

Clearer errors on invalid connections

Creating a connection with invalid settings — an unsupported voiceId, malformed provider credentials, or a companion that isn't ready — now returns a 400 response with a descriptive error explaining what to fix. Previously such a request could connect and then fail silently; now it is aborted immediately and the reason comes back on the request.

Handle the 400 on your backend before handing a token to the client. See Session Configuration — Handling invalid configuration.

On this page