<?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: George Kioko</title>
    <description>The latest articles on DEV Community by George Kioko (@the_aientrepreneur_7ae85).</description>
    <link>https://dev.to/the_aientrepreneur_7ae85</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3819055%2Fd9abfd38-f5cf-4c9c-bb04-30b1ea57dd40.jpg</url>
      <title>DEV Community: George Kioko</title>
      <link>https://dev.to/the_aientrepreneur_7ae85</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/the_aientrepreneur_7ae85"/>
    <language>en</language>
    <item>
      <title>My Apify Promotion Filter: Scale Clean APIs, Hold Back Noisy Demand</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Sun, 07 Jun 2026 04:05:11 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/my-apify-promotion-filter-scale-clean-apis-hold-back-noisy-demand-2bpg</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/my-apify-promotion-filter-scale-clean-apis-hold-back-noisy-demand-2bpg</guid>
      <description>&lt;p&gt;I pulled a fresh read-only Apify Store check on June 6 after seeing revenue cool down from the better days earlier in the week.&lt;/p&gt;

&lt;p&gt;The portfolio is not dead. The traffic is still moving:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;63,720 total runs&lt;/li&gt;
&lt;li&gt;2,532 total users&lt;/li&gt;
&lt;li&gt;+426 runs since the last fresh read&lt;/li&gt;
&lt;li&gt;+25 users since the last fresh read&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem is not whether the actors exist. The problem is where the promotion is pointed.&lt;/p&gt;

&lt;p&gt;When I promote the whole catalog, the message is too broad. A buyer does not wake up looking for "66 Apify actors." They wake up needing validated emails, YouTube transcripts, domain/company intelligence, local business lists, or a way to score prospects before outreach.&lt;/p&gt;

&lt;p&gt;So today's rule is simple:&lt;/p&gt;

&lt;p&gt;Promote the monetized actors that are reliable enough to absorb traffic.&lt;/p&gt;

&lt;p&gt;Hold back the ones with demand but weak completion until they are repaired.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Scale Lane
&lt;/h2&gt;

&lt;p&gt;These are the actors I am comfortable putting in public today because the current 30-day Store stats show strong reliability.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Actor&lt;/th&gt;
&lt;th&gt;Rolling 30d runs&lt;/th&gt;
&lt;th&gt;30d success&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Email Validator API&lt;/td&gt;
&lt;td&gt;1,575&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain WHOIS Lookup&lt;/td&gt;
&lt;td&gt;1,654&lt;/td&gt;
&lt;td&gt;99.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YouTube Transcript Scraper&lt;/td&gt;
&lt;td&gt;1,123&lt;/td&gt;
&lt;td&gt;98.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telegram Channel Scraper&lt;/td&gt;
&lt;td&gt;861&lt;/td&gt;
&lt;td&gt;98.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI Content Detector&lt;/td&gt;
&lt;td&gt;621&lt;/td&gt;
&lt;td&gt;99.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Company Enrichment API&lt;/td&gt;
&lt;td&gt;395&lt;/td&gt;
&lt;td&gt;96.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google News Monitor&lt;/td&gt;
&lt;td&gt;232&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That list has two jobs.&lt;/p&gt;

&lt;p&gt;First, it proves the portfolio is not just a batch of abandoned demos. These actors are getting used and completing at a level I can defend.&lt;/p&gt;

&lt;p&gt;Second, it gives the buyer a clean entry point. A developer building an AI workflow can start with transcripts, enrichment, WHOIS, news monitoring, or validation without taking on the risk of a noisier scraper.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Money Lane
&lt;/h2&gt;

&lt;p&gt;The second lane is the buyer-outcome stack.&lt;/p&gt;

&lt;p&gt;These actors are not the highest-volume tools in the catalog, but they map more directly to business value:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Actor&lt;/th&gt;
&lt;th&gt;Rolling 30d result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HVAC Contractor Lead Finder&lt;/td&gt;
&lt;td&gt;40/40 succeeded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Law Firm Lead Finder&lt;/td&gt;
&lt;td&gt;35/35 succeeded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dental Practice Lead Finder&lt;/td&gt;
&lt;td&gt;31/31 succeeded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Maps Leads + Website Audit&lt;/td&gt;
&lt;td&gt;29/29 succeeded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Maps Lead Intelligence&lt;/td&gt;
&lt;td&gt;29/30 succeeded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restaurant Lead Finder&lt;/td&gt;
&lt;td&gt;33/34 succeeded&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pitch here is not "scrape a website."&lt;/p&gt;

&lt;p&gt;The pitch is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find local businesses.&lt;/li&gt;
&lt;li&gt;Score the website and digital presence.&lt;/li&gt;
&lt;li&gt;Pull vertical-specific prospect lists.&lt;/li&gt;
&lt;li&gt;Enrich the company data.&lt;/li&gt;
&lt;li&gt;Validate emails before outreach.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is a workflow an agency, consultant, or local sales team can understand.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hold-Back Lane
&lt;/h2&gt;

&lt;p&gt;This is the part that matters if you care about revenue instead of vanity traffic.&lt;/p&gt;

&lt;p&gt;Some actors have demand, but I do not want them as the main CTA today:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Actor&lt;/th&gt;
&lt;th&gt;Current issue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;TikTok Shop Affiliate Intelligence&lt;/td&gt;
&lt;td&gt;84.0% 30d success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Scholar Scraper&lt;/td&gt;
&lt;td&gt;80.1% 30d success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reddit Scraper Pro&lt;/td&gt;
&lt;td&gt;87.5% 30d success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lead Enrichment Pipeline&lt;/td&gt;
&lt;td&gt;65.6% 30d success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Influencer Marketing Intel&lt;/td&gt;
&lt;td&gt;86.8% 30d success&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Demand is useful. Broken demand burns trust.&lt;/p&gt;

&lt;p&gt;If an actor has buyers but too many aborts, timeouts, or failures, the move is QA first and promotion second.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Promotion Filter
&lt;/h2&gt;

&lt;p&gt;This is the filter I am using today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scale anything above 95% 30-day success with meaningful use.&lt;/li&gt;
&lt;li&gt;Use high-volume utility APIs as trust proof.&lt;/li&gt;
&lt;li&gt;Put buyer-outcome lead actors in the main CTA.&lt;/li&gt;
&lt;li&gt;Keep 90-95% actors in the careful lane.&lt;/li&gt;
&lt;li&gt;Hold back anything under 90% until reliability improves.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means the main public profile is still the best single entry point:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/george.the.developer" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But the copy should not say "here are all my actors."&lt;/p&gt;

&lt;p&gt;The copy should say:&lt;/p&gt;

&lt;p&gt;Use the clean APIs for reliable data workflows.&lt;br&gt;
Use the local lead stack when you need a buyer outcome.&lt;br&gt;
Do not push noisy actors until the completion rate is fixed.&lt;/p&gt;

&lt;p&gt;That is the playbook for today.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>apify</category>
      <category>scraping</category>
    </item>
    <item>
      <title>Stop Promoting a Scraper Catalog. Promote a Local Lead Research Stack.</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Sat, 06 Jun 2026 05:41:14 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/stop-promoting-a-scraper-catalog-promote-a-local-lead-research-stack-38g4</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/stop-promoting-a-scraper-catalog-promote-a-local-lead-research-stack-38g4</guid>
      <description>&lt;p&gt;I pulled a fresh read-only Apify Store check late on June 5.&lt;/p&gt;

&lt;p&gt;The portfolio is moving:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;66 public Store actors&lt;/li&gt;
&lt;li&gt;63,294 total runs&lt;/li&gt;
&lt;li&gt;2,507 total users&lt;/li&gt;
&lt;li&gt;15,584 rolling 30-day runs&lt;/li&gt;
&lt;li&gt;15,073 rolling 30-day successful runs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the useful revenue lesson is not "post all the actors again."&lt;/p&gt;

&lt;p&gt;The useful lesson is this:&lt;/p&gt;

&lt;p&gt;Traffic and revenue are not the same thing. Utility actors can bring a lot of runs, but the bigger buyer intent is in the local lead stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Local Lead Stack
&lt;/h2&gt;

&lt;p&gt;This is the stack I am promoting harder now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Maps Lead Intelligence&lt;/li&gt;
&lt;li&gt;Google Maps Leads + Website Audit&lt;/li&gt;
&lt;li&gt;HVAC Contractor Lead Finder&lt;/li&gt;
&lt;li&gt;Law Firm Lead Finder&lt;/li&gt;
&lt;li&gt;Dental Practice Lead Finder&lt;/li&gt;
&lt;li&gt;Restaurant Lead Finder&lt;/li&gt;
&lt;li&gt;Company Enrichment API&lt;/li&gt;
&lt;li&gt;Email Validator API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a workflow, not a catalog.&lt;/p&gt;

&lt;p&gt;For an agency, consultant, broker, or operator, the pitch is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find local businesses.&lt;/li&gt;
&lt;li&gt;Score their websites.&lt;/li&gt;
&lt;li&gt;Pull vertical-specific lead lists.&lt;/li&gt;
&lt;li&gt;Enrich the companies.&lt;/li&gt;
&lt;li&gt;Validate emails before outreach.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is much clearer than saying "I have a bunch of scrapers."&lt;/p&gt;

&lt;h2&gt;
  
  
  Current Store Proof
&lt;/h2&gt;

&lt;p&gt;The local lead actors are not the highest-volume actors in the portfolio, but they map to a buyer outcome.&lt;/p&gt;

&lt;p&gt;Current Store stats from the June 5 read:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Actor&lt;/th&gt;
&lt;th&gt;Rolling 30d runs&lt;/th&gt;
&lt;th&gt;Success&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HVAC Contractor Lead Finder&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Law Firm Lead Finder&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dental Practice Lead Finder&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Maps Lead Intelligence&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;96.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Maps Leads + Website Audit&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restaurant Lead Finder&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;97.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The support actors make the stack more useful:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Actor&lt;/th&gt;
&lt;th&gt;Rolling 30d runs&lt;/th&gt;
&lt;th&gt;Success&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Email Validator API&lt;/td&gt;
&lt;td&gt;1,507&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Domain WHOIS Lookup&lt;/td&gt;
&lt;td&gt;3,054&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YouTube Transcript Scraper&lt;/td&gt;
&lt;td&gt;1,100&lt;/td&gt;
&lt;td&gt;98.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telegram Channel Scraper&lt;/td&gt;
&lt;td&gt;857&lt;/td&gt;
&lt;td&gt;98.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Company Enrichment API&lt;/td&gt;
&lt;td&gt;606&lt;/td&gt;
&lt;td&gt;97.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google News Monitor&lt;/td&gt;
&lt;td&gt;239&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why This Works Better Than a Catalog
&lt;/h2&gt;

&lt;p&gt;A catalog asks the buyer to think.&lt;/p&gt;

&lt;p&gt;A stack gives them a path.&lt;/p&gt;

&lt;p&gt;"Here are 65 paid actors" is broad, but broad is not always helpful.&lt;/p&gt;

&lt;p&gt;"Here is a local lead research stack for finding, scoring, enriching, and validating prospects" is specific. It tells the buyer what job the tools do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example Workflow
&lt;/h2&gt;

