# Loom Video Downloader - Public Stream Links (`khadinakbar/loom-video-downloader`) Actor

Resolve downloadable public Loom share and embed URLs into expiring HLS stream links with metadata. It only returns videos that Loom marks downloadable; no login, password bypass, or private-video access.

- **URL**: https://apify.com/khadinakbar/loom-video-downloader.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Videos, Developer tools, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 loom video results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Loom Video Downloader

Resolve a public Loom share or embed URL into a temporary, Loom-permitted video stream link plus clean metadata. It is for teams archiving or processing videos they are entitled to download—not for accessing private, password-protected, login-gated, or download-disabled content.

### What it returns

One dataset row per unique Loom video URL:

| Field                                                | Meaning                                                                                                                    |
| ---------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `downloadUrl`                                        | Temporary signed HLS stream URL when Loom permits downloading. It can expire, and its media format is HLS rather than MP4. |
| `title`, `description`, `ownerName`                  | Public video metadata exposed by Loom.                                                                                     |
| `thumbnailUrl`, `durationSeconds`, `width`, `height` | Preview and media details when available.                                                                                  |
| `downloadable`, `status`, `error`                    | Permission and diagnostic context for every input.                                                                         |

The actor also writes a compact `OUTPUT` record and a detailed `RUN_SUMMARY` record to the default key-value store.

### Use it when

- You have a public `loom.com/share/...` or `loom.com/embed/...` URL.
- You are authorized to save or process the video.
- You need a structured stream URL and metadata for an archive, media pipeline, or agent workflow.

### Do not use it when

- The video is private, password-protected, login-gated, or only shared with named users.
- Loom does not mark the video downloadable and `requireDownloadPermission` is enabled.
- You need captions or a transcript. Use the related [Loom Transcript Scraper](https://apify.com/scrapersdelight/loom-transcript-scraper) for that separate job.

### Input

```json
{
  "loomUrls": ["https://www.loom.com/share/002508e86fde4232bb8de474eb5c65c4"],
  "maxVideos": 20,
  "requireDownloadPermission": true
}
```

Accepted values in `loomUrls` are public share URLs, embed URLs, iframe snippets, or a 32-character Loom video ID. Duplicate video IDs are processed only once.

`requireDownloadPermission` defaults to `true`. Leave it enabled to return a stream only if Loom's public page marks the video downloadable. Disabling it can return a public playback manifest; it never bypasses passwords, login, private visibility, or any other access control.

### Output example

```json
{
  "videoId": "002508e86fde4232bb8de474eb5c65c4",
  "sourceUrl": "https://www.loom.com/share/002508e86fde4232bb8de474eb5c65c4",
  "status": "video_resolved",
  "downloadUrl": "https://luna.loom.com/id/.../playlist-multibitrate.m3u8?...",
  "streamFormat": "hls",
  "downloadable": true,
  "title": "Screen and engagement tips",
  "durationSeconds": 151,
  "width": 1152,
  "height": 720,
  "error": null
}
```

### Pricing

| Event                       |    Price |
| --------------------------- | -------: |
| Valid actor run             | $0.00005 |
| Resolved downloadable video |   $0.003 |

Platform compute and proxy usage are charged separately under Pay per event + usage. A run with `maxVideos: 20` has event charges capped at `$0.06005`; diagnostic rows for unavailable or restricted videos are not billed as results.

### Reliability and limits

- Signed stream URLs are short-lived. Use them promptly and resolve the Loom link again if one expires.
- The actor makes one public page request per unique video, no login or cookies required.
- `not_downloadable`, `access_restricted`, and `not_found` are useful diagnostic outcomes and leave the run successful when no upstream outage occurred.
- An all-upstream failure causes an honest failed run with `OUTPUT` and `RUN_SUMMARY` preserved.

### API / agent use

Use the actor with one public Loom URL when you need a single structured media record, or pass a bounded list for batch processing. Read the default dataset for rows and `OUTPUT` for the compact terminal result. The actor has no side effect on Loom and does not alter videos, permissions, or accounts.

### Compliance

Only process content you own or are authorized to download. This actor intentionally respects Loom's public-page download indicator and does not bypass passwords, logins, visibility settings, DRM, or access controls.

# Actor input Schema

## `loomUrls` (type: `array`):

Use this when you have public Loom share or embed URLs and need Loom-permitted downloadable stream links. Example: https://www.loom.com/share/002508e86fde4232bb8de474eb5c65c4. Accepts share URLs, embed URLs, iframe snippets, and 32-character video IDs. Not for login-gated, password-protected, or private videos.

## `maxVideos` (type: `integer`):

Use this to cap the number of unique Loom videos processed and billed in one run. Defaults to 20; allowed range is 1–200. This is a run-wide cap, not a per-URL cap.

## `requireDownloadPermission` (type: `boolean`):

Use this to return a stream link only when Loom marks the public video downloadable. Defaults to true and should normally remain enabled. Turning it off can return playback-only manifests, not an authorization bypass and not a way to access private or password-protected videos.

## Actor input object example

```json
{
  "loomUrls": [
    "https://www.loom.com/embed/002508e86fde4232bb8de474eb5c65c4"
  ],
  "maxVideos": 20,
  "requireDownloadPermission": true
}
```

# Actor output Schema

## `videos` (type: `string`):

Resolved public Loom video streams and diagnostic records.

## `output` (type: `string`):

Compact stable terminal summary.

## `runSummary` (type: `string`):

Detailed terminal diagnostics and billing telemetry.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "loomUrls": [
        "https://www.loom.com/share/002508e86fde4232bb8de474eb5c65c4"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/loom-video-downloader").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "loomUrls": ["https://www.loom.com/share/002508e86fde4232bb8de474eb5c65c4"] }

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/loom-video-downloader").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "loomUrls": [
    "https://www.loom.com/share/002508e86fde4232bb8de474eb5c65c4"
  ]
}' |
apify call khadinakbar/loom-video-downloader --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=khadinakbar/loom-video-downloader",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/6bIzBvot8hfn3Q0RI/builds/5zA1pGxqIrnvRHU10/openapi.json
