logo
languageENdown
menu

YouTube Keyword Search

Give one YouTube search keyword and an expected count to get matching public videos, channels, view counts, and publish times.

Overview

YouTube search is where viewers decide which video to open: the title, the channel, the view count, and how recently it was published. This app turns one public search keyword into a structured table of those listings so brand, competitor, and content work can start from the same results a viewer would see.

The dataset keeps the keyword beside each video, which makes later comparisons stay attached to the query that produced them. It is a search-result workbook, not a substitute for comments, transcripts, or a full channel page.

Data notes

Each row is one public YouTube keyword-search listing. Rows are ordered by publish time from newest to oldest, and the same Video ID is kept once in the returned set. View count and View count text are the figures shown on the search card; they are not normalized lifetime totals from a channel dashboard. Display duration is the player clock text, while Duration ms is the same length in milliseconds as text. Published at and Collected at are returned without a timezone. Display published is the relative phrase shown on the card, such as 5 days ago. Content status is the source status text as returned. Cover images, Channel thumbnail, Video badges, and similar list fields are JSON text, not unpacked image files. Keyword, Business ID, and Source item repeat the search context across rows from the same query.

The collection does not cover comments, transcripts, private or unlisted videos, or a full channel homepage. Channel banner, Channel description, Channel URL, Subscriber count, and Video summary are often empty on search listings. A No-data marker distinguishes a keyword that produced no videos from ordinary video rows.

What a result looks like

Each row is one public YouTube search listing.

Video titleChannel nameVideo URLView countPublished atDisplay duration
Shokz OpenRun Air 2 vs OpenRun Air Headphones Review 2026: ComparisonMariselle Hartwellhttps://www.youtube.com/watch?v=EpGip-GW7g42152026-09-04T18:42:584:23
Opening my new OpenRun by Shokz Bone Conduction Sport HeadphonesType1Reframedhttps://www.youtube.com/watch?v=Ccj5oDYwCEo22026-09-05T18:42:583:48

Video ID, Channel ID, Content type, and Video description are also available when the listing shows them.

Use cases

  • For share-of-search reviews, group rows by Keyword and scan Video title, Channel name, and View count to see which videos occupy the first results.
  • For competitor tracking, compare Channel name, Verified channel, and Published at to see who is publishing into the same query.
  • For content planning, read Video title with Display duration and View count to separate short explainers from longer reviews.
  • For landing-page work, keep Video URL and Cover images with Channel handle to rebuild the public cards that viewers actually see.

Scope and boundaries

One YouTube search keyword per task with an expected result count from 1 to 600; results are returned in complete batches of 20 and may be rounded up; coverage is limited to public YouTube keyword search listings, and the platform returns at most 600 videos.

  • Good for
  • When you need public YouTube search listings for one keyword, including video titles, channels, view counts, and publish times.
  • When you need to compare how competing videos appear for the same search keyword.
  • Do not use for
  • When you need comments, transcripts, or a full channel homepage — this App only returns keyword search listings.
  • When you need private, unlisted, or signed-in YouTube data — this App covers public search results only.

Failure handling

Failure and retry behavior declared by the author. We recommend including it in your system prompt when integrating.

  1. 1If no videos are returned, try a broader or more common keyword and confirm the query is searchable on public YouTube.
  2. 2Keep completed records after a partial success; resubmit the same input after a failed or expired task.
  3. 3Retry later after rate limiting, temporary unavailability, or a timeout.
  4. 4If authentication fails, verify the API Key configured for the execution environment.

Input

Parameters required to call this App, generated from the input.schema in manifest.json.

FieldBusiness nameTypeRequiredDefaultEnum / ConstraintsExampleDescription
keywordSearch keywordstringYes——ShokzBrand, product, topic, or phrase to search on YouTube. Each task accepts one keyword from 1 to 512 characters.
crawl_countExpected result countintegerYes—1–6001Expected number of videos, from 1 to 600. Results are returned in complete batches of 20, so the actual count may be rounded up. A partial batch is still billed as 20 videos.

Output

Field structure of a single record, generated from the output.schema in manifest.json.

