# Loom Video Download & Transcript Extractor (`muhammadafzal/loom-video-downloader`) Actor

Extract public Loom video metadata, native transcripts, timestamped segments, SRT/WebVTT captions, and direct media URLs. Optionally download video files for content, research, and AI-agent workflows. Private or password-protected videos are not bypassed.

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

## Pricing

from $2.00 / 1,000 accessible loom video returneds

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 a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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 Download & Transcript Extractor

Extract metadata, native transcripts, timestamped segments, SRT/WebVTT captions, and direct media URLs from public Loom share links. Optionally download each exposed video into the run key-value store for downstream processing.

This actor is designed for content teams, customer-success teams, researchers, and AI agents that need to turn public Loom recordings into searchable text or reusable video files.

### What it returns

| Field | Description |
| --- | --- |
| `sourceUrl`, `videoId` | Normalized Loom share URL and identifier |
| `title`, `ownerName`, `durationSeconds`, `thumbnailUrl` | Public metadata when exposed by Loom |
| `videoUrl` | Direct video media URL when exposed by the public page |
| `transcriptText` | Plain-text native Loom transcript |
| `transcriptSegments` | Structured text segments with timestamps when available |
| `srt`, `vtt` | Caption files generated from timed native segments |
| `videoKeyValueStoreKey` | Key of the downloaded MP4 when `downloadVideo` is enabled |
| `accessStatus`, `warnings` | Explicit access and extraction diagnostics |

### When to use

Use this actor for public `loom.com/share/{id}` or `loom.com/embed/{id}` links. It reads Loom’s own transcript/caption data and does not use speech-to-text, so the output reflects what Loom currently exposes.

Do not use it for private, password-protected, workspace-restricted, or invite-only videos. The actor does not bypass authentication or access controls; those inputs return a diagnostic record with `accessStatus: "restricted"`.

### Input example

```json
{
  "loomUrls": [
    "https://www.loom.com/share/981c06eada22476088cb5fe462a6b955"
  ],
  "downloadVideo": false,
  "includeCaptions": true
}
````

Bare Loom video IDs are also accepted. Up to 25 URLs can be processed per run.

### Output example

```json
{
  "sourceUrl": "https://www.loom.com/share/981c06eada22476088cb5fe462a6b955",
  "videoId": "981c06eada22476088cb5fe462a6b955",
  "title": "Code Demos & Overviews with Loom",
  "durationSeconds": 124,
  "videoUrl": "https://cdn.loom.com/sessions/.../video.mp4",
  "transcriptText": "Hi everyone. My name is Tru...",
  "transcriptSegments": [{ "startSeconds": 0, "endSeconds": 4.2, "text": "Hi everyone." }],
  "srt": "1\n00:00:00,000 --> 00:00:04,200\nHi everyone.\n",
  "vtt": "WEBVTT\n\n00:00:00.000 --> 00:00:04.200\nHi everyone.\n",
  "videoKeyValueStoreKey": null,
  "accessStatus": "accessible",
  "warnings": []
}
```

### Pricing

| Event | Price |
| --- | ---: |
| Actor start | $0.00005 per GB of actor memory used, minimum one event |
| Accessible Loom video returned | $0.002 per video |

Restricted, invalid, and failed inputs return diagnostics without the per-video result charge. The actor’s Apify PPE charge limit remains available for cost control.

### Reliability and legal notes

Public visibility is controlled by the Loom video owner. Transcript availability depends on whether Loom generated and exposed a transcript for that recording; a video can be accessible while its transcript is unavailable. Use downloaded media and transcript data only where you have the rights and permission to process it, and comply with Loom’s terms and applicable law.

# Actor input Schema

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

Use this when you have one or more public Loom share links to download or extract. Accepts full URLs such as https://www.loom.com/share/981c06eada22476088cb5fe462a6b955 or bare Loom video IDs. Provide up to 25 URLs. This is not a Loom folder or private workspace URL.

## `downloadVideo` (type: `boolean`):

Use this when you need a video file stored in the run key-value store in addition to its direct Loom media URL. Set true only when you have permission to download the public video; the actor does not bypass passwords, workspace restrictions, or access controls. Defaults to false.

## `includeCaptions` (type: `boolean`):

Use this when you want SRT and WebVTT caption text when Loom exposes timed transcript segments. Defaults to true. Set false to return transcript text and metadata without caption strings.

## Actor input object example

```json
{
  "loomUrls": [
    "https://www.loom.com/share/981c06eada22476088cb5fe462a6b955"
  ],
  "downloadVideo": false,
  "includeCaptions": true
}
```

# Actor output Schema

## `status` (type: `string`):

SUCCEEDED when at least one public Loom result was processed; PARTIAL when only restricted, invalid, or failed URLs were returned.

## `recordsPushed` (type: `string`):

Number of dataset records created.

## `invalidUrls` (type: `string`):

Inputs that were not valid Loom share URLs or IDs.

## `warnings` (type: `string`):

Run-level diagnostics.

# 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/981c06eada22476088cb5fe462a6b955"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("muhammadafzal/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/981c06eada22476088cb5fe462a6b955"] }

# Run the Actor and wait for it to finish
run = client.actor("muhammadafzal/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/981c06eada22476088cb5fe462a6b955"
  ]
}' |
apify call muhammadafzal/loom-video-downloader --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Loom Video Download & Transcript Extractor",
        "description": "Extract public Loom video metadata, native transcripts, timestamped segments, SRT/WebVTT captions, and direct media URLs. Optionally download video files for content, research, and AI-agent workflows. Private or password-protected videos are not bypassed.",
        "version": "1.0",
        "x-build-id": "ggbW7fGfvINhSTJ4H"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/muhammadafzal~loom-video-downloader/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-muhammadafzal-loom-video-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/muhammadafzal~loom-video-downloader/runs": {
            "post": {
                "operationId": "runs-sync-muhammadafzal-loom-video-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/muhammadafzal~loom-video-downloader/run-sync": {
            "post": {
                "operationId": "run-sync-muhammadafzal-loom-video-downloader",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "loomUrls"
                ],
                "properties": {
                    "loomUrls": {
                        "title": "Loom share URLs",
                        "minItems": 1,
                        "maxItems": 25,
                        "type": "array",
                        "description": "Use this when you have one or more public Loom share links to download or extract. Accepts full URLs such as https://www.loom.com/share/981c06eada22476088cb5fe462a6b955 or bare Loom video IDs. Provide up to 25 URLs. This is not a Loom folder or private workspace URL.",
                        "items": {
                            "type": "string",
                            "minLength": 8
                        },
                        "default": []
                    },
                    "downloadVideo": {
                        "title": "Download video files",
                        "type": "boolean",
                        "description": "Use this when you need a video file stored in the run key-value store in addition to its direct Loom media URL. Set true only when you have permission to download the public video; the actor does not bypass passwords, workspace restrictions, or access controls. Defaults to false.",
                        "default": false
                    },
                    "includeCaptions": {
                        "title": "Include caption files",
                        "type": "boolean",
                        "description": "Use this when you want SRT and WebVTT caption text when Loom exposes timed transcript segments. Defaults to true. Set false to return transcript text and metadata without caption strings.",
                        "default": true
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
