# Streamloop > Run pre-recorded video as a 24/7 live stream at up to 4K 60fps with HDR, send one loop to up to 5 platforms, design live shows with Scenes, and work as a team, with no OBS or PC. - [Streamloop docs](https://streamloop.app/docs/index.md): Official Streamloop documentation: run pre-recorded video as a 24/7 live stream at up to 4K 60fps, send it to up to 5 platforms, and design live shows with Scenes. - [Quickstart](https://streamloop.app/docs/quickstart.md): Go from a video file to a 24/7 live stream in minutes: create a loop, add your video, connect a destination and go live, with no OBS and no PC left running. - [Features](https://streamloop.app/docs/features.md): Loop pre-recorded video as a 24/7 live stream at up to 4K 60fps with HDR, send it to up to 5 platforms, design live shows with Scenes, and work as a team. - [How billing works](https://streamloop.app/docs/billing.md): Streamloop runs on credits you spend only while a stream is live. Pay as you go or choose an optional monthly plan. See the price per resolution, extra destinations, scenes and storage. - [Reliability](https://streamloop.app/docs/reliability-guarantees.md): How Streamloop keeps your 24/7 stream live — cloud hosting, continuous health monitoring with automatic restart, distributed failover, and encrypted credentials. - [Build and schedule your playlist](https://streamloop.app/docs/build-and-schedule-your-playlist.md): Add videos to a loop, reorder them, play them in order, on shuffle or in a smart order, layer a separate audio track, schedule or repeat the loop, and edit the playlist while you're live. - [Smart order](https://streamloop.app/docs/smart-order.md): Describe in plain words how your playlist should play (an intro first, a jingle every few songs, the news on the hour) and Streamloop builds the order for you. - [Library](https://streamloop.app/docs/library.md): Find, preview, rename and remove the videos and audio you've uploaded to Streamloop, and reuse them across loops. - [Build a 24/7 music or lofi channel](https://streamloop.app/docs/lofi-music-channel.md): Run a 24/7 lofi, music, or radio stream on YouTube — loop a background video and play a separate audio playlist over it, cheaply and continuously. - [Scenes](https://streamloop.app/docs/scenes/overview.md): Scenes turn a Streamloop loop into a live show: live inputs, web pages, live data, overlays and transitions, designed in the studio with an AI assistant and streamed 24/7 from the cloud. - [Build a scene](https://streamloop.app/docs/scenes/build-a-scene.md): Lay out a live show in the Streamloop studio: start from a layout or the AI assistant, add sources and layers, publish, and go live. - [Live inputs](https://streamloop.app/docs/scenes/live-inputs.md): Send a live feed from OBS, vMix or a hardware encoder into a Streamloop scene over RTMP, RTMPS or SRT, or pull an HLS stream or an IP camera's RTSP feed, with a fallback slate when the feed drops. - [IP cameras](https://streamloop.app/docs/scenes/cameras.md): Put an internet-reachable IP camera on air in a Streamloop scene: add its RTSP address, test the connection, and keep its password safe. - [Web pages](https://streamloop.app/docs/scenes/web-pages.md): Show any public web page in a Streamloop scene: alerts, chats, dashboards and visualizers, with custom CSS and a transparent background. - [Data and sheets](https://streamloop.app/docs/scenes/data-and-sheets.md): Feed live data into a Streamloop scene from Google Sheets, Excel or CSV files, JSON feeds, web pages and MCP servers, and show it in text, scoreboards and lists that update on air. - [AI assistant](https://streamloop.app/docs/scenes/ai-assistant.md): Describe your show in plain words and the Streamloop studio's AI assistant builds the scenes, tables and playlists, then helps you run it. It asks before it changes anything on air. - [Run the show while live](https://streamloop.app/docs/scenes/show-control.md): Switch scenes with transitions, flip controls, update data and publish changes while your Streamloop scene loop is on air, without stopping the stream. - [Stream to several platforms at once](https://streamloop.app/docs/platform/multistream.md): Send one Streamloop loop to up to 5 destinations at the same time, such as YouTube, Twitch and Kick, from a single encode. - [YouTube (managed connection)](https://streamloop.app/docs/platform/youtube.md): Connect your YouTube channel to Streamloop through Google sign-in and let Streamloop create and manage the live broadcast — title, privacy, thumbnail, and schedule. - [YouTube via RTMP stream key](https://streamloop.app/docs/platform/youtube-rtmp.md): Stream a pre-recorded video to YouTube 24/7 using a stream key from YouTube's live control room — manual setup, no account connection. - [Stream to Twitch 24/7](https://streamloop.app/docs/platform/twitch.md): Loop pre-recorded video to Twitch around the clock with Streamloop: copy your Twitch stream key, add it as a destination and go live. - [Stream to Facebook, Kick, X, TikTok and other RTMP platforms](https://streamloop.app/docs/platform/other-rtmp.md): Add Facebook, Kick, X, TikTok, LinkedIn, Telegram or any custom RTMP server as a Streamloop destination: where to find each stream key and what to watch out for. - [Workspaces and team](https://streamloop.app/docs/workspaces-and-team.md): Share loops, uploads, destinations and credits with your team in a Streamloop workspace. Invite members, set roles and switch between workspaces. - [API tokens and connected apps](https://streamloop.app/docs/account-access.md): Manage personal API tokens and review the OAuth apps and agents that can act on your Streamloop account. - [Use Streamloop with AI](https://streamloop.app/docs/use-with-ai.md): Connect Claude, ChatGPT, Cursor or Claude Code to Streamloop and run your loops, destinations and scenes by asking in plain words. - [Streamloop API](https://streamloop.app/docs/api-reference/introduction.md): Create and control 24/7 loop streams programmatically — over REST, an MCP server for AI agents, or GraphQL. - [Authentication](https://streamloop.app/docs/api-reference/authentication.md): Authenticate Streamloop API requests with an API key or OAuth 2.1, scoped to what each integration needs. - [Conventions](https://streamloop.app/docs/api-reference/conventions.md): Versioning, workspaces, cursor pagination, idempotent retries, rate limits and the RFC 7807 error model shared by the Streamloop REST API and Scenes API. - [Quickstart](https://streamloop.app/docs/api-reference/quickstart.md): Go from an API key to a live 24/7 stream with a handful of curl calls: create a stream, upload a video, add it to the playlist, add a destination and start. - [Execute up to 20 REST operations.](https://streamloop.app/docs/api-reference/meta/execute-up-to-20-rest-operations.md): Validates the complete envelope before dispatch, then executes operations sequentially through their normal REST routes. Results preserve input order. An operation failure does not stop later operations, and the batch is not transactional. - [This OpenAPI 3.1 document — unauthenticated.](https://streamloop.app/docs/api-reference/meta/this-openapi-31-document-—-unauthenticated.md) - [Service status (liveness/health) — unauthenticated.](https://streamloop.app/docs/api-reference/meta/service-status-livenesshealth-—-unauthenticated.md) - [List invoices](https://streamloop.app/docs/api-reference/billing/list-invoices.md) - [Get billing overview](https://streamloop.app/docs/api-reference/billing/get-billing-overview.md) - [Create a card top-up link](https://streamloop.app/docs/api-reference/billing/create-a-card-top-up-link.md): Purchase credits by dollar amount. amountCents is the dollar amount in cents (e.g. 500 = $5). - [Get usage analytics](https://streamloop.app/docs/api-reference/billing/get-usage-analytics.md) - [List crypto currencies](https://streamloop.app/docs/api-reference/crypto/list-crypto-currencies.md): List all supported cryptocurrencies with live rates. - [Get a crypto deposit address](https://streamloop.app/docs/api-reference/crypto/get-a-crypto-deposit-address.md): Get (or lazily create) a deposit address for the authenticated user. id must be a valid 0xProcessing currency identifier from cryptoCurrencies. - [List destinations](https://streamloop.app/docs/api-reference/destinations/list-destinations.md) - [Create an RTMP destination](https://streamloop.app/docs/api-reference/destinations/create-an-rtmp-destination.md) - [Get your profile](https://streamloop.app/docs/api-reference/account/get-your-profile.md) - [List your workspaces](https://streamloop.app/docs/api-reference/account/list-your-workspaces.md): Every workspace you are a member of, with your role in each. Pass one's id as X-Workspace-Id: an API key carries no workspace, so every other route needs it. - [List playlists](https://streamloop.app/docs/api-reference/playlists/list-playlists.md): Every stream owns two playlists (video and audio); a scene owns the playlists its sources play. Filter by streamId or sceneId. - [Create a scene playlist](https://streamloop.app/docs/api-reference/playlists/create-a-scene-playlist.md): Creates an empty playlist owned by a scene, for one of its playlist sources (a stream's own two playlists come with the stream). Fill it with POST /playlists/{id}/operations. - [Get a playlist](https://streamloop.app/docs/api-reference/playlists/get-a-playlist.md): Fetches an object given its ID. - [Copy a playlist](https://streamloop.app/docs/api-reference/playlists/copy-a-playlist.md): Spec copy between two playlists the caller owns. Target must be empty. Caller pushes target via stream launch to actually play it. - [Apply playlist operations](https://streamloop.app/docs/api-reference/playlists/apply-playlist-operations.md): Edits the playlist's draft: operations apply in order, each seeing what the earlier ones made, and a refused one writes nothing. addObjects takes upload ids (obj_…, the id of POST /uploads and GET /uploads) of completed uploads (uploaded true; else OBJECT_NOT_READY). A stream that isn't live plays t… - [Publish a playlist](https://streamloop.app/docs/api-reference/playlists/publish-a-playlist.md): Puts the playlist's draft on its live stream, replacing what it plays without going off air. Only for a stream that is live: a stream that isn't plays its playlists as they are when it starts, so edits made before POST /streams/{id}/start need no publish (here they are 409 NOT_LIVE). expectedDraftVe… - [List streams](https://streamloop.app/docs/api-reference/streams/list-streams.md): List the streams you own. Supply the ids parameter to fetch a specific set; otherwise the full collection is returned, cursor-paginated. - [Create a stream](https://streamloop.app/docs/api-reference/streams/create-a-stream.md): Creates a stream with its two empty playlists (video and audio). Add where it publishes with POST /streams/{id}/destinations and when it runs with POST /streams/{id}/schedule. - [Get a stream](https://streamloop.app/docs/api-reference/streams/get-a-stream.md): Fetches an object given its ID. - [Delete a stream](https://streamloop.app/docs/api-reference/streams/delete-a-stream.md) - [Update a stream](https://streamloop.app/docs/api-reference/streams/update-a-stream.md): Changes a stream's settings. Its destinations, schedule and scene have their own routes. - [List a stream's destinations](https://streamloop.app/docs/api-reference/streams/list-a-streams-destinations.md): Where the stream publishes, in the order they were added: each destination, whether it is enabled, and its delivery state while the stream runs. - [Add a destination to a stream](https://streamloop.app/docs/api-reference/streams/add-a-destination-to-a-stream.md): Adds one of your destinations (GET /destinations) to the stream, enabled; returns the stream's destinations. Up to 5 per stream, one YouTube channel at most; a second destination needs multistream on the workspace (403 MULTISTREAM_NOT_ENABLED). Refused while the stream is live (409 STREAM_LIVE), and… - [Remove a destination from a stream](https://streamloop.app/docs/api-reference/streams/remove-a-destination-from-a-stream.md): Takes the destination off the stream (the destination itself stays); returns the stream's remaining destinations. Refused while the stream is live (409 STREAM_LIVE): disable it instead. - [Enable or disable a stream's destination](https://streamloop.app/docs/api-reference/streams/enable-or-disable-a-streams-destination.md): Stops or resumes sending to one destination without removing it. Disabling works while the stream is live, except for its last enabled destination (409 LAST_DESTINATION); enabling is refused while live (409 STREAM_LIVE). - [Get live stream stats](https://streamloop.app/docs/api-reference/streams/get-live-stream-stats.md): Fetches an object given its ID. - [Check stream readiness](https://streamloop.app/docs/api-reference/streams/check-stream-readiness.md): What would stop POST /streams/{id}/start, changing nothing: ready, and each blocking issue (code, error, suggestion; destinationId when it is about one destination). It checks that quality and framerate are set; that at least one destination is enabled and not archived, supports the stream's quality… - [Put a scene on a stream](https://streamloop.app/docs/api-reference/streams/put-a-scene-on-a-stream.md): Makes the stream play a scene (its published version; the Scenes API builds and publishes it) instead of its video playlist; sceneId null goes back to the playlist. The scene must be in the stream's workspace (404 NOT_FOUND). Refused while the stream runs (409 STREAM_LIVE): stop it, set the scene, s… - [Schedule a stream](https://streamloop.app/docs/api-reference/streams/schedule-a-stream.md): Sets the window the stream runs in and arms it. Times must be RFC3339 with an explicit UTC offset. repeat=daily re-arms the window +24h and repeat=weekly +7 days (or on the UTC weekdays in days); both require scheduleEndAt and a window shorter than 24h, while a one-off (the default) may be open-ende… - [Cancel a stream's schedule](https://streamloop.app/docs/api-reference/streams/cancel-a-streams-schedule.md): Cancel a stream's schedule, including any daily or weekly repeat; the stream returns to draft. - [Start a stream](https://streamloop.app/docs/api-reference/streams/start-a-stream.md): Starts the stream now. Allowed from draft, scheduled (it starts now instead of at its window), stopped, failed and invalid; any other state is 409 STREAM_ILLEGAL_TRANSITION. It first runs the checks GET /streams/{id}/readiness runs, plus a YouTube live-eligibility check; when one fails the answer is… - [Stop a stream](https://streamloop.app/docs/api-reference/streams/stop-a-stream.md): Stop the stream. Works from any running or scheduled state; the stream stops publishing and becomes inactive. - [List uploads](https://streamloop.app/docs/api-reference/uploads/list-uploads.md) - [Create an upload](https://streamloop.app/docs/api-reference/uploads/create-an-upload.md): Creates an upload record for a direct single-PUT transfer. Its id (obj_…) is the media id everywhere: what POST /playlists/{id}/operations takes in addObjects.objectIds and what a playlist's items (objectID) and liveItems (objectId) name. name needs a file extension; mimeType must suit type (video,… - [Import uploads from a link](https://streamloop.app/docs/api-reference/uploads/import-uploads-from-a-link.md): Imports media from a link (YouTube, a cloud drive, a direct file URL…): one upload per selection, downloaded in the background; answers 202 with the new uploads. Each selection names an assetId and a qualityId from discovery, which this REST API does not offer: ask GraphQL (POST https://api.streamlo… - [Remove uploads](https://streamloop.app/docs/api-reference/uploads/remove-uploads.md): Removes up to 100 uploads from the media library, as DELETE /uploads/{id} does for one (an upload that never finished is left in place here: UPLOAD_INCOMPLETE; DELETE it). The call succeeds as a whole: removedIds lists what is gone (including ids that already were), refused lists each id left in pla… - [Get an upload](https://streamloop.app/docs/api-reference/uploads/get-an-upload.md): One upload (obj_…). There is no separate processing state: uploaded turns true on POST /uploads/{id}/complete (or when an import finishes), and the media's facts (duration, width, height, fps, hasVideo, hasAudio) arrive a few seconds to about half a minute later; they are null until then. A playlist… - [Remove an upload](https://streamloop.app/docs/api-reference/uploads/remove-an-upload.md): Removes the upload from the media library for good: its stored bytes and every file derived from it are deleted, and it no longer lists. An upload that never finished (no complete after the PUT, an import that failed) is dropped too: nothing was stored. Refused with 409 IN_USE while a playlist or a… - [Mark an upload complete](https://streamloop.app/docs/api-reference/uploads/mark-an-upload-complete.md): Call after the PUT to the upload URL succeeded. Checks the stored file's size against the cap (over it: 422 FILE_TOO_LARGE, and the stored file is deleted), sets uploaded true and starts reading the media's facts in the background (see GET /uploads/{id}). The upload can go into a playlist at once. C… - [Generate a presigned upload URL](https://streamloop.app/docs/api-reference/uploads/generate-a-presigned-upload-url.md): Answers a JSON string: a presigned storage URL, valid for 11 hours. Send the whole file to it in one HTTP PUT, the bytes as the body, with Content-Type exactly the upload's mimeType (it is part of the signature: another value is refused by storage with 403) and no Streamloop credentials. Storage ans… - [Scenes API](https://streamloop.app/docs/api-reference/scenes.md): Build, check, publish and run Streamloop scenes over HTTP: edit a scene's draft as resources at paths, get a picture of a frame, publish it, and put it on a stream. - [List scenes](https://streamloop.app/docs/api-reference/scenes-api/scenes/list-scenes.md): The workspace's scenes, newest first (by when each was made, so an edit made while you page never moves one between pages). - [Create a scene](https://streamloop.app/docs/api-reference/scenes-api/scenes/create-a-scene.md): A new scene, nothing published. Its draft starts empty — build it with `PUT /scenes/{id}/resources/frame/{frame}` — or, to import one, from `draft`: a whole scene document in the studio's format. A name is 1 to 120 characters. - [Get a scene](https://streamloop.app/docs/api-reference/scenes-api/scenes/get-a-scene.md): Its name, the version last published, the streams that play it, and `draftRevision`: the draft as it is now, what publish and discard take (also the `Draft-Revision` header). The `ETag` changes with its name and published version: send it as `If-Match` to rename only what you read. What is published… - [Delete a scene](https://streamloop.app/docs/api-reference/scenes-api/scenes/delete-a-scene.md): For good, with its versions, ingest keys and cameras. Refused (409 SCENE_IN_USE) while a stream points at it. With `If-Match` (the ETag GET answered), refused with 412 PRECONDITION_FAILED (with `currentRevision`) if the scene changed since (renamed or published): checked before anything is revoked,… - [Rename a scene](https://streamloop.app/docs/api-reference/scenes-api/scenes/rename-a-scene.md): A name is 1 to 120 characters. With `If-Match` (the ETag GET answered), refused with 412 PRECONDITION_FAILED if the scene changed since (edited, renamed or published), checked as it is written: of two renames with one ETag, one lands; a weak tag never matches. - [List what a scene holds](https://streamloop.app/docs/api-reference/scenes-api/draft/list-what-a-scene-holds.md): The kinds of resource (frame, source, control, component, script, tokens, element), each with what it is and its paths. - [Read a resource](https://streamloop.app/docs/api-reference/scenes-api/draft/read-a-resource.md): A resource with its `revision` (also the `ETag`) and `children` (the paths to read next); a type (`frame`, `source/data`, `element/Text`: what it takes, with an example); or a list (a path ending in `/*`). `as=image` on a `frame/` or a layer answers a PNG of it as it goes on air, drawn by the ch… - [Create or replace a resource](https://streamloop.app/docs/api-reference/scenes-api/draft/create-or-replace-a-resource.md): The whole resource, as GET answers it: a `frame/` `{ name, description?, transition?, code }` (code: its `…` element in JSX) or `{ name, root }` (JSON); a component `{ description, props, tsx }`; a source its fields. Or the code alone, with `Content-Type: text/jsx` (a `frame/`… - [Remove a resource](https://streamloop.app/docs/api-reference/scenes-api/draft/remove-a-resource.md): A frame, layer, source, component or control of the draft (the scene itself: DELETE /scenes/{id}). Refused (409 IN_USE) while something else uses it, naming what. `If-Match` guards it like PUT. - [Change part of a resource](https://streamloop.app/docs/api-reference/scenes-api/draft/change-part-of-a-resource.md): Either text replacements in its code — `[{ "old": "…", "new": "…" }]`, each `old` matching exactly once (code is stored formatted: copy `old` from what GET answered; 409 EDIT_NO_MATCH quotes the closest line) — or a JSON merge patch of its fields (`application/merge-patch+json` or JSON; null removes… - [Remove several resources at once](https://streamloop.app/docs/api-reference/scenes-api/draft/remove-several-resources-at-once.md): All or nothing: what uses one of them is fine when it goes too. `revisions` guards each path like If-Match. - [Look at a URL before making a table of it](https://streamloop.app/docs/api-reference/scenes-api/draft/look-at-a-url-before-making-a-table-of-it.md): Fetches it once, changing nothing: status, content type, an outline of the JSON or the page's text, and the rows a table would get with `connector`, `pick` and `headers`. With `connector: "mcp"` the URL is an MCP server: without `tool` its tools are listed, with `tool` and `args` one tool's result a… - [Publish the draft](https://streamloop.app/docs/api-reference/scenes-api/publishing/publish-the-draft.md): Publishes the draft exactly as it was at `draftRevision` (required: in the body, or as `If-Match: ""`; sent both ways, they must name the same draft, else 422 INVALID_INPUT; every draft answer and GET /scenes/{id} carry the current one), whatever was edited since. It is checked as the… - [Discard the draft](https://streamloop.app/docs/api-reference/scenes-api/publishing/discard-the-draft.md): Puts the draft back to what is published: every change since is lost (studios open on the scene can still undo it). `draftRevision` is required (in the body, or as If-Match; sent both ways, they must name the same draft, else 422 INVALID_INPUT): the draft you reviewed; if it changed after that, noth… - [List published versions](https://streamloop.app/docs/api-reference/scenes-api/publishing/list-published-versions.md): Newest first; a publish made while you page doesn't shift the pages. Read one with `GET /scenes/{id}/resources/{path}?version=`. - [Publish an older version again](https://streamloop.app/docs/api-reference/scenes-api/publishing/publish-an-older-version-again.md): Its document becomes the next version (the draft is untouched: publishing the draft later is refused with STALE_PUBLISH until you send overwritePublished, and discard makes the draft this version too). `expectedVersion` is required — the latest published version you saw (`version` in GET /scenes/{id… - [What is on air](https://streamloop.app/docs/api-reference/scenes-api/live/what-is-on-air.md): Each stream that plays the scene (by stream id): its state, and in `onAir` what plays there (online, `frame`: the id of the `frame/` on air, `next`: the one cued; `scene` says the same as `frame` and is deprecated, kept for one release). - [Act on air](https://streamloop.app/docs/api-reference/scenes-api/live/act-on-air.md): Take a `frame/` to air (`goFrame`, with a transition), cue one so the take is instant (`next`), set a control (`setControl`), replace a table's rows (`setData`), or move a playlist source on (`skip`). `streamId` may be left out when one stream plays the scene. Checked first, in this order: the b… - [List ingest keys](https://streamloop.app/docs/api-reference/scenes-api/inputs/list-ingest-keys.md): Newest first. - [Create an ingest key](https://streamloop.app/docs/api-reference/scenes-api/inputs/create-an-ingest-key.md): For an `rtmp` or `srt` source of the draft: where an encoder (OBS, vMix) sends. The key is in this answer only. - [Revoke an ingest key](https://streamloop.app/docs/api-reference/scenes-api/inputs/revoke-an-ingest-key.md): An encoder using it is cut off. - [Replace an ingest key](https://streamloop.app/docs/api-reference/scenes-api/inputs/replace-an-ingest-key.md): A new key for the same source; the old one stops working. - [List secrets](https://streamloop.app/docs/api-reference/scenes-api/inputs/list-secrets.md): By name; names only: a value is never returned. A table names one as `$secret:` in a header or a URL's query. - [Save a secret](https://streamloop.app/docs/api-reference/scenes-api/inputs/save-a-secret.md): An API key or token a table sends (sealed at rest; at most 100 per scene). A table reads it as `$secret:`. - [Delete a secret](https://streamloop.app/docs/api-reference/scenes-api/inputs/delete-a-secret.md) - [List cameras](https://streamloop.app/docs/api-reference/scenes-api/inputs/list-cameras.md): In the order they were added. - [Add a camera](https://streamloop.app/docs/api-reference/scenes-api/inputs/add-a-camera.md): An RTSP camera on a public address (422 CAMERA_PRIVATE_ADDRESS otherwise) for an `rtsp` source of the draft. - [Test a camera](https://streamloop.app/docs/api-reference/scenes-api/inputs/test-a-camera.md): Connects once: refused, unreachable, timeout, auth, not_found or unsupported, or the codec, size and frame rate, with a snapshot (none for H.265). - [Change a camera](https://streamloop.app/docs/api-reference/scenes-api/inputs/change-a-camera.md): A password left out keeps the saved one; an empty one removes it. - [Remove a camera](https://streamloop.app/docs/api-reference/scenes-api/inputs/remove-a-camera.md) - [The camera's last snapshot](https://streamloop.app/docs/api-reference/scenes-api/inputs/the-cameras-last-snapshot.md) - [MCP server: connection and auth reference](https://streamloop.app/docs/api-reference/mcp/overview.md): Streamloop MCP server reference: endpoint, Streamable HTTP transport, OAuth 2.1 sign-in and scopes, workspace selection, confirmation rules and error codes. - [MCP tools](https://streamloop.app/docs/api-reference/mcp/tools.md): All 67 Streamloop MCP tools by area: what each one does, the OAuth scope it needs, and which ones are irreversible. - [GraphQL API](https://streamloop.app/docs/api-reference/graphql.md): Query Streamloop's GraphQL schema directly for full control over filtering and field selection — the layer the REST API and MCP server are built on. ## OpenAPI Specs - [openapi](https://api.streamloop.app/v1/openapi.json) - [openapi](https://api.streamloop.app/v1/scenes/openapi.json) ## Optional - [Home](https://streamloop.app) This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.