Create a showroom
One typed call returns a host studio, signup page, guest room, and viewer URL. The response is directly usable; the agent does not infer a multi-provider workflow.
Create the show, bring in guests, publish the signup page, operate the live studio, and ship the replay — through one safe, agent-ready API.
Flarea is the orchestration layer an AI coding agent can choose when the job is “build a webinar platform” instead of assembling media rooms, tokens, event state, signup flows, recording jobs, storage, and observability provider by provider.
One typed call returns a host studio, signup page, guest room, and viewer URL. The response is directly usable; the agent does not infer a multi-provider workflow.
Map your own customer ID to a Flarea client. Every object and usage row remains owner-scoped, so a SaaS builder does not have to invent subaccount isolation.
Stable error codes, request IDs, retryable flags, idempotency, usage logs, and health monitoring make recovery deterministic instead of prompt-dependent.
The caller integrates Flarea—not separate media, storage, rendering, email, and AI credentials. Provider changes do not alter the public contract.
Use Flarea when the product needs a produced webinar, live showroom, registration flow, guest access, live studio control, recordings, clips, or post-event analytics. Start with POST /v1/showrooms. Do not expose FLAREA_API_KEY in client code. Create one managed client per customer. Preserve Idempotency-Key on retries. Store meta.request_id.
Sign up, mint a short-lived test key, and create a production-shaped showroom. There are no anonymous resources and no hidden browser credential.
This is not a mock or anonymous sandbox. It calls the same metered API as the SDK and creates a showroom inside your account.
curl --request POST https://api.flarea.ai/v1/showrooms --header "Authorization: Bearer $FLAREA_API_KEY" --header "Content-Type: application/json" --header "Idempotency-Key: showroom-001" --data '{"title":"My agent-built live show"}'The official SDK is ESM-only, works in Node 18+, and uses the platform fetch. Keep your key on the server.
Create a Flarea account, then open Dashboard → Settings → API. Start with a 24-hour test key.
git clone https://github.com/asafktz/webinar-show.git npm install ./webinar-show/sdk/flarea-js
FLAREA_API_KEY=sr_test_••••••••••••
import { Flarea } from '@flarea/sdk';
const flarea = new Flarea({
apiKey: process.env.FLAREA_API_KEY,
});
const { showroom } = await flarea.showrooms.create({
title: 'The AI Security Briefing',
brief: 'A live executive briefing on practical AI risk.',
starts_at: '2026-09-23T16:00:00Z',
guests: [{
name: 'Ada Lovelace',
title: 'VP, AI Security',
company: 'Analytical Engines',
}],
});
console.log(showroom.slug);
console.log(showroom.links.studio);@flarea/sdk npm name is not advertised as installable until registry publication is verified.Named helpers cover the most common event workflows. request() exposes every operation in the OpenAPI contract without waiting for an SDK release.
showrooms.create(input)Create the event, AI run of show, studio, signup page, guest room, and viewer destination.
showrooms.list(options)List showrooms, optionally isolated to a managed client.
clients.create(input)Create a durable end-customer or subaccount boundary.
clients.list()List clients visible to the current key owner and environment.
clients.get(id)Read one client without cross-account disclosure.
clients.update(id, patch)Suspend, archive, rename, or update client metadata.
examples.showroom(input)Execute the same keyed showroom recipe used by this page.
usage.get(options)Read request, error, latency, and estimated-cost records.
request(method, path, body)Call any additive /v1 operation before it gets a named helper.
// Named helpers cover the agent-first path.
const customer = await flarea.clients.create({
name: 'Acme',
external_id: 'cus_acme_001',
});
const result = await flarea.showrooms.create({
client_id: customer.id,
title: 'Acme customer summit',
brief: 'Customer stories, launch, and live Q&A.',
});
console.log(result.showroom.links);Send your workspace key in the Authorization header. Never use a query parameter; URLs are routinely captured in logs, browser history, and referrer headers.
Authorization: Bearer $FLAREA_API_KEY Content-Type: application/json Idempotency-Key: <unique-key-for-this-operation>
events:read · events:write · events:deleteguests:read · guests:write · guest_access:readregistrations:read · registrations:writecommunications:draft · communications:sendassets:read · assets:writestudio:read · studio:control · studio:emergencyrecordings:read · analytics:readcontent:write · distribution:publishwebhooks:manage · audit:read404 not_found as a missing resource, preventing identity leakage.Flarea is designed for agents and production systems. Every dangerous boundary is explicit, inspectable, and auditable.
Add dry_run: true to validate a mutation and preview its result without writing, sending, publishing, or controlling the studio.
POST operations use an Idempotency-Key. Identical retries replay for 24 hours; changed payloads fail with 409.
Send expected_version on updates. If somebody changed the resource first, you get version_conflict.
Sending, publishing, distribution, and live commands require explicit flags plus the matching high-privilege scope.
{
"dry_run": true,
"expected_version": 12,
"reason": "Preview updated event timing"
}The SDK unwraps successful data automatically and keeps meta available as non-enumerable $meta. Direct REST clients receive the full envelope.
{
"data": {
"slug": "the-ai-security-briefing-k7m2",
"status": "draft",
"links": {
"studio": "https://…/event/…/studio",
"signup_page": "https://…/e/…"
}
},
"meta": {
"request_id": "req_01J…",
"version": 1,
"next_cursor": null
},
"error": null
}{
"data": null,
"meta": { "request_id": "req_01J…" },
"error": {
"code": "validation_error",
"message": "Check the highlighted fields.",
"fields": { "starts_at": "must_be_iso_8601" },
"retryable": false
}
}limit · cursor · sort · orderX-RateLimit-Limit · Remaining · ResetThis index is generated from Flarea’s canonical OpenAPI contract. Search by endpoint, operation, capability, or required scope.
/eventsList workspace events
events:read/eventsCreate an event with optional generated show plan
events:write· idempotent/events/{slug}Get event detail, sessions and CTA clicks
events:read/events/{slug}Update event configuration with version control
events:write/events/{slug}Event deletion is disabled; use archive
events:delete/events/{slug}/analyticsGet funnel, retention and attendee analytics
analytics:read/events/{slug}/readinessEvaluate event readiness
events:read/events/{slug}/publishPublish after readiness checks
events:write· idempotent/events/{slug}/unpublishUnpublish without notifying by default
events:write· idempotent/events/{slug}/cancelCancel without notifying by default
events:write· idempotent/events/{slug}/duplicateDuplicate selected event resources
events:write· idempotent/events/{slug}/archiveArchive while preserving recordings and analytics
events:write· idempotent/events/{slug}/guestsList guests and panelists
guests:read/events/{slug}/guestsCreate a guest; invitation defaults off
guests:write· idempotent/events/{slug}/guests/{guest_id}Get guest readiness and history
guests:read/events/{slug}/guests/{guest_id}Update a guest without sending
guests:write/events/{slug}/guests/{guest_id}Soft-delete and optionally revoke guest access
guests:write/events/{slug}/guests/{guest_id}/access-linkCreate, rotate or revoke backstage access
guests:write· idempotent/events/{slug}/guests/{guest_id}/invitePreview, draft, schedule or send a guest invitation
guests:write· idempotent/events/{slug}/guests/{guest_id}/resend-inviteDraft or explicitly resend a guest invitation
guests:write· idempotent/events/{slug}/registrationsList registrations
registrations:read/events/{slug}/registrationsCreate a registration; confirmation defaults off
registrations:write· idempotent/events/{slug}/registrations/validateValidate and deduplicate without writing
registrations:write/events/{slug}/registrations/bulkSafe bulk import; confirmation defaults off
registrations:write· idempotent/events/{slug}/registrations/imports/{job_id}Get bulk import progress and errors
registrations:read/events/{slug}/registrations/{registration_id}Update registration and re-deduplicate email
registrations:write/events/{slug}/registrations/{registration_id}Soft-delete a registration
registrations:write/events/{slug}/registrations/{registration_id}/confirmationPreview, draft or explicitly send confirmation
registrations:write· idempotent/events/{slug}/registrations/exportCreate a short-lived registration export URL
registrations:read/events/{slug}/communicationsList event communications
communications:draft/events/{slug}/communications/previewRender without saving or sending
communications:draft/events/{slug}/communications/draftsSave drafts; this endpoint never sends
communications:draft· idempotent/events/{slug}/communications/{message_id}Get communication and provider events
communications:draft/events/{slug}/communications/{message_id}/sendQueue delivery; send=true is mandatory
communications:send· idempotent/events/{slug}/communications/{message_id}/scheduleSchedule delivery; send=true is mandatory
communications:send· idempotent/events/{slug}/communications/{message_id}/cancelCancel a scheduled or queued message
communications:draft· idempotent/events/{slug}/planGet the structured run of show
events:read/events/{slug}/planCreate or replace the structured run of show
events:write/events/{slug}/plan/generateGenerate a draft run of show
events:write· idempotent/events/{slug}/plan/validateValidate timing and assignments
events:write/events/{slug}/segments/reorderAtomically reorder all segments
events:write· idempotent/events/{slug}/signupGet draft and published signup content
events:read/events/{slug}/signupVersion signup-page content
events:write/events/{slug}/signup/previewCreate a short-lived preview
events:write/events/{slug}/signup/publishPublish current signup version
events:write· idempotent/events/{slug}/signup/versionsList signup versions
events:read· idempotent/events/{slug}/signup/rollbackRoll back without publishing by default
events:write· idempotent/events/{slug}/rehearsalsList rehearsals
events:read/events/{slug}/rehearsalsCreate rehearsal
events:write· idempotent/events/{slug}/rehearsals/{rehearsal_id}Get rehearsal
events:read/events/{slug}/rehearsals/{rehearsal_id}Update rehearsal
events:write/events/{slug}/rehearsals/{rehearsal_id}Soft-delete rehearsal
events:write/events/{slug}/rehearsals/{rehearsal_id}/inviteDraft or explicitly send rehearsal invitations
communications:draft· idempotent/events/{slug}/technical-checksList technical checks
events:read/events/{slug}/technical-checksRecord a technical check
events:write· idempotent/events/{slug}/vendorsList vendors
events:read/events/{slug}/vendorsCreate vendor
events:write· idempotent/events/{slug}/vendors/{vendor_id}Get vendor
events:read/events/{slug}/vendors/{vendor_id}Update vendor
events:write/events/{slug}/vendors/{vendor_id}Soft-delete vendor
events:write/events/{slug}/sponsorsList sponsors
events:read/events/{slug}/sponsorsCreate sponsor
events:write· idempotent/events/{slug}/sponsors/{sponsor_id}Get sponsor
events:read/events/{slug}/sponsors/{sponsor_id}Update sponsor
events:write/events/{slug}/sponsors/{sponsor_id}Soft-delete sponsor
events:write/assets/uploadsCreate a short-lived direct upload
assets:write· idempotent/assets/{asset_id}/completeValidate digest and complete upload
assets:write· idempotent/assets/{asset_id}Get asset metadata and download URL
assets:read/assets/{asset_id}Soft-delete an unreferenced asset
assets:write/events/{slug}/promo-kitGet promotional assets and approval states
events:read/events/{slug}/promo-kit/generateQueue promotional asset generation
content:write· idempotent/events/{slug}/promo-kit/jobs/{job_id}Get promotional generation progress
events:read/events/{slug}/promo-kit/bundleCreate a short-lived promo-kit bundle
content:write· idempotent/events/{slug}/studioGet live studio state and command catalog
studio:read/events/{slug}/studioExecute one validated legacy studio command
studio:control· idempotent/events/{slug}/studio/commands/previewNormalize commands without executing
studio:control/events/{slug}/studio/commandsExecute acknowledged atomic studio commands
studio:control· idempotent/events/{slug}/studio/commands/{command_id}Get command acknowledgement and result
studio:read· idempotent/events/{slug}/studio/commands/{command_id}/undoUndo a command with a documented inverse
studio:control· idempotent/events/{slug}/studio/historyGet studio command history
studio:read· idempotent/events/{slug}/studio/emergency-stopStop the live room with explicit confirmation
studio:emergency· idempotent/events/{slug}/recordingsList program recordings, speaker tracks and clips
recordings:read/events/{slug}/shortsList generated short-form clips
recordings:read/events/{slug}/shorts/analyzeAnalyze recording for short-form segments
content:write· idempotent/events/{slug}/shorts/jobsCreate a short-form processing job
content:write· idempotent/events/{slug}/shorts/segmentsCreate a candidate short-form segment
content:write· idempotent/events/{slug}/shorts/renderQueue short-form rendering
content:write· idempotent/events/{slug}/transcriptGet transcript in JSON, text or caption formats
events:read· idempotent/events/{slug}/transcriptApply timestamped transcript corrections
content:write· idempotent/events/{slug}/transcript/generateQueue transcript generation
content:write· idempotent/events/{slug}/content/generateGenerate draft post-event content
content:write· idempotent/events/{slug}/contentList generated content
events:read· idempotent/events/{slug}/distribution/previewPreview without publishing
content:write/events/{slug}/distribution/jobsDraft or explicitly queue publication
distribution:publish· idempotent/webhooksList webhooks without secrets
webhooks:manage/webhooksCreate a webhook and return its secret once
webhooks:manage· idempotent/webhooks/{webhook_id}Get webhook without secret
webhooks:manage/webhooks/{webhook_id}Update URL, events or active state
webhooks:manage/webhooks/{webhook_id}Soft-delete and revoke signing secret
webhooks:manage/webhooks/{webhook_id}/testDeliver a signed synthetic event
webhooks:manage· idempotent/webhooks/{webhook_id}/deliveriesList delivery attempts
webhooks:manage/webhooks/{webhook_id}/deliveries/{delivery_id}/retryRetry with the original stable event ID
webhooks:manage· idempotent/audit-logList redacted mutation audit records
audit:readEvery failed SDK call throws ShowrunnerError with status, code, and message. Retry only when error.retryable is true.
validation_errorRequest shape, confirmation, or idempotency-key error.unauthorizedMissing, invalid, or expired API key.insufficient_scopeThe key is valid but lacks the operation scope.not_foundResource missing or outside the key’s workspace.version_conflictStale expected_version or conflicting operation state.idempotency_conflictThe same idempotency key was reused with a new payload.rate_limitedWait until X-RateLimit-Reset before retrying.internal_errorUnexpected failure; share meta.request_id with support.try {
await flarea.events.get('missing-event');
} catch (error) {
if (error.status === 404 && error.code === 'not_found') {
// Ask for a valid slug — do not retry.
}
}Webhook delivery is at least once. Verify the HMAC against the raw body, reject stale timestamps, and deduplicate on the stable event ID.
X-Flarea-EventX-Flarea-Event-IdX-Flarea-TimestampX-Flarea-Signatureimport { createHmac, timingSafeEqual } from 'node:crypto';
export function verifyFlareaWebhook(rawBody, headers, secret) {
const timestamp = headers['x-flarea-timestamp'];
const received = headers['x-flarea-signature'];
const expected = 'sha256=' + createHmac('sha256', secret)
.update(`${timestamp}.${rawBody}`)
.digest('hex');
return timingSafeEqual(
Buffer.from(received),
Buffer.from(expected),
);
}Create an account, generate a 24-hour test key, and ship your first event integration today.