Podcast Rooms API

Everything you do with Podcast Rooms on the website — channel defaults, branding, a podcast custom domain, starting or booking rooms, running the waiting room and the stage, the in-room chat and each room's history — is also available through the API, the MCP server and developer webhooks. Use it to start a show from your own scheduler, admit guests from a producer's dashboard, or log every episode to a spreadsheet.

Base URL: https://streamrepeater.com/api/v1 · OpenAPI: /api/openapi.json (tag Podcast Rooms).

Before you start

  • Plan. The workspace plan must include Podcast Rooms. Otherwise every podcast call answers 403 with {"error": "not_entitled"}.
  • Role. Every call — reads included — needs the Manage streams role in the workspace, exactly as the website's podcast pages do. Brand library uploads and deletes need Manage settings.
  • Token. Create one in Settings → API tokens. A Read-only token can list rooms, participants, chat and history; changes need Read & write.
  • What the API never returns: a PIN (only has_pin), a guest's token, a media key or a guest's IP address. The join code and link are returned while the room can still be joined, because they are what you share.
  • What it never does: go on air. A room opened through the API is open until the host's Browser Studio (or the iPhone app) publishes; then it is live.

Start a room and share it

curl -X POST -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" \
  -d '{"title":"Episode 12"}' https://streamrepeater.com/api/v1/channels/10/podcast/rooms

The answer includes code, join_url (your podcast domain when one is live), qr_url (an SVG QR code — send the same token) and studio_url (where the host goes live). Calling it again while a room is open returns that room (200) instead of creating another; a channel has one open room at a time.

To book ahead, send {"when":"later","scheduled_for":"2026-11-05T19:00:00","timezone":"Europe/London"}. A booked room holds its code, opens 30 minutes before its time (or when the host opens it with POST /podcast/rooms/{room}/start) and can be cancelled with DELETE /podcast/rooms/{room}.

Run the waiting room

Guests who open the link wait until they are admitted:

curl -H "Authorization: Bearer YOUR_TOKEN" https://streamrepeater.com/api/v1/podcast/rooms/ROOM_ID/participants
curl -X POST -H "Authorization: Bearer YOUR_TOKEN" https://streamrepeater.com/api/v1/podcast/rooms/ROOM_ID/participants/GUEST_ID/approve

Actions: approve, deny, remove, mute, unmute, stage (into the program), unstage (backstage: only the host hears them), lower_hand. PATCH …/participants/GUEST_ID with {"gain": 1.4} sets their volume in the mix. Approving past the plan's guest limit answers 409 room_full.

Poll the participants about once a second while someone may be waiting, or subscribe to the webhooks below.

Change a room or the channel defaults

  • PATCH /podcast/rooms/{room} — title, PIN (null clears it), approval_mode (auto_pin admits guests who give the right PIN; only for a room with a PIN), layout, show_names, seat order and the pinned speaker.
  • POST /podcast/rooms/{room}/rotate-code — a new code; the old one stops working at once.
  • POST /podcast/rooms/{room}/end — ends the room for everyone. It does not stop the channel's broadcast.
  • GET|PATCH /channels/{channel}/podcast/settings — the defaults every new room copies. Send only the fields you want to change; the same rules as the settings page apply (max_guests up to the plan's limit, auto_pin needs a default PIN, branding ids must be your own library's).

Branding and your own domain

Upload logos, square show artwork and backgrounds to the workspace library with POST /tenants/{tenant}/brand-assets (multipart: file, kind, name), then reference them in the settings as logo_asset_id, artwork_asset_id and background_asset_id. An asset a channel uses cannot be deleted (409 in_use lists the channels).

For a podcast custom domain: POST /channels/{channel}/podcast/domain with {"hostname":"pod.example.com"} returns the TXT record to publish and the CNAME target; then call POST …/podcast/domain/verify until it answers "code": "verified". Your plan must include custom domains.

History

GET /podcast/rooms/{room}/summary gives when the room started and ended and why, how long it ran, how many guests asked to join, went on air, were turned away or removed, and each person's time on air. Talk time (who was actually speaking) is measured in the host's browser and is not stored.

Webhooks

Add a developer webhook in Settings → Developer webhooks (or POST /tenants/{tenant}/webhooks) and subscribe to:

  • podcast.room.started — Podcast room went live
  • podcast.room.ended — Podcast room ended
  • podcast.guest.joined — Podcast guest came on air
  • podcast.guest.left — Podcast guest left

Payloads carry the room's id, title and channel, and a guest's id and display name — never a code or PIN. Guests still in a room when it ends are covered by podcast.room.ended.

AI assistants

The MCP server has tools for the same jobs: list_podcast_rooms, get_podcast_room, start_podcast_room, end_podcast_room, list_podcast_participants, admit_podcast_guest, deny_podcast_guest, remove_podcast_guest, mute_podcast_guest, stage_podcast_guest, get_podcast_settings and update_podcast_settings. An assistant cannot set a PIN. See Connect an AI assistant.

Limits and errors

  • Rate limits: 60 requests a minute per token overall; starting rooms and rotating codes 12 a minute, chat and ending 30 a minute.
  • 404 — Podcast Rooms is switched off for the workspace, or the room belongs to a workspace this token cannot see.
  • 410 room_ended — the room has ended (or is only booked, for in-room changes).
  • 422 — validation; the body's errors names the field.
Was this helpful?

← Back to Help Centre

14 days of Pro free, no card Start for free