<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Omar Khandji</title>
    <description>The latest articles on DEV Community by Omar Khandji (@omar_khandji_0135ce9388bb).</description>
    <link>https://dev.to/omar_khandji_0135ce9388bb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4152476%2F27a772ef-51f6-41b7-ad4a-c5dababb4425.png</url>
      <title>DEV Community: Omar Khandji</title>
      <link>https://dev.to/omar_khandji_0135ce9388bb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/omar_khandji_0135ce9388bb"/>
    <language>en</language>
    <item>
      <title>Korean marketplace prices for cross-border sellers: 11st products, sales counts and ratings in one API call</title>
      <dc:creator>Omar Khandji</dc:creator>
      <pubDate>Tue, 20 Oct 2026 14:13:30 +0000</pubDate>
      <link>https://dev.to/omar_khandji_0135ce9388bb/korean-marketplace-prices-for-cross-border-sellers-11st-products-sales-counts-and-ratings-in-one-3dcf</link>
      <guid>https://dev.to/omar_khandji_0135ce9388bb/korean-marketplace-prices-for-cross-border-sellers-11st-products-sales-counts-and-ratings-in-one-3dcf</guid>
      <description>&lt;p&gt;If you sell in or source from South Korea, you need to know what a product really costs on a local marketplace, who sells it, and how well it sells. Checking by hand means reading Korean search pages one product at a time. Most scraping tools skip 11st (11번가), one of the country's largest online marketplaces.&lt;/p&gt;

&lt;p&gt;Here is the short version: give one API call a search word, in Korean or English, and get back a table of products with the price in won, the list price, the discount, the brand, the sales count, the rating and the review count.&lt;/p&gt;

&lt;h2&gt;
  
  
  The answer first
&lt;/h2&gt;

&lt;p&gt;I built an &lt;a href="https://apify.com/om_kh/11st-korea-product-scraper" rel="noopener noreferrer"&gt;11st Korea Product Scraper on Apify&lt;/a&gt;. It reads 11st's public search results, logged out, with no account or proxy setup on your side. When I checked on 15 October 2026, no other 11st scraper was listed on the Apify Store.&lt;/p&gt;

&lt;p&gt;A run returns up to 2,500 unique products per search. Ads and products repeated across pages are removed, and each row says whether it was sponsored. In my tests, about 500 products came back in 20 seconds.&lt;/p&gt;

&lt;p&gt;You can search in Korean (&lt;code&gt;노트북&lt;/code&gt; is "laptop", &lt;code&gt;선크림&lt;/code&gt; is "sunscreen") or in English for brand and model names (&lt;code&gt;dyson&lt;/code&gt;, &lt;code&gt;iphone 16&lt;/code&gt;). For generic products, Korean words return far more results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working Python snippet
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;YOUR_APIFY_TOKEN&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;om_kh/11st-korea-product-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;searchTerms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;노트북&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dyson&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxProductsPerSearch&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sortBy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;best_selling&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxTotalChargeUsd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;salesCount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The inputs that matter for sourcing and price checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;searchTerms&lt;/code&gt;: one search per entry. You can also paste 11st search links in &lt;code&gt;searchUrls&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;maxProductsPerSearch&lt;/code&gt;: 1 to 2,500 unique products per search (default 100).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sortBy&lt;/code&gt;: the same seven orders as the 11st menu: &lt;code&gt;ranking&lt;/code&gt;, &lt;code&gt;popular&lt;/code&gt;, &lt;code&gt;lowest_price&lt;/code&gt;, &lt;code&gt;highest_price&lt;/code&gt;, &lt;code&gt;best_selling&lt;/code&gt;, &lt;code&gt;most_reviews&lt;/code&gt;, &lt;code&gt;newest&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;minPrice&lt;/code&gt; and &lt;code&gt;maxPrice&lt;/code&gt;: a price range in Korean won.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;includeSponsored&lt;/code&gt;: keep or drop the products 11st shows as ads.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;maxTotalChargeUsd&lt;/code&gt;: a hard cap on the cost of the run.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What the output looks like
&lt;/h2&gt;