&lt;p&gt;Start with a market:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dentists in Austin
law firms in Atlanta
HVAC contractors in Phoenix
restaurants in Miami
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run the stack:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use a vertical lead finder or Google Maps actor to find businesses.&lt;/li&gt;
&lt;li&gt;Use the website audit actor to inspect digital presence.&lt;/li&gt;
&lt;li&gt;Use Company Enrichment API to add firmographic details.&lt;/li&gt;
&lt;li&gt;Use Email Validator API before sending outreach.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The buyer does not care that this is a scraper portfolio. They care that it helps build a prospecting list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start With Apify Client
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ApifyClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;apify-client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;APIFY_TOKEN&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;george.the.developer/law-firm-lead-finder&lt;/span&gt;&lt;span class="dl"&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="na"&gt;searchQuery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;personal injury law firms in Atlanta GA&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;maxResults&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="na"&gt;enrichWebsites&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;validateEmails&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&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="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;listItems&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check each actor's input schema before running at scale. The important idea is the stack: discovery, audit, enrichment, validation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Am Holding Back
&lt;/h2&gt;

&lt;p&gt;Some monetized actors still have demand, but I am not putting them in the main cash CTA until reliability improves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TikTok Shop Affiliate Sales Scraper&lt;/li&gt;
&lt;li&gt;Google Scholar Scraper&lt;/li&gt;
&lt;li&gt;Lead Enrichment Pipeline&lt;/li&gt;
&lt;li&gt;Reddit Scraper Pro&lt;/li&gt;
&lt;li&gt;Influencer Marketing Intel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Demand is useful. Broken demand burns trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;Full Apify profile:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/george.the.developer" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Local lead actors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apify.com/george.the.developer/google-maps-lead-intel" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/google-maps-lead-intel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/george.the.developer/google-maps-leads-website-audit" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/google-maps-leads-website-audit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/george.the.developer/hvac-contractor-lead-finder" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/hvac-contractor-lead-finder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/george.the.developer/law-firm-lead-finder" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/law-firm-lead-finder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/george.the.developer/dental-practice-lead-finder" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/dental-practice-lead-finder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/george.the.developer/restaurant-lead-finder" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/restaurant-lead-finder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/george.the.developer/company-enrichment-api" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/company-enrichment-api&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/george.the.developer/email-validator-api" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/email-validator-api&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>apify</category>
      <category>scraping</category>
    </item>
    <item>
      <title>Quiet Apify Store Day? Promote the Actors That Complete, Not the Ones That Need Repair</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Thu, 04 Jun 2026 07:59:18 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/quiet-apify-store-day-promote-the-actors-that-complete-not-the-ones-that-need-repair-999</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/quiet-apify-store-day-promote-the-actors-that-complete-not-the-ones-that-need-repair-999</guid>
      <description>&lt;p&gt;Revenue days do not always move in a clean line.&lt;/p&gt;

&lt;p&gt;On June 4, my public Apify Store read was flat versus June 3: 65 active pay-per-event actors, 62,169 all-time monetized runs, 2,424 all-time users, 16,945 rolling 30-day public runs, and a 96.7% rolling 30-day success rate. That does not mean the portfolio is dead. It means the promotion lane has to get narrower.&lt;/p&gt;

&lt;p&gt;When the Store is quiet, I do not promote every actor equally. I split the portfolio into three groups:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;buyer-outcome actors that solve a direct cash problem&lt;/li&gt;
&lt;li&gt;utility APIs that run cleanly and can sit inside someone else's workflow&lt;/li&gt;
&lt;li&gt;actors that need QA before they deserve harder promotion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That keeps the message honest and gives buyers a cleaner path to the tools that are ready today.&lt;/p&gt;

&lt;h2&gt;
  
  
  The buyer-outcome lane
&lt;/h2&gt;

&lt;p&gt;These are the actors I promote when the goal is direct revenue. They are not abstract data tools. They map to sales, outreach, lead generation, or market research work that a buyer can monetize.&lt;/p&gt;

&lt;h3&gt;
  
  
  Law Firm Lead Finder
&lt;/h3&gt;

&lt;p&gt;Use this when you need a repeatable list of law firms for outreach, local lead generation, or agency research.&lt;/p&gt;

&lt;p&gt;Public Store stats from today's read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;33 rolling 30-day runs&lt;/li&gt;
&lt;li&gt;33 successful rolling 30-day runs&lt;/li&gt;
&lt;li&gt;100% rolling 30-day success&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Store link: &lt;a href="https://apify.com/george.the.developer/law-firm-lead-finder" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/law-firm-lead-finder&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Dental Practice Lead Finder
&lt;/h3&gt;

&lt;p&gt;Dental offices are a good fit for local SEO, ads, review management, and appointment-setting offers. This actor is built for that kind of prospecting workflow.&lt;/p&gt;

&lt;p&gt;Public Store stats from today's read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;30 rolling 30-day runs&lt;/li&gt;
&lt;li&gt;30 successful rolling 30-day runs&lt;/li&gt;
&lt;li&gt;100% rolling 30-day success&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Store link: &lt;a href="https://apify.com/george.the.developer/dental-practice-lead-finder" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/dental-practice-lead-finder&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Maps Leads + Website Audit
&lt;/h3&gt;

&lt;p&gt;This is useful when a raw business list is not enough. The extra website audit angle helps separate weak digital presence from stronger prospects.&lt;/p&gt;

&lt;p&gt;Public Store stats from today's read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;29 rolling 30-day runs&lt;/li&gt;
&lt;li&gt;29 successful rolling 30-day runs&lt;/li&gt;
&lt;li&gt;100% rolling 30-day success&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Store link: &lt;a href="https://apify.com/george.the.developer/google-maps-leads-website-audit" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/google-maps-leads-website-audit&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Restaurant Lead Finder
&lt;/h3&gt;

&lt;p&gt;Restaurants are another direct outreach lane: websites, ordering flows, local ads, review systems, delivery tooling, and marketing services.&lt;/p&gt;

&lt;p&gt;Public Store stats from today's read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;34 rolling 30-day runs&lt;/li&gt;
&lt;li&gt;33 successful rolling 30-day runs&lt;/li&gt;
&lt;li&gt;97.1% rolling 30-day success&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Store link: &lt;a href="https://apify.com/george.the.developer/restaurant-lead-finder" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/restaurant-lead-finder&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The utility API lane
&lt;/h2&gt;

&lt;p&gt;These are not always flashy, but they are exactly the kind of actors that can become embedded in other products, agents, dashboards, and internal workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Email Validator API
&lt;/h3&gt;

&lt;p&gt;Use this before cold outreach, CRM imports, signup checks, or enrichment workflows. It covers email validation, disposable detection, and MX-related checks in one API-style actor.&lt;/p&gt;

&lt;p&gt;Public Store stats from today's read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1,371 rolling 30-day runs&lt;/li&gt;
&lt;li&gt;1,371 successful rolling 30-day runs&lt;/li&gt;
&lt;li&gt;100% rolling 30-day success&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Store link: &lt;a href="https://apify.com/george.the.developer/email-validator-api" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/email-validator-api&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Domain WHOIS Lookup
&lt;/h3&gt;

&lt;p&gt;Domain age, expiry, registrar, and DNS details are useful for lead scoring, fraud checks, market maps, and due diligence tools.&lt;/p&gt;

&lt;p&gt;Public Store stats from today's read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5,007 rolling 30-day runs&lt;/li&gt;
&lt;li&gt;5,007 successful rolling 30-day runs&lt;/li&gt;
&lt;li&gt;100% rolling 30-day success&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Store link: &lt;a href="https://apify.com/george.the.developer/domain-whois-lookup" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/domain-whois-lookup&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  YouTube Transcript Scraper
&lt;/h3&gt;

&lt;p&gt;This is a strong utility actor for AI builders, content teams, research workflows, and RAG pipelines that need transcript data without managing a custom scraper.&lt;/p&gt;

&lt;p&gt;Public Store stats from today's read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1,085 rolling 30-day runs&lt;/li&gt;
&lt;li&gt;98.8% rolling 30-day success&lt;/li&gt;
&lt;li&gt;28 users in the last 7 days&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Store link: &lt;a href="https://apify.com/george.the.developer/youtube-transcript-scraper" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/youtube-transcript-scraper&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Telegram Channel Scraper
&lt;/h3&gt;

&lt;p&gt;Good fit for market monitoring, community intelligence, crypto research, and niche data feeds where Telegram content matters.&lt;/p&gt;

&lt;p&gt;Public Store stats from today's read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;861 rolling 30-day runs&lt;/li&gt;
&lt;li&gt;98.8% rolling 30-day success&lt;/li&gt;
&lt;li&gt;7 users in the last 7 days&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Store link: &lt;a href="https://apify.com/george.the.developer/telegram-channel-scraper" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/telegram-channel-scraper&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Company Enrichment API
&lt;/h3&gt;

&lt;p&gt;This one is for turning a domain or company target into a richer company profile for sales workflows, prospect research, and internal tools.&lt;/p&gt;

&lt;p&gt;Public Store stats from today's read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;599 rolling 30-day runs&lt;/li&gt;
&lt;li&gt;97.3% rolling 30-day success&lt;/li&gt;
&lt;li&gt;12 users in the last 7 days&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Store link: &lt;a href="https://apify.com/george.the.developer/company-enrichment-api" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/company-enrichment-api&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Google News Monitor
&lt;/h3&gt;

&lt;p&gt;This fits brand monitoring, market alerts, competitor tracking, and lightweight news intelligence.&lt;/p&gt;

&lt;p&gt;Public Store stats from today's read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;270 rolling 30-day runs&lt;/li&gt;
&lt;li&gt;270 successful rolling 30-day runs&lt;/li&gt;
&lt;li&gt;100% rolling 30-day success&lt;/li&gt;
&lt;li&gt;8 users in the last 7 days&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Store link: &lt;a href="https://apify.com/george.the.developer/google-news-monitor" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/google-news-monitor&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The hold-back lane
&lt;/h2&gt;

&lt;p&gt;Some actors are still monetized, but I do not want to push them hard until the reliability story is stronger.&lt;/p&gt;

&lt;p&gt;Today that hold-back list includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TikTok Shop Affiliate Sales Scraper&lt;/li&gt;
&lt;li&gt;Google Scholar Scraper&lt;/li&gt;
&lt;li&gt;HVAC Contractor Lead Finder&lt;/li&gt;
&lt;li&gt;Lead Enrichment Pipeline&lt;/li&gt;
&lt;li&gt;Reddit Scraper Pro&lt;/li&gt;
&lt;li&gt;Influencer Marketing Intel&lt;/li&gt;
&lt;li&gt;Medspa Lead Discovery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That does not mean those actors are worthless. It means they should get QA, better docs, or tighter inputs before they become the main public pitch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start with any Apify actor
&lt;/h2&gt;

&lt;p&gt;Here is the basic Node.js pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ApifyClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;apify-client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;APIFY_TOKEN&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;george.the.developer/youtube-transcript-scraper&lt;/span&gt;&lt;span class="dl"&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="na"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.youtube.com/watch?v=dQw4w9WgXcQ&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;outputFormat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;both&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&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="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;listItems&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Swap the actor ID and input for the lane you are using.&lt;/p&gt;

&lt;h2&gt;
  
  
  My practical rule
&lt;/h2&gt;

&lt;p&gt;When revenue drops, do not blast the whole catalog.&lt;/p&gt;

&lt;p&gt;Promote the actors that already complete cleanly. Send buyer traffic to tools with a direct use case. Keep the weaker actors in a repair lane until the public numbers support a harder push.&lt;/p&gt;

