Build on the supported package contract
Use @absolutejs/meeting-recall through its supported public entry points.
@absolutejs/meeting-recallv0.0.1-beta.16betaVoice & MediaRecall.ai source adapter for @absolutejs/meeting — Recall joins a Google Meet / Zoom / Teams call as a bot and streams per-participant audio into the meeting core for live transcription + analysis
bun add @absolutejs/meeting-recallRecall.ai source adapter for @absolutejs/meeting. Recall joins a Google Meet / Zoom / Teams call as a bot and streams per-participant audio; this adapter turns that into the MeetingSource the meeting core consumes, so the @absolutejs/voice scribe can transcribe the call live with speaker labels.
One Recall integration covers all three platforms — you only pass a meeting URL.
For dynamic applications, createRecallMeetingSourceFactory binds the Recall credentials and websocket once; @absolutejs/meeting supplies each approved meeting URL as the managed session target. The hosted AbsoluteJS.ai platform uses this factory contract, so installing the package never creates a bot or joins a call.
Recall's bot dials out to a websocket _you_ host and streams audio_separate_raw events: one stream per participant, mono 16-bit little-endian PCM at 16 kHz (exactly the scribe's input format). Your server accepts that socket and forwards each frame to source.ingest(), which decodes the PCM and emits diarized audio + participant events.
A Recall workspace lives in exactly one region and its key only works against that region's host. Pass region ("us-west-2" | "us-east-1" | "eu-central-1" | "ap-northeast-1") or a full baseUrl (https://us-west-2.recall.ai/api/v1). Defaults to us-west-2.
createRecallMeetingSource(options) → MeetingSource & { botId, ingest }.
start() creates the bot with a realtime websocket endpoint pointed at
websocketUrl — or, given botId, resumes that bot without creating one (for picking a call back up after your server restarts; Recall redials the websocket for 90 seconds).
ingest(frame) decodes a realtime frame (JSON string, bytes, or object)
into audio / participant events.
stop() makes the bot leave the call.
createRecallClient(options) → a thin typed client:
createBot, getBot, listBots, leaveBot, deleteBot.
RECALL_AUDIO_FORMAT — the PCM format Recall emits.
Outcomes
Use @absolutejs/meeting-recall through its supported public entry points.
Hardening checklist
Follow in order
Working example for Usage.
import { createMeeting } from "@absolutejs/meeting";
import { createRecallMeetingSource } from "@absolutejs/meeting-recall";
import { createDeepgramStt } from "@absolutejs/voice-deepgram";
// 1. A source backed by a Recall bot. `websocketUrl` is a public wss:// URL
// your server listens on (Recall connects out to it).
const source = createRecallMeetingSource({
apiKey: process.env.RECALL_API_KEY!,
baseUrl: process.env.RECALL_API_BASE_URL, // regional; defaults to us-west-2
meetingUrl: "https://meet.google.com/abc-defg-hij",
websocketUrl: "wss://your-app.example.com/meeting/recall",
botName: "Deal Referee",
});
// 2. Wire it into the meeting core + a scribe STT.
const meeting = await createMeeting({
source,
stt: createDeepgramStt({ apiKey: process.env.DEEPGRAM_API_KEY! }),
sessionId: crypto.randomUUID(),
});
meeting.on("turn", (turn) => console.log(turn.speaker, turn.text));
await meeting.start(); // creates the bot; it joins + starts streaming
// 3. In your websocket handler, pipe each frame into the source:
// ws.on("message", (data) => source.ingest(data));
await meeting.stop(); // bot leaves the callRecall's bot dials out to a websocket _you_ host and streams audio_separate_raw events: one stream per participant, mono 16-bit little-endian PCM at 16 kHz (exactly the scribe's input format). Your server accepts that socket and forwards each frame to source.ingest(), which decodes the PCM and emits diarized audio + participant events.
Recall bot ──(wss, per-participant PCM)──▶ your server ──source.ingest()──▶ @absolutejs/meeting ──▶ voice scribe ──▶ diarized turnsSupported entry points declared by this package manifest.
Package entry point declared in package.json.
Scripts declared by this package manifest.