# Odysee Video Search by Keyword, Channel & Tag (`vexaloom-labs/odysee-video-search-by-keyword-channel-and-tag`) Actor

Search Odysee by keyword, browse a creator's channel, or filter by content tag, and get each video's title, description, duration, tags, view count, and publish date.

- **URL**: https://apify.com/vexaloom-labs/odysee-video-search-by-keyword-channel-and-tag.md
- **Developed by:** [vexaloom-labs](https://apify.com/vexaloom-labs) (community)
- **Categories:** Videos, Social media, Automation
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.49 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

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

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

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

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

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

# README

## Odysee Video Search by Keyword, Channel, Tag & Details

Odysee hosts independent video, audio, document and image creators on the LBRY network. This actor collects the catalog records behind Odysee's own pages: keyword search results, a creator's upload history, a tag feed, or a handful of specific videos you name yourself.

No account, cookie, wallet or API key is needed. Every request goes to Odysee's public web gateways.

### Four ways to collect

| Mode | What it returns | Best for |
|---|---|---|
| `search` | Odysee's ranked keyword matches | Topic discovery and monitoring a phrase |
| `byChannel` | One channel's uploads, newest first by default | Archiving or auditing a creator |
| `byTag` | The public feed for a content tag | Category and trend research |
| `details` | Exact records for video URLs, `lbry://` URLs or claim IDs | Enriching a known list |

`orderBy` controls channel and tag feeds (`release_time`, `effective_amount`, `support_amount`, `trending_group`, `trending_mixed`). Keyword search keeps Odysee's relevance order.

`mediaType` narrows results to video, audio, documents or images, or leaves it on `all`.

### Input

| Field | Type | Default | Notes |
|---|---|---|---|
| `mode` | string (select) | `search` | `search`, `byChannel`, `byTag` or `details` |
| `keyword` | string | `open source` | Used by `search` |
| `channel` | string | `@veritasium` | Used by `byChannel`; accepts `@handle`, channel URL, `lbry://` URL or claim ID |
| `tag` | string | `science` | Used by `byTag`; omit the leading `#` |
| `videoUrls` | string array | – | Used by `details`; one URL or claim ID per line |
| `orderBy` | string (select) | `release_time` | Sort for channel and tag feeds |
| `mediaType` | string (select) | `video` | `video`, `audio`, `document`, `image` or `all` |
| `maxItems` | integer | `20` | 1–10,000 records across the run |
| `includeStats` | boolean | `true` | Adds views, likes, dislikes and channel follower count |

#### Tasks built on the original input

Saved tasks from the earlier three-mode release keep working unchanged: `mode`, `keyword`, `channel`, `tag`, `orderBy` and `maxItems` mean the same things they did before, and the old default sort still produces the same channel and tag feeds. Calls that pass an older alias instead of the current field are also mapped: `searchQuery`/`query`/`searchTerm`/`q`, `channelUrl`/`channelName`/`channelHandle`, `tagName`/`tags`, `videoUrl`/`urls`/`url`/`claimIds`/`claimId`, `maxResults`, `sort`/`sortBy`, `streamType`/`contentType`, and `includeEngagement`. A real value in the current field always wins over an alias, except when the current field still holds its untouched schema default.

#### Keyword search

```json
{
  "mode": "search",
  "keyword": "open source",
  "maxItems": 20
}
```

#### A creator's uploads

```json
{
  "mode": "byChannel",
  "channel": "https://odysee.com/@veritasium:f",
  "orderBy": "release_time",
  "maxItems": 50
}
```

#### Trending science feed

```json
{
  "mode": "byTag",
  "tag": "science",
  "orderBy": "trending_group",
  "maxItems": 30
}
```

#### Exact videos

```json
{
  "mode": "details",
  "videoUrls": [
    "https://odysee.com/@veritasium:f/why-do-deserts-get-cold-at-night:6",
    "lbry://@KRR1751#8/more-open-source-windows#a",
    "4bfb6602f540a7cc03997142a383dca6f4347991"
  ]
}
```

### Output per record

| Field | Meaning |
|---|---|
| `claimId` | Stable LBRY claim identifier |
| `title`, `description` | Video title and description (description capped at 10,000 characters) |
| `channelName`, `channelId`, `channelUrl` | Publishing channel identity and link |
| `channelTitle`, `channelThumbnailUrl` | Channel display name and avatar |
| `channelVideoCount`, `channelFollowerCount` | Channel upload count and follower count |
| `thumbnailUrl` | Video thumbnail |
| `durationSeconds` | Length in seconds |
| `width`, `height` | Video resolution |
| `mediaType`, `streamType` | MIME type and Odysee stream class |
| `tags`, `languages` | Content tags and language codes |
| `publishedAt`, `createdAt` | Release time and blockchain claim time, ISO 8601 |
| `license` | Publisher-declared license |
| `fileSizeBytes` | Source file size |
| `effectiveAmount`, `supportAmount`, `repostCount` | LBC support and repost signals |
| `feeAmount`, `feeCurrency` | Paid-content price when the publisher set one |
| `views`, `likes`, `dislikes` | Odysee counters (present when `includeStats` is on) |
| `canonicalUrl`, `permanentUrl` | `lbry://` canonical and permanent URLs |
| `viewUrl` | Ready-to-open Odysee page |
| `scrapedAt` | Collection timestamp |

Records are omit-empty: a field Odysee genuinely lacks for an item (for example a duration on a text post, or tags on a bare upload) is left out rather than filled with a placeholder.

### Practical notes

- **Keyword ceiling.** Odysee's search ranking exposes roughly 550 items per keyword. When a run reaches that ceiling it says so in the run status message; use a narrower keyword to go deeper.
- **Channel and tag depth.** These feeds continue page by page until `maxItems` is reached or Odysee runs out of matching items.
- **Counting views.** Odysee's public counters require a short-lived anonymous session that the actor creates automatically. No user credentials are involved, and no cookie is stored.
- **Media types.** `mediaType` applies to search, channel and tag modes. `details` returns the referenced item as it exists.
- **Duplicate removal.** Results are de-duplicated by claim ID, including overlapping URLs in `details`.
- **Images and links.** Video pages, channel pages and thumbnails are public; the actor stores the original Odysee CDN URLs.

### FAQ

**Do I need an Odysee login?**
No. The actor never asks for an account, cookie, wallet or API key.

**Can I export a whole channel?**
Yes. Point `mode: "byChannel"` at the channel and raise `maxItems`. The actor pages through the upload list until it reaches your limit or the channel's end.

**Why is `views` missing on some records?**
It is only missing if Odysee's counter endpoint fails for that item or you turned `includeStats` off. A value of `0` means Odysee reported zero tracked views.

**Does search support non-English keywords?**
Yes. Unicode and non-Latin keywords work, as do tags in their original language.

**Are comments, live status or subscriber-only content included?**
No. This actor focuses on public catalog metadata and engagement counters that Odysee exposes without a login.

**Is this affiliated with Odysee or LBRY?**
No. It is an independent tool that reads publicly reachable Odysee data.

# Actor input Schema

## `mode` (type: `string`):

Choose what to collect: a keyword search, a channel's uploads, a tag feed, or details for specific videos.

## `keyword` (type: `string`):

Keyword used by mode=search. Supports ordinary words and non-English text. Odysee returns at most about 550 results per keyword.

## `channel` (type: `string`):

Used by mode=byChannel. Accepts an @handle (@veritasium), an Odysee channel URL, an lbry:// channel URL, or a channel claim ID.

## `tag` (type: `string`):

Used by mode=byTag. Tag text without the leading #, for example science, technology or gaming.

## `videoUrls` (type: `array`):

Used by mode=details. One item per line: a full Odysee video URL, an lbry:// URL, or a 40-character claim ID.

## `orderBy` (type: `string`):

Sort order for channel and tag modes. Keyword search always uses Odysee's relevance ranking.

## `mediaType` (type: `string`):

Filter channel, tag and keyword results by Odysee stream type. Details mode returns the referenced item as-is.

## `maxItems` (type: `integer`):

Maximum number of records to collect across the whole run.

## `includeStats` (type: `boolean`):

Add view count, likes, dislikes and channel follower count. These numbers come from Odysee's public counters and add a few small requests per record.

## Actor input object example

```json
{
  "mode": "search",
  "keyword": "open source",
  "channel": "@veritasium",
  "tag": "science",
  "orderBy": "release_time",
  "mediaType": "video",
  "maxItems": 3,
  "includeStats": true
}
```

# Actor output Schema

## `videos` (type: `string`):

Dataset containing every Odysee video record collected by this run.

# 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 = {
    "mode": "search",
    "keyword": "open source",
    "channel": "@veritasium",
    "tag": "science",
    "orderBy": "release_time",
    "mediaType": "video",
    "maxItems": 3,
    "includeStats": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("vexaloom-labs/odysee-video-search-by-keyword-channel-and-tag").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 = {
    "mode": "search",
    "keyword": "open source",
    "channel": "@veritasium",
    "tag": "science",
    "orderBy": "release_time",
    "mediaType": "video",
    "maxItems": 3,
    "includeStats": True,
}

# Run the Actor and wait for it to finish
run = client.actor("vexaloom-labs/odysee-video-search-by-keyword-channel-and-tag").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 '{
  "mode": "search",
  "keyword": "open source",
  "channel": "@veritasium",
  "tag": "science",
  "orderBy": "release_time",
  "mediaType": "video",
  "maxItems": 3,
  "includeStats": true
}' |
apify call vexaloom-labs/odysee-video-search-by-keyword-channel-and-tag --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,vexaloom-labs/odysee-video-search-by-keyword-channel-and-tag"
        }
    }
}
```

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/eBzYsmc2Luw6leV5E/builds/Ud4Fy1bekuk2aFtqT/openapi.json
