@keystrokehq/zoom
v0.0.1
Published
Zoom meetings, webinars, recordings, reporting, and webhook helpers for Keystroke workflows.
Downloads
47
Readme
@keystrokehq/zoom
Zoom meetings, webinars, recordings, reporting, and webhook helpers for Keystroke workflows.
This package is a single-mode official integration. The package root is intentionally non-canonical; use explicit subpaths instead:
@keystrokehq/zoom/connection@keystrokehq/zoom/client@keystrokehq/zoom/schemas@keystrokehq/zoom/events@keystrokehq/zoom/triggers@keystrokehq/zoom/verification@keystrokehq/zoom/meetings@keystrokehq/zoom/webinars@keystrokehq/zoom/recordings@keystrokehq/zoom/reports
Connection
Use the public Zoom connection for connected-account workflow operations:
import { zoom } from '@keystrokehq/zoom/connection';The package intentionally uses a Keystroke-owned fetch client instead of zoomus or @zoom/rivet so the OAuth token lifecycle, runtime ownership, and webhook handling stay aligned with the official integration model.
Meetings
import { createMeeting, listMeetings } from '@keystrokehq/zoom/meetings';
const created = await createMeeting.run({
topic: 'Customer onboarding call',
type: 'scheduled',
startTime: '2026-04-10T16:00:00Z',
duration: 30,
settings: {
waitingRoom: true,
autoRecording: 'cloud',
},
});
const meetings = await listMeetings.run({
userId: 'me',
type: 'scheduled',
pageSize: 25,
});Webinars
import { addWebinarRegistrant, getWebinar } from '@keystrokehq/zoom/webinars';
const webinar = await getWebinar.run({
webinarId: '81234567890',
});
await addWebinarRegistrant.run({
webinarId: webinar.id,
registrant: {
email: '[email protected]',
firstName: 'Ada',
lastName: 'Lovelace',
},
});Recordings And Reports
import {
getMeetingSummary,
listRecordings,
} from '@keystrokehq/zoom/recordings';
import { getDailyUsageReport } from '@keystrokehq/zoom/reports';
const recordings = await listRecordings.run({
userId: 'me',
from: '2026-04-01',
to: '2026-04-09',
});
const summary = await getMeetingSummary.run({
meetingId: recordings.meetings[0]?.id ?? 'meeting-id',
});
const report = await getDailyUsageReport.run({
year: 2026,
month: 4,
});Webhooks
import { webhooks } from '@keystrokehq/zoom/triggers';
const meetingStarted = webhooks.meetingStarted({
name: 'Zoom Meeting Started',
transform: (payload) => ({
meetingId: payload.meeting.id,
topic: payload.meeting.topic,
}),
});Zoom requires both signed delivery verification and endpoint URL validation. The package exports verifyZoomWebhookRequest() and createZoomEndpointValidationResponse() from @keystrokehq/zoom/verification for the signature and CRC logic.
Supported direct-binding webhook helpers cover:
meeting.createdmeeting.updatedmeeting.startedmeeting.endedmeeting.registration_createdwebinar.createdwebinar.updatedwebinar.startedwebinar.endedwebinar.registration_createdrecording.completed
Caveats
- Some Zoom APIs are plan-gated or admin-scoped, especially reporting, archived files, devices, and AI meeting summaries.
- Zoom uses UUIDs on several historical endpoints; values that begin with
/or contain//must be double-encoded, which the client wrapper handles automatically. - Zoom does not expose a native "upcoming meeting" or "upcoming webinar" webhook event. Upcoming-event workflows should use scheduled polling against meetings or webinars APIs instead of waiting for a webhook.
- Recurring meetings arrive on the standard
meeting.*webhook events with occurrence metadata rather than through separate recurring-meeting event names. - Zoom's
endpoint.url_validationresponse body must echo the incomingplainToken, so CRC handling currently lives in the exported verification helpers instead of the direct-binding trigger helpers.