&lt;p&gt;Full Apify profile: &lt;a href="https://apify.com/george.the.developer" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>apify</category>
      <category>scraping</category>
    </item>
    <item>
      <title>Revenue Falling? Promote the Paid Apify Actors That Actually Complete</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Wed, 03 Jun 2026 09:22:23 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/revenue-falling-promote-the-paid-apify-actors-that-actually-complete-1o5k</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/revenue-falling-promote-the-paid-apify-actors-that-actually-complete-1o5k</guid>
      <description>&lt;p&gt;When revenue dips, the tempting move is to promote everything.&lt;/p&gt;

&lt;p&gt;That is usually the wrong move. A scraper portfolio is not one product. It is a collection of separate reliability profiles, buyer intents, prices, and failure risks. If you blast the entire catalog, you send new users into actors that may not be ready for more traffic.&lt;/p&gt;

&lt;p&gt;This morning I pulled a fresh read-only Apify Store API snapshot for my paid actor portfolio. I looked only at active &lt;code&gt;PAY_PER_EVENT&lt;/code&gt; actors and compared the result against yesterday's snapshot.&lt;/p&gt;

&lt;p&gt;The current snapshot:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;65 active paid actors&lt;/li&gt;
&lt;li&gt;62,169 all-time runs across those paid actors&lt;/li&gt;
&lt;li&gt;2,424 all-time users&lt;/li&gt;
&lt;li&gt;16,945 rolling 30-day public runs&lt;/li&gt;
&lt;li&gt;96.7% rolling 30-day public success&lt;/li&gt;
&lt;li&gt;+965 total runs since yesterday&lt;/li&gt;
&lt;li&gt;+74 total users since yesterday&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is public Store and run-quality signal, not exact Console payout attribution. That distinction matters. The public API can tell me what is moving and what is completing, but it cannot replace the payout dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Actors I Am Promoting Today
&lt;/h2&gt;

&lt;p&gt;These are the actors with either clean completion rates, fresh movement, or direct buyer utility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email Validator API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fresh movement: +137 runs since yesterday with 100% rolling 30-day success.&lt;/p&gt;

&lt;p&gt;Use it before cold outreach, lead imports, CRM cleanup, or newsletter sends:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/george.the.developer/email-validator-api" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/email-validator-api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI Content Detector&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fresh movement: +115 runs since yesterday with 99.8% rolling 30-day success.&lt;/p&gt;

&lt;p&gt;Use it when you need a lightweight AI-text signal for moderation, publishing workflows, or audit queues:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/george.the.developer/ai-content-detector" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/ai-content-detector&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;YouTube Transcript Scraper&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fresh movement: +59 runs since yesterday, 98.8% rolling 30-day success, and 28 users in the last 7 days.&lt;/p&gt;

&lt;p&gt;Use it for RAG pipelines, content analysis, creator research, video summaries, and training-data prep:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/george.the.developer/youtube-transcript-scraper" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/youtube-transcript-scraper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Telegram Channel Scraper&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fresh movement: +58 runs since yesterday with 98.8% rolling 30-day success.&lt;/p&gt;

&lt;p&gt;Use it for market intel, community monitoring, crypto research, public-channel tracking, and message archiving:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/george.the.developer/telegram-channel-scraper" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/telegram-channel-scraper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Company Enrichment API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fresh movement: +28 runs since yesterday with 97.3% rolling 30-day success.&lt;/p&gt;

&lt;p&gt;Use it to turn domains into company records for lead routing, qualification, prospect research, or internal enrichment:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/george.the.developer/company-enrichment-api" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/company-enrichment-api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google News Monitor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fresh movement: +19 runs since yesterday with 100% rolling 30-day success.&lt;/p&gt;

&lt;p&gt;Use it for brand monitoring, competitor alerts, executive mentions, product-news tracking, or regulatory/news watchlists:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/george.the.developer/google-news-monitor" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/google-news-monitor&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Buyer-Outcome Lane
&lt;/h2&gt;

&lt;p&gt;High-volume utilities are useful, but the revenue pressure is not solved by tiny utility events alone. The more interesting lane is completed-search work where the buyer gets a business artifact.&lt;/p&gt;

&lt;p&gt;Today that means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Law Firm Lead Finder: 33/33 successful rolling 30-day runs&lt;/li&gt;
&lt;li&gt;Dental Practice Lead Finder: 30/30 successful rolling 30-day runs&lt;/li&gt;
&lt;li&gt;Google Maps Lead Intel: 29/29 successful rolling 30-day runs&lt;/li&gt;
&lt;li&gt;Restaurant Lead Finder: 33/34 successful rolling 30-day runs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those actors are for buyers who want lead lists, local market research, or prospect intelligence without building a custom scraper.&lt;/p&gt;

&lt;p&gt;Law Firm Lead Finder:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/george.the.developer/law-firm-lead-finder" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/law-firm-lead-finder&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dental Practice Lead Finder:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/george.the.developer/dental-practice-lead-finder" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/dental-practice-lead-finder&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Google Maps Lead Intel:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/george.the.developer/google-maps-lead-intel" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/google-maps-lead-intel&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Restaurant Lead Finder:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/george.the.developer/restaurant-lead-finder" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/restaurant-lead-finder&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Am Not Hard-Promoting Today
&lt;/h2&gt;

&lt;p&gt;Some actors have demand but do not deserve extra traffic until reliability improves.&lt;/p&gt;

&lt;p&gt;My current hold-back list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Scholar Scraper&lt;/li&gt;
&lt;li&gt;TikTok Shop Affiliate Sales Scraper&lt;/li&gt;
&lt;li&gt;HVAC Contractor Lead Finder&lt;/li&gt;
&lt;li&gt;Lead Enrichment Pipeline&lt;/li&gt;
&lt;li&gt;Reddit Scraper Pro&lt;/li&gt;
&lt;li&gt;Influencer Marketing Intel&lt;/li&gt;
&lt;li&gt;US Tariff Lookup&lt;/li&gt;
&lt;li&gt;MedSpa Lead Discovery PPE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The issue is not that these are bad ideas. The issue is that current rolling quality shows enough failed, aborted, or timed-out runs that promotion could create a worse buyer experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Operating Rule
&lt;/h2&gt;

&lt;p&gt;Do not promote the whole catalog.&lt;/p&gt;

&lt;p&gt;Split the portfolio into three lanes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scale lane: reliable actors with clean completion rates and real recent movement.&lt;/li&gt;
&lt;li&gt;Buyer-outcome lane: lower-volume actors with a clear business result.&lt;/li&gt;
&lt;li&gt;Fix-first lane: actors with demand but too much run-quality risk.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is how I am handling the portfolio today.&lt;/p&gt;

&lt;p&gt;Full catalog:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/george.the.developer" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>apify</category>
      <category>scraping</category>
    </item>
    <item>
      <title>Humanize AI Text at Scale Without Paying for Another LLM Call</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Sat, 30 May 2026 05:33:37 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/humanize-ai-text-at-scale-without-paying-for-another-llm-call-1184</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/humanize-ai-text-at-scale-without-paying-for-another-llm-call-1184</guid>
      <description>&lt;p&gt;LLMs are good at producing a first draft. They are also good at producing the same first draft over and over.&lt;/p&gt;

&lt;p&gt;The problem is not that the grammar is wrong. The problem is that AI text often has a recognizable texture: uniform sentence length, too many transition phrases, overly clean structure, low burstiness, and phrasing that sounds like it came from a template.&lt;/p&gt;

&lt;p&gt;For content teams, SEO operators, newsletter writers, agencies, and AI-agent builders, that creates a last-mile problem. You can generate the draft quickly, but you still need it to sound natural before publishing, sending, or handing it to a client.&lt;/p&gt;

&lt;p&gt;That is where a humanization step belongs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Most "make this sound human" workflows call another LLM. That can work, but it adds new costs and new failure modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Another API call for every piece of text.&lt;/li&gt;
&lt;li&gt;Possible meaning drift.&lt;/li&gt;
&lt;li&gt;Slower bulk processing.&lt;/li&gt;
&lt;li&gt;External model rate limits.&lt;/li&gt;
&lt;li&gt;Harder cost control.&lt;/li&gt;
&lt;li&gt;Less predictable output.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are building a content pipeline, those tradeoffs matter. A rewrite step should be fast, cheap, and stable enough to run automatically after the draft is generated.&lt;/p&gt;

&lt;p&gt;The goal is not to hide bad work. The goal is to turn a robotic first draft into text that reads like a person edited it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;AI Text Humanizer API on Apify applies a deterministic humanization pipeline instead of routing the text through another LLM.&lt;/p&gt;

&lt;p&gt;It supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;12 transform passes for phrase cleanup, rhythm changes, sentence variation, and final polish.&lt;/li&gt;
&lt;li&gt;Five writing styles: &lt;code&gt;casual&lt;/code&gt;, &lt;code&gt;professional&lt;/code&gt;, &lt;code&gt;academic&lt;/code&gt;, &lt;code&gt;creative&lt;/code&gt;, and &lt;code&gt;technical&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Three humanization levels: &lt;code&gt;light&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, and &lt;code&gt;heavy&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Before-and-after AI detection scoring.&lt;/li&gt;
&lt;li&gt;Bulk processing for up to 20 texts per request.&lt;/li&gt;
&lt;li&gt;A Standby HTTP API for real-time integrations.&lt;/li&gt;
&lt;li&gt;Standard Apify actor runs for batch workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Actor link: &lt;a href="https://apify.com/george.the.developer/ai-text-humanizer-api" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/ai-text-humanizer-api&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;p&gt;Run it directly on Apify with this input:&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;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Furthermore, it is important to note that artificial intelligence has significantly impacted the landscape of modern technology."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"style"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"casual"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"aggressiveness"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"preserveMeaning"&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="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;The output includes the original text, humanized text, length changes, settings, removed AI phrases, and detection scores before and after the rewrite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Example
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Standby API request
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://george-the-developer--ai-text-humanizer-api.apify.actor/humanize&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Furthermore, it is important to note that AI has revolutionized content production for modern teams.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;professional&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;aggressiveness&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;medium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;preserveMeaning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;humanized&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;detection&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Standard Apify actor run
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ApifyClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;apify-client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;george.the.developer/ai-text-humanizer-api&lt;/span&gt;&lt;span class="dl"&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="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;In conclusion, leveraging robust solutions provides a comprehensive advantage for organizations.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;casual&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;aggressiveness&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;medium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;preserveMeaning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&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="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;listItems&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;humanized&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Bulk processing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://george-the-developer--ai-text-humanizer-api.apify.actor/humanize/bulk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;texts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;First AI-generated paragraph...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;casual&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Second AI-generated paragraph...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;professional&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Third AI-generated paragraph...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;technical&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;aggressiveness&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;medium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;humanized&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What the Output Gives You
&lt;/h2&gt;

&lt;p&gt;A humanization API is more useful when it returns more than rewritten text.&lt;/p&gt;

&lt;p&gt;This actor returns a before-and-after view:&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;"original"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Furthermore, it is important to note that..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"humanized"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"It is worth noting that..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"originalLength"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;142&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"humanizedLength"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;98&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"detection"&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;"before"&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;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;87&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"verdict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ai_generated"&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;"after"&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;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;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;"verdict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"likely_human"&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;"improvement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;56&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;"settings"&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;"style"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"casual"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"aggressiveness"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"preserveMeaning"&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="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="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That makes the tool easier to automate. You can reject weak rewrites, retry with &lt;code&gt;heavy&lt;/code&gt;, or route content to manual review when the score does not improve enough.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  AI content pipelines
&lt;/h3&gt;