FieldBusiness nameTypeExampleDescription
account_badge_listAccount badgesstring—Badge text shown on the channel, returned as JSON text when present.
account_display_idChannel handlestring@MariselleHartwellPublic YouTube handle for the channel, including the @ prefix when shown.
account_idChannel IDstringUCzIWiqlJ3CakJ7QpNaPHJNwStable YouTube channel identifier for the publisher of this listing.
account_nameChannel namestringMariselle HartwellDisplay name of the channel that published this listing.
article_typeContent typestringvideoListing type returned by search, such as video or short.
biz_idBusiness IDstringShokzBusiness identifier attached to the search item that produced this listing.
channel_banner_urlChannel bannerstring—Banner image URL for the channel when the search listing includes it.
channel_descriptionChannel descriptionstring—Public channel description text when the search listing includes it.
channel_description_linksChannel linksstring—Links from the channel description, returned as JSON text when present.
channel_thumbnail_listChannel thumbnailstring[{"height": 68, "url": "https://yt3.ggpht.com/NosIQPZfiNCw_pXuwLWpNbx0T9jyIDMVJePbO6LVZGjKXz9ppAO49vmpqNyMGBDj96AufI9PMg=s68-c-k-c0x00ffffff-no-rj", "width": 68}]Channel avatar image list, returned as JSON text when present.
channel_total_videosChannel video countstring—Public video count for the channel when the search listing includes it.
channel_urlChannel URLstring—Public channel page URL when the search listing includes it.
co_creator_infoCo-creator infostring—Co-creator details for this listing, returned as JSON text when present.
content_badge_listVideo badgesstring["New"]Badges shown on the listing card, returned as JSON text when present.
content_idVideo IDstringEpGip-GW7g4Stable YouTube video identifier for this search listing.
content_rich_thumbnail_listRich thumbnailstring[{"height": 180, "url": "https://i.ytimg.com/an_webp/EpGip-GW7g4/mqdefault_6s.webp?du=3000&sqp=CLDUhNUG&rs=AOn4CLA9KhjVt8CHIDcWbqhbSz4rCcFjXQ", "width": 320}]Animated or rich thumbnail list, returned as JSON text when present.
content_statusContent statusstringRUNNINGSource status text for the listing as returned at collection time.
content_textVideo descriptionstringShokz #OpenRunAir2 #BoneConduction In this comprehensive comparison, we dive deep into the differences between the new ...Short description or snippet shown for this listing.
content_titleVideo titlestringShokz OpenRun Air 2 vs OpenRun Air Headphones Review 2026: ComparisonTitle shown on the public YouTube search card.
content_urlVideo URLstringhttps://www.youtube.com/watch?v=EpGip-GW7g4Public watch URL for this listing.
cover_image_listCover imagesstring[{"height": 202, "url": "https://i.ytimg.com/vi/EpGip-GW7g4/hq720.jpg?sqp=-oaymwEnCOgCEMoBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLC3oubUMvaAVXixL45NhWFyGYHaWw", "width": 360}, {"height": 404, "url": "https://i.ytimg.com/vi/EpGip-GW7g4/hq720.jpg?sqp=-oaymwEnCNAFEJQDSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLBcz_YqYgJfo5VIlQ0RXqnFnu4c1Q", "width": 720}]Cover image list for the listing, returned as JSON text when present.
crawl_timeCollected atstring2026-09-09T18:42:58Collection timestamp for this listing, without a timezone offset.
is_collaborationCollaborationbooleanfalseWhether the listing is marked as a collaboration. Yes when true.
is_verifiedVerified channelbooleanfalseWhether the channel is marked verified. Yes when true.
is_verified_artistVerified artistbooleanfalseWhether the channel is marked as a verified artist. Yes when true.
keywordKeywordstringShokzSearch keyword that produced this listing.
keyword_typeKeyword typestringkeywordSearch item type returned with this listing, such as keyword.
list_orderList orderinteger0Position of this listing in the collected search list when returned.
number_of_subscribersSubscriber countstring—Public subscriber count text when the search listing includes it.
publish_timePublished atstring2026-09-04T18:42:58Publish timestamp for this listing, without a timezone offset.
raw_durationDisplay durationstring4:23Duration clock text shown on the search card, such as 4:23.
raw_publish_timeDisplay publishedstring5 days agoRelative publish phrase shown on the card, such as 5 days ago.
video_durationDuration msstring263000Video length in milliseconds, returned as text.
video_summaryVideo summarystring—Longer summary text for the listing when the search result includes it.
view_countView countstring215View count shown on the search card, returned as text.
view_count_textView count textstring215 viewsView count phrase shown on the card, such as 215 views.
task_itemSource itemstringShokzSubmitted search item that produced this row.
no_dataNo-data markerbooleanfalseWhether this row marks a search item that produced no videos. Yes when true.

Record schema

Output is returned record by record. detail.output.idFieldHint

