# Loom Video Transcript Scraper — TXT, SRT, VTT (`scrapersdelight/loom-transcript-scraper`) Actor

Extract any public Loom video's transcript — no ASR, no login. Reads Loom's own auto-captions from the share page: full text, timestamped segments, SRT/VTT, plus title, owner, and duration. Schedule it to transcribe new videos in a folder.

- **URL**: https://apify.com/scrapersdelight/loom-transcript-scraper.md
- **Developed by:** [Scrapers Delight](https://apify.com/scrapersdelight) (community)
- **Categories:** Videos, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 per record returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.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/platform/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 Transcript Scraper — TXT, SRT, VTT

**Get the transcript of any public [Loom](https://www.loom.com) video — instantly, with no AI transcription and no login. Loom already auto-captions its videos; this actor reads that transcript straight from the share page and returns clean text, timestamped segments, and ready-to-use SRT/VTT subtitles, plus the video's title, owner, and duration.**

Because the transcript already exists, there's no speech-to-text compute — it's fast and cheap.

---

### What does it do?

Point it at one or more Loom **share URLs** (or a folder/page full of them) and it returns, per video:

- 📝 **Full transcript** (plain text) — always included
- ⏲️ **Timestamped segments** — `{start, end, text}` for clipping/search
- 🎬 **SRT / VTT subtitles** — drop straight into a video editor
- 🏷️ **Title, owner, created date, duration, privacy, description**

No ASR, no API key — the transcript is read from the public share page.

---

### What data does it extract?

For every video:

- 🆔 `share_id`, 🔗 `video_url`, 🏷️ `title`
- 👤 `owner`, 📅 `created_at`, ⏱️ `duration_sec`, 🔒 `privacy`, 📝 `description`
- 📄 `transcript` (text), ⏲️ `segments[]`, 🎬 `srt`, `vtt`, `segment_count`
- ✨ `is_new` (monitor mode), 🕒 `scraped_at`

---

### Who is it for?

- 🧑‍💼 **Sales & CS teams** archiving and searching Looms they send/receive.
- ✂️ **Editors & marketers** repurposing Loom recordings into docs, clips, and posts.
- 📚 **Knowledge-base builders** turning async video into searchable text.
- 🤖 **AI / RAG pipelines** feeding video content to LLMs as text.

---

### How to use it (step by step)

1. Click **Try for free**.
2. Paste one or more **Loom share URLs** (e.g. `https://www.loom.com/share/{id}`) — or a **folder/page URL** that links to several.
3. *(Optional)* pick extra **formats** (`srt`, `vtt`, `segments`).
4. Click **Start**, then open the **Dataset** tab to view/export.
5. *(Optional)* set **monitorMode** + a **folderUrl** + a **Schedule** to transcribe new videos automatically.

#### Quick start

```json
{ "shareUrls": ["https://www.loom.com/share/71c758748f60497fa1267c19ba667f57"], "transcriptFormats": ["txt", "srt"] }
````

***

### Input

| Field | What it does |
|-------|--------------|
| `shareUrls` | Loom share URLs / 32-char IDs to transcribe |
| `folderUrl` | a public page/folder of Loom links to harvest IDs from |
| `transcriptFormats` | `txt` · `segments` · `srt` · `vtt` |
| `maxVideos` | hard cap per run (0 = unlimited) |
| `monitorMode`, `alertOnNewVideo` | recurring new-video watcher + alerts |
| `webhookUrl`, `slackWebhookUrl`, `emailRecipients` | alert channels |
| `proxyConfiguration`, `requestConcurrency` | proxy + parallelism |

***

### Output

Each video is one dataset record (fields above). Export to **JSON, CSV, Excel, HTML, or RSS**, or fetch via the **Apify API**. `srt`/`vtt` are ready-to-use subtitle files.

***

### How much does it cost?

Pay-per-event — and because there's **no transcription compute**, it's cheap:

| Event | What it covers | Suggested price |
|-------|----------------|-----------------|
| `lot-scraped` | each video returned | ~$0.005 / video |
| `lot-detail-enriched` | each transcript fetched | ~$0.005 / video |
| `monitor-run-completed` | each scheduled watch run | ~$0.05 / run |
| `new-lot-detected` | each newly-seen video | ~$0.02 / video |
| `alert-delivered` | each Slack/email/webhook push | ~$0.005 / alert |

*(Final per-event prices are set on the actor's pricing page.)*

***

### How does it work without AI transcription?

Loom auto-generates a transcript for every public video. The public share page ships the video's metadata and a (short-lived, pre-signed) link to that transcript. This actor reads the existing transcript — it does **not** run speech-to-text, so there's no GPU/compute cost and results are instant.

***

### Is it legal to scrape Loom transcripts?

This actor reads **publicly shared** Loom videos (public / anyone-with-link) and their existing transcripts; it cannot access workspace-restricted videos (those return no transcript and are reported as unavailable). The output includes the video owner's display name and spoken content, which may be personal data. Scraping public data is generally legal, but **you are responsible for your use — review Loom's Terms of Service and only process videos you're authorized to.**

***

### FAQ

**Does it transcribe private/internal Loom videos?**
No. Only public / anyone-with-link videos expose a transcript. Restricted videos are reported as unavailable.

**Is there an AI/Whisper step?**
No — it reads Loom's own auto-generated transcript, so it's fast and cheap with no ASR compute.

**Can I get subtitles?**
Yes — add `srt` and/or `vtt` to `transcriptFormats`.

**Can I auto-transcribe new videos in a folder?**
Yes. Set `folderUrl` + `monitorMode` + an Apify **Schedule** — each run handles only videos new since the last run.

**How do I export?**
JSON, CSV, Excel, HTML, or RSS from the Dataset tab, or via the Apify API.

***

### Feedback

Want word-level timestamps, speaker labels, or another source? Open an issue on the actor.

# Actor input Schema

## `shareUrls` (type: `array`):

Public Loom videos to transcribe — full https://www.loom.com/share/{id} URLs or bare 32-character video IDs.

## `folderUrl` (type: `string`):

Any public page or Loom share-folder URL that contains Loom share links — the actor collects every /share/{id} it finds there. Great with monitor mode to watch a folder for new videos.

## `transcriptFormats` (type: `array`):

Which transcript representations to include. Plain text is always included.

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

Hard cap on videos this run (0 = unlimited).

## `monitorMode` (type: `boolean`):

Recurring watcher: diff against the prior run's seen videos (per folder) and output/alert ONLY newly-seen videos. Pair with a folderUrl + an Apify Schedule.

## `alertOnNewVideo` (type: `boolean`):

In monitor mode, deliver an alert for each newly-seen video via the channels below.

## `webhookUrl` (type: `string`):

POST endpoint for new-video alert payloads.

## `slackWebhookUrl` (type: `string`):

Slack incoming-webhook URL for formatted new-video cards.

## `emailRecipients` (type: `array`):

Emails for the new-video digest (via apify/send-mail).

## `proxyConfiguration` (type: `object`):

Proxy settings. Datacenter rotation is plenty.

## `requestConcurrency` (type: `integer`):

Max parallel video fetches.

## `diagnose` (type: `boolean`):

Dev only. Dumps the raw share-page HTML + logs the parsed metadata + transcript, then exits.

## Actor input object example

```json
{
  "shareUrls": [
    "https://www.loom.com/share/71c758748f60497fa1267c19ba667f57"
  ],
  "transcriptFormats": [
    "txt"
  ],
  "maxVideos": 0,
  "monitorMode": false,
  "alertOnNewVideo": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "requestConcurrency": 5,
  "diagnose": false
}
```

# Actor output Schema

## `transcripts` (type: `string`):

The dataset of transcribed Loom videos (one item per video).

# 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 = {
    "shareUrls": [
        "https://www.loom.com/share/71c758748f60497fa1267c19ba667f57"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/loom-transcript-scraper").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 = { "shareUrls": ["https://www.loom.com/share/71c758748f60497fa1267c19ba667f57"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapersdelight/loom-transcript-scraper").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 '{
  "shareUrls": [
    "https://www.loom.com/share/71c758748f60497fa1267c19ba667f57"
  ]
}' |
apify call scrapersdelight/loom-transcript-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Loom Video Transcript Scraper — TXT, SRT, VTT",
        "description": "Extract any public Loom video's transcript — no ASR, no login. Reads Loom's own auto-captions from the share page: full text, timestamped segments, SRT/VTT, plus title, owner, and duration. Schedule it to transcribe new videos in a folder.",
        "version": "0.1",
        "x-build-id": "TpoE6fNajFZOqo4OO"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/scrapersdelight~loom-transcript-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-scrapersdelight-loom-transcript-scraper",
                "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/scrapersdelight~loom-transcript-scraper/runs": {
            "post": {
                "operationId": "runs-sync-scrapersdelight-loom-transcript-scraper",
                "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/scrapersdelight~loom-transcript-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-scrapersdelight-loom-transcript-scraper",
                "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",
                "properties": {
                    "shareUrls": {
                        "title": "Loom share URLs / IDs",
                        "type": "array",
                        "description": "Public Loom videos to transcribe — full https://www.loom.com/share/{id} URLs or bare 32-character video IDs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "folderUrl": {
                        "title": "Folder / page URL (optional)",
                        "type": "string",
                        "description": "Any public page or Loom share-folder URL that contains Loom share links — the actor collects every /share/{id} it finds there. Great with monitor mode to watch a folder for new videos."
                    },
                    "transcriptFormats": {
                        "title": "Transcript formats",
                        "type": "array",
                        "description": "Which transcript representations to include. Plain text is always included.",
                        "items": {
                            "type": "string",
                            "enum": [
                                "txt",
                                "segments",
                                "srt",
                                "vtt"
                            ],
                            "enumTitles": [
                                "Plain text",
                                "Timestamped segments (array)",
                                "SRT subtitles",
                                "VTT subtitles"
                            ]
                        },
                        "default": [
                            "txt"
                        ]
                    },
                    "maxVideos": {
                        "title": "Max videos per run",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Hard cap on videos this run (0 = unlimited).",
                        "default": 0
                    },
                    "monitorMode": {
                        "title": "Monitor mode (new-video watcher)",
                        "type": "boolean",
                        "description": "Recurring watcher: diff against the prior run's seen videos (per folder) and output/alert ONLY newly-seen videos. Pair with a folderUrl + an Apify Schedule.",
                        "default": false
                    },
                    "alertOnNewVideo": {
                        "title": "Alert on new videos",
                        "type": "boolean",
                        "description": "In monitor mode, deliver an alert for each newly-seen video via the channels below.",
                        "default": true
                    },
                    "webhookUrl": {
                        "title": "Webhook URL",
                        "type": "string",
                        "description": "POST endpoint for new-video alert payloads."
                    },
                    "slackWebhookUrl": {
                        "title": "Slack webhook URL",
                        "type": "string",
                        "description": "Slack incoming-webhook URL for formatted new-video cards."
                    },
                    "emailRecipients": {
                        "title": "Email recipients",
                        "type": "array",
                        "description": "Emails for the new-video digest (via apify/send-mail).",
                        "items": {
                            "type": "string"
                        }
                    },
                    "proxyConfiguration": {
                        "title": "Proxy",
                        "type": "object",
                        "description": "Proxy settings. Datacenter rotation is plenty.",
                        "default": {
                            "useApifyProxy": true
                        }
                    },
                    "requestConcurrency": {
                        "title": "Request concurrency",
                        "minimum": 1,
                        "maximum": 10,
                        "type": "integer",
                        "description": "Max parallel video fetches.",
                        "default": 5
                    },
                    "diagnose": {
                        "title": "Diagnostic mode (dev)",
                        "type": "boolean",
                        "description": "Dev only. Dumps the raw share-page HTML + logs the parsed metadata + transcript, then exits.",
                        "default": false
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