&lt;p&gt;Generate a first draft with an LLM, then run the output through the humanizer as the final editing step before publishing.&lt;/p&gt;

&lt;h3&gt;
  
  
  SEO content operations
&lt;/h3&gt;

&lt;p&gt;Turn structured outlines and AI drafts into copy with more natural sentence rhythm, fewer repeated transitions, and less template-like phrasing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agency deliverables
&lt;/h3&gt;

&lt;p&gt;Agencies can standardize the last-mile editing step across blog posts, product descriptions, newsletters, and client reports.&lt;/p&gt;

&lt;h3&gt;
  
  
  Email and LinkedIn copy
&lt;/h3&gt;

&lt;p&gt;Cold messages that sound like an AI template get ignored quickly. Use a lighter style pass to make generated copy less stiff before it enters an outreach workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI agent output
&lt;/h3&gt;

&lt;p&gt;If an agent writes summaries, reports, or recommendations, add humanization before the final response is saved, emailed, or posted.&lt;/p&gt;

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

&lt;p&gt;AI Text Humanizer API uses Pay Per Event pricing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$0.003 per text humanized.&lt;/li&gt;
&lt;li&gt;100 texts cost $0.30.&lt;/li&gt;
&lt;li&gt;1,000 texts cost $3.00.&lt;/li&gt;
&lt;li&gt;10,000 texts cost $30.00.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Detection-only requests are free according to the actor documentation. Bulk humanization charges per text.&lt;/p&gt;

&lt;h2&gt;
  
  
  Style Guide
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;casual&lt;/code&gt; for blog posts, social copy, newsletters, and everyday writing.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;professional&lt;/code&gt; for LinkedIn posts, client reports, sales copy, and business communication.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;academic&lt;/code&gt; for research-adjacent writing where the tone needs to stay formal.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;creative&lt;/code&gt; for storytelling, brand copy, and more expressive articles.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;technical&lt;/code&gt; for documentation, API guides, and engineering writing where precision matters.&lt;/p&gt;

&lt;p&gt;For aggressiveness:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with &lt;code&gt;medium&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;light&lt;/code&gt; when preserving structure is more important than changing tone.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;heavy&lt;/code&gt; when the original draft is highly formulaic.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is this another GPT wrapper?
&lt;/h3&gt;

&lt;p&gt;No. The actor documentation describes it as a deterministic transform pipeline with no external API calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does it preserve meaning?
&lt;/h3&gt;

&lt;p&gt;The input schema includes &lt;code&gt;preserveMeaning&lt;/code&gt;, and it defaults to &lt;code&gt;true&lt;/code&gt;. For sensitive content, still review the output before publishing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I process multiple texts at once?
&lt;/h3&gt;

&lt;p&gt;Yes. The bulk endpoint supports up to 20 texts per request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I only run AI detection?
&lt;/h3&gt;

&lt;p&gt;Yes. The actor includes detection endpoints for checking text without humanizing it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I use this to misrepresent authorship?
&lt;/h3&gt;

&lt;p&gt;No. Treat it like an editing tool. It is best used to improve drafts you are responsible for, not to hide dishonest or low-quality work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;p&gt;Run AI Text Humanizer API on Apify:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/george.the.developer/ai-text-humanizer-api" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/ai-text-humanizer-api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use it as a final polish step in content pipelines, AI agents, agency workflows, and automated publishing systems.&lt;/p&gt;

</description>
      <category>apify</category>
      <category>api</category>
      <category>ai</category>
      <category>content</category>
    </item>
    <item>
      <title>Validate Emails Before Cold Outreach: MX, SMTP, and Disposable Checks in One API</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Sat, 30 May 2026 05:33:12 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/validate-emails-before-cold-outreach-mx-smtp-and-disposable-checks-in-one-api-3idc</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/validate-emails-before-cold-outreach-mx-smtp-and-disposable-checks-in-one-api-3idc</guid>
      <description>&lt;p&gt;Cold outreach fails faster when the email list is dirty.&lt;/p&gt;

&lt;p&gt;It is not only the obvious typos. A list can be full of addresses that look valid but point to domains with no mail servers, disposable inboxes, free providers that do not match a B2B campaign, role-based inboxes like &lt;code&gt;info@&lt;/code&gt; or &lt;code&gt;support@&lt;/code&gt;, and mailboxes that reject SMTP delivery.&lt;/p&gt;

&lt;p&gt;If you send to those addresses, you pay for the mistake twice. First you waste credits in the sending tool. Then you damage the sender reputation you need for the next campaign.&lt;/p&gt;

&lt;p&gt;The better workflow is simple: validate before you send.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Most prospecting workflows treat email validation as a cleanup step at the end. That is backwards.&lt;/p&gt;

&lt;p&gt;By the time a bad email reaches the final CSV, it may already be attached to a CRM record, an outreach sequence, a lead score, or an automation rule. Removing it later creates a second data-cleaning job.&lt;/p&gt;

