# Reel Knowledge Distiller: Videos to Claims (`physealabs/reel-knowledge-distiller`) Actor

Turn public short videos into transcripts, typed claims, and Markdown notes for research and content teams.

- **URL**: https://apify.com/physealabs/reel-knowledge-distiller.md
- **Developed by:** [jay casey](https://apify.com/physealabs) (community)
- **Categories:** AI, Social media, Videos
- **Stats:** 2 total users, 1 monthly users, 44.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## Reel Knowledge Distiller

Turn public short videos into transcripts, typed claims, and Markdown notes for research and content teams.

### What can Reel Knowledge Distiller do?

Add public YouTube, TikTok, or Instagram video links. The Actor fetches each video, transcribes its speech, sorts its claims into your categories, and saves both dataset rows and Markdown pages.

| What you get | Features |
|--|--|
| 📝 A transcript and typed claims for each video | 🎬 Direct video and profile input for supported public sources |
| 📚 Category pages and an index in Markdown | 🔊 Local Whisper transcription by default |

### Who this is for

- Build a source set from short videos
- Track claims made by creators or competitors
- Sort video research into topic pages

### What you get back

| Field | Type | What you get | Example |
|--|--|--|--|
| `shortcode` | `string` | Short identifier taken from the source video URL. | `fwBIZRq-vzY` |
| `url` | `string` | Public video page analyzed by the Actor. | `https://www.youtube.com/watch?v=fwBIZRq-vzY` |
| `author` | `string` | Creator handle reported for the video. | `@Fireship` |
| `author_name` | `string` | Creator name when the source provides one. | `Fireship` |
| `posted` | `string` | Date the video was published when available. | `2024-09-21` |
| `status` | `string` | Whether this item completed its requested analysis. | `distilled` |
| `title` | `string` | Title reported for the source item. | `Linux command tricks for faster coding workflows` |
| `theme` | `string` | Main subject assigned to the video. | `linux productivity` |
| `categories` | `array` | Knowledge categories assigned to the result. | `["ai-production"]` |
| `claims` | `array` | Structured claims extracted from the transcript. | `[{"type":"technique","signal":"actionable","status":"definitive","text":"Use mkdir { } to create a directory and immediately cd into it, then cd - to return...` |
| `tools_mentioned` | `array` | Products or tools named in the source. | `["Atom One Dark","vscode-icons","Fira Code"]` |
| `why_it_matters` | `string` | Why the extracted material may matter to the selected audience. | `These Linux shortcuts streamline directory navigation, bulk file creation, log monitoring, and command reuse , directly boosting developer efficiency.` |
| `org_relevance` | `string` | How the result relates to the chosen perspective. | `The techniques illustrate practical automation patterns relevant to AI production workflows that the research team can benchmark or integrate into tooling.` |
| `importance_signal` | `string` | Signal used to judge why the source may be useful. | `The creator highlights overlooked command-line efficiencies, signaling that practitioners value quick, tangible productivity gains.` |
| `quality` | `integer` | Quality score assigned to the distilled result. | `5` |
| `transcript` | `string` | Full speech-to-text transcript. | `This cooking trick recently changed my life. If you just drop an egg to crack it, instead of tapping it while holding it, you'll never get shells in the resu...` |
| `transcript_source` | `string` | Method used to obtain the transcript. | `local-whisper` |
| `transcript_chars` | `integer` | Character count of the transcript. | `976` |
| `caption` | `string` | Source caption or post text when available. | `Here are five Linux command tricks that will change your life if you're a programmer. mkdir { } cd - touch {1..100} tail -f history 🎨 My Editor Settings - At...` |
| `error` | `null` | Problem details when this item does not complete. | `null` |
| `error_stage` | `null` | Processing step that failed, if any. | `null` |
| `model` | `string` | Model used for the analysis. | `nvidia.nemotron-nano-3-30b` |
| `distilled_at` | `string` | Time the distilled result was created. | `2026-09-11T17:11:28Z` |

The run also links to its dataset and any files named in the Actor output.

### What you need to provide

| Field | Type | Required | What it does | Example |
|--|--|--:|--|--|
| `reelUrls` | `array` | No | Public short-video links we fetch ourselves with yt-dlp , Instagram reels/posts (share → copy link), TikTok videos, YouTube Shorts. No third-party scrapers, no login. Note: Instagram currently serves media only intermittently to non-logged-in clients; failures are reported per row as `error_stage: fetch`, never faked. | `["https://www.youtube.com/shorts/fwBIZRq-vzY"]` |
| `reelUrlsFile` | `string` | No | Public URL of a JSON, CSV or text file containing reel/post links (for example an export from your own tooling). Every Instagram/TikTok/YouTube link found in it is added to `reelUrls`. | ``|
| `profiles` | `array` | No | Public YouTube channel URLs (e.g. `https://www.youtube.com/@Fireship` → its Shorts tab) or TikTok profile URLs (`https://www.tiktok.com/@handle`). Up to `resultsLimit` latest videos are listed and processed. Instagram handles are DEPRECATED and skipped with a warning: listing an Instagram profile needs a login, and this Actor never calls third-party scrapers , paste the reel links into `reelUrls` instead. |`` |
| `resultsLimit` | `integer` | No | Cap on how many URLs are processed in one run (1-500). Remaining URLs can be run later; already-processed shortcodes are skipped when you reuse the dataset. | `30` |
| `perspective` | `string` | No | Free text used in the prompt for `org_relevance`, e.g. "an AI infra startup's GTM team" or "a solo indie-hacker building a SaaS". | `a research team tracking practitioner knowledge` |
| `categories` | `array` | No | Knowledge categories the LLM assigns (1-3 per reel, primary first). Each item: `{"id": "gtm-sales", "description": "..."}`. Leave empty for the built-in default set (ai-production, ai-architecture, model-research, market-state, gtm-sales, marketing-content, product-design, founder-ops, psychology-research, other). An `other` category is always appended. | \`\` |
| `llm` | `object` | No | Distillation model. Default (when left blank): the Actor's own inexpensive Bedrock model (nvidia.nemotron-nano-3-30b) , no key needed. Override with any /v1/chat/completions server (`provider` openai|openai-compatible, `baseUrl`, `model`, `apiKey` stored encrypted). | `{"provider":"openai-compatible","model":"nvidia.nemotron-nano-3-30b","baseUrl":"https:/...` |
| `transcription` | `object` | No | `mode`: `local` (default , faster-whisper runs inside the Actor on CPU, no key; optional `model`: tiny|base|small, `language`: ISO code), `whisper-api` (POST audio to an OpenAI-compatible /audio/transcriptions endpoint you name via `baseUrl` + `openaiApiKey`), or `none` (reels are emitted as `no_speech` unless a transcript is supplied). The old `apify` mode is retired. | `{"mode":"local"}` |
| `minTranscriptChars` | `integer` | No | Transcripts shorter than this are treated as no speech (music/text-overlay reels) and are NOT sent to the LLM. | `80` |

#### Quick start

1. Open the Actor in Apify Console.
2. Click **Try for free** or **Create a task**.
3. Replace the sample values with your own input.
4. Click **Start**.
5. Open the dataset and the named output files when the run ends.

### Pricing

- `reel-distilled`: $0.01 per reel distilled.
- `reel-transcribed`: $0.006 per reel transcribed.
- Failed or skipped work is not charged unless an event is listed in the run charges.
- Normal Apify compute and proxy costs may also apply.

### Limits and honest notes

- Public platforms can block or rate limit downloads. Each blocked item gets an error row.
- Instagram profile listing needs a login, so the Actor skips Instagram handles. Paste public reel links instead.
- Videos with transcripts shorter than `minTranscriptChars` return `no_speech` and are not sent to the LLM.

### Code and API

The examples below use the same values as the Apify Console sample.

#### Input JSON

```json
{
  "reelUrls": [
    "https://www.youtube.com/shorts/fwBIZRq-vzY"
  ],
  "resultsLimit": 30,
  "perspective": "a research team tracking practitioner knowledge",
  "llm": {
    "provider": "openai-compatible",
    "model": "nvidia.nemotron-nano-3-30b",
    "baseUrl": "https://bedrock-runtime.us-east-1.amazonaws.com/openai/v1",
    "apiKey": ""
  },
  "transcription": {
    "mode": "local"
  },
  "minTranscriptChars": 80
}
```

#### Real output sample

This excerpt comes from the real run named in the current marketplace release report.

```json
{
  "shortcode": "fwBIZRq-vzY",
  "url": "https://www.youtube.com/watch?v=fwBIZRq-vzY",
  "author": "@Fireship",
  "author_name": "Fireship",
  "posted": "2024-09-21",
  "status": "distilled",
  "title": "Linux command tricks for faster coding workflows",
  "theme": "linux productivity",
  "categories": [
    "ai-production"
  ],
  "claims": [
    {
      "type": "technique",
      "signal": "actionable",
      "status": "definitive",
      "text": "Use mkdir { } to create a directory and immediately cd into it, then cd - to return to the previous directory."
    },
    {
      "type": "technique",
      "signal": "actionable",
      "status": "definitive",
      "text": "Create multiple files with touch {1..100} to generate 100 sequentially numbered empty files in one command."
    },
    {
      "type": "technique",
      "signal": "actionable",
      "status": "definitive",
      "text": "Use tail -f to continuously monitor and display new lines appended to a log file in real time."
    },
    {
      "type": "technique",
      "signal": "actionable",
      "status": "definitive",
      "text": "Leverage history to quickly recall and re-execute the last five commands without retyping them."
    },
    {
      "type": "tool",
      "signal": "actionable",
      "status": "definitive",
      "text": "Use brace expansion in mkdir, cd, and touch commands to simplify path manipulation and file creation."
    }
  ],
  "tools_mentioned": [
    "mkdir",
    "cd",
    "touch",
    "tail",
    "history"
  ],
  "why_it_matters": "These Linux shortcuts streamline directory navigation and file management, directly boosting developer productivity.",
  "quality": 5,
  "transcript_source": "local-whisper",
  "transcript_chars": 976
}
```

#### curl

```sh
curl -X POST "https://api.apify.com/v2/acts/physealabs~reel-knowledge-distiller/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d @input.json
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("physealabs/reel-knowledge-distiller").call(run_input={'reelUrls': ['https://www.youtube.com/shorts/fwBIZRq-vzY'], 'resultsLimit': 30, 'perspective': 'a research team tracking practitioner knowledge', 'llm': {'provider': 'openai-compatible', 'model': 'nvidia.nemotron-nano-3-30b', 'baseUrl': 'https://bedrock-runtime.us-east-1.amazonaws.com/openai/v1', 'apiKey': ''}, 'transcription': {'mode': 'local'}, 'minTranscriptChars': 80})
items = client.dataset(run["defaultDatasetId"]).list_items().items
```

#### Node.js

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('physealabs/reel-knowledge-distiller').call({"reelUrls": ["https://www.youtube.com/shorts/fwBIZRq-vzY"], "resultsLimit": 30, "perspective": "a research team tracking practitioner knowledge", "llm": {"provider": "openai-compatible", "model": "nvidia.nemotron-nano-3-30b", "baseUrl": "https://bedrock-runtime.us-east-1.amazonaws.com/openai/v1", "apiKey": ""}, "transcription": {"mode": "local"}, "minTranscriptChars": 80});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

You can call this Actor from an agent or LLM tool that can send HTTP requests to the Apify API. Keep the Apify token in a secret store.

### FAQ

#### Does it open private posts?

No. It works with public links and does not log in to social platforms.

#### Can it process profiles?

It can list recent videos from public YouTube and TikTok profiles. Instagram profiles are skipped.

#### Can I use my own model?

Yes. Set the `llm` object with a compatible endpoint, model, and API key.

# Actor input Schema

## `reelUrls` (type: `array`):

Public short-video links we fetch ourselves with yt-dlp — Instagram reels/posts (share → copy link), TikTok videos, YouTube Shorts. No third-party scrapers, no login. Note: Instagram currently serves media only intermittently to non-logged-in clients; failures are reported per row as `error_stage: fetch`, never faked.

## `reelUrlsFile` (type: `string`):

Public URL of a JSON, CSV or text file containing reel/post links (for example an export from your own tooling). Every Instagram/TikTok/YouTube link found in it is added to `reelUrls`.

## `profiles` (type: `array`):

Public YouTube channel URLs (e.g. `https://www.youtube.com/@Fireship` → its Shorts tab) or TikTok profile URLs (`https://www.tiktok.com/@handle`). Up to `resultsLimit` latest videos are listed and processed. Instagram handles are DEPRECATED and skipped with a warning: listing an Instagram profile needs a login, and this Actor never calls third-party scrapers — paste the reel links into `reelUrls` instead.

## `resultsLimit` (type: `integer`):

Cap on how many URLs are processed in one run (1–500). Remaining URLs can be run later; already-processed shortcodes are skipped when you reuse the dataset.

## `perspective` (type: `string`):

Free text used in the prompt for `org_relevance`, e.g. "an AI infra startup's GTM team" or "a solo indie-hacker building a SaaS".

## `categories` (type: `array`):

Knowledge categories the LLM assigns (1–3 per reel, primary first). Each item: `{"id": "gtm-sales", "description": "..."}`. Leave empty for the built-in default set (ai-production, ai-architecture, model-research, market-state, gtm-sales, marketing-content, product-design, founder-ops, psychology-research, other). An `other` category is always appended.

## `llm` (type: `object`):

Distillation model. Default (when left blank): the Actor's own inexpensive Bedrock model (nvidia.nemotron-nano-3-30b) — no key needed. Override with any /v1/chat/completions server (`provider` openai|openai-compatible, `baseUrl`, `model`, `apiKey` stored encrypted).

## `transcription` (type: `object`):

`mode`: `local` (default — faster-whisper runs inside the Actor on CPU, no key; optional `model`: tiny|base|small, `language`: ISO code), `whisper-api` (POST audio to an OpenAI-compatible /audio/transcriptions endpoint you name via `baseUrl` + `openaiApiKey`), or `none` (reels are emitted as `no_speech` unless a transcript is supplied). The old `apify` mode is retired.

## `minTranscriptChars` (type: `integer`):

Transcripts shorter than this are treated as no speech (music/text-overlay reels) and are NOT sent to the LLM.

## Actor input object example

```json
{
  "reelUrls": [
    "https://www.youtube.com/shorts/fwBIZRq-vzY"
  ],
  "resultsLimit": 30,
  "perspective": "a research team tracking practitioner knowledge",
  "llm": {
    "provider": "openai-compatible",
    "model": "nvidia.nemotron-nano-3-30b",
    "baseUrl": "https://bedrock-runtime.us-east-1.amazonaws.com/openai/v1",
    "apiKey": ""
  },
  "transcription": {
    "mode": "local"
  },
  "minTranscriptChars": 80
}
```

# Actor output Schema

## `reels` (type: `string`):

One row per reel: status, title, theme, categories, typed claims, tools, relevance, transcript.

## `knowledgePages` (type: `string`):

Per-category KNOWLEDGE\_\*.md pages plus INDEX.md and RUN\_SUMMARY.json.

## `index` (type: `string`):

Table of contents linking every knowledge page.

# 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 = {
    "reelUrls": [
        "https://www.youtube.com/shorts/fwBIZRq-vzY"
    ],
    "llm": {
        "provider": "openai-compatible",
        "model": "nvidia.nemotron-nano-3-30b",
        "baseUrl": "https://bedrock-runtime.us-east-1.amazonaws.com/openai/v1",
        "apiKey": ""
    },
    "transcription": {
        "mode": "local"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("physealabs/reel-knowledge-distiller").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 = {
    "reelUrls": ["https://www.youtube.com/shorts/fwBIZRq-vzY"],
    "llm": {
        "provider": "openai-compatible",
        "model": "nvidia.nemotron-nano-3-30b",
        "baseUrl": "https://bedrock-runtime.us-east-1.amazonaws.com/openai/v1",
        "apiKey": "",
    },
    "transcription": { "mode": "local" },
}

# Run the Actor and wait for it to finish
run = client.actor("physealabs/reel-knowledge-distiller").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 '{
  "reelUrls": [
    "https://www.youtube.com/shorts/fwBIZRq-vzY"
  ],
  "llm": {
    "provider": "openai-compatible",
    "model": "nvidia.nemotron-nano-3-30b",
    "baseUrl": "https://bedrock-runtime.us-east-1.amazonaws.com/openai/v1",
    "apiKey": ""
  },
  "transcription": {
    "mode": "local"
  }
}' |
apify call physealabs/reel-knowledge-distiller --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,physealabs/reel-knowledge-distiller"
        }
    }
}

```

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/mtEpnXrGLpRJP2WRx/builds/HZJinXgrViaily2Mu/openapi.json
