Owncast
Register an admin webhook for chat presence events — viewers support the streamer per second watched.
What gets metered
live viewing presence — Owncast emits USER_JOINED / USER_PARTED chat events to a registered admin webhook; the sidecar bills (parted − joined) × RATE micro-USDC per second on part.
- Who pays: the viewer (chat username, mapped in
PAYER_WALLETS), who has staked + granted via the agent - Who gets paid: the streamer (
STREAMER_KEY, resolved viaCREATOR_WALLETS)
Attach surface — no fork
Owncast's own outbound-webhook mechanism: an admin registers the sidecar URL via POST /api/admin/webhooks/create, subscribed to USER_JOINED / USER_PARTED. Zero Owncast change.
Quickstart
Run the sidecar, then register the webhook against the running Owncast admin API:
PLATFORM=owncast \
FACILITATOR_URL=https://facilitator.example FACILITATOR_API_KEY=… \
STREAMER_KEY=stream \
PAYER_WALLETS='{"<viewer-username>":"0x…"}' \
CREATOR_WALLETS='{"stream":"0x…"}' \
RATE=1000 npx up-integration # micro-USDC per second
# register the outbound webhook (wraps POST /api/admin/webhooks/create):
./register-webhook.sh # → USER_JOINED / USER_PARTED
# → http://up-sidecar:8410/owncast
All values above are placeholders — supply your own facilitator, wallets, and rate.
The shared prerequisites (a deployed StakeVaultFactory, a running
facilitator, a wallet registry) are covered in the admin overview.
Verify
npm run e2e:owncast -w @universal-paywall/integrations Drives the real sidecar HTTP server with the byte-exact JSON Owncast posts, through the facilitator to an on-chain settle — asserts the streamer is paid (parted − joined) × RATE.
Notes & caveats
Links
- Recipe:
packages/integrations/deploy/owncast/README.md— the authoritative attach instructions in the repo. - Testing plan — Owncast row (L3 + L4 details)
- Integration Playbook — how integrations like this one are built.
- Testing plan — this platform's row in the L1→L4 matrix.