&lt;p&gt;The real goal is not "check if this string has an at sign." The real goal is to answer practical questions before the email ever gets used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the email formatted correctly?&lt;/li&gt;
&lt;li&gt;Does the domain have MX records?&lt;/li&gt;
&lt;li&gt;Is the address from a disposable provider?&lt;/li&gt;
&lt;li&gt;Is it a role-based inbox?&lt;/li&gt;
&lt;li&gt;Is it a free provider instead of a company domain?&lt;/li&gt;
&lt;li&gt;Does the SMTP server accept the mailbox?&lt;/li&gt;
&lt;li&gt;Should this lead be sent, reviewed, or discarded?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the job of an email validation API.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;Email Validator API on Apify validates addresses with a five-layer pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Format validation.&lt;/li&gt;
&lt;li&gt;Disposable or temporary domain detection.&lt;/li&gt;
&lt;li&gt;Role-based inbox detection.&lt;/li&gt;
&lt;li&gt;MX record lookup.&lt;/li&gt;
&lt;li&gt;SMTP mailbox verification.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The actor also returns a 0-100 confidence score, domain-level flags, MX records, and the reason behind the result. That makes it useful for more than a pass/fail check. You can use the output to route leads into different follow-up paths.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;valid=true&lt;/code&gt; and &lt;code&gt;score &amp;gt;= 60&lt;/code&gt;: safe to keep.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;is_disposable=true&lt;/code&gt;: remove before CRM import.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;is_free=true&lt;/code&gt;: keep for consumer campaigns, review for B2B.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;is_role_based=true&lt;/code&gt;: useful for company contact, weak for personal outreach.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mx_found=false&lt;/code&gt;: discard or enrich from another source.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Actor link: &lt;a href="https://apify.com/george.the.developer/email-validator-api" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/email-validator-api&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;p&gt;Use the Apify Store page to run it directly:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the actor on Apify.&lt;/li&gt;
&lt;li&gt;Enter one &lt;code&gt;email&lt;/code&gt;, or pass an &lt;code&gt;emails&lt;/code&gt; array for a batch.&lt;/li&gt;
&lt;li&gt;Choose &lt;code&gt;validate&lt;/code&gt;, &lt;code&gt;disposable&lt;/code&gt;, or &lt;code&gt;bulk&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run the actor and export the dataset as JSON, CSV, Excel, or through the Apify API.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The input schema supports:&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;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bulk"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emails"&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="s2"&gt;"founder@company.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"sales@gmail.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"fake@mailinator.com"&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="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For real-time API use, copy the actor's Standby URL from Apify and call the HTTP endpoints directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Example
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Batch validation with Standby
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;standbyUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;EMAIL_VALIDATOR_STANDBY_URL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;standbyUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/validate/bulk`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;emails&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;founder@company.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sales@gmail.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fake@mailinator.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cleanList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;valid&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;is_disposable&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cleanList&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your Standby endpoint requires authentication, add an Apify bearer token from an environment variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Standard Apify actor run
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ApifyClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;apify-client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;george.the.developer/email-validator-api&lt;/span&gt;&lt;span class="dl"&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="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bulk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;emails&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;founder@company.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sales@gmail.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fake@mailinator.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&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="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;listItems&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sendable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;valid&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
  &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;is_disposable&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sendable&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Example Output
&lt;/h2&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;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hello@stripe.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;"valid"&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;"format_valid"&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;"mx_found"&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;"smtp_check"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"valid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"is_disposable"&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;"is_free"&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;"is_role_based"&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;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stripe.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;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Valid email address"&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;That output is structured enough to plug straight into a lead scoring workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Clean a scraped lead list
&lt;/h3&gt;

&lt;p&gt;If you scrape websites, directories, or company pages, validate emails before pushing them to a CRM. Keep valid business emails, flag free-provider emails, and remove disposable inboxes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Protect cold email deliverability
&lt;/h3&gt;

&lt;p&gt;High bounce rates are expensive. Run new prospects through validation before they enter an outreach sequence, then route risky addresses into manual review.&lt;/p&gt;

&lt;h3&gt;
  
  
  Block disposable signups
&lt;/h3&gt;

&lt;p&gt;For SaaS forms, waitlists, and gated content, use disposable detection to block temporary inboxes before they become low-quality accounts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Score B2B leads
&lt;/h3&gt;

&lt;p&gt;An email from a company domain is usually stronger than a free-provider address for B2B outbound. The API returns &lt;code&gt;is_free&lt;/code&gt;, &lt;code&gt;is_role_based&lt;/code&gt;, and &lt;code&gt;domain&lt;/code&gt;, so you can add those signals to your score.&lt;/p&gt;

&lt;h3&gt;
  
  
  Audit old CRM records
&lt;/h3&gt;

&lt;p&gt;Old lead databases decay. Run stale records through the validator before reactivation campaigns so you do not wake up a list with avoidable bounces.&lt;/p&gt;

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

&lt;p&gt;Email Validator API uses Pay Per Event pricing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$0.002 per email validated.&lt;/li&gt;
&lt;li&gt;100 emails cost $0.20.&lt;/li&gt;
&lt;li&gt;1,000 emails cost $2.00.&lt;/li&gt;
&lt;li&gt;10,000 emails cost $20.00.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bulk requests charge per email in the batch. The current input schema supports up to 50 emails per bulk request.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does this only check email syntax?
&lt;/h3&gt;

&lt;p&gt;No. Syntax is just the first layer. The API also checks disposable domains, role-based inboxes, MX records, SMTP response, free-provider status, and a confidence score.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use it without writing code?
&lt;/h3&gt;

&lt;p&gt;Yes. Run the actor from Apify, paste one email or a JSON array, and export the dataset when the run finishes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use it in a real-time app?
&lt;/h3&gt;

&lt;p&gt;Yes. The actor supports Standby mode, so you can call HTTP endpoints such as &lt;code&gt;/validate&lt;/code&gt;, &lt;code&gt;/disposable&lt;/code&gt;, and &lt;code&gt;/validate/bulk&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I remove every role-based address?
&lt;/h3&gt;

&lt;p&gt;Not always. &lt;code&gt;info@&lt;/code&gt;, &lt;code&gt;sales@&lt;/code&gt;, and &lt;code&gt;support@&lt;/code&gt; can still be useful for general company contact. They are weaker for personalized outbound, so the best move is to route them differently instead of treating them like personal inboxes.&lt;/p&gt;

&lt;h3&gt;
  
  
  What should my minimum score be?
&lt;/h3&gt;

&lt;p&gt;Start with &lt;code&gt;valid=true&lt;/code&gt;, &lt;code&gt;score &amp;gt;= 60&lt;/code&gt;, &lt;code&gt;mx_found=true&lt;/code&gt;, and &lt;code&gt;is_disposable=false&lt;/code&gt;. Tighten the rule if you are protecting a high-value sending domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;p&gt;Run Email Validator API on Apify:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/george.the.developer/email-validator-api" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/email-validator-api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use it before a campaign, before CRM import, or directly inside a lead generation pipeline.&lt;/p&gt;

</description>
      <category>apify</category>
      <category>email</category>
      <category>api</category>
      <category>leadgeneration</category>
    </item>
    <item>
      <title>Seven new Apify actors in two days: healthcare, AI infra, GovCon, real estate</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Thu, 14 May 2026 01:01:06 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/seven-new-apify-actors-in-two-days-healthcare-ai-infra-govcon-real-estate-2io4</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/seven-new-apify-actors-in-two-days-healthcare-ai-infra-govcon-real-estate-2io4</guid>
      <description>&lt;h1&gt;
  
  
  Seven new Apify actors in two days
&lt;/h1&gt;

&lt;p&gt;Two day sprint. Codex did the per-actor source code, I orchestrated and verified each one against real data. All seven live on Apify Store. Pay per event pricing activates 2026-05-26.&lt;/p&gt;

&lt;p&gt;Each one targets a specific buyer category with a real budget. Not generic scrapers, not toy demos. Numbers on what each one does and which buyers should care.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Hospital Price Transparency MRF Normalizer
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/george-the-developer/hospital-mrf-normalizer" rel="noopener noreferrer"&gt;Store link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CMS enforcement of the hospital price transparency rule tightened in April 2026. Every US hospital publishes a machine readable file of negotiated rates by payer and procedure, but the files are gigantic and inconsistent. CMS v2 JSON, CMS v3 JSON, CSV with column drift between hospitals.&lt;/p&gt;

&lt;p&gt;This actor wraps the parsing into one Standby API. Detects format automatically (gzip, JSON, CSV), streams the file, normalizes each row to one schema with payer, plan, billing code, code type, negotiated rate, methodology, expiration date.&lt;/p&gt;

&lt;p&gt;Pricing: $0.50 per start, $0.002 per rate row, $0.02 per provider procedure payer bundle.&lt;/p&gt;

&lt;p&gt;Verified live test: Cooper University Hospital CSV returned 13 normalized rows including Aetna Better Health at code 0042T (HCPCS) for $272.44 negotiated.&lt;/p&gt;

&lt;p&gt;Buyers: health cost transparency platforms (Amino, Cedar, Healthcare Bluebook), employer benefits tools (Castlight, Garner, Transcarent), TPA and PPO operators (Zelis, MultiPlan).&lt;/p&gt;

&lt;h2&gt;
  
  
  2. MCP Server Registry and Security Scorer
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/george-the-developer/mcp-server-registry-scorer" rel="noopener noreferrer"&gt;Store link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Anthropic Model Context Protocol exploded past 22,000 servers indexed on Glama. Agent platforms admitting MCP servers do it by README and stars and hope.&lt;/p&gt;

&lt;p&gt;This actor joins the official Anthropic registry with npm package metadata (downloads, first published date, maintainer count), GitHub repo data (stars, archived, last commit, open issues), and produces a deterministic risk score per server. Signals: missing repo, archived, stale 90 days, unknown publisher, no license, weird tool count, registered but never built, single maintainer npm, advisory match.&lt;/p&gt;

&lt;p&gt;Score lands 0 to 100 in bands low, medium, high, critical. Same input always returns same score, no LLM in the loop.&lt;/p&gt;

&lt;p&gt;Pricing: $0.50 per start, $0.025 per server profile, $0.15 per full security scan.&lt;/p&gt;

&lt;p&gt;Verified live test: &lt;code&gt;ac.inference.sh/mcp&lt;/code&gt; server flagged risk 70 (high) because no repo link, no license, unknown publisher, remote only transport.&lt;/p&gt;

&lt;p&gt;Buyers: agent platform admission control (Docker MCP Toolkit, Cursor, Continue, Windsurf), enterprise AI governance teams, MCP marketplace ranking signals, dev tool risk dashboards.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. FDA Warning Letter and Enforcement Monitor
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/george-the-developer/fda-warning-letter-monitor" rel="noopener noreferrer"&gt;Store link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FDA published warning letters on a static index page that everyone in regulated industries needs to read but nobody wants to scrape. The April 2026 GLP-1 and telehealth enforcement push made this even more urgent.&lt;/p&gt;

&lt;p&gt;This actor pulls the full letter feed, classifies each letter by topic (GLP-1, telehealth, compounding, manufacturing, biologics, food, advertising, dietary supplement), extracts the recipient company and product line, and rolls everything up into a company level risk brief with letter count, topic mix, time since last letter, and severity signals.&lt;/p&gt;

&lt;p&gt;Pricing: $1 per start, $0.30 per letter, $1.50 per company risk brief.&lt;/p&gt;

&lt;p&gt;Verified live test: CareFusion 213 LLC returned risk band "high" with 4 open enforcement actions tied to manufacturing.&lt;/p&gt;

&lt;p&gt;Buyers: FDA consultants (Redica, Greenleaf Health, ProPharma, RQM Plus, The FDA Group), pharma QA SaaS (AssurX, Sparta, Kneat), med-device legal, telehealth ops.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Clinical Trial Investigator and Site Intelligence
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/george-the-developer/clinical-trial-investigator-intel" rel="noopener noreferrer"&gt;Store link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CROs and sponsors at any scale rebuild the same data join for every new study. ClinicalTrials.gov plus NPI Registry plus OpenPayments plus PubMed publication count plus geo cluster of sites. The data is public, the join is mechanical, but everyone rebuilds it in a half maintained Python script.&lt;/p&gt;

&lt;p&gt;This actor wraps the join into one Standby API. Query by condition or NCT id, get investigator profiles with NPI, OpenPayments dollar totals by company, publication counts, trial history broken down by phase, and a deterministic site fit score for each location.&lt;/p&gt;

&lt;p&gt;Pricing: $1 per start, $0.10 per investigator profile, $0.50 per site fit row.&lt;/p&gt;

&lt;p&gt;Verified live test: glioblastoma phase 2 query returned Thomas J Kaley MD at Memorial Sloan Kettering with NPI 1578721858, full therapeutic area list, and complete trial history.&lt;/p&gt;

&lt;p&gt;Buyers: top 5 CROs (IQVIA, ICON, Parexel, Medidata, Veeva), clinical site networks (Advarra, Clinitiative), patient recruitment platforms (LINEA), sponsor BD teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Federal Contract Opportunity Monitor
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/george-the-developer/federal-contract-opportunity-monitor" rel="noopener noreferrer"&gt;Store link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SAM.gov publishes federal contract opportunities hourly. USAspending publishes awarded contracts with recipient data. Joining them and tagging by topic is the daily grind for federal sales teams and GovCon advisors. Bloomberg Government and Govini do this at enterprise pricing.&lt;/p&gt;

&lt;p&gt;This actor pulls SAM.gov internal search (no API key required) plus USAspending POST endpoint, normalizes both into one schema, tags opportunities by topic keyword (configurable per user), and produces partnership leads: which prime contractors won similar work recently and at what value.&lt;/p&gt;

&lt;p&gt;Pricing: $1 per start, $0.10 per opportunity, $0.50 per partnership lead.&lt;/p&gt;

&lt;p&gt;Verified live test: &lt;code&gt;/leads?keyword=consulting&amp;amp;awarded_amount_min=100000&lt;/code&gt; returned General Dynamics IT with 2 recent awards totaling $1.7 billion, lead band "priority", top buying agency Department of State.&lt;/p&gt;

&lt;p&gt;Buyers: GovCon advisors (Govini, Deltek, EZGovOpps), federal sales teams at MSPs and consulting firms, subcontract introduction services, state and local procurement intel.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. LLM Provider Price and Latency Monitor
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/george-the-developer/llm-provider-price-latency-monitor" rel="noopener noreferrer"&gt;Store link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;LLM gateways and agent platforms route across 5 to 10 providers. Pricing changes weekly. OpenRouter aggregates in a UI but does not publish it as a clean JSON ingestion feed. Most teams maintain their own scraper.&lt;/p&gt;

&lt;p&gt;This actor wraps OpenRouter as canonical (200+ models, no auth), falls back to scraping OpenAI, Anthropic, Together, and Groq pricing pages when a model is missing, and returns a normalized snapshot per model with prompt and completion price per 1M tokens, context length, capability flags (vision, tools, JSON mode), and provider routing list.&lt;/p&gt;

&lt;p&gt;A second endpoint produces cross provider benchmark rows: same model family, multiple providers, cost per 1k chat pair, multiplier from cheapest to most expensive.&lt;/p&gt;

&lt;p&gt;Pricing: $0.50 per start, $0.025 per model snapshot, $0.15 per benchmark row.&lt;/p&gt;

&lt;p&gt;Verified live test: &lt;code&gt;/models?provider=anthropic&amp;amp;limit=3&lt;/code&gt; returned 3 Anthropic models with full pricing populated. Benchmark endpoint returned 2 cross provider rows with cheapest_provider field.&lt;/p&gt;

&lt;p&gt;Buyers: LLM gateway operators (Portkey, Helicone, LiteLLM), agent platform model admission, FinOps cost per task budgeting, AI engineering team weekly digests.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Multi City Building Permit Aggregator
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/george-the-developer/multi-city-building-permit-aggregator" rel="noopener noreferrer"&gt;Store link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each US city publishes building permit data in its own JSON shape. NYC moved their authoritative feed from the old DOB Issuance dataset to DOB NOW in 2024 and broke every scraper that hardcoded the old IDs.&lt;/p&gt;

&lt;p&gt;This actor wraps NYC and Chicago open data portals into one schema. Per permit you get permit type, status, work type, estimated cost, address with GPS, ZIP, block lot, builder business name, builder license, property business name. A second endpoint produces a builder activity roundup for any business name.&lt;/p&gt;

&lt;p&gt;Pricing: $1 per start, $0.05 per permit row, $0.30 per builder activity roundup.&lt;/p&gt;

&lt;p&gt;Verified live test: COSTELLO CONSTRUCTION roundup returned 88 permits over 3 years for $3 million total value, top property businesses served (Flushing Hospital Medical Center, Jerome Avenue SM Realty LLC), top permit types, top ZIP codes, activity tier "high volume".&lt;/p&gt;

&lt;p&gt;Buyers: construction supply distributors planning territories, contractor SaaS lead enrichment (ServiceTitan, Jobber, Buildertrend), real estate investor research, market research firms.&lt;/p&gt;

&lt;h2&gt;
  
  
  What activation looks like
&lt;/h2&gt;

&lt;p&gt;Pricing activates 2026-05-26 for the first 5 actors and 2026-05-27 for the last 2. Until then runs are free for testers who want to validate the schema.&lt;/p&gt;

&lt;p&gt;If any of the buyer categories above describes your work, drop a free trial test at the contact info in each Store listing. Sample data on one company or condition of your choice gets returned within the day.&lt;/p&gt;

&lt;p&gt;If you want to follow what each actor earns at first activation, the monthly digest goes out via &lt;a href="https://x.com/ai_in_it" rel="noopener noreferrer"&gt;@ai_in_it on X&lt;/a&gt; and the &lt;a href="https://github.com/the-ai-entrepreneur-ai-hub/apify-actor-portfolio" rel="noopener noreferrer"&gt;apify-actor-portfolio repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;George&lt;br&gt;
&lt;a href="https://apify.com/george-the-developer" rel="noopener noreferrer"&gt;george.the.developer on Apify&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Source and verification reports: &lt;a href="https://github.com/the-ai-entrepreneur-ai-hub/apify-actor-portfolio/blob/main/articles/2026-05-13-seven-actors-launch.md" rel="noopener noreferrer"&gt;github.com/the-ai-entrepreneur-ai-hub/apify-actor-portfolio&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I built a $0.002 email validator because ZeroBounce was killing my margins on a freelance gig</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Tue, 05 May 2026 20:47:08 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/i-built-a-0002-email-validator-because-zerobounce-was-killing-my-margins-on-a-freelance-gig-3dag</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/i-built-a-0002-email-validator-because-zerobounce-was-killing-my-margins-on-a-freelance-gig-3dag</guid>
      <description>&lt;p&gt;A client paid me a fixed fee to clean a 47k email list. Sounded fine on paper. Then I priced the verification step.&lt;/p&gt;

&lt;p&gt;ZeroBounce minimum is 2,000 credits for $39, so $0.0195 per email at the cheapest pay-as-you-go rate. Their subscription gets you to about $0.0099 per email at 10k volume. For my 47k list that is $462 PAYG or $235 if I commit to a monthly plan I will not need next month. The freelance fee was a flat number. The math was getting ugly.&lt;/p&gt;

&lt;p&gt;I have an Apify account and a small list of standby actors that bill per call. So I went to check what an SMTP MX validator actually costs to run.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is in a real validation
&lt;/h2&gt;

&lt;p&gt;If you scope it tight there are five checks that catch most of the garbage:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;RFC 5322 syntax (regex on the local part and domain).&lt;/li&gt;
&lt;li&gt;Disposable domain list (Mailinator, 10MinuteMail, 1.4k entries that move slowly).&lt;/li&gt;
&lt;li&gt;Free provider tag (Gmail, Yahoo, etc, useful for B2B scoring not deliverability).&lt;/li&gt;
&lt;li&gt;MX record lookup via DNS.&lt;/li&gt;
&lt;li&gt;Optional SMTP handshake that opens a TCP connection to the MX host on port 25 and reads the banner. No data sent.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first four are local computation. Microseconds. The SMTP step is the only thing that costs a network round trip and most ISPs will give you a clean answer in under 2 seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The actor
&lt;/h2&gt;

&lt;p&gt;I wrote it as a standby HTTP server on Apify. One endpoint, JSON in, JSON out. Billed per email via &lt;code&gt;Actor.charge&lt;/code&gt;. Pay only on a successful return.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s1"&gt;'https://george-the-developer--email-validator-api.apify.actor/?token=YOUR_TOKEN'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"email":"someone@somewhere.com"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns:&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;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"someone@somewhere.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;"valid_syntax"&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;"is_disposable"&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;"is_free"&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;"mx_records"&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;"mail.somewhere.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;"smtp_check"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deliverable"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.95&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;Per call cost is $0.002. For my 47k list that came out to roughly $94 of compute, not $462. The shape of the gig changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
  Client[Client API call] --&amp;gt; Standby[Apify Standby Actor]
  Standby --&amp;gt; Syntax[RFC 5322 check]
  Syntax --&amp;gt; Disposable[Disposable domain list]
  Disposable --&amp;gt; MX[DNS MX lookup]
  MX --&amp;gt; SMTP[SMTP handshake on :25]
  SMTP --&amp;gt; Charge[Actor.charge per email]
  Charge --&amp;gt; Resp[(JSON response)]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What it does not do
&lt;/h2&gt;

&lt;p&gt;I want to be honest about scope. It does not do role-based detection beyond a simple list of &lt;code&gt;info@&lt;/code&gt;, &lt;code&gt;support@&lt;/code&gt;, &lt;code&gt;sales@&lt;/code&gt;, etc. It does not do toxicity scoring or abuse history, that needs a paid feed. It does not catch every catch-all domain, which is a known industry problem and not solvable with public DNS alone. ZeroBounce charges more partly because they aggregate proprietary signals from their customer base. Worth it if you are validating cold lists for cold outreach. Less worth it if you are cleaning a list of people who already opted in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Per call vs flat subscription
&lt;/h2&gt;

&lt;p&gt;The shape that bugged me about SaaS validators is the cap. You pay $79 a month and you get a fixed bucket of credits. If your usage is bursty (one client every few weeks) most of that bucket evaporates. If your usage is steady the math works out. But solo and freelance work is bursty by definition. Per call billing matches the work. No cap, no commitment, just a number per email.&lt;/p&gt;

&lt;h2&gt;
  
  
  Numbers from the gig
&lt;/h2&gt;

&lt;p&gt;47,219 emails through the actor. Run completed in 38 minutes on the lowest memory tier. About 3.1k emails came back as undeliverable, 1.2k as disposable, 41.5k as deliverable. The client took the cleaned list and ran their own send. I did not have to think about a credit pool.&lt;/p&gt;

&lt;h2&gt;
  
  
  When this is the wrong call
&lt;/h2&gt;

&lt;p&gt;If you are running enterprise email marketing at 10M sends a month, ZeroBounce or NeverBounce or Bouncer probably fit you. They have account managers, SLA contracts, GDPR paperwork. I am one developer with an Apify account. If you need that other thing, go pay for it.&lt;/p&gt;

&lt;p&gt;If you are a freelancer cleaning a list, or a small agency that runs verification once a month, per call billing solves your specific problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Actor is at apify.com/george.the.developer/email-validator-api. Free to try if you have an Apify account, billed per call. Source for the docs and curl examples is at github.com/the-ai-entrepreneur-ai-hub/email-validator-api-docs (I keep the actor itself private but the call surface is documented).&lt;/p&gt;

&lt;p&gt;If anyone has run into the same SaaS-cap problem with their own freelance gigs, would love to hear what you ended up using.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://theaientrepreneur.hashnode.dev/i-built-a-0002-email-validator-because-zerobounce-was-killing-my-margins-on-a-freelance-gig" rel="noopener noreferrer"&gt;Hashnode&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>4 days to lock in current LinkedIn scraper pricing</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Fri, 01 May 2026 08:24:24 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/4-days-to-lock-in-current-linkedin-scraper-pricing-5elg</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/4-days-to-lock-in-current-linkedin-scraper-pricing-5elg</guid>
      <description>&lt;p&gt;Short post. The LinkedIn Company Employees Scraper on my Apify portfolio is raising PPE pricing on May 5. If you have a planned batch coming up, run it before then.&lt;/p&gt;

&lt;p&gt;This is not a marketing nudge. This is an "I auto-disabled half the actor's value because I was losing money on residential proxy and the May 5 fix re-enables it" situation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes May 5
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Old&lt;/th&gt;
&lt;th&gt;New&lt;/th&gt;
&lt;th&gt;Multiplier&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;short-profile&lt;/td&gt;
&lt;td&gt;$0.003&lt;/td&gt;
&lt;td&gt;$0.009&lt;/td&gt;
&lt;td&gt;3x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;full-profile&lt;/td&gt;
&lt;td&gt;$0.006&lt;/td&gt;
&lt;td&gt;$0.015&lt;/td&gt;
&lt;td&gt;2.5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;full-profile-with-email&lt;/td&gt;
&lt;td&gt;$0.01&lt;/td&gt;
&lt;td&gt;$0.025&lt;/td&gt;
&lt;td&gt;2.5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;actor-start&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;td&gt;$0.005&lt;/td&gt;
&lt;td&gt;unchanged&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A run that costs $0.10 today would cost about $0.30 after May 5. Same data, same accuracy, same actor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why now
&lt;/h2&gt;

&lt;p&gt;Verification was auto-disabled on April 24 because residential proxy cost was running below the short-profile price. The actor falls back to confidence=low SERP-only output until the May 5 increase reactivates verified mode.&lt;/p&gt;

&lt;p&gt;If you absolutely cannot wait until May 5 for verified data, pass &lt;code&gt;acceptDiscoveryFallback: true&lt;/code&gt; on input. Build 2.2.21+ runs SERP-only at the current $0.003 rate.&lt;/p&gt;

&lt;p&gt;Full breakdown of how the pricing got into this state in the first place:&lt;/p&gt;

&lt;p&gt;theaientrepreneur.hashnode.dev/two-agency-users-were-83-of-my-revenue-they-left-and-i-noticed-29-days-later&lt;/p&gt;

&lt;h2&gt;
  
  
  Three actions if you use this actor
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Run any planned bulk batches before May 5 to lock in current pricing on the events you need.&lt;/li&gt;
&lt;li&gt;Update your maxTotalChargeUsd cap if you have one. The same volume after May 5 needs roughly 3x the cap on short-profile-heavy runs.&lt;/li&gt;
&lt;li&gt;If your pipeline expects verified output and you cannot wait, switch to acceptDiscoveryFallback now to keep getting results at current pricing, with the confidence=low caveat.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What does not change
&lt;/h2&gt;

&lt;p&gt;The actor itself. Same code, same maintenance, same response time. Same author who reads every Discussion thread.&lt;/p&gt;

&lt;p&gt;The May 5 change brings pricing in line with what residential verification costs. After it lands, verification turns back on automatically and your runs return verified worksFor data again at the new rate.&lt;/p&gt;

&lt;h2&gt;
  
  
  When this is the wrong actor for you
&lt;/h2&gt;

&lt;p&gt;If you only need the candidate set and not LinkedIn-verified worksFor data, the SERP-only path at $0.003 stays cheaper than competitors that bundle verification. If you need fully-verified output and your spreadsheet math says $0.009 per profile is too much, my actor is not the right tool. Phantombuster bundles verification at $69/mo for low volume. Bright Data is more expensive but enterprise-grade. Apify itself has 50+ LinkedIn actors, some priced lower for lower-quality verification.&lt;/p&gt;

&lt;p&gt;I run mine at $0.009 because the residential proxy cost behind verification is real. Lower-priced competitors either skip verification, scrape with logged-in cookies (ToS risk), or run at a loss until they shut down (Proxycurl pattern).&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;Run your batches before May 5 if you can. Drop questions on the Apify Discussion thread for the actor if anything is unclear about the change.&lt;/p&gt;

&lt;p&gt;apify.com/george.the.developer/linkedin-company-employees-scraper&lt;/p&gt;

</description>
      <category>apify</category>
      <category>pricing</category>
      <category>scraping</category>
      <category>saas</category>
    </item>
    <item>
      <title>6 Apify actors I actually use myself</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Tue, 28 Apr 2026 19:51:26 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/6-apify-actors-i-actually-use-myself-1n06</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/6-apify-actors-i-actually-use-myself-1n06</guid>
      <description>&lt;p&gt;I have 27 public Apify actors. Most are good. Six are genuinely useful and I run them through n8n and curl on a weekly basis. This is a tour of those six, with the actual prices, sample inputs, and the use cases I built them for.&lt;/p&gt;

&lt;p&gt;If you found me through the silent-churn postmortem from earlier this week, this is the followup people kept asking for: "what else do you have?"&lt;/p&gt;

&lt;h2&gt;
  
  
  1. LinkedIn Company Employees Scraper
&lt;/h2&gt;

&lt;p&gt;apify.com/george.the.developer/linkedin-company-employees-scraper&lt;/p&gt;

&lt;p&gt;The one most people find me through. Takes a LinkedIn company URL, returns the top N employees who match your title filter. Verifies via JA4-accurate TLS fetch on a self-hosted Go service so it does not need login cookies and does not get flagged as a bot.&lt;/p&gt;

&lt;p&gt;Sample input:&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;"companies"&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;"https://www.linkedin.com/company/stripe"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxEmployees"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"targetTitles"&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;"CEO"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"CTO"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Head of Engineering"&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;Pay per event. $0.005 actor-start, $0.003 per short profile. Hike scheduled for May 5 to $0.009 per short profile to cover residential proxy cost properly.&lt;/p&gt;

&lt;p&gt;Use it for: lead lists, sales prospecting, recruiter sourcing.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Email Validator API
&lt;/h2&gt;

&lt;p&gt;apify.com/george.the.developer/email-validator-api&lt;/p&gt;

&lt;p&gt;Standby HTTP API. Sub-second response. Runs syntax + MX + disposable + role-based + SMTP handshake checks. Pay per event $0.002 per email. Run a list of 50,000 emails and pay $100, not the $375 NeverBounce charges.&lt;/p&gt;

&lt;p&gt;Sample call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://george-the-developer--email-validator-api.apify.actor/validate?email=test@stripe.com'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use it for: pre-flight on cold email lists, signup form fraud filtering, list cleanup before importing to a CRM.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Domain WHOIS Lookup
&lt;/h2&gt;

&lt;p&gt;apify.com/george.the.developer/domain-whois-lookup&lt;/p&gt;

&lt;p&gt;Standby API. Returns registrar, age in days, expiry, DNS records. Falls back to RDAP since 374 gTLDs sunsetted port 43 WHOIS in early 2025. $0.005 per lookup.&lt;/p&gt;

&lt;p&gt;Sample call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'https://george-the-developer--domain-whois-lookup.apify.actor/lookup?domain=stripe.com'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use it for: lead-scoring (domain age is a real signal), security tooling, brand monitoring.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Company Enrichment API
&lt;/h2&gt;

&lt;p&gt;apify.com/george.the.developer/company-enrichment-api&lt;/p&gt;

&lt;p&gt;Domain in, company name + industry + tech stack signals out. Sub-second standby response. $0.01 per call.&lt;/p&gt;

&lt;p&gt;Use it for: enrichment step in a lead-gen pipeline, ICP scoring, account research.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. URL Metadata Extractor
&lt;/h2&gt;

&lt;p&gt;apify.com/george.the.developer/url-metadata-extractor&lt;/p&gt;

&lt;p&gt;OG tags, Twitter cards, favicon, canonical URL, structured data. Anything an AI agent needs to actually understand a page without parsing the full DOM. $0.003 per URL.&lt;/p&gt;

&lt;p&gt;Use it for: content tools that show link previews, AI agents that need to summarize before they read, dashboards that aggregate links.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. AI Content Detector
&lt;/h2&gt;

&lt;p&gt;apify.com/george.the.developer/ai-content-detector&lt;/p&gt;

&lt;p&gt;Text in, AI-probability score out. Uses an LLM-based classifier behind the scenes, not a regex. $0.003 per text.&lt;/p&gt;

&lt;p&gt;Use it for: content moderation pipelines, marketplace listings filtering, dataset cleanup before training.&lt;/p&gt;

&lt;h2&gt;
  
  
  How they fit together
&lt;/h2&gt;

&lt;p&gt;A typical pipeline I see in customer logs looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;LinkedIn Company Employees Scraper finds candidates at a target company&lt;/li&gt;
&lt;li&gt;Each candidate's email gets cleaned through Email Validator&lt;/li&gt;
&lt;li&gt;Their company domain runs through WHOIS Lookup for age signal&lt;/li&gt;
&lt;li&gt;Domain runs through Company Enrichment for industry + tech stack&lt;/li&gt;
&lt;li&gt;Output goes into Hubspot or Pipedrive&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each step is pay per event. If you only need 3 of the 5 steps, you only pay for those events. There is no per-seat or per-month surcharge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest pricing context
&lt;/h2&gt;

&lt;p&gt;I just shipped a billing-guard fix for the LinkedIn actor that prevents it from emitting profiles when the charge would exceed your maxTotalChargeUsd cap. Postmortem on that lives here:&lt;/p&gt;

&lt;p&gt;theaientrepreneur.hashnode.dev/why-my-linkedin-scraper-now-refuses-jobs&lt;/p&gt;

&lt;p&gt;Same gate is rolling out across the standby APIs over the next two weeks. If you used any of these before the fix and your output count did not match your billed events, ping me.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to start
&lt;/h2&gt;

&lt;p&gt;If you do lead generation, start with LinkedIn + Email Validator. That is the chain that produces revenue for users I see in the logs.&lt;/p&gt;

&lt;p&gt;If you do content moderation or AI agent work, start with URL Metadata Extractor + AI Content Detector. They both return clean JSON in well under a second.&lt;/p&gt;

&lt;p&gt;If you do security or domain research, start with WHOIS + Company Enrichment.&lt;/p&gt;

&lt;p&gt;All six work standalone. All six bill per event, not per seat. None require API key contortions, just an Apify token and a curl.&lt;/p&gt;

&lt;p&gt;apify.com/george.the.developer&lt;/p&gt;

</description>
      <category>apify</category>
      <category>scraping</category>
      <category>indiehackers</category>
      <category>saas</category>
    </item>
    <item>
      <title>What I shipped after the $540 silent churn postmortem</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Sat, 25 Apr 2026 08:24:18 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/what-i-shipped-after-the-540-silent-churn-postmortem-hmk</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/what-i-shipped-after-the-540-silent-churn-postmortem-hmk</guid>
      <description>&lt;p&gt;Yesterday I posted a postmortem on losing $540 a month to silent user churn. Some folks asked what the actual fix was. This is that post. Less drama, more code, three concrete patches that went live today.&lt;/p&gt;

&lt;p&gt;If you missed yesterday: &lt;a href="https://theaientrepreneur.hashnode.dev/two-agency-users-were-83-of-my-revenue-they-left-and-i-noticed-29-days-later" rel="noopener noreferrer"&gt;https://theaientrepreneur.hashnode.dev/two-agency-users-were-83-of-my-revenue-they-left-and-i-noticed-29-days-later&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I started digging into why my LinkedIn employee scraper was bleeding compute on real user runs, I found it was not one bug. It was three, layered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug one: push first, charge second
&lt;/h2&gt;

&lt;p&gt;Every Apify pay per event tutorial shows you Actor.charge('event-name', { count: 1 }). Easy. What none of them stress is what happens when the charge call fails.&lt;/p&gt;

&lt;p&gt;There are at least three live failure modes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The user set maxTotalChargeUsd on the run. They hit it. Charge returns chargedCount: 0.&lt;/li&gt;
&lt;li&gt;Apify itself returns eventChargeLimitReached: true mid run.&lt;/li&gt;
&lt;li&gt;The platform throws a transient error your try/catch swallows.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My actor's loop was structured like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pushData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;count&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;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`charge failed: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// the loop keeps going regardless&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Push first, charge second, swallow errors, keep looping. So if charge stopped working halfway through a 100 profile run, the actor cheerfully output the remaining 50 for free while still spending real proxy and SERP money. The user got 100 profiles. I got billed for 50.&lt;/p&gt;

