v1.0 · in private beta

The programmable layer for live video.

Stream, transact, automate. Vidbloq gives builders the primitives — peer-to-peer transactions, AI agents, engagement — to make live video feel like a product, not a tool.

stream.vidbloq.com/q9-fk2-zr
Live·1,284
mayahost
jordan
reza
lin
Agent · live captions
so the way webhooks work in vidbloq is they're HMAC-signed · and you can verify them with one call from the node sdk · we ship them through bullmq with exponential backoff · for the agent piece, transcription runs on livekit agents · you can subclass the base agent and bring your own llm · moderation and summary recipes are shipped first-party
Live preview · stub dataRenders the same components shipped in @vidbloq/react
(the shift)

Live video has been a closed product for a decade. We’re making it a primitive.

03 · what you can build

Three examples. There are more.

bookings · 1:1 · 30min
andrew
maya
session$48 USDC · paid
starts in00:24
agenttranscription · on

Verified-payment 1:1 sessions.

Verify payment, mint a token, drop the user into the room. Refunds and rescheduling handled by webhooks. Around 40 lines of TypeScript end-to-end.

StreamsTokensTransactionsWebhooks
// 1. Confirm payment on your side
const paid = await db.payments.exists(req.body.bookingId)
if (!paid) return res.status(402).end()

// 2. Mint a Vidbloq token scoped to one room
const { token, url } = await vidbloq.tokens.mint({
  streamId: booking.streamId,
  identity: req.user.id,
  role: 'guest',
  ttl: 60 * 30
})

return res.json({ token, url })
04 · primitives

Seven primitives. One SDK.

Compose them how you want. Everything below is a real call against @vidbloq/node.

01 · Streams

Spin up rooms in one call.

const stream = await vidbloq.streams.create({
  title: 'Office hours',
  scheduledFor: nextWeek
})
jwt · headereyJhbGciOiJIUzI1Ni...payloadstreamId: q9-fk2-zrrole: guestexp: +30m
02 · Tokens

Mint scoped access in 50ms.

await vidbloq.tokens.mint({
  streamId, identity, role
})
M
J
R
L
+8
03 · Participants

Roles, presence, permissions.

vidbloq.participants
  .list(streamId)
J
jordan
+5USDC
tx · pending → confirmed
M
maya
04 · Transactions

Peer-to-peer value transfer. In the room.

const tx = await vidbloq.transactions.create({
  streamId, from: viewer, to: host,
  amount: 5, token: 'USDC'
})
A
62%
B
24%
C
14%
05 · Agendas

Polls, Q&A, quizzes, contests.

vidbloq.polls.create({
  streamId, question, options
})
06 · Recordings

Capture, store, replay.

vidbloq.recordings
  .start(streamId)
stream.started200
participant.joined200
transaction.confirmed200
agent.completed200
07 · Webhooks

Signed. Retried. Observable.

vidbloq.webhooks.verify(
  body, sig, secret
)
05 · agents

Agents that join the room.

Transcription, moderation, summaries, custom logic — live participants, programmable like any other primitive. Not "AI features." Agents are participants who happen to be programs.

loop · 15s
agent · Transcription@vidbloq/agents
// Live captions, multilingual
await vidbloq.agents.start(
  streamId,
  'transcription',
  { language: 'en', interim: true }
)

// Receive partial results via webhook
vidbloq.webhooks.on(
  'agent.transcription',
  handle
)
Self-host the worker, or run it on Vidbloq
live room · 4 participants
recording
mayahost
jordan
rezamic off
Agent · Transcription
@vidbloq/agentsrunning
transcriptso the way webhooks work is they're HMAC-signed and you verify them with one call from the node sdk
Hover the stage to pause · click a step to jumpChoreographed loop · 15s
06 · developers

Three steps from zero to live.

End-to-end TS, from server to client.

step 01 · Installts
pnpm add @vidbloq/node
+ added~2.1 MB
@vidbloq/nodev1.0.0
deps · livekit-server-sdk · zod
step 02 · Mint a tokents
import { Vidbloq } from '@vidbloq/node'

const vb = new Vidbloq({
  apiKey: process.env.VIDBLOQ_API_KEY!,
  apiSecret: process.env.VIDBLOQ_API_SECRET!
})

const { token, url } = await vb.tokens.mint({
  streamId, identity, role: 'guest'
})
jwt
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdHJlYW1JZCI6InE5LWZrMi16ciIs...
ttl30 minroleguest
step 03 · Drop user in roomts
import { VidbloqRoom } from '@vidbloq/react'

<VidbloqRoom token={token} url={url}>
  <ParticipantGrid />
  <CallControls />
</VidbloqRoom>
rendered
M
J
R
L
live · @vidbloq/react
08 · ship

Start building.

We’re rolling out access in waves. Drop your email — we’ll send your API key as soon as your batch opens.

Or read the docs first
First 10,000 participant-minutes / mo · free