Welcome to the BusyBee social data platform. For partnerships or usage questions, click “Support” on the right.

YouTube Data API: video search, comment fetching and channel profiles

Search videos by keyword, fetch comments by video link, read channel profiles and upload lists. Use it for topic research, competitor channel analysis and comment sentiment counts, with no scraper to build.

What you get

CapabilitiesVideo search / Channel search / Channel details / Channel videos / Video details / Fetch comments
Response fieldsVideo url, title and description, channel (id/handle/name), duration, views, likes, comments, cover
IntegrationMCP (Streamable HTTP) or REST (GET or POST)
BillingPay per call, automatic refund on failure

Response schema

Whichever platform you call, post-type responses share the same structure: items[] holds platform / id / url / author{id,handle,name} / text / created_at / stats{...} / cover; creator responses are handle / name / bio / followers / following / posts / verified / avatar / url. Switching platforms needs no changes to your parsing code.

MCP or REST

For models, use MCP: add https://lucydomi.com/mcp to your client config and it selects the tools itself. For code, use REST: https://lucydomi.com/mcp/v1/search_posts, where GET with query parameters or POST with a JSON body both work and return an identical structure.

Copy and run

cURL
curl -s https://lucydomi.com/mcp/v1/search_posts \
  -H "Authorization: Bearer $BUSYBEE_API_KEY" \
  -H "Content-Type: application/json" \
  -X POST \
  -d '{"platform": "youtube", "keyword": "real estate", "limit": 3}'
Python (standard library, no dependencies)
import os, json, urllib.request

KEY = os.environ["BUSYBEE_API_KEY"]
req = urllib.request.Request(
    "https://lucydomi.com/mcp/v1/search_posts",
    data=json.dumps({"platform": "youtube", "keyword": "real estate", "limit": 3}).encode(),
    headers={"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"},
    method="POST",
)
data = json.load(urllib.request.urlopen(req, timeout=60))
for it in data["items"]:
    print(it.get("url"), it.get("text", "")[:60])

Sample response

This is a real production response, truncated to one item and with billing fields removed.

{
  "ok": true,
  "platform": "youtube",
  "tool": "search_posts",
  "count": 1,
  "items": [
    {
      "platform": "youtube",
      "id": "ECxXKKfW37w",
      "url": "https://www.youtube.com/watch?v=ECxXKKfW37w",
      "author": {
        "id": "UCR2_8uHyWcTSV6iIw6BN4rg",
        "handle": "Lance Hedrick",
        "name": "Lance Hedrick"
      },
      "text": "The Espresso Revolution is Already Happening",
      "created_at": "7 days ago",
      "stats": {
        "likes": 0,
        "comments": 0,
        "shares": 0,
        "views": 235291,
        "collects": 0
      },
      "cover": "https://i.ytimg.com/vi/ECxXKKfW37w/hq720.jpg?sqp=-oaymwEcCOgCEMoBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLBka77pr0vAUL5fYqy0J5pNRARgAA"
    }
  ]
}

FAQ

Do I need my own scraper or proxy?
No. Scraping and cleaning happen server-side, so you only receive structured JSON; failed calls are refunded automatically.
Can I use it commercially?
Everything returned is publicly visible content and can be used for analysis and product features; see the “Data policy” page for the exact limits.
Can I raise the number of results?
Yes, limit is adjustable, but each call returns synchronously. Fetch in batches to avoid a single call timing out.

Related

API docsPricingTikTok dataInstagram dataX / Twitter dataComment insights

One key, six platforms

Same fields, same MCP endpoint; switching platforms only changes one parameter. Sign up and get $0.2 in trial credit.

See pricing Try one call