# Circle Downloader (`serpdownloaders/circle-downloader`) Actor

Circle Downloader (Unofficial). Authorized-use only - download content you own or have permission to access. Download Circle videos and community lessons for offline viewing.

- **URL**: https://apify.com/serpdownloaders/circle-downloader.md
- **Developed by:** [SERP Downloaders](https://apify.com/serpdownloaders) (community)
- **Categories:** Videos, Automation, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

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

## Circle Downloader (Browser Extension)

> Browser extension that adds a download button to Circle.so community pages — detects videos from Circle's native player, Tella, Loom, Vimeo, YouTube, and Wistia, and saves them as MP4 for offline viewing.

A browser extension that downloads videos from Circle.so communities, Tella.tv recordings, Loom videos, and embedded content from YouTube, Vimeo, and Wistia — directly to your computer as MP4 files. No external software needed. 3 free downloads included.

- Save entire Circle classrooms and course content for unlimited offline access anytime, anywhere
- Protect your educational investment by downloading all materials before courses expire or disappear
- Create a personal library of video lectures, coaching calls, and resources that you own forever
- Never lose access to paid courses again — backup everything before platforms shut down or remove content

<a href="https://www.youtube.com/watch?v=_8XKKHj0eLs" target="_blank">
<img src="https://raw.githubusercontent.com/devinschumacher/uploads/refs/heads/main/images/how-to-download-circle-so-videos-for-free-hls-m3u8-streams.jpg" width="700px">
</a>

### Links

- :rocket: Get it here: [Circle Downloader](https://serp.ly/circle-downloader)
- :new: Latest release: [GitHub Releases](https://github.com/serpapps/circle-downloader/releases/latest)
- :question: Help center: [SERP Help](https://help.serp.co/en/)
- :beetle: Report bugs: [GitHub Issues](https://github.com/serpapps/circle-downloader/issues)
- :bulb: Request features: [Feature Requests](https://github.com/serpapps/circle-downloader/issues)

### Table of Contents

- [Why Circle Downloader](#why-circle-downloader)
- [Features](#features)
- [How It Works](#how-it-works)
- [Supported Platforms](#supported-platforms)
- [Videos](#videos)
- [Trial & Access](#trial--access)
- [Installation Instructions](#installation-instructions)
- [Downloading Member-Only Content](#downloading-member-only-content)
- [Frequently Asked Questions](#frequently-asked-questions)
- [Troubleshooting](#troubleshooting)
- [License](#license)
- [Related](#related)

### Why Circle Downloader

Circle.so has no native download button. Tella recordings expire. Loom auto-deletes older videos on free plans. Course platforms embed videos from multiple sources with no unified download option.

Circle Downloader handles all of them in one extension — detecting videos across 7+ platforms and converting HLS/DASH streams to standard MP4 files directly in your browser. Open a lesson or post with a video, click the extension icon, pick your quality, and it saves as MP4.

### Features

- **Multi-platform detection** — Circle.so, Tella.tv, Loom.com, YouTube, Vimeo, Wistia, and generic embedded players
- **Finds hidden embeds** — detects players buried inside Circle.so web components
- **Stream-to-MP4 conversion** — converts HLS/DASH streaming video to downloadable MP4 in-browser
- **Quality selector** — all available resolutions per platform with bitrate and estimated file size
- **Concurrent downloads** — up to 3 simultaneous downloads with real-time progress, speed, and cancel
- **Batch download queue** — add multiple lessons and process them automatically
- **YouTube URL display** — one-click yt-dlp copy for Mac and Windows
- **Right-click context menu** — quick downloads without opening the popup
- **Auto-organized storage** — saves to a Circle Downloader subfolder in Downloads
- **Desktop notifications** — alerts when downloads complete or fail
- **Original quality preserved** — no re-encoding, no watermarks, no quality loss
- **Privacy-first** — all processing on-device, zero tracking, no data sent to external servers
- **100% privacy-friendly** — no tracking or data collection
- 1-on-1 support via our community

#### Supported Platforms & Pages

| Content Type | Circle Native | YouTube | Vimeo | Wistia | Loom | Tella |
| --- | --- | --- | --- | --- | --- | --- |
| Course Lessons | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Community Posts | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Coaching Calls | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Member-Only Content | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |

#### Supported Browsers

Chrome, Edge, Brave, Opera, Firefox, Whale, and Yandex — on Windows, macOS, and Linux.

#### Supported Formats

- **Input:** Circle.so, Tella.tv, Loom.com, YouTube, Vimeo, Wistia, and generic embedded players
- **Output:** MP4

### How It Works

1. **Install** — Add SERP Circle Downloader to your browser
2. **Navigate** — Go to a Circle.so lesson, Tella recording, Loom video, or any page with embedded video
3. **Play** — Start the video so the extension can detect the stream
4. **Download** — Click the extension icon, pick your quality, and hit Download — saved as MP4

### Videos

<a href="https://www.youtube.com/watch?v=_8XKKHj0eLs" target="_blank">
<img src="https://raw.githubusercontent.com/devinschumacher/uploads/refs/heads/main/images/how-to-download-circle-so-videos-for-free-hls-m3u8-streams.jpg" width="700px">
</a>

### Trial & Access

- Includes **3 free downloads** after email sign-in (OTP verification)
- No credit card required for the free trial
- Unlimited downloads available with a license

### Installation Instructions

Each release has its own specific installation instructions to make it easier to upgrade, or rollback, to different versions.
You can find the installation instructions for the specific version in the release:

- <https://github.com/serpapps/circle-downloader/releases>

### Downloading Member-Only Content

The Circle Downloader extension respects your existing Circle login and permissions. If you can view a post in your community — whether it's public, member-only, or restricted — the extension can download it using your authentication.

**Key Points:**
- Your existing Circle login is used automatically in the background
- No separate passwords or credentials needed
- Works for private communities, restricted posts, and member-exclusive lessons
- Downloads happen entirely on your device with no data sent to third parties

### Frequently Asked Questions

#### Q: What sites does this extension support?

A: Circle.so (and Circle.com), Tella.tv, Loom.com, YouTube.com, Vimeo.com, and Wistia.com. It also detects generic embedded video players on other sites.

#### Q: Does this work on native Circle videos?

A: Yes.

#### Q: Does this work on 2+ hour long videos?

A: Yes.

#### Q: Does this work on Loom/Tella videos embedded in Circle?

A: Yes.

#### Q: Can I download multiple videos at once?

A: Yes. The extension supports up to 3 concurrent downloads with individual progress tracking. Additional videos are added to an automatic queue.

#### Q: What quality options are available?

A: The extension detects all available resolutions from the source platform and lists them in the quality selector, sorted highest to lowest. Each option shows resolution, bitrate, and estimated file size.

#### Q: Does downloading preserve the original quality?

A: Yes. For adaptive streams (HLS/DASH), the extension downloads segments and merges them into a single MP4 without re-encoding. Direct MP4 uploads are saved at full quality instantly.

#### Q: Where are my downloads saved?

A: Videos automatically save to a Circle Downloader subfolder inside your browser's default Downloads directory. You can also set a custom default download location.

#### Q: Can I download member-only or private content?

A: Yes. If you can view the post in Circle, the extension can download it using your existing Circle login. Authentication happens automatically in the background.

#### Q: Why isn't the extension finding my video?

A: Press play on the video first. The extension needs the stream to start before detection works. If issues persist, refresh the page and try again.

#### Q: Is there a free trial?

A: Yes — 3 free downloads after email sign-in. No credit card required. Unlimited downloads available with a license.

#### Q: Is my data safe?

A: Yes. All video processing happens entirely in your browser. No video data is sent to external servers. Your Circle login credentials are never shared.

### Troubleshooting

#### Videos Not Detecting

1. Refresh the Circle post page
2. Press play on the video first — the extension needs the stream active
3. Make sure you're logged into your Circle community
4. Try clearing browser cache and reloading
5. Check that JavaScript is enabled in your browser
6. Disable browser extensions that might interfere (ad blockers, etc.)

#### Download Failures

1. Check your internet connection stability
2. Try downloading in a lower quality
3. Reduce concurrent downloads to 1
4. Ensure you have sufficient disk space
5. Try a different browser to rule out browser-specific issues

#### Authentication Issues

1. Make sure you're logged into Circle in your browser
2. Refresh the page and try again
3. Check that cookies are enabled
4. Log out and log back into Circle
5. Clear browser cookies for circle.so and try again

#### File Playback Issues

1. Try a different video player (VLC, Windows Media Player, QuickTime)
2. Check file format — should be .mp4
3. Ensure download completed fully (check file size)
4. Update your video player to the latest version
5. Try re-downloading the video

### License

This repository is distributed under the proprietary SERP Apps license in the [LICENSE](LICENSE) file. Review that file before copying, modifying, or redistributing any part of this project.

### About

Circle.so is a community platform for creators, educators, and businesses to host courses, coaching programs, and member communities. However, like many course platforms, they don't provide a way to download the videos that you (the actual users) pay for access to — or even offer an offline viewing option.

So we created a way for you to download your Circle.so community videos even if you're not technically inclined.

---

### Related

- [Circle Downloader](https://github.com/serpapps/circle-downloader)
- [How to download circle videos for free](https://gist.github.com/devinschumacher/5910965cbff1e563e120dbd2df06d4ba)

# Actor input Schema

## `listingNotice` (type: `string`):

Optional informational field only. This actor currently serves as the public listing surface for the browser extension and does not yet expose a finalized runtime API contract.

## Actor input object example

```json
{
  "listingNotice": "No runtime input is required yet. See the README and product page for the current extension workflow."
}
````

# 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 = {};

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

# Run the Actor and wait for it to finish
run = client.actor("serpdownloaders/circle-downloader").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 '{}' |
apify call serpdownloaders/circle-downloader --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Circle Downloader",
        "description": "Circle Downloader (Unofficial). Authorized-use only - download content you own or have permission to access. Download Circle videos and community lessons for offline viewing.",
        "version": "0.0",
        "x-build-id": "IdpI1KtIMBe5JHQb4"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/serpdownloaders~circle-downloader/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-serpdownloaders-circle-downloader",
                "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/serpdownloaders~circle-downloader/runs": {
            "post": {
                "operationId": "runs-sync-serpdownloaders-circle-downloader",
                "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/serpdownloaders~circle-downloader/run-sync": {
            "post": {
                "operationId": "run-sync-serpdownloaders-circle-downloader",
                "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",
                "properties": {
                    "listingNotice": {
                        "title": "Listing notice",
                        "type": "string",
                        "description": "Optional informational field only. This actor currently serves as the public listing surface for the browser extension and does not yet expose a finalized runtime API contract.",
                        "default": "No runtime input is required yet. See the README and product page for the current extension workflow."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
