Pick the level of control you want
Embed
No codeDrop one <script> tag and theme it with data-* attributes. Our UI, your colors — live in minutes.
Embedding guideHeadless library
Your UIBuild your own components in any framework. @perfox/widget-core owns init, async replies, history, voice and upload — you own every pixel.
Headless library APIRaw protocol
Full controlNo Perfox code at all. Speak the REST + WebSocket protocol directly from any language or runtime.
Build from scratchA real widget, fully custom
The chat below is React we wrote on top of @perfox/widget-core — talking to a live Perfox tenant. Open it, send a message (202 → WebSocket reply), and try the history switcher: every thread is a real, replayable conversation.
Two steps to conversation
POST /send returns 202; the engine matches the WebSocket reply frame by reply_id and self-heals with a history poll if a push is missed.
Replays the thread on connect and pages backwards with loadOlder() — no cursor bookkeeping in your UI.
startVoice() / stopVoice() over LiveKit, with partial + final transcript events you can render as live captions.
upload(file) for attachments and identify(user_context) for HMAC-verified end-users — same API surface, opt-in.
Full method & event reference in the headless library docs. Prefer no library? Build from the raw protocol.