&lt;p&gt;That is exactly the kind of leak you only notice when you stare at a per run cost graph and wonder why your revenue line is growing slower than your cost line.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: a charge gate that fails closed
&lt;/h2&gt;

&lt;p&gt;The new code calls a small helper before every emit. If charge fails for any reason, the gate refuses every subsequent call without even trying.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createProfileChargeGate&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;isPPE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;actorCharge&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stats&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;chargeLimitReached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;hasChargeLimitReached&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;chargeLimitReached&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;chargeForNextProfile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isPPE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;canEmit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;charged&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;not-ppe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;chargeLimitReached&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;canEmit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;charged&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;charge-limit-reached&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

            &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;actorCharge&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;count&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;eventChargeLimitReached&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nx"&gt;chargeLimitReached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;canEmit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;charged&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;charge-limit-reached&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;charged&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;chargedCount&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;charged&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="nx"&gt;chargeLimitReached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;canEmit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;charged&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;not-charged&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;totalCharges&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;totalCharges&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;charged&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;canEmit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;charged&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;charged&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;chargeLimitReached&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;canEmit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;charged&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;charge-error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&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 main loop now does:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;gate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createProfileChargeGate&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;isPPE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;actorCharge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;charge&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stats&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;profile&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;profiles&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;verdict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;gate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chargeForNextProfile&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;verdict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;canEmit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Stopping at &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;totalCharges&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; profiles, gate refused: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;verdict&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;Actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pushData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the gate has refused, every call short circuits without trying to charge again. The run wraps up gracefully instead of bleeding compute on uncharged output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug two: jobs that should never start