output.schema
{
  "type": "object",
  "properties": {
    "account_badge_list": {
      "type": "string",
      "title": "Account badges",
      "description": "Badge text shown on the channel, returned as JSON text when present."
    },
    "account_display_id": {
      "type": "string",
      "title": "Channel handle",
      "description": "Public YouTube handle for the channel, including the @ prefix when shown.",
      "prefill": "@MariselleHartwell"
    },
    "account_id": {
      "type": "string",
      "title": "Channel ID",
      "description": "Stable YouTube channel identifier for the publisher of this listing.",
      "prefill": "UCzIWiqlJ3CakJ7QpNaPHJNw"
    },
    "account_name": {
      "type": "string",
      "title": "Channel name",
      "description": "Display name of the channel that published this listing.",
      "prefill": "Mariselle Hartwell"
    },
    "article_type": {
      "type": "string",
      "title": "Content type",
      "description": "Listing type returned by search, such as video or short.",
      "prefill": "video"
    },
    "biz_id": {
      "type": "string",
      "title": "Business ID",
      "description": "Business identifier attached to the search item that produced this listing.",
      "prefill": "Shokz"
    },
    "channel_banner_url": {
      "type": "string",
      "title": "Channel banner",
      "description": "Banner image URL for the channel when the search listing includes it."
    },
    "channel_description": {
      "type": "string",
      "title": "Channel description",
      "description": "Public channel description text when the search listing includes it."
    },
    "channel_description_links": {
      "type": "string",
      "title": "Channel links",
      "description": "Links from the channel description, returned as JSON text when present."
    },
    "channel_thumbnail_list": {
      "type": "string",
      "title": "Channel thumbnail",
      "description": "Channel avatar image list, returned as JSON text when present.",
      "prefill": "[{\"height\": 68, \"url\": \"https://yt3.ggpht.com/NosIQPZfiNCw_pXuwLWpNbx0T9jyIDMVJePbO6LVZGjKXz9ppAO49vmpqNyMGBDj96AufI9PMg=s68-c-k-c0x00ffffff-no-rj\", \"width\": 68}]"
    },
    "channel_total_videos": {
      "type": "string",
      "title": "Channel video count",
      "description": "Public video count for the channel when the search listing includes it."
    },
    "channel_url": {
      "type": "string",
      "title": "Channel URL",
      "description": "Public channel page URL when the search listing includes it."
    },
    "co_creator_info": {
      "type": "string",
      "title": "Co-creator info",
      "description": "Co-creator details for this listing, returned as JSON text when present."
    },
    "content_badge_list": {
      "type": "string",
      "title": "Video badges",
      "description": "Badges shown on the listing card, returned as JSON text when present.",
      "prefill": "[\"New\"]"
    },
    "content_id": {
      "type": "string",
      "title": "Video ID",
      "description": "Stable YouTube video identifier for this search listing.",
      "prefill": "EpGip-GW7g4"
    },
    "content_rich_thumbnail_list": {
      "type": "string",
      "title": "Rich thumbnail",
      "description": "Animated or rich thumbnail list, returned as JSON text when present.",
      "prefill": "[{\"height\": 180, \"url\": \"https://i.ytimg.com/an_webp/EpGip-GW7g4/mqdefault_6s.webp?du=3000&sqp=CLDUhNUG&rs=AOn4CLA9KhjVt8CHIDcWbqhbSz4rCcFjXQ\", \"width\": 320}]"
    },
    "content_status": {
      "type": "string",
      "title": "Content status",
      "description": "Source status text for the listing as returned at collection time.",
      "prefill": "RUNNING"
    },
    "content_text": {
      "type": "string",
      "title": "Video description",
      "description": "Short description or snippet shown for this listing.",
      "prefill": "Shokz #OpenRunAir2 #BoneConduction In this comprehensive comparison, we dive deep into the differences between the new ..."
    },
    "content_title": {
      "type": "string",
      "title": "Video title",
      "description": "Title shown on the public YouTube search card.",
      "prefill": "Shokz OpenRun Air 2 vs OpenRun Air Headphones Review 2026: Comparison"
    },
    "content_url": {
      "type": "string",
      "title": "Video URL",
      "description": "Public watch URL for this listing.",
      "prefill": "https://www.youtube.com/watch?v=EpGip-GW7g4"
    },
    "cover_image_list": {
      "type": "string",
      "title": "Cover images",
      "description": "Cover image list for the listing, returned as JSON text when present.",
      "prefill": "[{\"height\": 202, \"url\": \"https://i.ytimg.com/vi/EpGip-GW7g4/hq720.jpg?sqp=-oaymwEnCOgCEMoBSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLC3oubUMvaAVXixL45NhWFyGYHaWw\", \"width\": 360}, {\"height\": 404, \"url\": \"https://i.ytimg.com/vi/EpGip-GW7g4/hq720.jpg?sqp=-oaymwEnCNAFEJQDSFryq4qpAxkIARUAAIhCGAHYAQHiAQoIGBACGAY4AUAB&rs=AOn4CLBcz_YqYgJfo5VIlQ0RXqnFnu4c1Q\", \"width\": 720}]"
    },
    "crawl_time": {
      "type": "string",
      "title": "Collected at",
      "description": "Collection timestamp for this listing, without a timezone offset.",
      "prefill": "2026-09-09T18:42:58"
    },
    "is_collaboration": {
      "type": "boolean",
      "title": "Collaboration",
      "description": "Whether the listing is marked as a collaboration. Yes when true.",
      "prefill": false
    },
    "is_verified": {
      "type": "boolean",
      "title": "Verified channel",
      "description": "Whether the channel is marked verified. Yes when true.",
      "prefill": false
    },
    "is_verified_artist": {
      "type": "boolean",
      "title": "Verified artist",
      "description": "Whether the channel is marked as a verified artist. Yes when true.",
      "prefill": false
    },
    "keyword": {
      "type": "string",
      "title": "Keyword",
      "description": "Search keyword that produced this listing.",
      "prefill": "Shokz"
    },
    "keyword_type": {
      "type": "string",
      "title": "Keyword type",
      "description": "Search item type returned with this listing, such as keyword.",
      "prefill": "keyword"
    },
    "list_order": {
      "type": "integer",
      "title": "List order",
      "description": "Position of this listing in the collected search list when returned.",
      "prefill": 0
    },
    "number_of_subscribers": {
      "type": "string",
      "title": "Subscriber count",
      "description": "Public subscriber count text when the search listing includes it."
    },
    "publish_time": {
      "type": "string",
      "title": "Published at",
      "description": "Publish timestamp for this listing, without a timezone offset.",
      "prefill": "2026-09-04T18:42:58"
    },
    "raw_duration": {
      "type": "string",
      "title": "Display duration",
      "description": "Duration clock text shown on the search card, such as 4:23.",
      "prefill": "4:23"
    },
    "raw_publish_time": {
      "type": "string",
      "title": "Display published",
      "description": "Relative publish phrase shown on the card, such as 5 days ago.",
      "prefill": "5 days ago"
    },
    "video_duration": {
      "type": "string",
      "title": "Duration ms",
      "description": "Video length in milliseconds, returned as text.",
      "prefill": "263000"
    },
    "video_summary": {
      "type": "string",
      "title": "Video summary",
      "description": "Longer summary text for the listing when the search result includes it."
    },
    "view_count": {
      "type": "string",
      "title": "View count",
      "description": "View count shown on the search card, returned as text.",
      "prefill": "215"
    },
    "view_count_text": {
      "type": "string",
      "title": "View count text",
      "description": "View count phrase shown on the card, such as 215 views.",
      "prefill": "215 views"
    },
    "task_item": {
      "type": "string",
      "title": "Source item",
      "description": "Submitted search item that produced this row.",
      "prefill": "Shokz"
    },
    "no_data": {
      "type": "boolean",
      "title": "No-data marker",
      "description": "Whether this row marks a search item that produced no videos. Yes when true.",
      "prefill": false
    }
  },
  "required": [],
  "additionalProperties": false
}

