Facebook Video Search Scraper With Views & Engagement
Pricing
Pay per usage
Facebook Video Search Scraper With Views & Engagement
Search and scrape Facebook videos with the Facebook Video Search Scraper. Extract video URLs, titles, descriptions, upload dates, views, reactions, and comments by keyword or page. Ideal for trend tracking, content research, and social media analysis. Fast, reliable, and scalable.
Pricing
Pay per usage
Rating
1.0
(1)
Developer
Scrapier
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Facebook Video Search Scraper With Views & Engagement
Search Facebook by keyword and get back every matching public video with its measured performance attached: exact view count, exact play count, reactions broken down by type, comment and share totals, exact publish time, exact duration, and a computed engagement rate. Every response is structured JSON — ready to pass directly to an LLM, index into a vector store, or feed a monitoring pipeline. Unlike a plain search-results list, each row is ranked by numbers you can actually sort and diff, not by Facebook's own relevance ordering. Point it at a keyword list once, or schedule it, and the same shortlist keeps updating itself.
What is Facebook Video Search Scraper With Views & Engagement?
It is a keyword-driven Facebook video finder: you submit one or more search phrases, and it queries Facebook's watch/search results the same way a logged-out visitor's browser does, then reads two response shapes Facebook serves under the same result type and merges them into one row per video. Where most Facebook video scrapers stop at whatever the search tile shows — a title, a thumbnail, and a rounded view-count string — this Actor also opens each video's own page under a search-engine-crawler identity to read Facebook's exact video_view_count and play_count integers, the two numbers the search grid itself never exposes. No Facebook account, login, or session cookie is required anywhere in the input schema; the entire run works off publicly served search HTML and GraphQL responses.
Key capabilities:
- 🔑 Search any number of keywords in one run — one line per phrase, each result row tagged with the keyword that found it
- 👁️ Exact view and play counts pulled from each video's own page, not the rounded tile estimate
- ❤️ Reactions broken down by type (Like, Love, Care, Haha, Wow, Sad, Angry) plus the top reaction
- 📊 A computed engagement rate per view, so results can be ranked on performance instead of recency
- 🎞️ Optional SD/HD/DASH stream links, subtitle track URL, and live-stream flag on videos that carry them
- 📈 Client-side view and reaction thresholds to drop low-performing results before they reach your dataset
What data can you get with Facebook Video Search Scraper With Views & Engagement?
Every result row is one Facebook video, but the Actor draws on three layers of Facebook data to build it: the search tile, the underlying post's engagement payload (when Facebook renders one), and — optionally — a second page fetch for the exact counters.
| Result type | Extracted fields | Primary use case |
|---|---|---|
| Search tile data (present on every row) | title, videoUrl, video_duration_text, thumbnail_image, video_owner_profile, relative_time_string, approxViewCount, approxViewCountText | Fast topical discovery, building an initial shortlist |
| In-payload engagement (Facebook's "STORY" render shape) | reactionCount, commentCount, shareCount, reactions, topReactionType, publishedAtTimestamp, mediaUrls, postId, storyId, feedbackId | Ranking without any extra page fetch |
| Exact-count enrichment (permalink hop) | viewCount, playCount, engagementRatePerView, engagementSource, fetchStatus | Precise performance ranking and engagement-rate math |
| Run notices (uncharged) | rowType: "run_notice", fetchStatus, errorReason | Run diagnostics — never billed |
Exact views, plays, and reactions by type
This is the capability none of the top-ranked Facebook video search scrapers on the Apify Store expose as a structured field: an exact, integer view count and play count per video, plus a full reaction breakdown. Facebook's search grid only ever shows a rounded string like "410K views" baked into a caption; this Actor opens the video's own permalink under a crawler-class user agent (the identity Facebook actually serves the counters to) and reads the exact video_view_count and play_count integers off that page, ID-scoped to the correct video's feedback node so a busy permalink page's related-video tray can't get matched by mistake. A JSON row with everything on:
{"title": "Monsoon street food tour — 40 stalls in one night","viewCount": 184230,"playCount": 179850,"approxViewCount": 180000,"reactionCount": 6142,"topReactionType": "LOVE","reactions": [{ "type": "LIKE", "count": 4310 },{ "type": "LOVE", "count": 1502 },{ "type": "HAHA", "count": 210 },{ "type": "WOW", "count": 120 }],"commentCount": 388,"shareCount": 941,"engagementRatePerView": 0.040231,"engagementSource": "mixed","fetchStatus": "ok"}
Two Facebook render shapes, merged into one schema
Facebook's watch-search results come back as one of two internal view-models under the same result typename: a lightweight "META" shape that carries only the tile text and a rounded view count, and a "STORY" shape that carries the post's full UFI feedback block — reaction, comment and share counts, top reactions, exact creation time, and playable media URLs. Both are parsed into the same output row shape, so a result set from one keyword can mix rows with different levels of built-in engagement data, and renderShape ("meta" or "story") tells you which one produced any given row.
Why not build this yourself?
Facebook does not publish a keyword video-search endpoint in its Graph API — the Graph API is built around known object IDs (a specific video, page, or ad) reachable with app review and page access tokens, not an open "search all public videos for this phrase" call. The only surface that supports keyword video search is the watch/search web page itself, which runs on a persisted GraphQL query identified by a doc_id that Facebook rotates inside its JS bundles, answers a normal browser user agent with a wall on the search page's exact-counter surfaces, and rate-limits the paginated results endpoint from datacenter IP ranges with a zero-result response rather than an HTTP error. Building and maintaining that pipeline yourself means re-deriving the doc_id on every bundle reshuffle, running a residential-proxy fleet, and writing crawler-UA fallback logic for the permalink hop that carries the exact counters — all of which this Actor already does and keeps current.
What is the difference between a video search scraper and a video engagement scraper?
A video search scraper answers "which videos match this keyword" — a list of titles, links, and thumbnails. A video engagement scraper answers "how is each video performing" — view counts, reactions, comments, and shares. The distinction matters because Facebook's own search results only ever give you the first: the tile shows a title and a rounded view estimate, nothing more. Ranking or filtering a content shortlist by actual performance needs the second, and until a video's own page is fetched under the right conditions, that data simply isn't in the search response at all. Facebook Video Search Scraper With Views & Engagement returns both in the same JSON object — the search-result identity fields (title, videoUrl, video_owner_profile) and the measured-performance fields (viewCount, reactionCount, engagementRatePerView) arrive on one row, so there's no need to run a search scraper and a separate analytics tool and join the results yourself.
How to scrape Facebook videos by keyword with Facebook Video Search Scraper With Views & Engagement?
- Open Facebook Video Search Scraper With Views & Engagement on the Apify Store and click Try for free (or Run if you already have it saved to your account).
- Enter your search phrases in
startUrls— one keyword or phrase per line, for examplecricket highlights,street food,tesla. - Set the query controls that matter for your run:
maxVideosfor how many results to keep per keyword,fetchExactViewCountsto turn the exact-counter lookup on or off, andminViews/minReactionsif you only want results above a performance floor. - Click Start and let the run finish — progress and per-keyword counts stream to the log in real time.
- Open the Dataset tab and export the results as JSON, CSV, Excel, HTML, XML, or RSS, or pull them programmatically through the Apify API.
Example request body sent through the Apify API:
{"startUrls": ["cricket highlights", "street food"],"maxVideos": 25,"fetchExactViewCounts": true,"minViews": 5000}
How to run multiple keywords in one job
startUrls is a plain list — add as many keywords as you want, one per line, and the Actor searches each one separately in the same run, in the order supplied. Every result row carries the query field naming the exact keyword that produced it, so a single dataset from a ten-keyword run can be filtered or grouped by query without re-running anything. There is no documented per-run concurrency setting across keywords in the input schema; keywords are processed one after another within a run.
⬇️ Input
The Actor takes one required field — your keyword list — plus optional fields that control how much enrichment happens per video and which results get through.
| Parameter | Required | Type | Default | Constraints | Description |
|---|---|---|---|---|---|
startUrls | Yes | array of strings | — | editor: stringList | One search phrase per line — for example cricket highlights, street food, tesla. Each line is searched separately and every result row carries the keyword it came from. Plain keywords work best; a long sentence is searched literally. |
maxVideos | No | integer | 10 | min 1, max 1000 | How many videos to keep for each keyword. Rows removed by the minimum-views / minimum-reactions filters do not count towards this number, so a filtered run keeps paging until it has enough matches or Facebook runs out of results. |
fetchExactViewCounts | No | boolean | true | — | Opens each video's own page to read Facebook's exact view count and play count integers — the two numbers the search grid never shows. Costs one extra request per video. Turn it off for the fastest possible run: reactions, shares, comments, and the approximate view count parsed from the tile are still returned. |
maxExactViewFetches | No | integer | 60 | min 0, max 5000 | Upper bound on how many videos get the extra exact view/play lookup in one run. Videos beyond this number are still returned in full — they carry fetchStatus: "skipped_limit" and no exact view count. Set it to match your budget. |
includeReactionBreakdown | No | boolean | true | — | Adds the reactions list — Like / Love / Care / Haha / Wow / Sad / Angry with a count each — plus the top reaction type. Turn it off if you only want the reaction total. |
includeMediaUrls | No | boolean | false | — | Adds SD / HD / DASH stream links, pixel width and height, the subtitle-track URL, and the live-stream flag. Available on videos Facebook returns in "story" render form; the links are time-limited and signed by Facebook. |
minViews | No | integer | 0 | min 0, max 1000000000 | Drop any video below this view count. Compared against the exact view count when it was fetched, otherwise against the approximate count parsed from the tile. Videos with no view number at all are dropped when this is above 0. Leave at 0 for no filter. |
minReactions | No | integer | 0 | min 0, max 1000000000 | Drop any video with fewer total reactions than this. Videos with no reaction number available are dropped when this is above 0. Leave at 0 for no filter. |
proxyConfiguration | No | object | {"useApifyProxy": false} (prefill) | editor: proxy | Your proxy selection is used as-is. Facebook rate-limits the paginated search API from datacenter addresses, so Residential is the default and the fallback whenever another tier stops returning results. |
Example input:
{"startUrls": ["cricket highlights", "street food", "tesla"],"maxVideos": 20,"fetchExactViewCounts": true,"maxExactViewFetches": 60,"includeReactionBreakdown": true,"includeMediaUrls": false,"minViews": 1000,"minReactions": 0,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Common pitfall: if the same video surfaces under two of your keywords in the same run (a real possibility with overlapping phrases like cricket and cricket highlights), it is only kept once, attributed to whichever keyword's page reached it first — the second keyword's result set will simply be smaller, with no error or flag marking the skip. If you need every keyword's full result count independently, run overlapping keywords as separate runs rather than in the same startUrls list. Also budget maxExactViewFetches deliberately: rows beyond that count are still returned and still billed as normal results, they just arrive with viewCount: null and fetchStatus: "skipped_limit".
⬆️ Output
Results are pushed to the Actor's dataset as typed, normalized JSON with the same schema on every row, exportable as JSON, CSV, Excel, XML, HTML, or RSS from the Storage tab or the Apify API. The default dataset view already surfaces every key the Actor writes — nothing is held back in a hidden sub-object.
Scraped results
[{"title": "Cricket highlights: last-over finish stuns the crowd","videoUrl": "https://www.facebook.com/globalsportsnetwork/videos/1122334455667788/","viewCount": 512430,"playCount": 498210,"approxViewCount": 510000,"approxViewCountText": "510K views","reactionCount": 18420,"topReactionType": "LIKE","reactions": [{ "type": "LIKE", "count": 14210 },{ "type": "LOVE", "count": 3100 },{ "type": "WOW", "count": 900 },{ "type": "HAHA", "count": 210 }],"commentCount": 1204,"shareCount": 3310,"engagementRatePerView": 0.045432,"durationSeconds": 92.0,"publishedAt": "2026-06-11T08:24:03Z","publishedAtTimestamp": 1749630243,"video_owner_profile": {"__typename": "Page","id": "100064812233445","__isNode": "Page","__isActor": "Page","name": "Global Sports Network","url": "https://www.facebook.com/globalsportsnetwork","is_verified": true},"query": "cricket highlights","engagementSource": "mixed","fetchStatus": "ok","renderShape": "story","rowType": "video","thumbnail_image": { "uri": "https://scontent.xx.fbcdn.net/v/t15.5256-10/example_1.jpg" },"video_duration_text": "1:32","relative_time_string": null,"video": { "id": "1122334455667788" },"video_broadcast_status": null,"facebookId": "1122334455667788","postId": "1122334455667788","storyId": "S:_I1122334455667788","feedbackId": "ZmVlZGJhY2s6MTEyMjMzNDQ1NTY2Nzc4OA==","permalinkUrl": "https://www.facebook.com/globalsportsnetwork/videos/1122334455667788/","mediaUrls": null,"save_description": "That last-over run chase nobody saw coming. Full highlights inside.","label": null,"facebookUrl": "https://www.facebook.com/watch/search?q=cricket+highlights","inputUrl": "https://www.facebook.com/watch/search?q=cricket+highlights","errorReason": null},{"title": "Street food night market — 40 stalls in one video","videoUrl": "https://www.facebook.com/reel/998877665544332/","viewCount": null,"playCount": null,"approxViewCount": 82000,"approxViewCountText": "82K views","reactionCount": null,"topReactionType": null,"reactions": null,"commentCount": null,"shareCount": null,"engagementRatePerView": null,"durationSeconds": 261.0,"publishedAt": null,"publishedAtTimestamp": null,"video_owner_profile": {"__typename": "User","id": "100089123456789","__isNode": "User","__isActor": "User","name": "Night Market Eats","url": "https://www.facebook.com/nightmarketeats","is_verified": false},"query": "street food","engagementSource": "approx_only","fetchStatus": "skipped_limit","renderShape": "meta","rowType": "video","thumbnail_image": { "uri": "https://scontent.xx.fbcdn.net/v/t15.5256-10/example_2.jpg" },"video_duration_text": "4:21","relative_time_string": "Jul 3 · 82K views","video": { "id": "998877665544332" },"video_broadcast_status": null,"facebookId": "998877665544332","postId": null,"storyId": null,"feedbackId": null,"permalinkUrl": "https://www.facebook.com/reel/998877665544332/","mediaUrls": null,"save_description": "40 stalls, one night, one very hungry cameraman.","label": "Street food night market — 40 stalls in one video\nJul 3 · 82K views","facebookUrl": "https://www.facebook.com/watch/search?q=street+food","inputUrl": "https://www.facebook.com/watch/search?q=street+food","errorReason": null},{"title": null,"videoUrl": null,"viewCount": null,"playCount": null,"approxViewCount": null,"approxViewCountText": null,"reactionCount": null,"topReactionType": null,"reactions": null,"commentCount": null,"shareCount": null,"engagementRatePerView": null,"durationSeconds": null,"publishedAt": null,"publishedAtTimestamp": null,"video_owner_profile": null,"query": "left-handed guitars","engagementSource": "none","fetchStatus": "empty","renderShape": null,"rowType": "run_notice","thumbnail_image": null,"video_duration_text": null,"relative_time_string": null,"video": null,"video_broadcast_status": null,"facebookId": null,"postId": null,"storyId": null,"feedbackId": null,"permalinkUrl": null,"mediaUrls": null,"save_description": null,"label": null,"facebookUrl": null,"inputUrl": null,"errorReason": "Facebook returned no video results for this keyword."}]
Every field the Actor writes on a normal video row: facebookUrl, videoUrl, label, thumbnail_image, video_duration_text, video, video_owner_profile, video_broadcast_status, save_description, title, relative_time_string, facebookId, inputUrl, query, rowType, renderShape, viewCount, playCount, approxViewCount, approxViewCountText, reactionCount, commentCount, shareCount, reactions, topReactionType, durationSeconds, publishedAt, publishedAtTimestamp, engagementRatePerView, engagementSource, fetchStatus, permalinkUrl, postId, storyId, feedbackId, mediaUrls, errorReason — 37 keys in total, all present on the default dataset view.
engagementRatePerView formula: round((reactionCount + commentCount + shareCount) / viewCount, 6), computed only when viewCount is a positive integer — that is, only after the exact-count permalink lookup has succeeded for that row. If fetchExactViewCounts is off, the lookup was skipped by maxExactViewFetches, or the permalink page was walled, engagementRatePerView stays null even when reaction, comment, and share counts are all populated, because the denominator (the exact view count) isn't available.
fetchStatus values you'll see: "ok" (exact counters retrieved), "not_requested" (fetchExactViewCounts was off), "skipped_limit" (over the maxExactViewFetches budget), "no_url" (no permalink to fetch), "id_mismatch" (the permalink resolved to a different feedback node than the search result, so nothing was merged), "blocked" / "no_counters" (the permalink page loaded but carried no counters), or a "network:<ExceptionType>" string on a connection failure. Run-level notice rows (rowType: "run_notice") instead carry a run-outcome reason such as "blocked", "rate_limited", "empty", or "no_data".
Uncharged accounting rows: when a keyword returns nothing — Facebook walled the request, rate-limited it, or genuinely had no matching videos — the Actor pushes one diagnostic row instead of silently returning zero results, and that row is not billed. It is pushed without a charged-event name, unlike every real video row, which is billed under the row_result pay-per-event. Filter these out (or isolate them for debugging) with rowType === "run_notice".
How can I use the data extracted with Facebook Video Search Scraper With Views & Engagement?
- 📈 Content and social media marketers: rank a keyword's results by
engagementRatePerVieworreactionCountinstead of Facebook's own ordering, to shortlist which video formats and hooks are actually landing before briefing a creative team. - 🤖 AI engineers and LLM developers: an agent issues a keyword query, receives structured JSON with
viewCount,reactions, andsave_descriptionalready typed, and passes it straight to a model as grounded context — no HTML parsing step in the agent loop. - 🔬 Market and social researchers: group rows by
queryto compare share-of-voice across topics, and trackpublishedAtdistributions to see how recently a topic is being covered on Facebook video. - 🎬 Creator and brand scouts: use
video_owner_profile.nameand.urlalongsideviewCountandtopReactionTypeto find accounts that are consistently outperforming on a given topic, independent of follower count.
📊 How do you monitor Facebook video performance over time?
Video performance on Facebook isn't static — the same video's view count, reaction total, and engagement rate keep climbing (or plateauing) after it's found, and the delta between two runs is often more useful than either snapshot alone. Repeated querying turns this Actor into a lightweight tracker: run the same keyword list on a schedule, and each run's viewCount, reactionCount, commentCount, shareCount, and engagementRatePerView become directly comparable against the previous run's values for the same facebookId.
The fields to diff between runs: viewCount and playCount for raw growth, reactionCount / commentCount / shareCount for engagement composition, and engagementRatePerView for whether a video is gaining traction relative to its own reach — a video whose view count is climbing but whose engagement rate is falling is losing relevance even as its raw numbers grow. topReactionType shifting from LIKE to LOVE or WOW across runs is also a real, checkable signal of changing audience sentiment on the same content.
A concrete workflow: schedule a run across your keyword set every few days using an Apify Schedule on this Actor, key each run's rows by facebookId, and alert when engagementRatePerView moves past a threshold you set, or when a video_owner_profile.name you're tracking publishes a video that clears your minViews filter on a subsequent run.
Integrate Facebook Video Search Scraper With Views & Engagement and automate your workflow
Facebook Video Search Scraper With Views & Engagement works with any language or tool that can send an HTTP request, through the Apify API and its official client libraries.
REST API with Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run_input = {"startUrls": ["cricket highlights", "street food"],"maxVideos": 20,"fetchExactViewCounts": True,"minViews": 1000,}run = client.actor("<YOUR_USERNAME>/facebook-video-search-scraper-views-engagement").call(run_input=run_input)for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["title"], item["viewCount"], item["engagementRatePerView"])
Scheduled monitoring and delivery
Set up an Apify Schedule to run this Actor on a cron interval against a fixed keyword list, and attach a webhook on ACTOR.RUN.SUCCEEDED to push each run's dataset URL to your own pipeline the moment it finishes — both are general Apify Console features available on any Actor, not something you need to build.
Is it legal to scrape Facebook video search results?
Yes — scraping publicly accessible Facebook video search results is generally lawful; this Actor returns only what any logged-out visitor sees on Facebook's own watch/search page. In hiQ Labs v. LinkedIn Corp., 938 F.3d 985 (9th Cir. 2019), the Ninth Circuit held that scraping publicly available web data does not violate the Computer Fraud and Abuse Act, a precedent widely cited for public-data scraping generally. Facebook's own Terms of Service prohibit automated data collection, so continued use of the platform under your own account carries ToS risk independent of the CFAA question — consult counsel before relying on this for anything beyond your own research or monitoring. Because video_owner_profile can identify an individual poster (name, profile URL), treat that field as personal data subject to GDPR/CCPA if you store or process it at scale; the video performance metrics themselves (views, reactions, counts) are not personal data. Scraping for one-off research and scraping to train a model or build a persistent database carry different risk profiles. Consult your legal team for commercial use cases involving bulk data storage.
❓ Frequently asked questions
Does this Actor need me to log into Facebook?
No. There is no login, cookie, or session field anywhere in the input schema — every request is built from Facebook's own publicly served search HTML and GraphQL responses, the same ones a logged-out browser receives.
Can I set a region or language for the search?
No — this is not exposed as an input. The GraphQL request the Actor sends fixes "locale": null, so every search runs against Facebook's default-locale search results rather than a region- or language-pinned variant.
How many videos does it return per keyword?
Up to maxVideos (default 10, maximum 1000) per keyword, provided enough matching videos exist and pass any minViews / minReactions filter you've set. Paging is hard-capped at 40 result pages per keyword regardless of filters — a heavily filtered keyword that never reaches its target will stop there rather than paging Facebook's results indefinitely.
How does this Actor handle Facebook's anti-bot measures?
It escalates through user agents and proxy tiers rather than retrying blindly: the search page is fetched with a standard Chrome user agent first, and if Facebook serves its wall (an HTTP 400 with a roughly 1.5 KB body, or a rate-limit error with GraphQL code 1675004), the request is retried and, when it keeps failing, the proxy is rotated through your configured tiers (custom proxy URLs, then your chosen Apify Proxy groups, then Apify Residential). The exact-counter permalink hop separately uses a rotating set of search-engine-crawler user agents (Googlebot, Bingbot, facebookexternalhit), since Facebook only serves the exact view/play counters to that user-agent class.
Does it extract exact view and play counts?
Yes — viewCount and playCount on every row where fetchExactViewCounts is on, the row was within your maxExactViewFetches budget, and the permalink lookup wasn't walled. When any of those conditions isn't met, both fields are null and fetchStatus tells you why ("not_requested", "skipped_limit", "blocked", or "no_counters").
How do I use this Actor to monitor a video's performance over time?
Schedule the same keyword list to run every few days, key each run's rows by facebookId, and compare viewCount, reactionCount, and engagementRatePerView between runs to see which videos are still gaining reach and engagement versus which have plateaued. See the monitoring section above for the specific fields to diff.
Does this Actor work with Claude, ChatGPT, and AI agent frameworks?
It is callable as an HTTP endpoint through the Apify API, which any agent framework that can make an HTTP request can call directly — an agent issues a keyword query, receives the structured JSON dataset, and grounds its answer in the actual returned view counts, reactions, and captions rather than guessing.
How does this Actor compare to other Facebook video search scrapers?
Based on their public Apify Store listings as checked on 2026-07-26: the official apify/facebook-video-search-scraper returns identity and tile fields (title, video URL, owner, thumbnail) with the view count only embedded inside a raw caption string, and documents a pay-per-result price of $5 per 1,000 results on its pricing tab. powerai/facebook-video-search-scraper and igview-owner/facebook-search-scraper both return a similar tile-level field set, with view counts likewise left inside an unparsed time_and_views_raw string rather than a numeric field. None of the three document a structured, exact numeric view count, a reaction-type breakdown, or a computed engagement rate as an output field — this Actor returns all three as first-class JSON keys (viewCount, reactions, engagementRatePerView).
Can I use this Actor without managing proxies or Facebook credentials?
Yes. No Facebook account or credential of any kind is ever requested. Proxy handling is automatic — leave proxyConfiguration at its default and the run uses Apify Residential, the tier that actually returns paginated search results; you only need to supply your own proxy URLs or groups if you want to override that choice.
💬 Your feedback
Found a bug, a field that came back empty when it shouldn't have, or a keyword pattern that behaves unexpectedly? Open an issue on this Actor's Issues tab on its Apify Store page — that's the fastest way to get a fix scheduled, and it's the channel this listing is actively maintained through.