&lt;p&gt;One row per product. This is a real row from the Actor's README, read on 15 October 2026 (search &lt;code&gt;선크림&lt;/code&gt;, sorted by &lt;code&gt;best_selling&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"productId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1085982197"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"본트리 베리 에센스 선 블럭 50ml(SPF50+) 3개"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.11st.co.kr/products/1085982197"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22900&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"originalPrice"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;24000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"discountPercent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"KRW"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"brand"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"본트리"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isOfficialSeller"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"salesCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18060&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rating"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reviewCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3952&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"deliveryText"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"무료"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"shipsToday"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isSoldOut"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isLowestPrice11st"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"isSponsored"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"position"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"searchTerm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"선크림"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sortBy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"best_selling"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few notes on reading it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;price&lt;/code&gt; is in won and already includes the discount 11st applies. Card or membership discounts are not included.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;salesCount&lt;/code&gt;, &lt;code&gt;rating&lt;/code&gt; and &lt;code&gt;reviewCount&lt;/code&gt; appear when 11st shows them for that product. They are present on 70 to 90 percent of rows for consumer goods.&lt;/li&gt;
&lt;li&gt;Fields 11st does not show are &lt;code&gt;null&lt;/code&gt;. An official 11st listing has no third-party seller name, for example.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;deliveryText&lt;/code&gt; is 11st's own wording (&lt;code&gt;무료&lt;/code&gt; means free delivery).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a cross-border seller, sort by &lt;code&gt;best_selling&lt;/code&gt;, then compare &lt;code&gt;price&lt;/code&gt; against your landed cost. The &lt;code&gt;isLowestPrice11st&lt;/code&gt; flag and the sponsored flag help you separate real demand from paid placement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it on a schedule with Make or n8n
&lt;/h2&gt;

&lt;p&gt;You do not need to host any Python. In Make or n8n, use the Apify module or node and build three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run an Actor&lt;/strong&gt;: pick &lt;code&gt;om_kh/11st-korea-product-scraper&lt;/code&gt;, set your search words, a sort order and a product limit. Schedule the scenario daily to follow prices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get Dataset Items&lt;/strong&gt;: use the default dataset of the run from step 1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Sheets: Add a Row&lt;/strong&gt;: map &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;price&lt;/code&gt;, &lt;code&gt;salesCount&lt;/code&gt;, &lt;code&gt;rating&lt;/code&gt; and &lt;code&gt;url&lt;/code&gt; to columns.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After a week, the sheet shows which products drop in price and which ones keep selling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;$4 per 1,000 products, no start fee. The first 10 products of every run are free. A search with no product, or an 11st outage, is never charged. Paid Apify plans get lower tier prices (see the Pricing tab), and &lt;code&gt;maxTotalChargeUsd&lt;/code&gt; caps any run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;p&gt;11st serves about 100 new products per page, so a broad search can return thousands of products while a narrow one returns only a few dozen. It reads public search results only. Use the data in line with the laws and terms that apply to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP
&lt;/h2&gt;

&lt;p&gt;AI agents can call it through &lt;code&gt;https://mcp.apify.com&lt;/code&gt; as &lt;code&gt;om_kh/11st-korea-product-scraper&lt;/code&gt; (tool &lt;code&gt;elevenst_products&lt;/code&gt;), so an assistant can look up Korean prices while it researches a product.&lt;/p&gt;

&lt;p&gt;More Actors and guides: &lt;a href="https://omarkhandji-commits.github.io/apify-actor-catalogue/guides/" rel="noopener noreferrer"&gt;https://omarkhandji-commits.github.io/apify-actor-catalogue/guides/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I built this Actor.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>ecommerce</category>
      <category>automation</category>
      <category>api</category>
    </item>
    <item>
      <title>Google Trends for 100 keywords without failed runs: a pipeline for SEO and e-commerce teams</title>
      <dc:creator>Omar Khandji</dc:creator>
      <pubDate>Tue, 13 Oct 2026 22:21:32 +0000</pubDate>
      <link>https://dev.to/omar_khandji_0135ce9388bb/google-trends-for-100-keywords-without-failed-runs-a-pipeline-for-seo-and-e-commerce-teams-59b2</link>
      <guid>https://dev.to/omar_khandji_0135ce9388bb/google-trends-for-100-keywords-without-failed-runs-a-pipeline-for-seo-and-e-commerce-teams-59b2</guid>
      <description>&lt;p&gt;If you run SEO or an online shop, you probably check Google Trends for a list of keywords every week: which products are rising, which queries are about to break out, which country is heating up. Doing that by hand for 100 keywords means 100 tabs. Doing it with a script usually means rate limits and half-empty results.&lt;/p&gt;

