Skip to content

Cloudflare.RealtimeKit reference

Source: packages/cloudflare/src/RealtimeKit/App.ts

A Cloudflare RealtimeKit app — the organizational container for RealtimeKit meetings, presets, and webhooks.

RealtimeKit (the acquired Dyte platform) is in beta and must be enabled on the account. The API is create-only today: there is no update and no delete endpoint. Destroying the resource therefore only forgets the app from state (with a warning) — the app itself remains on the account until Cloudflare ships a delete API. Because of this, an existing app with the same name is adopted rather than duplicated.

Basic app

const app = yield* Cloudflare.RealtimeKit.App("Meetings", {
name: "my-meetings-app",
});

Child resources

const app = yield* Cloudflare.RealtimeKit.App("Meetings", {});
const webhook = yield* Cloudflare.RealtimeKit.Webhook("Events", {
appId: app.appId,
url: "https://example.com/webhook",
events: ["meeting.started", "meeting.ended"],
});

RealtimeKit apps can’t be deleted, so an app created once is usually shared. App.lookup references one Alchemy doesn’t manage (created in the dashboard or by another stack), found by appId or name. It is read during plan/deploy and never created or updated.

const app = Cloudflare.RealtimeKit.App.lookup({ name: "meetings" });
yield* Cloudflare.RealtimeKit.Webhook("Events", {
appId: app.appId,
url: "https://example.com/webhook",
events: ["meeting.started", "meeting.ended"],
});

Source: packages/cloudflare/src/RealtimeKit/Preset.ts

A Cloudflare RealtimeKit preset — a named participant role (e.g. host, guest) bundling permissions, media quality, and UI design tokens for a RealtimeKit app.

Name, config, UI, and permissions are all mutable in place; only moving the preset to a different app forces a replacement. The create API requires the full config / UI / permissions objects, so the resource fills unspecified sections with sensible defaults.

Default group-call preset

const app = yield* Cloudflare.RealtimeKit.App("Meetings", {});
const guest = yield* Cloudflare.RealtimeKit.Preset("Guest", {
appId: app.appId,
name: "guest",
});

Host preset with moderation permissions

const host = yield* Cloudflare.RealtimeKit.Preset("Host", {
appId: app.appId,
name: "host",
permissions: {
...Cloudflare.RealtimeKit.defaultRealtimeKitPresetPermissions(),
canRecord: true,
kickParticipant: true,
pinParticipant: true,
acceptWaitingRequests: true,
},
});
const preset = yield* Cloudflare.RealtimeKit.Preset("Guest", {
appId: app.appId,
name: "guest",
config: {
...Cloudflare.RealtimeKit.defaultRealtimeKitPresetConfig(),
viewType: "WEBINAR",
},
});

Source: packages/cloudflare/src/RealtimeKit/Webhook.ts

A Cloudflare RealtimeKit webhook — receives meeting, recording, livestream, transcript, and summary events for a RealtimeKit app.

Name, URL, events, and enablement are all mutable in place; only moving the webhook to a different app forces a replacement.

Meeting lifecycle events

const app = yield* Cloudflare.RealtimeKit.App("Meetings", {});
const webhook = yield* Cloudflare.RealtimeKit.Webhook("Lifecycle", {
appId: app.appId,
url: "https://example.com/webhook",
events: ["meeting.started", "meeting.ended"],
});

Recording events to a Worker

const webhook = yield* Cloudflare.RealtimeKit.Webhook("Recordings", {
appId: app.appId,
url: worker.url,
events: ["recording.statusUpdate"],
});
const webhook = yield* Cloudflare.RealtimeKit.Webhook("Lifecycle", {
appId: app.appId,
url: "https://example.com/webhook",
events: ["meeting.started", "meeting.ended"],
enabled: false,
});