# Loom Transcript API: Captions and Monitoring (`getascraper/loom-transcript-scraper`) Actor

Loom transcript scraper for public share, embed, iframe, and raw ID inputs. Export captions as TXT, segments, SRT, or VTT with metadata, deduplication, and NEW, UPDATED, UNCHANGED, or REMOVED monitoring events.

- **URL**: https://apify.com/getascraper/loom-transcript-scraper.md
- **Developed by:** [GetAScraper](https://apify.com/getascraper) (community)
- **Categories:** AI, Automation, Developer tools
- **Stats:** 21 total users, 3 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 4.00 out of 5 stars

## Pricing

from $0.66 / 1,000 loom video scrape results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#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 Transcript API: captions and monitoring

<table width="100%" style="width:100%;min-width:100%;border-collapse:collapse;table-layout:fixed"><tbody style="display:table;width:100%;min-width:100%;border-collapse:collapse;table-layout:fixed"><tr style="width:100%"><td colspan="2" style="padding:14px 18px;background:#E9EEF9;color:#1C1917"><strong style="color:#1C1917">Loom content suite</strong><br><span style="color:#44403C">Turn public Loom videos into transcripts, downloadable media references, and repeatable content workflows.</span></td></tr><tr style="width:100%"><td width="50%" style="width:50%;padding:14px;background:#1E4FA3;color:#FFFFFF"><strong style="color:#FFFFFF">● Loom Transcript API</strong><br><span style="color:#FFFFFF">Captions, metadata, and monitoring</span></td><td width="50%" style="width:50%;padding:14px;background:#FFFFFF;color:#1C1917"><a href="https://apify.com/getascraper/loom-video-downloader" style="color:#1E4FA3;font-weight:700">Loom Video Downloader</a><br><span style="color:#44403C">MP4 retrieval and transcript files</span></td></tr></tbody></table>

<table width="100%" style="display:table;width:100%;background:#E9EEF9;border:1px solid #C9D7F2;border-left:5px solid #1E4FA3;border-radius:10px"><tr><td style="padding:20px 24px;background:#E9EEF9;color:#1C1917"><strong style="font-size:20px;color:#1C1917">Turn public Loom recordings into useful, searchable text.</strong><br><span style="color:#44403C">Collect native captions, timestamped segments, public metadata, and change events without rewatching every video.</span></td></tr></table>

### ✨ What you can do

<table width="100%" style="display:table;width:100%;border-collapse:collapse;table-layout:fixed"><tr><td width="25%" style="width:25%;padding:14px;background:#E9EEF9;color:#1C1917"><strong style="color:#1C1917">Read captions</strong><br><span style="color:#44403C">Export available text, segments, SRT, or VTT.</span></td><td width="25%" style="width:25%;padding:14px;background:#FFFFFF;color:#1C1917"><strong style="color:#1C1917">Keep context</strong><br><span style="color:#44403C">Bring public title, creator, duration, and links along.</span></td><td width="25%" style="width:25%;padding:14px;background:#E9EEF9;color:#1C1917"><strong style="color:#1C1917">Discover safely</strong><br><span style="color:#44403C">Find visible public Loom links from a supplied page.</span></td><td width="25%" style="width:25%;padding:14px;background:#FFFFFF;color:#1C1917"><strong style="color:#1C1917">Monitor changes</strong><br><span style="color:#44403C">Track new, updated, unchanged, and confirmed removed videos.</span></td></tr></table>

### 💡 Why use it?

- **I manage customer education** and need public Loom walkthroughs in a searchable help centre.
- **I run content operations** and want captions ready for articles, notes, or research.
- **I maintain a knowledge base** and need scheduled checks for new or changed public videos.
- **I build internal tools** and need source-backed transcript rows without manual copying.

### 🚀 How to use it

<table width="100%" style="display:table;width:100%;border-collapse:collapse;table-layout:fixed"><tr><td width="33%" style="width:33.333%;padding:14px;background:#E9EEF9;color:#1C1917"><span style="color:#1E4FA3;font-size:12px;font-weight:800;letter-spacing:1px">STEP 1</span><br><strong style="color:#1C1917">Add public Loom links</strong><br><span style="color:#44403C">Paste share or embed URLs, iframe snippets, or video IDs.</span></td><td width="33%" style="width:33.333%;padding:14px;background:#FFFFFF;color:#1C1917"><span style="color:#1E4FA3;font-size:12px;font-weight:800;letter-spacing:1px">STEP 2</span><br><strong style="color:#1C1917">Pick transcript formats</strong><br><span style="color:#44403C">Choose text, segments, subtitles, and optional public engagement data.</span></td><td width="33%" style="width:33.333%;padding:14px;background:#E9EEF9;color:#1C1917"><span style="color:#1E4FA3;font-size:12px;font-weight:800;letter-spacing:1px">STEP 3</span><br><strong style="color:#1C1917">Export or schedule</strong><br><span style="color:#44403C">Download your dataset or reuse a named monitor on a schedule.</span></td></tr></table>

### 🎛️ Input

| Field                         | Type          | Required | Description                                                                                       |
| ----------------------------- | ------------- | -------- | ------------------------------------------------------------------------------------------------- |
| `startUrls`                   | array of URLs | Yes      | Public Loom share or embed URLs, iframe snippets, video IDs, or pages for visible-link discovery. |
| `discoverFromPages`           | boolean       | No       | Discover only visible public share or embed links from supplied Loom pages.                       |
| `urls`, `videoUrls`           | array of text | No       | Compatibility aliases for Loom video inputs.                                                      |
| `transcriptFormats`           | array of text | No       | Choose `txt`, `segments`, `srt`, or `vtt` when captions are available.                            |
| `skipVideosWithoutTranscript` | boolean       | No       | Exclude videos that do not have native captions.                                                  |
| `includeEngagementStats`      | boolean       | No       | Include public view, viewer, comment, and reaction data when available.                           |
| `includeVideoDownloadUrl`     | boolean       | No       | Include a temporary MP4 link when Loom provides one.                                              |
| `maxVideos`                   | integer       | No       | Maximum videos to process. Use `0` for no limit.                                                  |
| `monitorMode`                 | boolean       | No       | Label successful results as new, updated, or unchanged in a saved monitor.                        |
| `monitorName`                 | text          | No       | Stable name for an independent monitor.                                                           |
| `requestConcurrency`          | integer       | No       | Number of videos to process in parallel.                                                          |
| `proxyConfiguration`          | object        | No       | Network connection settings.                                                                      |

### 📦 Output example

Native captions and public metadata vary by video. Missing values remain absent, and protected or password-gated videos are not bypassed.

```json
{
    "loomId": "public-video-id",
    "title": "Published Loom title",
    "transcriptStatus": "available",
    "url": "https://www.loom.com/share/public-video-id",
    "scrapedAt": "2026-08-10T00:00:00.000Z"
}
```

### 📋 Data table

| Field                                                                                                                                         | Type                   | Description                                                                      |
| --------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | -------------------------------------------------------------------------------- |
| `loomId`, `title`, `url`                                                                                                                      | text and URL           | Loom video identity and public source link.                                      |
| `id`, `videoUrl`, `sourceUrl`, `inputId`, `retrievedAt`                                                                                       | text, URL, and date    | Compatibility aliases, source provenance, input correlation, and retrieval time. |
| `transcript`, `transcriptSegments`, `transcriptSRT`, `transcriptVTT`                                                                          | text and array         | Native transcript content in the requested formats, when available.              |
| `transcriptStatus`, `transcriptAvailability`, `transcriptionStatus`, `captionStatus`, `transcriptLanguage`, `captionLanguage`, `segmentCount` | text and integer       | Native caption and transcript availability details.                              |
| `creatorName`, `description`, `thumbnailUrl`, `durationSeconds`                                                                               | text, URL, and integer | Public video context.                                                            |
| `privacy`, `folderId`, `folderName`, `isArchived`, `isMeetingRecording`, `calendarMeetingGuid`                                                | text, boolean, and ID  | Public folder, visibility, archive, and meeting context.                         |
| `requiresPermission`, `requiresPassword`, `isProtected`, `isTeamShared`, `downloadsEnabled`, `downloadable`, `downloadableBy`                 | boolean and text       | Public access and download markers.                                              |
| `ownerId`, `ownerEmail`, `width`, `height`, `durationISO8601`                                                                                 | text and number        | Public creator, dimensions, and duration context when supplied.                  |
| `createdAt`, `updatedAt`, `uploadDate`                                                                                                        | date and text          | Public recording, update, and upload dates.                                      |
| `viewCount`, `distinctViewCount`, `commentCount`                                                                                              | integer                | Public engagement data when requested and available.                             |
| `videoDownloadUrl`, `videoDownloadUrlExpiresAt`                                                                                               | URL and date           | Temporary download reference when Loom makes one available.                      |
| `mediaVariants`, `captionsUrl`, `captionsUrlExpiresAt`, `transcriptUrl`, `transcriptUrlExpiresAt`                                             | object, URL, and date  | Public media and caption references, with expiry when available.                 |
| `changeType`, `changedFields`, `firstSeen`, `lastSeen`, `transcriptHash`                                                                      | text, array, and date  | Named-monitor comparison result and transcript fingerprint.                      |
| `status`, `errorCode`, `scrapedAt`                                                                                                            | text and date          | Retrieval outcome and collection time.                                           |

### 💰 Pricing

Pricing is pay per processed video. Empty runs cost nothing, and there are no subscriptions.

### ⭐ Enjoying Loom Transcript API?

<table width="100%" style="display:table;width:100%"><tr><td style="padding:20px 24px 14px;background:#E9EEF9;border:1px solid #C9D7F2;border-left:5px solid #1E4FA3;color:#1C1917"><span style="font-size:20px;color:#1C1917">⭐ ⭐ ⭐ ⭐ ⭐</span><br><strong style="color:#1C1917">Help other teams find their Loom knowledge base.</strong><br><span style="color:#44403C">A quick rating helps prioritize the next improvement.</span></td></tr><tr><td style="padding:0;background:#1E4FA3;text-align:center"><a href="https://apify.com/getascraper/loom-transcript-scraper/reviews" style="display:block;padding:13px;color:#FFFFFF;text-decoration:none;font-weight:800">★ Rate this Actor on Apify</a></td></tr></table>

### ❓ FAQ

##### Can this Actor transcribe a Loom video with no captions?

No. It returns native captions Loom makes public. Videos without them can still return available metadata unless you choose to skip them.

##### Can I monitor a public Loom library?

Yes. Use the same monitor name on scheduled runs. Failed requests do not erase prior monitoring state.

##### Does it access private Loom videos?

No. It does not bypass login, password, permission, or workspace controls.

##### Why did my download link expire?

Loom download links are temporary. Run the Actor again to request a fresh link when one is publicly available.

### 🔗 Other actors

- [Loom Video Downloader](https://apify.com/getascraper/loom-video-downloader) ↗: Save public Loom MP4 files and captions when available.
- [Google Lens OCR](https://apify.com/getascraper/google-lens-ocr) ↗: Extract text from images for research workflows.
- [YouTube Transcript Scraper](https://apify.com/getascraper/youtube-transcript-scraper) ↗: Collect available public YouTube transcripts.
- [Loom Transcript](https://apify.com/getascraper/loom-transcript) ↗: Convert public Loom recordings into readable text.

# Actor input Schema

## `startUrls` (type: `array`):

Public Loom share URLs, embed URLs, iframe snippets, or bare 32-character video IDs. When discovery is enabled, a public Loom page can contribute only the share or embed links it visibly contains.

## `discoverFromPages` (type: `boolean`):

When enabled, a supplied public Loom page that is not itself a video is read only for visible public share or embed links. It does not guess folder membership or bypass access controls.

## `urls` (type: `array`):

Compatibility alias for Loom Video URLs. Paste share links, embed links, iframe snippets, or raw video IDs.

## `videoUrls` (type: `array`):

Compatibility alias for Loom Video URLs, useful for generic video workflows.

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

Formats to include in the output. Plain text (txt) and timestamped segments (segments) are on by default. Add srt or vtt for subtitle workflows.

## `skipVideosWithoutTranscript` (type: `boolean`):

When enabled, videos with no native captions are excluded from the dataset entirely. By default, they are included with metadata only and a transcriptStatus of unavailable.

## `includeEngagementStats` (type: `boolean`):

Include view count, unique viewer count, comment count, and emoji reactions in the output.

## `includeVideoDownloadUrl` (type: `boolean`):

Include a direct MP4 download link when one is available from the video page. Download links are temporary and expire after a short period.

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

Maximum number of videos to process per run. Set to 0 for no limit.

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

Persist a named snapshot and label each successful result as NEW, UPDATED, or UNCHANGED. A source HTTP 404 is labeled REMOVED only when Loom explicitly returns that response. Failed requests never erase prior state.

## `monitorName` (type: `string`):

Optional stable name for an independent saved monitor. Leave blank to use the default monitor.

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

Number of videos to fetch in parallel. Increase for faster runs on large batches. Decrease if you see rate-limit errors.

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

Datacenter proxies work well for Loom and are included by default. Switch to Residential only for very high-volume runs where you see blocks.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.loom.com/share/912e89a68ccc42c5ab5096fec7cd63d6"
    }
  ],
  "discoverFromPages": false,
  "transcriptFormats": [
    "txt",
    "segments"
  ],
  "skipVideosWithoutTranscript": false,
  "includeEngagementStats": true,
  "includeVideoDownloadUrl": true,
  "maxVideos": 0,
  "monitorMode": false,
  "requestConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `files` (type: `string`):

No description

## `dataset` (type: `string`):

No description

# 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 = {
    "startUrls": [
        {
            "url": "https://www.loom.com/share/912e89a68ccc42c5ab5096fec7cd63d6"
        }
    ],
    "discoverFromPages": false,
    "transcriptFormats": [
        "txt",
        "segments"
    ],
    "skipVideosWithoutTranscript": false,
    "includeEngagementStats": true,
    "includeVideoDownloadUrl": true,
    "maxVideos": 0,
    "monitorMode": false,
    "requestConcurrency": 5,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("getascraper/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 = {
    "startUrls": [{ "url": "https://www.loom.com/share/912e89a68ccc42c5ab5096fec7cd63d6" }],
    "discoverFromPages": False,
    "transcriptFormats": [
        "txt",
        "segments",
    ],
    "skipVideosWithoutTranscript": False,
    "includeEngagementStats": True,
    "includeVideoDownloadUrl": True,
    "maxVideos": 0,
    "monitorMode": False,
    "requestConcurrency": 5,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("getascraper/loom-transcript-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.loom.com/share/912e89a68ccc42c5ab5096fec7cd63d6"
    }
  ],
  "discoverFromPages": false,
  "transcriptFormats": [
    "txt",
    "segments"
  ],
  "skipVideosWithoutTranscript": false,
  "includeEngagementStats": true,
  "includeVideoDownloadUrl": true,
  "maxVideos": 0,
  "monitorMode": false,
  "requestConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call getascraper/loom-transcript-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,getascraper/loom-transcript-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/b9USr4ZlgZbNUGyfH/builds/sFRvDjfinIFQ6j8EP/openapi.json