&lt;p&gt;Here is the short version: pass a list of keywords (or a Google Sheet) to one API call, and get one row per keyword with the direction, the % change, the top regions and the rising "breakout" queries already computed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The answer first
&lt;/h2&gt;

&lt;p&gt;I built a &lt;a href="https://apify.com/om_kh/google-trends-scraper" rel="noopener noreferrer"&gt;Google Trends Scraper on Apify&lt;/a&gt;. It reads Google Trends directly, works through your list four keywords at a time (each on its own Google session), and retries a keyword that Google rate-limits on a fresh session at the end of the run, up to two more times. A keyword that still fails comes back as an error row and is never charged.&lt;/p&gt;

&lt;p&gt;Measured on Apify on 7 October 2026, United States, with regions and related queries on:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test&lt;/th&gt;
&lt;th&gt;Keywords delivered&lt;/th&gt;
&lt;th&gt;Run time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;40 keywords&lt;/td&gt;
&lt;td&gt;40 of 40&lt;/td&gt;
&lt;td&gt;64 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100 keywords&lt;/td&gt;
&lt;td&gt;100 of 100&lt;/td&gt;
&lt;td&gt;3 min 39 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A run accepts up to 1,000 keywords.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working Python snippet
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;YOUR_APIFY_TOKEN&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;om_kh/google-trends-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;searchTerms&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;standing desk&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ergonomic chair&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;monitor arm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;geo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;US&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;timeRange&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;past_90_days&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;includeRelated&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;includeRegions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;keyword&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trendDirection&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;changePct&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The inputs that matter for a keyword-list workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;searchTerms&lt;/code&gt;: your keywords, up to 1,000 per run.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;spreadsheetId&lt;/code&gt;: a link or ID of a Google Sheet shared as "Anyone with the link". The first column is read, one keyword per row, so your team keeps the list in a sheet instead of in code.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;geo&lt;/code&gt;: two-letter country code (&lt;code&gt;US&lt;/code&gt;, &lt;code&gt;FR&lt;/code&gt;, &lt;code&gt;GB&lt;/code&gt;...). Empty means worldwide.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;timeRange&lt;/code&gt; or &lt;code&gt;customTimeRange&lt;/code&gt; (&lt;code&gt;2025-01-01 2025-12-31&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;searchProperty&lt;/code&gt;: &lt;code&gt;web&lt;/code&gt;, &lt;code&gt;youtube&lt;/code&gt;, &lt;code&gt;news&lt;/code&gt;, &lt;code&gt;images&lt;/code&gt; or &lt;code&gt;shopping&lt;/code&gt;. E-commerce teams often want &lt;code&gt;shopping&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;compare&lt;/code&gt;: group keywords by 5 on the same 0-100 scale, like typing them together on Google Trends.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;maxTotalChargeUsd&lt;/code&gt;: a hard cost cap for the run.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What the output looks like
&lt;/h2&gt;

&lt;p&gt;One row per keyword. This is the real example from the Actor's README (YouTube searches, year 2025, labels in French because &lt;code&gt;language&lt;/code&gt; was &lt;code&gt;fr&lt;/code&gt;; lists cut to their first entries):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"keyword"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"keyword"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chatgpt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"geo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"US"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timeRange"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-01-01 2025-12-31"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"searchProperty"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"youtube"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"comparedWith"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"claude ai"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"averageInterest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;60.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"peakInterest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"peakDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-08-03T00:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"latestInterest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;53&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"trendDirection"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"rising"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"changePct"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;20.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"topRegions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"region"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Virginie"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"US-VA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"relatedQueriesRising"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deepseek"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;104850&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"formattedValue"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Record"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;trendDirection&lt;/code&gt; and &lt;code&gt;changePct&lt;/code&gt; are computed for you, so you can sort 100 or 1,000 keywords by momentum in a spreadsheet in seconds. The rising related queries include Google's "Breakout" queries, the earliest signal of a new trend. Values are Google's relative scale (100 is the peak for the period and place), not absolute search volumes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it on a schedule with Make or n8n
&lt;/h2&gt;

&lt;p&gt;You do not need to host any Python. In Make or n8n, use the Apify module/node and build three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run an Actor&lt;/strong&gt;: pick &lt;code&gt;om_kh/google-trends-scraper&lt;/code&gt;, set &lt;code&gt;spreadsheetId&lt;/code&gt; to your keyword sheet and &lt;code&gt;geo&lt;/code&gt; to your market. Schedule the scenario every Monday morning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get Dataset Items&lt;/strong&gt;: use the default dataset of the run from step 1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Sheets: Add a Row&lt;/strong&gt;: map &lt;code&gt;keyword&lt;/code&gt;, &lt;code&gt;trendDirection&lt;/code&gt;, &lt;code&gt;changePct&lt;/code&gt;, &lt;code&gt;peakDate&lt;/code&gt; and &lt;code&gt;latestInterest&lt;/code&gt; to columns, plus the measurement basis: &lt;code&gt;geo&lt;/code&gt;, &lt;code&gt;timeRange&lt;/code&gt;, &lt;code&gt;searchProperty&lt;/code&gt; and &lt;code&gt;comparedWith&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sort the results tab by &lt;code&gt;changePct&lt;/code&gt; and the products or topics gaining momentum are at the top.&lt;/p&gt;

&lt;p&gt;Keep the measurement-basis columns. Trends values are relative, so if the country, the period, the search property or the comparison group changes between two weekly runs, the numbers move even when demand did not. Comparing only rows with the same basis keeps a week-over-week change honest.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;$2 per 1,000 keyword rows, no start fee. The first 3 results of every run are free, a keyword Google could not return is not charged, and paid Apify plans get lower tier prices (see the Pricing tab). A 100-keyword weekly check is about $0.20 per run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;p&gt;Google Trends values are relative, not search volumes. Very rare keywords may return no data; they are reported and not charged. For lists over 50 keywords, leave &lt;code&gt;includeRelated&lt;/code&gt; on only if you need it, since it adds requests. Metro areas exist for the United States only. It reads public, aggregated data; use it in line with the terms that apply to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP
&lt;/h2&gt;

&lt;p&gt;AI agents can call it through &lt;code&gt;https://mcp.apify.com&lt;/code&gt; as &lt;code&gt;om_kh/google-trends-scraper&lt;/code&gt;, so an assistant can check whether a topic is growing before it recommends it.&lt;/p&gt;

&lt;p&gt;More Actors and guides: &lt;a href="https://omarkhandji-commits.github.io/apify-actor-catalogue/guides/" rel="noopener noreferrer"&gt;https://omarkhandji-commits.github.io/apify-actor-catalogue/guides/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I built this Actor.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>seo</category>
      <category>automation</category>
      <category>api</category>
    </item>
    <item>
      <title>Google Jobs to Google Sheets every morning: a recruiter's no-code-ish pipeline</title>
      <dc:creator>Omar Khandji</dc:creator>
      <pubDate>Tue, 06 Oct 2026 14:50:04 +0000</pubDate>
      <link>https://dev.to/omar_khandji_0135ce9388bb/google-jobs-to-google-sheets-every-morning-a-recruiters-no-code-ish-pipeline-oj5</link>
      <guid>https://dev.to/omar_khandji_0135ce9388bb/google-jobs-to-google-sheets-every-morning-a-recruiters-no-code-ish-pipeline-oj5</guid>
      <description>&lt;p&gt;If you recruit, you probably open Google Jobs every morning, search the same three or four roles in the same cities, and copy what looks new into a spreadsheet. It works, but it is 30 minutes a day of copy-paste, and Google only shows 10 jobs per page.&lt;/p&gt;

&lt;p&gt;Here is the short version: call one API with your searches, get one clean row per posting (salary as numbers, posted date, every apply link), and push the rows into Google Sheets on a schedule. Below is the Python version and the no-code version.&lt;/p&gt;

&lt;h2&gt;
  
  
  The answer first
&lt;/h2&gt;

&lt;p&gt;I built a &lt;a href="https://apify.com/om_kh/google-jobs-scraper" rel="noopener noreferrer"&gt;Google Jobs Scraper on Apify&lt;/a&gt;. Google Jobs merges LinkedIn, Indeed, Glassdoor, ZipRecruiter and company career pages, so one search covers all of them. You give it job titles and locations, and it returns deduplicated rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working Python snippet
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;YOUR_APIFY_TOKEN&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;om_kh/google-jobs-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;queries&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;registered nurse&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;physical therapist&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;locations&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Houston&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dallas&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maxJobsPerSearch&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;postedWithin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;today&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;onlyWithSalary&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;companyName&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;salary&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;applyUrl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The useful inputs for a daily recruiting feed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;postedWithin&lt;/code&gt;: &lt;code&gt;today&lt;/code&gt;, &lt;code&gt;3days&lt;/code&gt;, &lt;code&gt;week&lt;/code&gt; or &lt;code&gt;month&lt;/code&gt;. Use &lt;code&gt;today&lt;/code&gt; for a morning run so you only see new postings.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scheduleType&lt;/code&gt;: Full-time, Part-time, Contractor, Internship or Temporary.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;onlyWithSalary&lt;/code&gt;: keep only postings that show a pay range.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;radiusKm&lt;/code&gt;: a hint to Google to search around each location (1 to 300 km).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;maxJobsPerSearch&lt;/code&gt;: 1 to 140. Google shows 10 per page, so the Actor runs several filter variants in parallel to go further.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What the output looks like
&lt;/h2&gt;

&lt;p&gt;One row per posting. This is a real example from a Chicago search (lists and description shortened):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Data Analyst II"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"companyName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Shirley Ryan AbilityLab"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Chicago, IL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"via"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Built In Chicago"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"postedAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-14"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scheduleType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Full-time"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"salary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"71.2K–124K a year"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"salaryMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;71200.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"salaryMax"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;124000.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"salaryPeriod"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"year"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"applyUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://builtin.com/job/…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"applyLinks"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"builtin.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://builtin.com/job/…"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"linkedin.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://www.linkedin.com/jobs/view/…"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"experienceYears"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"skills"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Workday"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Salary comes parsed into &lt;code&gt;salaryMin&lt;/code&gt;, &lt;code&gt;salaryMax&lt;/code&gt; and &lt;code&gt;salaryPeriod&lt;/code&gt;, so you can sort and filter in a sheet instead of reading text. &lt;code&gt;experienceYears&lt;/code&gt;, &lt;code&gt;skills&lt;/code&gt;, &lt;code&gt;visaSponsorship&lt;/code&gt; and &lt;code&gt;education&lt;/code&gt; are read from the description by plain rules (no AI); they stay empty when the text does not say. Each row also keeps Google's raw tags (&lt;code&gt;extensions&lt;/code&gt;), a &lt;code&gt;googleUrl&lt;/code&gt; that reopens the job on Google, and the &lt;code&gt;country&lt;/code&gt; and &lt;code&gt;language&lt;/code&gt; of the search.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it on a schedule with Make or n8n
&lt;/h2&gt;

&lt;p&gt;You do not need to host any Python. In Make or n8n, use the Apify module/node and build three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run an Actor&lt;/strong&gt;: pick &lt;code&gt;om_kh/google-jobs-scraper&lt;/code&gt; and paste your input JSON. Schedule the scenario every morning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Get Dataset Items&lt;/strong&gt;: use the default dataset of the run from step 1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Sheets: Add a Row&lt;/strong&gt;: map &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;companyName&lt;/code&gt;, &lt;code&gt;location&lt;/code&gt;, &lt;code&gt;salary&lt;/code&gt;, &lt;code&gt;postedAt&lt;/code&gt; and &lt;code&gt;applyUrl&lt;/code&gt; to columns.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every morning you open the sheet and the new postings are already there, with the direct LinkedIn or Indeed link on each row.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;$2.50 per 1,000 jobs on paid Apify plans (down to $2 on the largest plans), $3 on the free plan, no start fee. Searches Google cannot answer are reported in the run summary and not charged, and you can set &lt;code&gt;maxTotalChargeUsd&lt;/code&gt; as a hard cap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;p&gt;Google Jobs holds a few hundred postings per search at most, so for full coverage split by city or by more specific titles. Salary only appears when the employer or the board publishes it. It reads public search results; use the data in line with the laws and terms that apply to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP
&lt;/h2&gt;

&lt;p&gt;AI agents can call it through &lt;code&gt;https://mcp.apify.com&lt;/code&gt; as &lt;code&gt;om_kh/google-jobs-scraper&lt;/code&gt;, so an assistant can run a search and summarize the results for you.&lt;/p&gt;

&lt;p&gt;More Actors and guides: &lt;a href="https://omarkhandji-commits.github.io/apify-actor-catalogue/guides/" rel="noopener noreferrer"&gt;https://omarkhandji-commits.github.io/apify-actor-catalogue/guides/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I built this Actor.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>automation</category>
      <category>productivity</category>
      <category>api</category>
    </item>
    <item>
      <title>Turn any YouTube video into SRT, VTT or RAG-ready chunks with one API call</title>
      <dc:creator>Omar Khandji</dc:creator>
      <pubDate>Wed, 30 Sep 2026 14:48:05 +0000</pubDate>
      <link>https://dev.to/omar_khandji_0135ce9388bb/turn-any-youtube-video-into-srt-vtt-or-rag-ready-chunks-with-one-api-call-50a3</link>
      <guid>https://dev.to/omar_khandji_0135ce9388bb/turn-any-youtube-video-into-srt-vtt-or-rag-ready-chunks-with-one-api-call-50a3</guid>
      <description>&lt;p&gt;If you build anything with LLMs on top of video — summaries, search, a RAG chatbot over a course — the first problem is getting clean transcripts. Most tools give you one big block of text. For RAG you want pieces of ~250 words that still know &lt;em&gt;when&lt;/em&gt; they were said, so your bot can cite the exact second.&lt;/p&gt;

&lt;p&gt;Here is the shortest path I found, using the &lt;a href="https://apify.com/om_kh/youtube-transcript-api" rel="noopener noreferrer"&gt;YouTube Transcript API&lt;/a&gt; Actor on Apify (no YouTube API key, no cookies):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;YOUR_APIFY_TOKEN&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;om_kh/youtube-transcript-api&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;videos&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.youtube.com/watch?v=dQw4w9WgXcQ&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;outputFormats&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chunks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;srt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chunks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;start&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;end&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;chunk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][:&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each chunk carries &lt;code&gt;start&lt;/code&gt; and &lt;code&gt;end&lt;/code&gt; in seconds, so a RAG answer can link to &lt;code&gt;https://youtu.be/&amp;lt;id&amp;gt;?t=&amp;lt;start&amp;gt;&lt;/code&gt;. The same run also returns a ready-to-save &lt;code&gt;.srt&lt;/code&gt; string, useful for video editors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other formats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;vtt&lt;/code&gt; for web players&lt;/li&gt;
&lt;li&gt;plain text for summaries&lt;/li&gt;
&lt;li&gt;whole channels or playlists: the &lt;a href="https://apify.com/om_kh/youtube-channel-transcripts" rel="noopener noreferrer"&gt;YouTube Channel Transcripts&lt;/a&gt; Actor takes an &lt;code&gt;@handle&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  From an AI agent (MCP)
&lt;/h2&gt;

&lt;p&gt;It also works as an MCP tool through &lt;code&gt;https://mcp.apify.com&lt;/code&gt;, so Claude, Cursor or any MCP client can call it directly: "get the transcript of this video and summarize it".&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;Pay per transcript delivered (see the &lt;a href="https://apify.com/om_kh/youtube-transcript-api" rel="noopener noreferrer"&gt;Actor page&lt;/a&gt; for the current price); videos without captions are never charged.&lt;/p&gt;

&lt;p&gt;More step-by-step API guides (Google Trends, YouTube comments, job boards, Kalshi &amp;amp; Polymarket odds): &lt;a href="https://omarkhandji-commits.github.io/apify-actor-catalogue/guides/" rel="noopener noreferrer"&gt;github.com/omarkhandji-commits/apify-actor-catalogue&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I built this Actor. Happy to help if you hit issues — leave a comment.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>rag</category>
      <category>youtube</category>
    </item>
  </channel>
</rss>
