Grounded support and live voice
Zipper Pilot
Zipper Pilot is Zipper’s embeddable support copilot. Drop hall.js on a site. It learns pages, sitemaps, OpenAPI, and the Zipper services on the workspace, then answers only from those scrolls — zip-fast compose on CPU, not a rented GPU. Visitors can ring for a human. On Starter and above, voice and video run WebRTC with STUN, optional TURN, and an HTTPS media relay when UDP is blocked. Waiting callers sit in a queue; an open agent chooses which booth to take. Transcripts stay on this Zipper process. This is not Intercom Fin, not a PSTN number, and not a GPU agent farm. Included on every Zipper plan.
Cloudflare analogue: Intercom Fin + Twilio Voice (skill map only)
What it is
Zipper Pilot is Zipper’s embeddable support copilot. Drop hall.js on a site. It learns pages, sitemaps, OpenAPI, and the Zipper services on the workspace, then answers only from those scrolls — zip-fast compose on CPU, not a rented GPU. Visitors can ring for a human. On Starter and above, voice and video run WebRTC with STUN, optional TURN, and an HTTPS media relay when UDP is blocked. Waiting callers sit in a queue; an open agent chooses which booth to take. Transcripts stay on this Zipper process. This is not Intercom Fin, not a PSTN number, and not a GPU agent farm.
Closest analogue: Intercom Fin + Twilio Voice (skill map only). SLA 99.9% · p99 90ms. Admins create halls and allowlists. Operators staff the desk and pick booths.
- ▸Learn the host site and Zipper palace services
- ▸Grounded answers on this node — not a GPU LLM
- ▸WebRTC booths on Starter+, with HTTPS relay fallback
- ▸Agents pick waiting calls; they are not auto-assigned
- ▸One script tag: /chamberlain/v1/hall.js
How it works
Zipper Pilot is an embeddable support copilot. Dashboard → Zipper Pilot → Open a hall. Copy /chamberlain/v1/hall.js with your public hall key. Teach it URLs, a sitemap, OpenAPI, or pasted copy. It also seeds this workspace’s Zipper services.
Chat answers only from those scrolls, composed with zip-fast on this CPU. It will not invent policy. Say “talk to a human” to keep the thread for an agent.
Starter and above unlock voice booths: WebRTC with public STUN, optional TURN, and an HTTPS PCM relay when UDP is blocked. Waiting callers sit in a queue. An open agent picks which booth to answer. This is not PSTN, not Intercom Fin, and not a GPU farm.
Use cases
Concrete ways teams use this service on day one.
Help visitors on a SaaS marketing site
A product site needs a bot that knows pricing, docs, and the API, plus a real voice path for paid customers.
- Open a hall and paste the site URL and /llms.txt.
- Drop hall.js before </body>.
- Staff the desk, go open, and pick waiting booths.
Queue inbound demos during a launch
Launch day floods the team. Bots answer FAQs; humans take the overflow calls they choose.
- Keep Free chat on the marketing domain.
- Upgrade to Starter for voice.
- Agents pick the hottest waiting booth instead of round-robin.
Set it up in the dashboard
Dashboard → Services → Zipper Pilot.
Open a hall. Copy the embed. Teach URLs.
Open the desk, set yourself open, pick a booth.
API
Control-plane: GET|POST /api/v1/chamberlain · GET /chamberlain/v1/hall.js · POST /api/v1/chamberlain/host/:host/chat · GET /live · POST /signal · /relay · POST /queue · POST /:id/pick. Send Authorization: Bearer tz_live_YOUR_TOKEN.
Creates count against the plan quota. A 402 plan_limit means you are at the cap — upgrade or delete an unused resource.
Embed the hall
<script src="https://tinyzipper.com/chamberlain/v1/hall.js" data-hall="ch_live_YOUR_KEY" async></script>
Create a hall
curl -sS -X POST https://tinyzipper.com/api/v1/chamberlain \
-H "Authorization: Bearer tz_live_YOUR_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"name":"docs-hall","origins":["shop.example.com"]}'List the same resource in JavaScript
const res = await fetch("https://tinyzipper.com/api/v1/chamberlain", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.ZIPPER_TOKEN}`,
"Content-Type": "application/json"
}
});
const json = await res.json();
if (!res.ok) throw new Error(json.error ?? res.statusText);
console.log(json);Tips
The bot will not answer off-corpus. Teach it a URL instead of prompting harder.
Voice is Starter+. Free can still chat and hand off.
Agents pick calls. Zipper does not auto-assign a booth.
If corporate UDP is blocked, the HTTPS relay still carries audio on this node.
This is not a phone number. Tab callback, not PSTN.
- ▸Grounded corpus
- ▸WebRTC + HTTPS relay
- ▸Origin allowlist
Runbook
Open a Zipper Pilot hall. Copy hall.js. Teach it URLs, a sitemap, or OpenAPI. Free chats from those scrolls. Starter and above get voice booths. Agents go open, then pick a waiting caller — Zipper does not auto-assign. If ICE fails, the HTTPS relay carries audio on this node. Not Intercom Fin, not PSTN, not a GPU farm.
Next: Honest production · All docs · Create a free account