# Loom Transcript Scraper: API-fast Metadata & Text (`devanshlive/loom-transcript-scraper`) Actor

Extract Loom video metadata and full transcripts (plain text, VTT, SRT) at scale. HTTP-only, API-fast, no browser overhead. Drop-in for Zendesk, HubSpot, Slack. Get clean text in seconds. Skip alternatives with high compute cost. $0.01 per video.

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

## Pricing

from $1.00 / 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.

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 Download & Transcript Extractor

Extract transcripts and metadata from public Loom videos. Delivers cleaned plain text, WebVTT (VTT), and SRT formats alongside video metadata including title, creator, duration, and upload date. Perfect for archiving, documentation, and accessibility compliance.

This Actor is a specialized tool designed to automate the extraction of transcripts from Loom video share URLs. It provides structured JSON output with complete transcript data and video metadata.

### Features

-   **Multi-Format Transcripts**: Provides transcripts in three formats:
    -   **Plain Text**: Clean transcript text without timestamps for easy reading.
    -   **WebVTT (VTT)**: Standard format with full timestamps, ideal for closed captions.
    -   **SubRip (SRT)**: Standard format for subtitle editing software.
-   **Comprehensive Video Metadata**: Extracts key details:
    -   **Title**: Video title as set by the creator.
    -   **Creator**: Display name of the video creator.
    -   **Duration**: Video length in HH:MM:SS format and ISO 8601.
    -   **Upload Date**: When the video was published.
-   **Flexible URL Input**: Handles various Loom input formats:
    -   Full Loom share URLs (e.g., `https://www.loom.com/share/912e89a68ccc42c5ab5096fec7cd63d6`).
    -   URLs with query parameters (e.g., `?sid=...`).
    -   Bare video IDs (32-character hex strings).
-   **AI Transcriber Fallback (Native Transcript Scraper)**: The existing actor memo23/loom-scraper claims this feature but **this version does not**. I have analyzed and confirmed that building a reliable AI fallback or MP4 download is not technically feasible for an HTTP-only actor on public Loom videos. Therefore, this actor focuses purely on extracting existing, native transcripts. If a video does not have a transcript, the `error` field will be populated.

### How to use

1.  Create an Apify account.
2.  Go to the **Actor tab** in your Apify Console and click on **Input**.
3.  Fill in the input fields, primarily the **Start URLs** (provide your Loom URLs here).
4.  Optionally, configure the **Max requests per crawl** and proxy settings.
5.  Click **Run** at the bottom of the page.
6.  Once the run is complete, download the results from the **Dataset** tab in your preferred format (JSON, CSV, Excel, etc.).

### Input Configuration

The Actor accepts the following input parameters:

| Field | Type | Description | Required | Default | Editor |
| --- | --- | --- | --- | --- | --- |
| **Start URLs** (`startUrls`) | array | The Loom video URLs or bare IDs to extract transcripts from. | Yes | `[]` | `requestListSources` |
| **Max requests per crawl** (`maxRequestsPerCrawl`) | integer | The maximum number of URLs to process. | No | `100` | `number` |

#### Sample Input JSON

```json
{
    "startUrls": [
        { "url": "https://www.loom.com/share/912e89a68ccc42c5ab5096fec7cd63d6" },
        { "url": "c823578e48064c1cbd8220c984a92df7" },
        { "url": "https://www.loom.com/share/912e89a68ccc42c5ab5096fec7cd63d6?sid=2e96ab06-46c4-4f14-b425-8944e89fb9e2" }
    ],
    "maxRequestsPerCrawl": 10
}
````

### Output Structure

The scraper produces structured JSON output for each video.

#### Sample Output JSON

```json
{
    "loomId": "912e89a68ccc42c5ab5096fec7cd63d6",
    "url": "https://www.loom.com/share/912e89a68ccc42c5ab5096fec7cd63d6",
    "title": "Getting Started with Loom",
    "creator": "Chanel Lovell",
    "uploadDateISO8601": "2023-08-19T00:19:41.112Z",
    "uploadDate": "2023-08-19",
    "durationISO8601": "PT355.166S",
    "transcript": "Hey, Chanel here from the Loom team. I'm going to show you how to get started with Loom...",
    "transcriptVTT": "WEBVTT\r\n\r\n1\r\n00:00:01.154 --> 00:00:04.774\r\n<v Chanel Lovell>Hey, Chanel here from the Loom team. I'm going to show you how to</v>\r\n\r\n2\r\n00:00:04.774 --> 00:00:07.704\r\nget started with Loom. First,\r\n...",
    "transcriptSRT": "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\n2\n00:00:04,774 --> 00:00:07,704\nget started with Loom. First,\n...",
    "error": null
}
```

### Pricing / Cost Estimation

This Actor is highly efficient. It uses a clean, API-first approach and does not require complex browser rendering or external AI transcription APIs. This keeps the cost of running the Actor very low. We estimate that you can scrape hundreds of videos for less than a few cents. Apify's free tier is likely sufficient for small to medium use cases.

### FAQ, disclaimers, and support

#### Are these scrapers legal?

Web scraping is generally legal for publicly available data, but you are responsible for:

- Complying with Loom's terms of service.
- Respecting `robots.txt` and rate limiting.
- Using scraped data in accordance with all applicable data protection laws.

#### How can I report an issue or suggest a feature?

For issues or feature requests, please use the **Issues** section of this actor in Apify Store. For other platforms or customization requests, you can contact the author at devanshtiwari365@gmail.com.

#### Technical Implementation Note

This actor focuses purely on public Loom videos with existing native transcripts. I have analyzed and confirmed that building a reliable AI fallback or MP4 download is not technically feasible for an HTTP-only actor. If a video does not have a transcript, the `error` field will be populated. The actor has robust parsing logic to clean and convert native transcripts into multiple formats.

# Actor input Schema

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

URLs to start with.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.loom.com/share/912e89a68ccc42c5ab5096fec7cd63d6"
    }
  ]
}
```

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

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

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Loom Transcript Scraper: API-fast Metadata & Text",
        "description": "Extract Loom video metadata and full transcripts (plain text, VTT, SRT) at scale. HTTP-only, API-fast, no browser overhead. Drop-in for Zendesk, HubSpot, Slack. Get clean text in seconds. Skip alternatives with high compute cost. $0.01 per video.",
        "version": "0.0",
        "x-build-id": "YAjMsE1TWhYxCTrUU"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/devanshlive~loom-transcript-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-devanshlive-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/devanshlive~loom-transcript-scraper/runs": {
            "post": {
                "operationId": "runs-sync-devanshlive-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/devanshlive~loom-transcript-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-devanshlive-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",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Loom Video URLs",
                        "type": "array",
                        "description": "URLs to start with.",
                        "default": [
                            {
                                "url": "https://www.loom.com/share/912e89a68ccc42c5ab5096fec7cd63d6"
                            }
                        ],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
