# Loom Transcript (`automly/loom-transcript-scraper`) Actor

Get the transcript of any public Loom video: Loom's own transcript when the video has one, otherwise transcribed from its audio. Timestamps, SRT and VTT subtitles, title, owner, date and length. Just paste Loom links. No login.

- **URL**: https://apify.com/automly/loom-transcript-scraper.md
- **Developed by:** [Automly](https://apify.com/automly) (community)
- **Categories:** Videos, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.40 / 1,000 transcripts

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Loom Transcript

Get the transcript of any public Loom video. Paste Loom share links, embed links or video IDs and get the full transcript with timestamps, ready-made SRT and VTT subtitles, and the video's title, owner, recording date and length. When Loom has its own transcript for a video you get that one; when it does not, the video is transcribed from its spoken audio, so older recordings and videos Loom could not process still get a transcript.

You pay only for transcripts you get. Private videos, deleted links, videos without sound and anything over your limits are never charged.

### What can Loom Transcript do?

- 📝 **Loom's own transcript** for every video that has one (most Loom videos do), word for word as Loom shows it under the video.
- 🎧 **Transcripts for videos without one**: older recordings and videos whose transcript failed are transcribed from their audio (you can turn this off).
- ⏱️ **Timestamps and subtitles**: timed segments plus SRT and VTT subtitle files with every transcript.
- 🗣️ **Speakers**: when Loom marks more than one speaker, each segment says which (Speaker 1, Speaker 2...).
- 🏷️ **Video details**: title, description, owner name, recording date, length and thumbnail.
- 🔗 **Any Loom link**: share links, embed links, embed codes copied from a website, or bare video IDs. The same video pasted twice is transcribed and charged once.
- 💸 **Fair billing**: one charge per transcript, plus a per-minute charge after the first minute only for videos transcribed from audio.

### What data do you get?

One row per video:

| Field | What it is |
|---|---|
| `inputUrl` | The link or ID you gave |
| `url`, `videoId` | The video's share link and Loom ID |
| `status` | `transcribed`, or why not: `no_captions`, `no_speech`, `unavailable`, `not_found`, `not_supported`, `too_long`, `limit_reached`, `time_limit`, `failed` |
| `transcriptSource` | `captions` (Loom's own transcript) or `audio` (transcribed from the video's sound) |
| `title`, `description` | The video's title and description |
| `ownerName` | Who recorded the video |
| `createdAt` | When it was recorded |
| `durationSeconds` | Length of the video |
| `billedMinutes` | Audio minutes charged (0 for Loom's own transcripts) |
| `language` | Spoken language, when known |
| `wordCount` | Words in the transcript |
| `speakers` | Number of speakers, when Loom marks more than one |
| `text` | The full transcript |
| `segments` | Timed segments: `start`, `end` (seconds), `text` and `speaker` |
| `srt`, `vtt` | Ready-to-save subtitle files |
| `thumbnailUrl` | The video's thumbnail |
| `error` | Why a video has no transcript |

### How to get a Loom transcript

1. Paste your Loom links into **Loom video links**, one per line. Hover over a Loom video and copy its share link, or paste the embed code from a web page.
2. Optional: leave **Transcribe videos without a Loom transcript from their audio** on (the default) so every video gets a transcript, and set the **Spoken language** if you know it.
3. Click **Start**. Each video appears as a row as soon as its transcript is ready.
4. Download the results as JSON, CSV, Excel or HTML, or copy the `srt` / `vtt` field into a subtitle file.

### How much does it cost?

You pay per video transcript. The transcript price includes the first minute of a video; a video that has no Loom transcript and is transcribed from its audio also pays an **extra minute** for every started minute past the first. Videos that have a Loom transcript pay the transcript price only, whatever their length. Higher Apify plans pay less:

| Apify plan | Per 1,000 transcripts | Per 1,000 extra minutes |
|---|---|---|
| Free | $3.00 | $5.00 |
| Starter (Bronze) | $2.80 | $4.50 |
| Scale (Silver) | $2.60 | $4.00 |
| Business (Gold) and higher | $2.40 | $3.50 |

So a 5-minute video transcribed from its audio is 1 transcript and 4 extra minutes. Platform usage is included in these prices, so you pay nothing else for the run. There is no start fee.

Example: 1,000 Loom videos with a Loom transcript cost $2.80 on Starter, $2.60 on Scale and $2.40 on Business and higher, whatever their length.

Never charged:

- private, password-protected and deleted videos, and links that are not Loom videos,
- videos whose owner turned the transcript off for viewers,
- videos with no sound or no speech,
- videos over your **Max minutes per video** (for audio transcripts),
- anything the run did not reach before its maximum cost or time limit.

A video transcribed from audio is only started when your run's maximum cost still covers it. Every Apify account gets **$5 of free usage each month**.

**On the Apify Free plan**, transcripts made from the audio use a lighter, slower method, so expect lower accuracy (more wrong words, most of all in songs and noisy videos), and a run transcribes up to 1 minute of audio: a longer video gets its first minute, and videos past that minute are saved as not transcribed and are not charged. Keep the default 1 GB memory: with less, a Free plan run transcribes no audio. Transcripts from Loom's own captions are the same on every plan. Paid Apify plans get full-accuracy transcripts with no such limit. On the Free plan a video cut to its first minute pays the transcript price only, with no extra minutes.

### Input example

```json
{
  "loomUrls": [
    "https://www.loom.com/share/912e89a68ccc42c5ab5096fec7cd63d6",
    "c823578e48064c1cbd8220c984a92df7"
  ],
  "transcribeAudio": true,
  "language": "",
  "maxMinutesPerVideo": 120
}
```

### Output example

```json
{
  "inputUrl": "https://www.loom.com/share/912e89a68ccc42c5ab5096fec7cd63d6",
  "url": "https://www.loom.com/share/912e89a68ccc42c5ab5096fec7cd63d6",
  "videoId": "912e89a68ccc42c5ab5096fec7cd63d6",
  "status": "transcribed",
  "transcriptSource": "captions",
  "title": "Getting Started with Loom",
  "description": null,
  "ownerName": "Chanel Lovell",
  "createdAt": "2023-08-19T00:19:41.112Z",
  "durationSeconds": 355.0,
  "billedMinutes": 0,
  "language": null,
  "wordCount": 572,
  "speakers": null,
  "text": "Hey, Chanel here from the Loom team. I'm going to show you how to get started with Loom. ...",
  "segments": [
    { "start": 1.154, "end": 4.774, "text": "Hey, Chanel here from the Loom team. I'm going to show you how to" }
  ],
  "srt": "1\n00:00:01,154 --> 00:00:04,774\nHey, Chanel here from the Loom team. I'm going to show you how to\n...",
  "vtt": "WEBVTT\n\n00:00:01.154 --> 00:00:04.774\nHey, Chanel here from the Loom team. I'm going to show you how to\n...",
  "thumbnailUrl": "https://cdn.loom.com/sessions/thumbnails/912e89a68ccc42c5ab5096fec7cd63d6-1696459031103.jpg",
  "error": null,
  "scrapedAt": "2026-11-01T12:00:00Z"
}
```

### Limits

- Videos must be viewable by anyone with the link. Private and password-protected videos come back as free `unavailable` rows.
- Folder and workspace links are not read: paste the links of the videos in them.
- When a video's owner has turned its transcript off for viewers, the video is not transcribed (a free `unavailable` row).
- Audio transcripts: videos over **Max minutes per video** (120 by default, up to 1,440) are skipped and not charged.

### FAQ

**Do I need a Loom account?** No. Loom Transcript reads public Loom videos without signing in.

**How many videos have a Loom transcript?** In our tests about 5 in 6 public Loom videos had one. The rest are transcribed from their audio when **Transcribe videos without a Loom transcript from their audio** is on.

**Which languages are supported?** Loom's own transcripts come in the language the video was recorded in. Audio transcripts work in about 100 languages, detected for each video; set **Spoken language** if you know it.

**Can I get subtitles?** Yes: every transcribed row has `srt` and `vtt` fields with ready-made subtitle files, at no extra cost.

**Can I use it through the API or from other tools?** Yes. Run it through the Apify API, with the Apify client for Python or JavaScript, from Make, Zapier, n8n or any tool with an Apify integration, or through the Apify MCP server.

**Is it legal to get transcripts of Loom videos?** The actor only reads videos their owners shared publicly. Make sure you have the right to use the transcripts, especially for republishing.

**Something does not work?** Open an issue on the Issues tab with the run link and we will look at it.

If Loom Transcript saves you time, please leave a review. It helps other people find it.

# Actor input Schema

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

One per line, e.g. https://www.loom.com/share/912e89a68ccc42c5ab5096fec7cd63d6. Share links, embed links, embed codes and video IDs all work. Videos must be viewable by anyone with the link.

## `transcribeAudio` (type: `boolean`):

Some Loom videos have no transcript (older recordings, videos Loom could not process). With this on they are transcribed from their spoken audio and charged per minute after the first; off, they come back as free rows.

## `language` (type: `string`):

Only for videos transcribed from audio: the spoken language as a two-letter code, e.g. en, es, de or fr. Leave it empty to detect it.

## `maxMinutesPerVideo` (type: `integer`):

Videos longer than this are not transcribed from audio and not charged, e.g. 120. Loom's own transcripts are returned whatever the length.

## Actor input object example

```json
{
  "loomUrls": [
    "https://www.loom.com/share/912e89a68ccc42c5ab5096fec7cd63d6"
  ],
  "transcribeAudio": true,
  "language": "",
  "maxMinutesPerVideo": 120
}
```

# Actor output Schema

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

No description

## `results` (type: `string`):

No description

## `report` (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 = {
    "loomUrls": [
        "https://www.loom.com/share/912e89a68ccc42c5ab5096fec7cd63d6"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("automly/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 = { "loomUrls": ["https://www.loom.com/share/912e89a68ccc42c5ab5096fec7cd63d6"] }

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automly/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/Jv12U2e639XKibpQ2/builds/spbPN9lVyAPGs4yga/openapi.json