Integration

This App can be integrated via MCP, API, SDK, or file export. All channels share the same capabilities and pricing. Every request authenticates with the Authorization: Bearer header using an API key (long-lived, created in the Data Hub Console); MCP clients can also sign in with OAuth, no key required. More options such as CLI and Skill are on the way.

With the MCP (Model Context Protocol), you can call this App directly from AI clients like Claude and Cursor. Pick your client and auth mode, then copy the config below.

Client config

Replace the value after Bearer with your long-lived API key. Works in any client, CI, or headless environment.

mcpServers config
{
  "mcpServers": {
    "hello_moto__youtube-keyword-list": {
      "type": "http",
      "url": "https://mcp-v2.octoparse.com?pin=hello_moto/youtube-keyword-list",
      "headers": { "Authorization": "Bearer <YOUR_API_KEY>" }
    }
  }
}

Let AI set it up for you

Don't want to edit configs by hand? Copy the install prompt and paste it into any AI client. It will complete the setup its own way. (The prompt asks the AI to request your API key from you, so credentials never end up in chat history or shared configs.)

detail.access.mcp.composeHint

Pricing

20 returned records

Charged by the number of records successfully returned. Failed runs are not charged. Billed in units of 20 record; any partial unit is rounded up to 20 record.

$0.003/ 20 record
Per task submitted

Charged once per submitted run, regardless of how many records are returned.

$0.0001/ run

Multiple billing events accumulate independently. See each item for details. Failed runs are not charged.

View credits

Try it now

Fill in the parameters and run. Results come from a real call.

Example
Parameters are validated against input.schema before submission
Please fill in the required parameters first
From $0.003 / 20 record