SFOLN

Catalogue / Documents & media

YouTube Video Details Scraper

sfoln/youtube-video-lookup · AI, Videos, Automation On request

Scrape YouTube video and Shorts details in bulk: title, channel, publish date, duration, views, likes, comments, keywords, category and caption languages, plus an optional full transcript. $4 per 1,000 videos; transcripts $4 per 1,000. Paste URLs or video IDs.

About

What it does

YouTube Video Details Scraper looks up YouTube videos and Shorts in bulk and returns one normalized record per video: title, description, channel (ID, name, handle), publish date, duration, view / like / comment counts, thumbnail, keywords, category, live and paid-promotion flags, available caption languages, and optionally the full transcript in the same record. Built for content analytics, influencer vetting, dataset building and AI agents.

Price

Price per delivered record

EventPricePer 1,000Charged for
YouTube video
youtube-video-looked-up
$0.004$4 / 1,000Charged once per video whose details (title, channel, counts, duration, keywords…) were returned. Missing, private or age-restricted videos and failed requests are not charged, unless the provider billed the lookup.
YouTube transcript
youtube-transcript-retrieved
$0.004$4 / 1,000Charged additionally, once per video, only when Include transcript is on and a caption transcript was returned. Paid plans only.

Apify free plan: up to 10 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.

Run

Call it from code, an agent or the Console

This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~youtube-video-lookup/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"videos":["https://www.youtube.com/watch?v=dQw4w9WgXcQ"]}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/youtube-video-lookup"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~youtube-video-lookup/runs?maxTotalChargeUsd=1
GET  https://api.apify.com/v2/actor-runs/{runId}            # until status is SUCCEEDED
GET  https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json

Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Get the views, likes, comment count, duration and publish date of https://www.youtube.com/watch?v=dQw4w9WgXcQ.

Input

Input fields

Paste YouTube video or Shorts URLs (or 11-character video IDs), one per line. Each video produces one dataset record with normalized metadata and, optionally, the transcript.

FieldTypeDefaultMeaning
videos *arrayrequiredYouTube videos
Video URLs (youtube.com/watch?v=…, youtu.be/…, /shorts/…, /live/…) or bare 11-character video IDs. Duplicates are removed. Accounts on the Apify free plan can process up to 10 videos per run.
includeTranscriptbooleanfalseInclude transcript
Also fetch the caption transcript as plain text (`transcriptText`). Charged as a separate event only when a transcript is returned. Paid plans only (turned off on the Apify free plan).
transcriptLanguagestring—Transcript language (optional)
Language code of the caption track, e.g. "en", "es" or "en-US". Leave empty for the original-language track. Only used when Include transcript is on.
cacheMaxAgestring"off"Accept cached results
Allow results the upstream fetched within this window instead of a live fetch. Faster; results (view/like counts) may be up to N days old when enabled. Price is the same. Default: off (always live). One of "off", "1d", "7d", "30d".
maxVideosinteger1000Max videos
Safety cap on the number of videos processed in this run. Range 1–10000.
concurrencyinteger5Concurrency
How many videos are fetched in parallel (1–8). Range 1–8.
includeRawbooleanfalseInclude raw upstream response
Attach the unmodified provider payloads (`raw.video`, `raw.transcript`) to each record (much larger output).
Example input
{
  "videos": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ]
}

Output

One record per input item

Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.

FieldTypeMeaning
inputstring | objectInput
The video URL or ID as provided.
videoIdstring | nullVideo ID
11-character YouTube video ID. e.g. "dQw4w9WgXcQ"
urlstring | nullURL
Watch URL.
typestring | nullType
video / short / live as reported upstream.
titlestring | nullTitle
descriptionstring | nullDescription
channelIdstring | nullChannel ID
channelNamestring | nullChannel name
channelHandlestring | nullChannel handle
Without the leading @.
channelUrlstring | nullChannel URL
publishedAtstring | nullPublished at
ISO 8601 (UTC).
durationSecsnumber | nullDuration (s)
viewCountnumber | nullViews
likeCountnumber | nullLikes
commentCountnumber | nullComments
thumbnailUrlstring | nullThumbnail URL
keywordsarrayKeywords / tags
categorystring | nullCategory
YouTube genre/category, e.g. "Music".
isLiveboolean | nullLive
true for live streams; null when not determinable.
isPaidPromotionboolean | nullPaid promotion
chapterCountintegerChapters
captionLanguagesarrayCaption languages
Language codes of available caption tracks.
hasCaptionsboolean | nullHas captions
cachedbooleanCached
Served from the upstream cache (cacheMaxAge).
transcriptTextstring | nullTranscript
Only when includeTranscript is on.
transcriptLanguagestring | nullTranscript language
transcriptStatusstringTranscript status
not_requested | ok | no_captions | skipped_budget (budget could not pay for the transcript; never delivered uncharged) | skipped_free_plan (paid add-on, off on the Apify free plan) | error
transcriptChargedbooleanTranscript charged
Whether youtube-transcript-retrieved was charged for this video.
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan e.g. "ok"
chargedbooleanCharged
Whether youtube-video-looked-up was charged for this record.
chargedEventstringCharged event
errorobjectError
sourcestringSource
fetchedAtstringFetched at
Example record
{
  "input": "https://www.youtube.com/watch?v=Y2Ah_DFr8cw",
  "videoId": "Y2Ah_DFr8cw",
  "url": "https://www.youtube.com/watch?v=Y2Ah_DFr8cw",
  "type": "video",
  "title": "Inside the NBA: Chuck Trolls Jussie Smollett",
  "description": null,
  "channelId": "UCWH3hing1Qb4LnkRfQdxsxQ",
  "channelName": "Afroballer",
  "channelHandle": "afroballer8906",
  "channelUrl": "https://www.youtube.com/@afroballer8906",
  "publishedAt": "2019-02-22T11:19:54.000Z",
  "durationSecs": 348,
  "viewCount": 372864,
  "likeCount": 4043,
  "commentCount": 358,
  "thumbnailUrl": "https://img.youtube.com/vi/Y2Ah_DFr8cw/maxresdefault.jpg",
  "keywords": [],
  "category": "People & Blogs",
  "isLive": false,
  "isPaidPromotion": false,
  "chapterCount": 0,
  "captionLanguages": [
    "en"
  ],
  "hasCaptions": true,
  "cached": false,
  "transcriptText": "what's going on everybody ...",
  "transcriptLanguage": "English",
  "transcriptStatus": "ok",
  "transcriptCharged": true,
  "status": "ok",
  "charged": true,
  "chargedEvent": "youtube-video-looked-up",
  "source": "scrapecreators",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

Machine-readable

This page for agents