meetbot / docs
SDKs

TypeScript / JavaScript SDK

Official @meetbot/sdk for Node.js 22+. Typed HTTP client, webhook signature verification, full surface for the meetbot orchestrator API.

The official TypeScript SDK is @meetbot/sdk on npm. Source is MIT at github.com/meetbot-dev/meetbot/tree/main/packages/sdk.

Install

bash npm install @meetbot/sdk
bash pnpm add @meetbot/sdk
bash yarn add @meetbot/sdk
bash bun add @meetbot/sdk

Requires Node 22+. ESM-only (no CommonJS shim — Node 22 ships native ESM).

Auth

import { createMeetbot } from "@meetbot/sdk";

const meetbot = createMeetbot({
  apiKey: process.env.MEETBOT_API_KEY!, // mb_live_… or mb_test_…
  baseUrl: "https://api.meetbot.dev", // optional; this is the default
});

Get a key at meetbot.dev/account/keys.

Method reference

MethodHTTPReturns
meetbot.dispatchBot(input)POST /api/v1/jobsPromise<Job>
meetbot.getJob(id)GET /api/v1/jobs/{id}Promise<Job | null>
meetbot.cancelJob(id)DELETE /api/v1/jobs/{id}Promise<void>
meetbot.requestRecordingPermission(id)POST /api/v1/jobs/{id}/request-recording-permissionPromise<RequestRecordingPermissionResult>
verifyWebhookSignature({ body, header, secret })n/a — localboolean

Bot-control verbs (pause_recording, resume_recording, stop_recording, leave_call, send_chat_message, pin_participant) are wired into the SDK in M1.1.

Example 1 — dispatch a bot

import { createMeetbot } from "@meetbot/sdk";

const meetbot = createMeetbot({ apiKey: process.env.MEETBOT_API_KEY! });

const job = await meetbot.dispatchBot({
  externalId: "lesson-2026-05-09-pavel",
  meetingUrl: "https://meet.google.com/abc-defg-hij",
  displayName: "Acme Notetaker",
  webhooks: {
    onFinalize: "https://api.acme.example/meetbot/finalize",
  },
});

console.log("dispatched", job.id, "→", job.status);

Example 2 — verify a webhook

app/api/webhook/meetbot/route.ts
import { verifyWebhookSignature } from "@meetbot/sdk";

export async function POST(req: Request) {
  const raw = await req.text();
  const ok = verifyWebhookSignature({
    body: raw,
    header: req.headers.get("x-meetbot-signature"),
    secret: process.env.MEETBOT_WEBHOOK_SECRET!,
  });
  if (!ok) return new Response("invalid signature", { status: 401 });

  const event = JSON.parse(raw);
  // …handle event.data.event
  return new Response("ok");
}

The full algorithm and gotchas are at Webhooks: Signature Verification.

Example 3 — auto-leave + custom metadata

const job = await meetbot.dispatchBot({
  externalId: "q2-board-meeting-acme",
  meetingUrl: "https://meet.google.com/xyz-abcd-efg",
  joinAt: new Date("2026-05-15T14:00:00Z"),
  metadata: { customer_id: "cust_4711", workspace: "acme-prod" },
  autoLeave: {
    afterEntryDelaySeconds: 300, // leave if not let in within 5m
    afterMaxSeconds: 7200, // cap at 2h
    onBotDetected: true, // leave if Otter/Fireflies/Read shows up
  },
});

Errors

MeetbotHttpError carries a numeric status and an optional machine- readable code from the orchestrator's error envelope:

import type { MeetbotHttpError } from "@meetbot/sdk";

try {
  await meetbot.dispatchBot({ externalId: "bad", meetingUrl: "not-a-url" });
} catch (err) {
  const e = err as MeetbotHttpError;
  if (e.status === 400) console.error("validation:", e);
  if (e.status === 401) console.error("auth:", e);
  if (e.status === 429) console.error("rate limit:", e);
  throw err;
}

See also

On this page