# Insight Timer Transcript Scraper (`groundworklabs/insight-timer-transcript-scraper`) Actor

Extract transcripts, ratings, and play counts  from Insight Timer meditations. Paste track URLs or a teacher profile URL to auto-scrape their most popular tracks. Built for writers and researchers studying mindful communication.

- **URL**: https://apify.com/groundworklabs/insight-timer-transcript-scraper.md
- **Developed by:** [Groundwork Labs](https://apify.com/groundworklabs) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

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

## 🧘 Insight Timer Transcript Scraper

**Extract full transcripts, ratings, and play counts from any Insight Timer meditation or talk — in one click.**

Paste individual track URLs **or a teacher's profile URL** to automatically pull their most popular tracks. Built for writers, researchers, and content creators who want to study the craft of mindful communication.

> ⚠️ **Ethical Use Only.** This tool is intended for learning, research, and educational purposes — studying tone, pacing, and narrative structure. It is not meant to reproduce content verbatim. Respect the creators whose work you're studying and always credit the original teachers.

***

### ✨ What It Does

- 📄 **Full transcript extraction** — pulls the complete spoken text from any track page
- 👤 **Teacher profile mode** — paste a teacher's profile URL (e.g. `https://insighttimer.com/sarahblondin`) and the scraper automatically finds and scrapes their top *N* most popular tracks
- ⭐ **Rating & play count** — captures each track's star rating, number of ratings, and total play count from structured page data
- 🔀 **Mix and match** — combine individual track URLs and profile URLs in the same run
- 🚀 **Handles dynamic content** — uses a real Chromium browser to expand Insight Timer's collapsed transcript containers

***

### 🎯 Who Is This For?

**Writers, content creators, researchers, and course builders** studying mindful communication:

- 🖊️ **Content writers** — analyse the tone, pacing, vocabulary, and sentence rhythm of top meditation teachers to inform your own voice
- 🎙️ **Podcast & script writers** — study how expert teachers open, develop, and close a session at scale
- 📚 **Researchers** — build a corpus of guided meditation language for NLP, linguistics, or wellbeing studies
- 🧠 **Course creators** — understand how the best teachers structure scripts for engagement and retention
- 📊 **Content strategists** — cross-reference transcripts with play counts and ratings to identify what resonates most with audiences

***

### 📥 Input

| Field | Description | Default |
|---|---|---|
| **URLs** | Individual track URLs and/or teacher profile URLs (mix freely) | — |
| **Max tracks per profile** | How many popular tracks to pull when a profile URL is given | `20` |
| **Delay between requests** | Seconds to wait between each track request | `3` |

#### URL formats accepted

**Individual track URL:**

```
https://insighttimer.com/sarahblondin/guided-meditations/transform-the-story-that-limits-you
```

**Teacher profile URL — auto-discovers their most popular tracks:**

```
https://insighttimer.com/sarahblondin
```

You can mix both in the same run. Duplicates are automatically removed.

***

### 📤 Output

One dataset row per track:

| Field | Description |
|---|---|
| `title` | Track title |
| `author` | Teacher / author name |
| `rating` | Average star rating (e.g. `4.94`) |
| `rating_count` | Number of ratings |
| `play_count` | Total number of plays |
| `transcript` | Full transcript text |
| `char_count` | Transcript length in characters |
| `url` | Source URL |
| `slug` | URL-derived identifier |
| `scraped_at` | ISO 8601 timestamp |
| `error` | Error message if extraction failed, `null` on success |

***

### 💡 Example Use Cases

**Study a teacher's most popular work:**
Paste `https://insighttimer.com/sarahblondin` → set *Max tracks* to `20` → run. You'll get 20 transcripts from Sarah Blondin's most-played meditations, each with its rating and play count, ready to analyse for tone, vocabulary, and narrative arc.

**Identify what content performs best:**
Sort the output by `play_count` or `rating` to see which topics, lengths, or styles resonate most with audiences — a data-driven way to guide your own content.

**Compare multiple teachers:**
Add multiple profile URLs in a single run — the scraper processes each in popularity order.

***

### ⚙️ How It Works

1. **URL detection** — each input URL is classified as a teacher profile (one path segment) or an individual track (three path segments)
2. **Profile expansion** — for profile URLs, a Chromium browser opens the teacher's page, sets the sort to "Popular", scrolls to trigger lazy-loading, and collects up to N track links
3. **Stats extraction** — each track page embeds schema.org JSON-LD structured data containing the `aggregateRating` (rating + review count) and `interactionStatistic` (play count). The scraper parses this directly — no fragile CSS selectors
4. **Transcript extraction** — the browser expands Insight Timer's collapsed transcript container (a Chakra UI element with a fixed-height clip) via JavaScript, then extracts the full text
5. **Deduplication** — if the same URL appears more than once across inputs, it is only scraped once

***

### 📌 Notes

- Only works on tracks that have a **published transcript** on the page. Audio-only tracks with no visible transcript return an error row (rating and play count are still captured).
- Profile pages typically surface 15–25 tracks on initial load. The scraper scrolls to trigger lazy-loading for larger requests.
- Video tracks (`/video-guided-meditations/`) are included when discovered via profile pages.
- Increase *Delay between requests* if you encounter rate limiting.

***

*For educational and research use only. Always credit original creators and comply with Insight Timer's Terms of Service.*

# Actor input Schema

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

List of Insight Timer URLs to scrape. Accepts two formats:
• Track URL — scrapes that specific track (e.g. https://insighttimer.com/sarahblondin/guided-meditations/transform-the-story-that-limits-you)
• Teacher profile URL — collects the top N most popular tracks automatically (e.g. https://insighttimer.com/sarahblondin)

You can mix both types in the same run.

## `maxTracksPerProfile` (type: `integer`):

When a teacher profile URL is given, how many of their most popular tracks to scrape. Ignored for individual track URLs.

## `delaySeconds` (type: `integer`):

How many seconds to wait between scraping each track. Increase if you hit rate limits.

## Actor input object example

```json
{
  "urls": [
    "https://insighttimer.com/sarahblondin"
  ],
  "maxTracksPerProfile": 20,
  "delaySeconds": 3
}
```

# Actor output Schema

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

One row per URL: title, author, full transcript text, character count, and any errors.

# 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 = {
    "urls": [
        "https://insighttimer.com/sarahblondin"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("groundworklabs/insight-timer-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 = { "urls": ["https://insighttimer.com/sarahblondin"] }

# Run the Actor and wait for it to finish
run = client.actor("groundworklabs/insight-timer-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 '{
  "urls": [
    "https://insighttimer.com/sarahblondin"
  ]
}' |
apify call groundworklabs/insight-timer-transcript-scraper --silent --output-dataset

```

## MCP server setup

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