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 title | Channel name | Video URL | View count | Published at | Display duration |
|---|---|---|---|---|---|
| Shokz OpenRun Air 2 vs OpenRun Air Headphones Review 2026: Comparison | Mariselle Hartwell | https://www.youtube.com/watch?v=EpGip-GW7g4 | 215 | 2026-09-04T18:42:58 | 4:23 |
| Opening my new OpenRun by Shokz Bone Conduction Sport Headphones | Type1Reframed | https://www.youtube.com/watch?v=Ccj5oDYwCEo | 2 | 2026-09-05T18:42:58 | 3: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.
- 1If no videos are returned, try a broader or more common keyword and confirm the query is searchable on public YouTube.
- 2Keep completed records after a partial success; resubmit the same input after a failed or expired task.
- 3Retry later after rate limiting, temporary unavailability, or a timeout.
- 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.
| Field | Business name | Type | Required | Default | Enum / Constraints | Example | Description |
|---|---|---|---|---|---|---|---|
| keyword | Search keyword | string | Yes | — | — | Shokz | Brand, product, topic, or phrase to search on YouTube. Each task accepts one keyword from 1 to 512 characters. |
| crawl_count | Expected result count | integer | Yes | — | 1–600 | 1 | Expected 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.
| Field | Business name | Type | Example | Description |
|---|---|---|---|---|
| account_badge_list | Account badges | string | — | Badge text shown on the channel, returned as JSON text when present. |
| account_display_id | Channel handle | string | @MariselleHartwell | Public YouTube handle for the channel, including the @ prefix when shown. |
| account_id | Channel ID | string | UCzIWiqlJ3CakJ7QpNaPHJNw | Stable YouTube channel identifier for the publisher of this listing. |
| account_name | Channel name | string | Mariselle Hartwell | Display name of the channel that published this listing. |
| article_type | Content type | string | video | Listing type returned by search, such as video or short. |
| biz_id | Business ID | string | Shokz | Business identifier attached to the search item that produced this listing. |
| channel_banner_url | Channel banner | string | — | Banner image URL for the channel when the search listing includes it. |
| channel_description | Channel description | string | — | Public channel description text when the search listing includes it. |
| channel_description_links | Channel links | string | — | Links from the channel description, returned as JSON text when present. |
| channel_thumbnail_list | Channel thumbnail | string | [{"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_videos | Channel video count | string | — | Public video count for the channel when the search listing includes it. |
| channel_url | Channel URL | string | — | Public channel page URL when the search listing includes it. |
| co_creator_info | Co-creator info | string | — | Co-creator details for this listing, returned as JSON text when present. |
| content_badge_list | Video badges | string | ["New"] | Badges shown on the listing card, returned as JSON text when present. |
| content_id | Video ID | string | EpGip-GW7g4 | Stable YouTube video identifier for this search listing. |
| content_rich_thumbnail_list | Rich thumbnail | string | [{"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_status | Content status | string | RUNNING | Source status text for the listing as returned at collection time. |
| content_text | Video description | string | Shokz #OpenRunAir2 #BoneConduction In this comprehensive comparison, we dive deep into the differences between the new ... | Short description or snippet shown for this listing. |
| content_title | Video title | string | Shokz OpenRun Air 2 vs OpenRun Air Headphones Review 2026: Comparison | Title shown on the public YouTube search card. |
| content_url | Video URL | string | https://www.youtube.com/watch?v=EpGip-GW7g4 | Public watch URL for this listing. |
| cover_image_list | Cover images | string | [{"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_time | Collected at | string | 2026-09-09T18:42:58 | Collection timestamp for this listing, without a timezone offset. |
| is_collaboration | Collaboration | boolean | false | Whether the listing is marked as a collaboration. Yes when true. |
| is_verified | Verified channel | boolean | false | Whether the channel is marked verified. Yes when true. |
| is_verified_artist | Verified artist | boolean | false | Whether the channel is marked as a verified artist. Yes when true. |
| keyword | Keyword | string | Shokz | Search keyword that produced this listing. |
| keyword_type | Keyword type | string | keyword | Search item type returned with this listing, such as keyword. |
| list_order | List order | integer | 0 | Position of this listing in the collected search list when returned. |
| number_of_subscribers | Subscriber count | string | — | Public subscriber count text when the search listing includes it. |
| publish_time | Published at | string | 2026-09-04T18:42:58 | Publish timestamp for this listing, without a timezone offset. |
| raw_duration | Display duration | string | 4:23 | Duration clock text shown on the search card, such as 4:23. |
| raw_publish_time | Display published | string | 5 days ago | Relative publish phrase shown on the card, such as 5 days ago. |
| video_duration | Duration ms | string | 263000 | Video length in milliseconds, returned as text. |
| video_summary | Video summary | string | — | Longer summary text for the listing when the search result includes it. |
| view_count | View count | string | 215 | View count shown on the search card, returned as text. |
| view_count_text | View count text | string | 215 views | View count phrase shown on the card, such as 215 views. |
| task_item | Source item | string | Shokz | Submitted search item that produced this row. |
| no_data | No-data marker | boolean | false | Whether this row marks a search item that produced no videos. Yes when true. |
Record schema
Output is returned record by record. detail.output.idFieldHint
{
"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": {
"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
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.
Charged once per submitted run, regardless of how many records are returned.
Multiple billing events accumulate independently. See each item for details. Failed runs are not charged.
View creditsTry it now
Fill in the parameters and run. Results come from a real call.