&lt;/h2&gt;

&lt;p&gt;The second class of bug is the job that should not have run at all. A user sets companyCount 200, targetTitles 30, maxEmployees 1, hits Run, and watches my actor burn proxy and verification cost while emitting almost nothing.&lt;/p&gt;

&lt;p&gt;The math is approachable. Per company you do roughly basePages + targetTitleCount SERP requests at about $0.0025 each, plus a verification attempt budget at about $0.0004 each. Per profile emitted you collect actorStartPriceUsd + shortProfilePriceUsd, then Apify takes 20% platform share off the top.&lt;/p&gt;

&lt;p&gt;So a preflight estimator can compute estimatedPlatformCostUsd and estimatedCreatorRevenueUsd before any compute happens.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;buildMarginPreflightEstimate&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="nx"&gt;companyCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;targetTitleCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxEmployees&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;verifyEnabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;actorStartPriceUsd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;shortProfilePriceUsd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;creatorRevenueShare&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;serpCostUsd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;verificationAttemptCostUsd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxCostToCreatorRevenueRatio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;basePages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getBaseSerpPagesPerCompany&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;maxEmployees&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;verifyEnabled&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;serpRequests&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;companyCount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;basePages&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;targetTitleCount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;verificationAttempts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;verifyEnabled&lt;/span&gt;
        &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;companyCount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;getInitialVerificationCandidateLimit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;companyCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxEmployees&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;estimatedProfiles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;companyCount&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;maxEmployees&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;estimatedPlatformCostUsd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;serpRequests&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;serpCostUsd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;verificationAttempts&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;verificationAttemptCostUsd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;estimatedCreatorRevenueUsd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;actorStartPriceUsd&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;estimatedProfiles&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;shortProfilePriceUsd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;creatorRevenueShare&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;estimatedCreatorRevenueUsd&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nx"&gt;estimatedPlatformCostUsd&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;estimatedCreatorRevenueUsd&lt;/span&gt;
        &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;Infinity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;exceedsMarginBudget&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ratio&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;maxCostToCreatorRevenueRatio&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;estimatedPlatformCostUsd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;estimatedCreatorRevenueUsd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ratio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;exceedsMarginBudget&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;exceedsMarginBudget&lt;/span&gt;
            &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`Not profitable enough for verified mode. Reduce companies, reduce targetTitles, or increase maxEmployees per company.`&lt;/span&gt;
            &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In main, before any real work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;estimate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exceedsMarginBudget&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Input rejected before run start: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;estimate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;. No PPE events will be charged.`&lt;/span&gt;&lt;span class="p"&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 throw happens before Actor.charge has been called once. The user gets a clear refusal at submit time and pays nothing. They can resubmit with parameters that actually make sense.&lt;/p&gt;

&lt;p&gt;The estimator tests confirm it accepts normal small runs (2 companies, 25 employees each, verified) and rejects the title-heavy 1-employee runs that were the worst offenders.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug three: a default that was too generous
&lt;/h2&gt;

&lt;p&gt;The third change is product taste. Default maxEmployees was 100. That is too many for verified scraping with current LinkedIn block rates. Most users wanted 10 to 20 anyway and just left the default. The new default is 25.&lt;/p&gt;

&lt;p&gt;If you really want 100 verified profiles per company, type 100 explicitly. Acknowledging it costs you a keystroke instead of nothing.&lt;/p&gt;

&lt;p&gt;Small change, real impact. The new default protected at least one user yesterday from accidentally triggering the margin preflight refusal.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means if you use the actor
&lt;/h2&gt;

&lt;p&gt;Three things you will notice in the build that went live today:&lt;/p&gt;

&lt;p&gt;You will not get billed for partial runs where charge stopped working. Either the run completes and you pay for everything you got, or it stops mid run and you pay nothing past the limit, never both.&lt;/p&gt;

&lt;p&gt;You will get rejected at submit time if your input is structurally unprofitable. The error message tells you exactly which knob to turn.&lt;/p&gt;

&lt;p&gt;You will be defaulted into a smaller, faster run. Big jobs are still possible, you just have to opt in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I am doing next
&lt;/h2&gt;

&lt;p&gt;The same three patterns apply to most of my PPE actors. The charge gate is already a module. I will be rolling it across the rest of the portfolio over the next week:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI Content Detector&lt;/li&gt;
&lt;li&gt;Email Validator API&lt;/li&gt;
&lt;li&gt;URL Metadata Extractor&lt;/li&gt;
&lt;li&gt;Domain WHOIS Lookup&lt;/li&gt;
&lt;li&gt;Company Enrichment API&lt;/li&gt;
&lt;li&gt;Website Intelligence API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These already shipped a fix yesterday for a different leak (GPT Store action pings hitting the standby actor with test payloads). The billing gate is the next layer.&lt;/p&gt;

&lt;p&gt;If you build pay per event actors on Apify, take an hour and add a similar gate. The savings show up immediately. Your users start trusting your billing numbers because the numbers actually match the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the actor
&lt;/h2&gt;

&lt;p&gt;The fixes are live as of today's build:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apify.com/george.the.developer/linkedin-company-employees-scraper" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer/linkedin-company-employees-scraper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pass companies as a list of LinkedIn URLs, set maxEmployees explicitly if you want more than 25, and watch the run console. The new guards should make the cost line predictable for the first time since I shipped this thing.&lt;/p&gt;

&lt;p&gt;Yesterday was the diagnosis. Today is the fix. Tomorrow, I find out if anyone other than me actually cares.&lt;/p&gt;

</description>
      <category>apify</category>
      <category>postmortem</category>
      <category>billing</category>
      <category>saas</category>
    </item>
    <item>
      <title>How I lost $540/month in 30 days to silent user churn (and didn't notice)</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Fri, 24 Apr 2026 04:34:05 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/how-i-lost-540month-in-30-days-to-silent-user-churn-and-didnt-notice-4m5c</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/how-i-lost-540month-in-30-days-to-silent-user-churn-and-didnt-notice-4m5c</guid>
      <description>&lt;p&gt;Last week my 30 day profit dropped from $268 to $50 and I assumed it was a bug in the dashboard.&lt;/p&gt;

&lt;p&gt;It wasn't a bug. It was me not paying attention for 29 days straight.&lt;/p&gt;

&lt;p&gt;This is a postmortem of how I lost roughly $540/month from two agency buyers who just quietly stopped running my actor on March 25. I found out on April 23. That's 29 days of ambient denial while every other part of my portfolio was also quietly rotting.&lt;/p&gt;

&lt;p&gt;Writing this partly so I remember the lesson, partly because I know at least three other Apify devs are about to make the same mistake.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;p&gt;I run a bunch of scrapers and APIs on Apify. Here's what the revenue split actually looked like in early April before things went sideways.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Actor&lt;/th&gt;
&lt;th&gt;Users&lt;/th&gt;
&lt;th&gt;Monthly revenue&lt;/th&gt;
&lt;th&gt;% of total&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Google Maps Lead Intel&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;$540&lt;/td&gt;
&lt;td&gt;83%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LinkedIn Employee Scraper&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;$42&lt;/td&gt;
&lt;td&gt;6.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YouTube Transcript&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;$28&lt;/td&gt;
&lt;td&gt;4.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Scholar&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;$14&lt;/td&gt;
&lt;td&gt;2.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email Validator API&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;$11&lt;/td&gt;
&lt;td&gt;1.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Website Intelligence API&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;$8&lt;/td&gt;
&lt;td&gt;1.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Everything else (5 actors)&lt;/td&gt;
&lt;td&gt;188&lt;/td&gt;
&lt;td&gt;$7&lt;/td&gt;
&lt;td&gt;1.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;353&lt;/td&gt;
&lt;td&gt;$650&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read that first row again. Two users. $540. More than the other 351 users combined, by a factor of like 7x.&lt;/p&gt;

&lt;p&gt;I told myself this was fine because the product was working and the buyers were happy. Both things were true in early March. Neither was true by late March. I just didn't know.&lt;/p&gt;

&lt;h2&gt;
  
  
  The silence
&lt;/h2&gt;

&lt;p&gt;March 25 was the last run either agency executed. I didn't flag it because nothing explicit broke. No error email, no angry message, no refund request. My Apify dashboard just showed fewer runs but the rolling 30 day number still looked okay because it was still averaging in the fat weeks from before.&lt;/p&gt;

&lt;p&gt;Here's roughly how the number moved:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Early April: $268 rolling 30d profit. I'm feeling smug.&lt;/li&gt;
&lt;li&gt;Mid April: $92. I figure maybe it's a slow week.&lt;/li&gt;
&lt;li&gt;April 22: $50. I finally open the run logs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the time I looked, the last run from either agency was 29 days ago. Whatever issue they had (I still don't fully know), they decided it wasn't worth telling me about. They just left.&lt;/p&gt;

&lt;p&gt;Agency users don't complain. They just stop paying. If you're building for them, burn that into your forehead.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I found when I actually looked
&lt;/h2&gt;

&lt;p&gt;This is the part that made me feel physically ill. Once I started doing a proper audit of my portfolio, I found that 6 of my other 10 monetized actors were broken in some way. Not all catastrophic. Some were returning partial data. One had a silently failing selector from a site redesign in February. One was charging $0 per run because of a broken &lt;code&gt;Actor.charge()&lt;/code&gt; signature I'd introduced in a refactor.&lt;/p&gt;

&lt;p&gt;Let me repeat that: I had actors that were executing successfully, returning data to users, and billing them exactly nothing. For weeks.&lt;/p&gt;

&lt;p&gt;If one of those 2 agencies had tried a second actor of mine during that period, they'd have gotten rot. That's probably why they didn't come back.&lt;/p&gt;

&lt;p&gt;The root cause wasn't the bugs though. Bugs happen. The root cause was that my attention was entirely on the $25/run cash cow because it was paying the bills. The cash cow was hiding the state of the herd.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why 2 agency users paid more than 353 devs
&lt;/h2&gt;

&lt;p&gt;I want to sit with this one because I think most solo devs misunderstand it.&lt;/p&gt;

&lt;p&gt;My Google Maps Lead Intel actor charges $25 per successful run. It scrapes a geography, enriches each business with a website audit, scores them, and hands the agency a ranked list of cold outreach targets. One agency was running it on a schedule against 40 US cities per week. At $25 a pop, that's serious money.&lt;/p&gt;

&lt;p&gt;The 353 devs on my other actors were paying $0.003 to $0.01 per row. They're hobbyists, students, one guy building a thesis scraper. They're lovely. They're also economically irrelevant to whether I can pay rent.&lt;/p&gt;

&lt;p&gt;Two lessons fell out of this.&lt;/p&gt;

&lt;p&gt;First, your paying users and your popular users are almost never the same people. Popularity on Apify Store is a vanity metric. Agency retention is the only metric that buys groceries.&lt;/p&gt;

&lt;p&gt;Second, concentrated revenue is fragile in ways that only hurt you once. When I had 2 whales, my revenue was 83% dependent on their mood. The moment either whale left, my month was destroyed. Worse, because they paid so much, I built no alerting around them. I assumed I'd notice. I did not notice.&lt;/p&gt;

&lt;p&gt;If you're reading this as an agency owner looking for scraping tools, what you actually want is a vendor who is not dependent on you. Someone with 50 paying clients will answer your ticket faster than someone with 2, because the guy with 2 is terrified of you and therefore weirdly slow to respond to bad news.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm changing
&lt;/h2&gt;

&lt;p&gt;Not writing a manifesto. Just the four things I'm doing this week.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Push alerting on every run.&lt;/strong&gt; Apify has webhooks. I never wired them up because my dashboard was enough. It wasn't. Every successful run, every failed run, every billing event now pings a private Telegram channel I actually read. Here's the whole snippet, it's embarrassingly short:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// webhooks config in actor.json points at this endpoint&lt;/span&gt;
&lt;span class="c1"&gt;// payload is whatever Apify sends plus the run metadata&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;notify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;eventType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;eventData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`[&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;eventType&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;] &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;actId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; run &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\n`&lt;/span&gt;
               &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;`status: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;\n`&lt;/span&gt;
               &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;`charged: $&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;usageTotalUsd&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://api.telegram.org/bot&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;TG_TOKEN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/sendMessage`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;chat_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TG_CHAT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&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="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. If I'd had this on March 25, I'd have noticed the absence of runs within 48 hours, not 29 days. If you run anything that bills users, stop reading and go wire this up. Seriously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Weekly self test of every monetized actor.&lt;/strong&gt; Every Sunday I run each of my paid actors against a known input and diff the output against last week's. If the schema changes or the row count collapses, I know before the user does. This is stupid simple and I should have been doing it from day one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Diversifying the buyer pool.&lt;/strong&gt; $25/run is staying. But I'm actively building out the $5 to $10 tier with two new actors targeted at small agencies, because I want the bottom of the revenue chart to be less wobbly. Ten $50/month buyers survive any one of them leaving. Two $270/month buyers don't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public status page.&lt;/strong&gt; Still building this but the idea is: if an actor is degraded, the user knows before they hit it. Trust compounds and I just burned a chunk of it, so I'm paying interest now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Close
&lt;/h2&gt;

&lt;p&gt;If you run any product that bills users on autopilot, go wire a Telegram or Slack webhook today. Not tomorrow. The 30 day rolling dashboard lies to you when things trend down because it's still averaging in good weeks. Push alerts don't lie. Runs either happen or they don't.&lt;/p&gt;

&lt;p&gt;I'm writing this mostly for me. But if you want to see what the portfolio looks like now, or hire the actor that caused all this drama in the first place, it's here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apify profile: &lt;a href="https://apify.com/george.the.developer" rel="noopener noreferrer"&gt;https://apify.com/george.the.developer&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Google Maps Lead Intel (the $25/run one): on the same profile&lt;/li&gt;
&lt;li&gt;Everything else I've shipped (27 public actors, some broken last week, all fixed now): same profile&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask me anything in the comments. Especially if you're an agency buyer thinking about pulling the trigger on a vendor. I have thoughts about what you should actually be looking for.&lt;/p&gt;

</description>
      <category>apify</category>
      <category>postmortem</category>
      <category>webscraping</category>
      <category>saas</category>
    </item>
  </channel>
</rss>
