<?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>How to Build a LinkedIn Data Pipeline Without Paying for Sales Navigator</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Thu, 02 Apr 2026 22:15:49 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/how-to-build-a-linkedin-data-pipeline-without-paying-for-sales-navigator-2k04</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/how-to-build-a-linkedin-data-pipeline-without-paying-for-sales-navigator-2k04</guid>
      <description>&lt;h2&gt;
  
  
  The Problem with LinkedIn Data Access
&lt;/h2&gt;

&lt;p&gt;LinkedIn charges $800–$1,200/month for Sales Navigator API access. For developers building lead-gen tools, market research pipelines, or sales automation, that's a brutal barrier. But there's a smarter path: build your own LinkedIn scraper using open-source tools — Playwright, Crawlee, and Apify.&lt;/p&gt;

&lt;p&gt;Here's how.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Playwright + Crawlee?
&lt;/h2&gt;

&lt;p&gt;Crawlee (by Apify) is a Node.js library built specifically for reliable web scraping. It handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Request queuing&lt;/strong&gt; — no duplicate URLs, automatic retries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser fingerprint rotation&lt;/strong&gt; — reduces detection risk&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session management&lt;/strong&gt; — persists cookies across requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proxy integration&lt;/strong&gt; — built-in support for residential proxies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Playwright drives a real Chromium/Chrome browser, meaning JavaScript-rendered content (like LinkedIn's React app) loads normally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anti-Detection Tips
&lt;/h2&gt;

&lt;p&gt;LinkedIn is aggressive about bot detection. These measures matter:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use residential proxies&lt;/strong&gt; — datacenter IPs get blocked fast&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Randomize delays&lt;/strong&gt; — add 2–5s between requests, never linear&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotate user agents&lt;/strong&gt; — match real Chrome versions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid headless mode&lt;/strong&gt; — use headless: false or set realistic window sizes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persist sessions&lt;/strong&gt; — re-use cookies so you don't re-login every run&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limit concurrency&lt;/strong&gt; — max 1–2 parallel requests on LinkedIn&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Basic Apify Actor Structure
&lt;/h2&gt;

&lt;p&gt;Here's a minimal actor that scrapes LinkedIn company employee data:&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;Actor&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&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PlaywrightCrawler&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;crawlee&lt;/span&gt;&lt;span class="dl"&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;init&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;input&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;Actor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getInput&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;linkedinUrls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="nx"&gt;maxProfiles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;input&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;crawler&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;PlaywrightCrawler&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;proxyConfiguration&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;createProxyConfiguration&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;groups&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;RESIDENTIAL&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;launchContext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;launchOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;headless&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;args&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;--no-sandbox&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;--disable-blink-features=AutomationControlled&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="na"&gt;minConcurrency&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="na"&gt;maxConcurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&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;requestHandler&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;request&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;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitForTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3000&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;employees&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;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="nf"&gt;$eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.org-people-profile-card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cards&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;cards&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;card&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.artdeco-entity-lockup__title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.artdeco-entity-lockup__subtitle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="na"&gt;profileUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;card&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nx"&gt;href&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="c1"&gt;// Pay-Per-Event pricing — charge per profile scraped&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="na"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;profile-scraped&lt;/span&gt;&lt;span class="dl"&gt;'&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="nx"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&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;employees&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="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;crawler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addRequests&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;linkedinUrls&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;url&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;url&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;crawler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&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;exit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Deploying to Apify
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; apify-cli
apify create my-linkedin-scraper &lt;span class="nt"&gt;--template&lt;/span&gt; playwright-js
apify push
apify call my-linkedin-scraper &lt;span class="nt"&gt;--input&lt;/span&gt; &lt;span class="s1"&gt;'{"linkedinUrls": ["https://www.linkedin.com/company/google/people/"]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Cost Math
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Approach&lt;/th&gt;
&lt;th&gt;Monthly Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sales Navigator API&lt;/td&gt;
&lt;td&gt;$800–$1,200/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DIY (Apify + Residential Proxies)&lt;/td&gt;
&lt;td&gt;$20–$80/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Savings&lt;/td&gt;
&lt;td&gt;90–95%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sales teams&lt;/strong&gt;: Build prospect lists from target company employee pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recruiters&lt;/strong&gt;: Source candidates at scale without LinkedIn Recruiter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Market researchers&lt;/strong&gt;: Track hiring signals, team growth, org changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competitive intel&lt;/strong&gt;: Monitor competitor headcount and hiring patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Get the Code
&lt;/h2&gt;

&lt;p&gt;All my scraping actors — including the LinkedIn Employee Scraper with 600+ runs in production — are open-source on GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/the-ai-entrepreneur-ai-hub" rel="noopener noreferrer"&gt;https://github.com/the-ai-entrepreneur-ai-hub&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built in Nairobi. Running on 45 Apify actors, 599 users, 11,974 total runs.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>node</category>
      <category>scraping</category>
    </item>
    <item>
      <title>How I Got 4,310% Growth on My API Portfolio in 30 Days (No Ads)</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Tue, 31 Mar 2026 06:11:57 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/how-i-got-4310-growth-on-my-api-portfolio-in-30-days-no-ads-kh6</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/how-i-got-4310-growth-on-my-api-portfolio-in-30-days-no-ads-kh6</guid>
      <description>&lt;p&gt;I'm George, a solo developer. A month ago I had 10 actor starts across a handful of Apify actors. Today I have 520 users across 45 tools and a 4,310% increase in actor starts.&lt;/p&gt;

&lt;p&gt;No ads. No budget. Just a laptop and stubbornness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Phase 1: Build Volume (Week 1-2)
&lt;/h2&gt;

&lt;p&gt;I built 45 actors instead of perfecting one. Every actor is a landing page indexed by Google. 45 actors = 45 chances to rank for a long-tail keyword.&lt;/p&gt;

&lt;p&gt;I grouped them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Standby APIs&lt;/strong&gt; (instant): &lt;a href="https://apify.com/george.the.developer/email-validator-api" rel="noopener noreferrer"&gt;Email Validator&lt;/a&gt;, &lt;a href="https://apify.com/george.the.developer/ai-content-detector-api" rel="noopener noreferrer"&gt;AI Content Detector&lt;/a&gt;, &lt;a href="https://apify.com/george.the.developer/domain-whois-lookup-api" rel="noopener noreferrer"&gt;Domain WHOIS&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scrapers&lt;/strong&gt; (batch): &lt;a href="https://apify.com/george.the.developer/linkedin-company-employees-scraper" rel="noopener noreferrer"&gt;LinkedIn Employee Scraper&lt;/a&gt;, &lt;a href="https://apify.com/george.the.developer/google-scholar-scraper" rel="noopener noreferrer"&gt;Google Scholar&lt;/a&gt;, &lt;a href="https://apify.com/george.the.developer/youtube-transcript-scraper" rel="noopener noreferrer"&gt;YouTube Transcript&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Niche tools&lt;/strong&gt;: &lt;a href="https://apify.com/george.the.developer/ofac-sanctions-search" rel="noopener noreferrer"&gt;OFAC Sanctions&lt;/a&gt;, &lt;a href="https://apify.com/george.the.developer/us-tariff-lookup" rel="noopener noreferrer"&gt;US Tariff Lookup&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Phase 2: SEO the Store Listings
&lt;/h2&gt;

&lt;p&gt;Every actor got:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Title = exact search term.&lt;/strong&gt; Not "Data Extraction Tool v2" but "LinkedIn Company Employees Scraper"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;README with Mermaid architecture diagram.&lt;/strong&gt; Signals quality to first-time visitors&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real JSON output examples.&lt;/strong&gt; People want to see what they're getting before clicking Run&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pay-per-event pricing.&lt;/strong&gt; Users pay per result, not per minute
&lt;/li&gt;
&lt;/ul&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;charge&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;linkedin-employee&lt;/span&gt;&lt;span class="dl"&gt;'&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="nx"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Phase 3: Distribute Everywhere
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What worked:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reddit (carefully) — posted in r/scrapingtools as a mod, not as a promoter. "Here's my 27-tool collection, roast them" got more engagement than any link drop&lt;/li&gt;
&lt;li&gt;Twitter/X — 3-4 tweets/day, only 30% link to actors. The observation tweets (no links) performed best&lt;/li&gt;
&lt;li&gt;dev.to + Hashnode + Medium — technical tutorials targeting specific search terms, not "10 Reasons to Use My API"&lt;/li&gt;
&lt;li&gt;GitHub repos — every actor has a companion repo. GitHub ranks well on Google&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What flopped:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discord cold DMs — posted in 10+ servers, response rate: zero&lt;/li&gt;
&lt;li&gt;Hacker News — account too new for Show HN, slow karma grind&lt;/li&gt;
&lt;li&gt;RapidAPI cross-listing — 16 subscribers, $0 revenue, too crowded&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Actor starts&lt;/td&gt;
&lt;td&gt;~100&lt;/td&gt;
&lt;td&gt;4,410+&lt;/td&gt;
&lt;td&gt;+4,310%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total users&lt;/td&gt;
&lt;td&gt;~30&lt;/td&gt;
&lt;td&gt;520&lt;/td&gt;
&lt;td&gt;+1,633%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Actors deployed&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;+1,400%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Top performers: LinkedIn Scraper (130 users), YouTube Transcript (104 users), Google Scholar (1,305 runs/month from 13 power users).&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd Do Differently
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start with 5 actors, not 45.&lt;/strong&gt; Maintaining 45 is a nightmare. Every library update breaks something.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invest in one hero actor early.&lt;/strong&gt; LinkedIn got 130 users organically. Should have doubled down sooner.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build in public from day one.&lt;/strong&gt; "Here's what I'm building today" posts outperformed everything.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Browse my full portfolio: &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;Find me on X: &lt;a href="https://x.com/ai_in_it" rel="noopener noreferrer"&gt;@ai_in_it&lt;/a&gt;&lt;/p&gt;

</description>
      <category>apify</category>
      <category>api</category>
      <category>webdev</category>
      <category>scraping</category>
    </item>
    <item>
      <title>How to Detect AI-Generated Images in Your App (Node.js + API)</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Sun, 29 Mar 2026 14:02:35 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/how-to-detect-ai-generated-images-in-your-app-nodejs-api-2o4h</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/how-to-detect-ai-generated-images-in-your-app-nodejs-api-2o4h</guid>
      <description>&lt;p&gt;Last week a client asked me to flag AI-generated profile photos during user signup. Sounds straightforward until you realize there's no built-in browser API for "is this image fake?" and training your own classifier means months of work and a GPU budget.&lt;/p&gt;

&lt;p&gt;I ended up solving it with an HTTP call. Here's how.&lt;/p&gt;

&lt;h3&gt;
  
  
  The problem is bigger than you think
&lt;/h3&gt;

&lt;p&gt;AI image generators have gotten absurdly good. Midjourney v6, DALL-E 3, Stable Diffusion XL — the outputs fool most humans. That creates real problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Marketplaces&lt;/strong&gt; where sellers use AI product photos that misrepresent items&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dating apps&lt;/strong&gt; flooded with generated profile pictures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;News platforms&lt;/strong&gt; where AI images get passed off as photojournalism&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KYC flows&lt;/strong&gt; where submitted ID photos might be synthetic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Manual review doesn't scale. You need something automated.&lt;/p&gt;

&lt;h3&gt;
  
  
  What detection actually looks for
&lt;/h3&gt;

&lt;p&gt;Before we write code, it helps to understand what AI image detectors analyze. There are roughly 12 signals that separate generated images from real ones:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Frequency domain artifacts&lt;/strong&gt; — GANs leave spectral fingerprints invisible to the eye but obvious in Fourier space&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inconsistent lighting direction&lt;/strong&gt; — shadows that don't agree with each other&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Texture repetition patterns&lt;/strong&gt; — diffusion models sometimes tile textures unnaturally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge coherence&lt;/strong&gt; — boundaries between objects can look too smooth or too sharp&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metadata analysis&lt;/strong&gt; — EXIF data either missing entirely or suspiciously generic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compression artifacts&lt;/strong&gt; — generated images show different JPEG artifact patterns than camera photos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Color distribution&lt;/strong&gt; — histogram shapes that differ from natural photography&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Noise patterns&lt;/strong&gt; — sensor noise in real photos follows predictable distributions; AI images don't&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facial geometry&lt;/strong&gt; — subtle asymmetries, iris irregularities, teeth artifacts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background consistency&lt;/strong&gt; — warped architecture, impossible geometry in the background&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fine detail analysis&lt;/strong&gt; — text, fingers, hair strands where generators still struggle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GAN fingerprinting&lt;/strong&gt; — identifying which specific model generated an image&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Running all 12 checks yourself would be a significant ML engineering project. Or you can call an API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up the detection endpoint
&lt;/h3&gt;

&lt;p&gt;I'm using the &lt;a href="https://apify.com/george.the.developer/ai-deepfake-detector" rel="noopener noreferrer"&gt;AI Deepfake Detector API&lt;/a&gt; which runs as an always-on Standby actor. That means sub-second response times — no cold starts, no waiting for containers to spin up.&lt;/p&gt;

&lt;p&gt;The base URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://george-the-developer--ai-deepfake-detector.apify.actor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Node.js implementation
&lt;/h3&gt;

&lt;p&gt;Here's a minimal working example. Install nothing — just &lt;code&gt;fetch&lt;/code&gt;:&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;detectAIImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageUrl&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;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-deepfake-detector.apify.actor&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&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;Bearer YOUR_APIFY_TOKEN&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;imageUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;imageUrl&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="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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&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;`Detection failed: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&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;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&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="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Usage&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;detectAIImage&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://example.com/suspicious-photo.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&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="s2"&gt;`AI Generated: &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;isAiGenerated&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;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="s2"&gt;`Confidence: &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;confidence&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;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="s2"&gt;`Signals detected:`&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;signals&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response gives you a confidence score and which specific signals triggered. That's important because you probably don't want to auto-reject at 51% confidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding it to an Express upload endpoint
&lt;/h3&gt;

&lt;p&gt;Here's a more realistic example — checking images during file upload:&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="nx"&gt;express&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;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;multer&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;multer&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&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;upload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;multer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;uploads/&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;DEEPFAKE_API&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://george-the-developer--ai-deepfake-detector.apify.actor&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;APIFY_TOKEN&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;APIFY_TOKEN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/upload-photo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;upload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;single&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;photo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;async &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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// First, upload the image to your CDN/storage and get a public URL&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;publicUrl&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;uploadToStorage&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;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Then check if it's AI-generated&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;detection&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="nx"&gt;DEEPFAKE_API&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&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;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="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;imageUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;publicUrl&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&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="k"&gt;if &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;span class="nx"&gt;isAiGenerated&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;detection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;confidence&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&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;422&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="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This image appears to be AI-generated&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;confidence&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;span class="nx"&gt;confidence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;signals&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;span class="nx"&gt;signals&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Image passed — continue with normal flow&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;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;success&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;imageUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;publicUrl&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;
  
  
  Setting your confidence threshold
&lt;/h3&gt;

&lt;p&gt;Don't blindly reject everything above 50%. Think about your use case:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Suggested Threshold&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;KYC / Identity verification&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;Better safe — flag for human review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marketplace product photos&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;Avoid false positives on edited photos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Social media profiles&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;td&gt;Balance between safety and usability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;News / journalism&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;Flag for editor review&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The signals array in the response helps too. If &lt;code&gt;ganFingerprint&lt;/code&gt; and &lt;code&gt;frequencyArtifacts&lt;/code&gt; both trigger, that's much more conclusive than &lt;code&gt;metadataAnalysis&lt;/code&gt; alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Error handling you'll actually need
&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;safeDetect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;timeoutMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5000&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;controller&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;AbortController&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;timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&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;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nx"&gt;timeoutMs&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;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="nx"&gt;DEEPFAKE_API&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&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;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="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="nx"&gt;imageUrl&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
      &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&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;`API error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&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;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&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="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;err&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="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AbortError&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Detection timed out — allowing image through&lt;/span&gt;&lt;span class="dl"&gt;'&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;isAiGenerated&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;confidence&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="na"&gt;timedOut&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="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timeout&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;Always have a fallback. If the detection API is slow or down, you probably want to allow the upload and flag it for async review rather than blocking the user.&lt;/p&gt;

&lt;h3&gt;
  
  
  Try it yourself
&lt;/h3&gt;

&lt;p&gt;You can test the API directly on Apify: &lt;a href="https://apify.com/george.the.developer/ai-deepfake-detector" rel="noopener noreferrer"&gt;AI Deepfake Detector&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It costs $0.003 per image — roughly $3 for every 1,000 checks. For most apps, that's negligible compared to the cost of fake content getting through.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrapping up
&lt;/h3&gt;

&lt;p&gt;Adding AI image detection to your app takes about 20 lines of code. The hard part — the ML models, the 12-signal analysis, the infrastructure — is someone else's problem. You just make an HTTP call and decide what to do with the result.&lt;/p&gt;

&lt;p&gt;If you're building anything where image authenticity matters, bolt this on now. The longer you wait, the better the generators get.&lt;/p&gt;




</description>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Detect AI-Generated Images in Your App (Node.js + API)</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Sun, 29 Mar 2026 13:53:02 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/how-to-detect-ai-generated-images-in-your-app-nodejs-api-jik</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/how-to-detect-ai-generated-images-in-your-app-nodejs-api-jik</guid>
      <description>&lt;p&gt;Last week a client asked me to flag AI-generated profile photos during user signup. Sounds straightforward until you realize there's no built-in browser API for "is this image fake?" and training your own classifier means months of work and a GPU budget.&lt;/p&gt;

&lt;p&gt;I ended up solving it with an HTTP call. Here's how.&lt;/p&gt;

&lt;h3&gt;
  
  
  The problem is bigger than you think
&lt;/h3&gt;

&lt;p&gt;AI image generators have gotten absurdly good. Midjourney v6, DALL-E 3, Stable Diffusion XL — the outputs fool most humans. That creates real problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Marketplaces&lt;/strong&gt; where sellers use AI product photos that misrepresent items&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dating apps&lt;/strong&gt; flooded with generated profile pictures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;News platforms&lt;/strong&gt; where AI images get passed off as photojournalism&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KYC flows&lt;/strong&gt; where submitted ID photos might be synthetic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Manual review doesn't scale. You need something automated.&lt;/p&gt;

&lt;h3&gt;
  
  
  What detection actually looks for
&lt;/h3&gt;

&lt;p&gt;Before we write code, it helps to understand what AI image detectors analyze. There are roughly 12 signals that separate generated images from real ones:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Frequency domain artifacts&lt;/strong&gt; — GANs leave spectral fingerprints invisible to the eye but obvious in Fourier space&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inconsistent lighting direction&lt;/strong&gt; — shadows that don't agree with each other&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Texture repetition patterns&lt;/strong&gt; — diffusion models sometimes tile textures unnaturally&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge coherence&lt;/strong&gt; — boundaries between objects can look too smooth or too sharp&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metadata analysis&lt;/strong&gt; — EXIF data either missing entirely or suspiciously generic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compression artifacts&lt;/strong&gt; — generated images show different JPEG artifact patterns than camera photos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Color distribution&lt;/strong&gt; — histogram shapes that differ from natural photography&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Noise patterns&lt;/strong&gt; — sensor noise in real photos follows predictable distributions; AI images don't&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facial geometry&lt;/strong&gt; — subtle asymmetries, iris irregularities, teeth artifacts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background consistency&lt;/strong&gt; — warped architecture, impossible geometry in the background&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fine detail analysis&lt;/strong&gt; — text, fingers, hair strands where generators still struggle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GAN fingerprinting&lt;/strong&gt; — identifying which specific model generated an image&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Running all 12 checks yourself would be a significant ML engineering project. Or you can call an API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting up the detection endpoint
&lt;/h3&gt;

&lt;p&gt;I'm using the &lt;a href="https://apify.com/george.the.developer/ai-deepfake-detector" rel="noopener noreferrer"&gt;AI Deepfake Detector API&lt;/a&gt; which runs as an always-on Standby actor. That means sub-second response times — no cold starts, no waiting for containers to spin up.&lt;/p&gt;

&lt;p&gt;The base URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://george-the-developer--ai-deepfake-detector.apify.actor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Node.js implementation
&lt;/h3&gt;

&lt;p&gt;Here's a minimal working example. Install nothing — just &lt;code&gt;fetch&lt;/code&gt;:&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;detectAIImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageUrl&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;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-deepfake-detector.apify.actor&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&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;Bearer YOUR_APIFY_TOKEN&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;imageUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;imageUrl&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="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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&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;`Detection failed: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&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;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&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="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Usage&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;detectAIImage&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://example.com/suspicious-photo.jpg&lt;/span&gt;&lt;span class="dl"&gt;'&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="s2"&gt;`AI Generated: &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;isAiGenerated&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;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="s2"&gt;`Confidence: &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;confidence&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;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="s2"&gt;`Signals detected:`&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;signals&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response gives you a confidence score and which specific signals triggered. That's important because you probably don't want to auto-reject at 51% confidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding it to an Express upload endpoint
&lt;/h3&gt;

&lt;p&gt;Here's a more realistic example — checking images during file upload:&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="nx"&gt;express&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;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;multer&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;multer&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&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;upload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;multer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;uploads/&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;DEEPFAKE_API&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://george-the-developer--ai-deepfake-detector.apify.actor&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;APIFY_TOKEN&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;APIFY_TOKEN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/upload-photo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;upload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;single&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;photo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;async &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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// First, upload the image to your CDN/storage and get a public URL&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;publicUrl&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;uploadToStorage&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;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Then check if it's AI-generated&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;detection&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="nx"&gt;DEEPFAKE_API&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&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;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="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;imageUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;publicUrl&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&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="k"&gt;if &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;span class="nx"&gt;isAiGenerated&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;detection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;confidence&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&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;422&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="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This image appears to be AI-generated&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;confidence&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;span class="nx"&gt;confidence&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;signals&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;span class="nx"&gt;signals&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Image passed — continue with normal flow&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;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;success&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;imageUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;publicUrl&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;
  
  
  Setting your confidence threshold
&lt;/h3&gt;

&lt;p&gt;Don't blindly reject everything above 50%. Think about your use case:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Suggested Threshold&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;KYC / Identity verification&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;td&gt;Better safe — flag for human review&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Marketplace product photos&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;Avoid false positives on edited photos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Social media profiles&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;td&gt;Balance between safety and usability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;News / journalism&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;td&gt;Flag for editor review&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The signals array in the response helps too. If &lt;code&gt;ganFingerprint&lt;/code&gt; and &lt;code&gt;frequencyArtifacts&lt;/code&gt; both trigger, that's much more conclusive than &lt;code&gt;metadataAnalysis&lt;/code&gt; alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Error handling you'll actually need
&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;safeDetect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;timeoutMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5000&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;controller&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;AbortController&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;timeout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&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;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nx"&gt;timeoutMs&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;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="nx"&gt;DEEPFAKE_API&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&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;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="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="nx"&gt;imageUrl&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
      &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&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;`API error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&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;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&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="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;err&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="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AbortError&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="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Detection timed out — allowing image through&lt;/span&gt;&lt;span class="dl"&gt;'&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;isAiGenerated&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;confidence&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="na"&gt;timedOut&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="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timeout&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;Always have a fallback. If the detection API is slow or down, you probably want to allow the upload and flag it for async review rather than blocking the user.&lt;/p&gt;

&lt;h3&gt;
  
  
  Try it yourself
&lt;/h3&gt;

&lt;p&gt;You can test the API directly on Apify: &lt;a href="https://apify.com/george.the.developer/ai-deepfake-detector" rel="noopener noreferrer"&gt;AI Deepfake Detector&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It costs $0.003 per image — roughly $3 for every 1,000 checks. For most apps, that's negligible compared to the cost of fake content getting through.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrapping up
&lt;/h3&gt;

&lt;p&gt;Adding AI image detection to your app takes about 20 lines of code. The hard part — the ML models, the 12-signal analysis, the infrastructure — is someone else's problem. You just make an HTTP call and decide what to do with the result.&lt;/p&gt;

&lt;p&gt;If you're building anything where image authenticity matters, bolt this on now. The longer you wait, the better the generators get.&lt;/p&gt;

</description>
      <category>api</category>
    </item>
    <item>
      <title>Why Do Screenshot APIs Take 21 Seconds? I Built One That Does It in 2</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Tue, 24 Mar 2026 18:44:43 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/why-do-screenshot-apis-take-21-seconds-i-built-one-that-does-it-in-2-cia</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/why-do-screenshot-apis-take-21-seconds-i-built-one-that-does-it-in-2-cia</guid>
      <description>&lt;p&gt;I benchmarked screenshot APIs on RapidAPI. The fastest took 6 seconds. Most took 14-21 seconds. Some had 74% uptime.&lt;/p&gt;

&lt;p&gt;So I built my own. It does screenshots in 2.1 seconds and PDFs in 1.2 seconds.&lt;/p&gt;

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

&lt;p&gt;If you've ever tried to programmatically capture a webpage, you know the pain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Self-hosted Puppeteer&lt;/strong&gt; = server maintenance, memory leaks, Chrome crashes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screenshot-as-a-service APIs&lt;/strong&gt; = slow (6-21 seconds), expensive ($50-300/month), unreliable (74-94% uptime)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Playwright in CI&lt;/strong&gt; = fine for tests, terrible for production APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I needed something fast, reliable, and cheap. So I built it on Apify's Standby infrastructure.&lt;/p&gt;

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

&lt;p&gt;The secret to sub-3-second delivery is &lt;strong&gt;browser pre-warming&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On startup, launch Chromium via Puppeteer and keep it running&lt;/li&gt;
&lt;li&gt;For each request, create a new page (not a new browser)&lt;/li&gt;
&lt;li&gt;Navigate, wait for network idle, capture&lt;/li&gt;
&lt;li&gt;Close the page, return the result&lt;/li&gt;
&lt;li&gt;Cache results for 10 minutes (same URL + same params = instant)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This avoids the 3-5 second cold start that kills most screenshot APIs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmarks
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API&lt;/th&gt;
&lt;th&gt;Screenshot Time&lt;/th&gt;
&lt;th&gt;PDF Time&lt;/th&gt;
&lt;th&gt;Uptime&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;This API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.1s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.2s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Competitor A&lt;/td&gt;
&lt;td&gt;8.4s&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;94%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Competitor B&lt;/td&gt;
&lt;td&gt;14.2s&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Competitor C&lt;/td&gt;
&lt;td&gt;21s&lt;/td&gt;
&lt;td&gt;15s&lt;/td&gt;
&lt;td&gt;74%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Endpoints
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Screenshot
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET /screenshot?url&lt;span class="o"&gt;=&lt;/span&gt;https://github.com&amp;amp;width&lt;span class="o"&gt;=&lt;/span&gt;1920&amp;amp;height&lt;span class="o"&gt;=&lt;/span&gt;1080&amp;amp;format&lt;span class="o"&gt;=&lt;/span&gt;png&amp;amp;fullPage&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parameters: &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;width&lt;/code&gt; (320-3840), &lt;code&gt;height&lt;/code&gt; (200-2160), &lt;code&gt;format&lt;/code&gt; (png/jpeg/webp), &lt;code&gt;fullPage&lt;/code&gt;, &lt;code&gt;quality&lt;/code&gt; (1-100), &lt;code&gt;delay&lt;/code&gt; (ms).&lt;/p&gt;

&lt;h3&gt;
  
  
  PDF
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GET /pdf?url&lt;span class="o"&gt;=&lt;/span&gt;https://github.com&amp;amp;format&lt;span class="o"&gt;=&lt;/span&gt;A4&amp;amp;landscape&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parameters: &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;format&lt;/code&gt; (A4/Letter/Legal), &lt;code&gt;landscape&lt;/code&gt;, &lt;code&gt;printBackground&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Batch (up to 20 URLs)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/batch&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;"urls"&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://google.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;"https://github.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;"width"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1280&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"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jpeg"&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;h3&gt;
  
  
  Response Formats
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Binary (default):&lt;/strong&gt; Raw image/PDF bytes with Content-Type header.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Base64 JSON (set Accept: application/json):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"base64"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"iVBORw0KGgo..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mimeType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image/png"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15856&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"latencyMs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2172&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;h2&gt;
  
  
  Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Visual QA Testing&lt;/strong&gt; — Screenshot every page after deployment, diff against baselines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social Media Cards&lt;/strong&gt; — Generate OG images for link previews&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competitive Monitoring&lt;/strong&gt; — Daily screenshots of competitor pricing pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PDF Reports&lt;/strong&gt; — Convert web dashboards to downloadable PDFs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Archiving&lt;/strong&gt; — Capture pages before they change&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Screenshots: $0.005 each ($5 per 1,000)&lt;/li&gt;
&lt;li&gt;PDFs: $0.008 each ($8 per 1,000)&lt;/li&gt;
&lt;li&gt;Only charged on success (failed captures = free)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Apify Store&lt;/strong&gt;: &lt;a href="https://apify.com/george.the.developer/screenshot-pdf-api" rel="noopener noreferrer"&gt;Screenshot &amp;amp; PDF API&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Also on RapidAPI&lt;/strong&gt;: Search "Website Screenshot PDF"&lt;/li&gt;
&lt;li&gt;Built with Puppeteer on Apify Standby (always-on HTTP, no queue)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The code uses &lt;code&gt;apify/actor-node-puppeteer-chrome&lt;/code&gt; as the base image. Spec was generated using &lt;a href="https://github.com/Fission-AI/OpenSpec" rel="noopener noreferrer"&gt;OpenSpec&lt;/a&gt; + Codex.&lt;/p&gt;

&lt;p&gt;Questions? &lt;a href="https://twitter.com/ai_in_it" rel="noopener noreferrer"&gt;@ai_in_it&lt;/a&gt; on X.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>node</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Built an API That Turns Any URL Into Structured JSON — Here's How</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Tue, 24 Mar 2026 17:53:46 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/i-built-an-api-that-turns-any-url-into-structured-json-heres-how-1apa</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/i-built-an-api-that-turns-any-url-into-structured-json-heres-how-1apa</guid>
      <description>&lt;p&gt;Most web scrapers give you raw HTML. I wanted clean, structured JSON from any URL — no configuration, no selectors, no parsing. Just pass a URL and get organized data back.&lt;/p&gt;

&lt;p&gt;So I built it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Web Content Extractor API&lt;/strong&gt; takes any URL and returns structured JSON. It automatically detects the content type:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Articles&lt;/strong&gt; → title, author, date, full text, headings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Products&lt;/strong&gt; → name, price, rating, reviews, SKU, images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recipes&lt;/strong&gt; → ingredients, instructions, prep time, servings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Job postings&lt;/strong&gt; → title, company, salary, location&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Events&lt;/strong&gt; → name, date, location, description&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Any webpage&lt;/strong&gt; → metadata, content, links, images&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Fetch the HTML&lt;/li&gt;
&lt;li&gt;Auto-detect content type using Open Graph tags, Schema.org markup, and DOM signals&lt;/li&gt;
&lt;li&gt;Score content blocks (Readability-style algorithm) to find the main content&lt;/li&gt;
&lt;li&gt;Extract structured data: metadata, headings, images, links, JSON-LD&lt;/li&gt;
&lt;li&gt;Return clean JSON&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Quick Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://george-the-developer--web-content-extractor-api.apify.actor/extract?url=https://techcrunch.com&amp;amp;token=YOUR_TOKEN"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://techcrunch.com/article"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"article"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&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;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AI Agents Are Reshaping Enterprise Software"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sarah Perez"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-03-24"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"siteName"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"TechCrunch"&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;"content"&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;"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;"The rise of AI agents represents..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"headings"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="nl"&gt;"level"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&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;"What Are AI Agents?"&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"wordCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2847&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;h2&gt;
  
  
  Why I Built This
&lt;/h2&gt;

&lt;p&gt;I maintain 35+ data extraction APIs on Apify. The most common request I get: "I just need the main content from this URL as JSON."&lt;/p&gt;

&lt;p&gt;Every developer building RAG pipelines, content aggregators, or AI agents needs this. But existing solutions are either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Too expensive&lt;/strong&gt; (Diffbot = $299/month)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Too complex&lt;/strong&gt; (custom scrapers = days of work)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Too slow&lt;/strong&gt; (most take 5-30 seconds)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This does it in 1-3 seconds for $0.003 per extraction.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;RAG Pipelines&lt;/strong&gt; — Feed clean text into vector databases for AI retrieval&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;News Aggregation&lt;/strong&gt; — Pull articles from 100+ sources into structured data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Competitive Intelligence&lt;/strong&gt; — Monitor competitor product pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content Repurposing&lt;/strong&gt; — Extract blog posts to repurpose across channels&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Batch Processing
&lt;/h2&gt;

&lt;p&gt;Need multiple URLs? The &lt;code&gt;/batch&lt;/code&gt; endpoint handles up to 25 URLs in parallel:&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="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/batch&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;"urls"&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://url1.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;"https://url2.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;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"article"&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;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Apify Store&lt;/strong&gt;: &lt;a href="https://apify.com/george.the.developer/web-content-extractor-api" rel="noopener noreferrer"&gt;Web Content Extractor API&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Also on RapidAPI&lt;/strong&gt;: Search "Web Content Extractor"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pricing&lt;/strong&gt;: $0.003/extraction (PPE — only pay for what you use)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Built with Node.js + Cheerio on Apify Standby (instant HTTP response, no queue).&lt;/p&gt;

&lt;p&gt;Questions? Hit me up &lt;a href="https://twitter.com/ai_in_it" rel="noopener noreferrer"&gt;@ai_in_it&lt;/a&gt; on X.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>javascript</category>
      <category>ai</category>
    </item>
    <item>
      <title>Best Website Analysis APIs for Developers (2026 Guide)</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Mon, 23 Mar 2026 16:34:17 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/best-website-analysis-apis-for-developers-2026-guide-29fa</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/best-website-analysis-apis-for-developers-2026-guide-29fa</guid>
      <description>&lt;h1&gt;
  
  
  Best Website Analysis APIs for Developers (2026 Guide)
&lt;/h1&gt;

&lt;p&gt;For developers who need comprehensive website intelligence in a single API call, WebSight API stands out by combining 7 analysis modules at $0.005/page. In 2026, the landscape of web data has shifted from simple scrapers to sophisticated intelligence engines. Modern applications—ranging from AI-driven lead generation tools to automated SEO auditors—require more than just raw HTML. They need structured, multi-dimensional data that covers everything from technology stacks and contact information to AI-generated quality scores.&lt;/p&gt;

&lt;p&gt;Selecting the &lt;strong&gt;best website analysis api&lt;/strong&gt; is no longer just about speed; it is about the depth of the data and the efficiency of the integration. This guide compares the five leading tools in the market to help you choose the right partner for your development stack.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. WebSight API: The Comprehensive Intelligence Engine
&lt;/h3&gt;

&lt;p&gt;WebSight API is the newcomer that has rapidly become the gold standard for data-intensive applications. Unlike legacy tools that require multiple calls to different endpoints to get a full picture of a site, WebSight delivers a unified payload.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Pricing:&lt;/strong&gt; $0.005 per page (Pay-as-you-go available).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance:&lt;/strong&gt; Consistently returns results in under 3 seconds.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Data Breadth:&lt;/strong&gt; It features 7 distinct modules in a single call:

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Content:&lt;/strong&gt; Extracts titles, descriptions, and primary text.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Tech:&lt;/strong&gt; Identifies the full tech stack (CMS, Analytics, CDN).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;SEO:&lt;/strong&gt; Provides a comprehensive audit of meta tags and link structures.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Contacts:&lt;/strong&gt; Scrapes verified emails, phone numbers, and social media handles.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Structured Data:&lt;/strong&gt; Parses Schema.org and JSON-LD for rich snippets.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;AI Score:&lt;/strong&gt; A proprietary metric that assesses content quality and readability.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Domain:&lt;/strong&gt; Delivers WHOIS data, registrar info, and domain age.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WebSight is built for scale, making it the top choice for developers building large-scale market research tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. BuiltWith API: The Industry Standard for Tech Tracking
&lt;/h3&gt;

&lt;p&gt;BuiltWith remains the most recognized name in the &lt;strong&gt;tech stack detection api&lt;/strong&gt; space. It has a massive database of historical technology usage going back over a decade.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Pricing:&lt;/strong&gt; Starting at $495/month.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance:&lt;/strong&gt; Very fast for cached domains; slightly slower for real-time deep scans.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pros:&lt;/strong&gt; Unmatched historical data and global technology trends.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Cons:&lt;/strong&gt; Extremely expensive for startups and limited primarily to technology detection. It does not provide the SEO or contact modules found in more modern alternatives.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Wappalyzer API: The Lightweight Tech Detector
&lt;/h3&gt;

&lt;p&gt;Wappalyzer is the developer favorite for quick, browser-based technology identification, and their API follows that same philosophy.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Pricing:&lt;/strong&gt; Starting at $100/month.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance:&lt;/strong&gt; Highly optimized for speed.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pros:&lt;/strong&gt; Very accurate at identifying obscure libraries and JavaScript frameworks.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Cons:&lt;/strong&gt; Data is limited. While it excels at tech detection, it lacks the broader "website intelligence" components like domain history, SEO audits, or structured data parsing.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. SimilarTech: Enterprise-Grade Traffic Insights
&lt;/h3&gt;

&lt;p&gt;SimilarTech bridges the gap between technology detection and market intelligence by adding traffic estimation data into the mix.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Pricing:&lt;/strong&gt; Enterprise-only (Custom quotes, typically very high).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance:&lt;/strong&gt; Can be slow due to the complexity of the traffic data being aggregated.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pros:&lt;/strong&gt; Excellent for identifying "high-value" targets by filtering tech stacks by site traffic.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Cons:&lt;/strong&gt; The price barrier is significant for independent developers, and the API response times often exceed the 5-second mark.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Google PageSpeed Insights API: The Performance Specialist
&lt;/h3&gt;

&lt;p&gt;For developers focused strictly on how a site loads and performs, Google’s own API is an essential, albeit narrow, tool.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Pricing:&lt;/strong&gt; Free (within generous rate limits).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Performance:&lt;/strong&gt; Fast, but limited to performance metrics.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pros:&lt;/strong&gt; The definitive source for Core Web Vitals and Lighthouse scores.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Cons:&lt;/strong&gt; It provides zero information regarding tech stacks, contacts, or business intelligence. It is a utility, not a comprehensive analysis tool.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Website Intelligence API Comparison Table (2026)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;WebSight API&lt;/th&gt;
&lt;th&gt;BuiltWith&lt;/th&gt;
&lt;th&gt;Wappalyzer&lt;/th&gt;
&lt;th&gt;SimilarTech&lt;/th&gt;
&lt;th&gt;Google PSI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$0.005/page&lt;/td&gt;
&lt;td&gt;$495/mo+&lt;/td&gt;
&lt;td&gt;$100/mo+&lt;/td&gt;
&lt;td&gt;Enterprise&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Modules&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7 (All-in-one)&lt;/td&gt;
&lt;td&gt;Tech Only&lt;/td&gt;
&lt;td&gt;Tech Only&lt;/td&gt;
&lt;td&gt;Tech + Traffic&lt;/td&gt;
&lt;td&gt;Perf Only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt; 3s&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;Very Fast&lt;/td&gt;
&lt;td&gt;Slow&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Contacts&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Scoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best For&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Startups &amp;amp; Scaling&lt;/td&gt;
&lt;td&gt;High Budget&lt;/td&gt;
&lt;td&gt;Dev Utilities&lt;/td&gt;
&lt;td&gt;Sales Intel&lt;/td&gt;
&lt;td&gt;SEO Perf&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  Implementation: Why WebSight Wins for Developers
&lt;/h3&gt;

&lt;p&gt;The primary advantage of WebSight is the reduction in "code bloat." Instead of managing five different API integrations, you can handle a single JSON response. Below is a Python example showing how easy it is to retrieve a full intelligence report.&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_website_intelligence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target_url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_WEBSIGHT_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;endpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.websight.io/v1/analyze?url=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;# A single call returns all 7 modules
&lt;/span&gt;    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tech Stack: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tech&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Contact Emails: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;contacts&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;emails&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AI Content Score: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ai_score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
    &lt;span class="k"&gt;else&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Analysis failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Example Usage
&lt;/span&gt;&lt;span class="n"&gt;site_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_website_intelligence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Pricing Analysis: Subscriptions vs. Usage-Based
&lt;/h3&gt;

&lt;p&gt;In our &lt;strong&gt;website intelligence api comparison&lt;/strong&gt;, the pricing model is often the deciding factor.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Monthly Subscriptions (BuiltWith, Wappalyzer):&lt;/strong&gt; These are best for established companies with a predictable volume of lookups (e.g., 50,000 per month). However, they create a high "entry cost" for developers who are just starting or building a MVP.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Usage-Based (WebSight):&lt;/strong&gt; At $0.005 per page, you can analyze 1,000 websites for just $5.00. This flexibility allows developers to scale their costs exactly in line with their application's growth.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Free Tiers:&lt;/strong&gt; Google PageSpeed is excellent for specific performance checks, but it cannot be used as a primary data source for business intelligence.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Primary Use Cases
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Sales Intelligence &amp;amp; Lead Gen:&lt;/strong&gt; By using the &lt;strong&gt;tech stack detection api&lt;/strong&gt; features of WebSight or BuiltWith, sales teams can find companies using specific competitors and reach out via the emails provided in the Contacts module.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Competitor Monitoring:&lt;/strong&gt; Automate a weekly scan of competitor sites to detect changes in their SEO strategy, technology upgrades, or content quality (via AI Score).&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Investment Research:&lt;/strong&gt; Hedge funds and VC firms use SimilarTech to identify which technologies are gaining "market share" based on the traffic levels of the sites adopting them.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Security Audits:&lt;/strong&gt; Identifying outdated CMS versions or vulnerable JavaScript libraries across a portfolio of websites.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  The Verdict: Which API is Best for You?
&lt;/h3&gt;

&lt;p&gt;The "best" API depends entirely on your project's constraints:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;If you need a complete picture of a website&lt;/strong&gt; (Tech, SEO, Contacts, and Content) without managing multiple subscriptions, &lt;strong&gt;WebSight API&lt;/strong&gt; is the clear winner for 2026. Its pay-as-you-go model and sub-3-second response time make it the most developer-friendly option.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;If you need deep historical data&lt;/strong&gt; and have a large corporate budget, &lt;strong&gt;BuiltWith&lt;/strong&gt; remains the gold standard for tracking long-term technology trends.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;If you are building a simple browser extension&lt;/strong&gt; or a tool that only needs to know "Is this site using React?", &lt;strong&gt;Wappalyzer&lt;/strong&gt; is a cost-effective and reliable choice.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;If you only care about Google rankings&lt;/strong&gt;, stick with the free &lt;strong&gt;Google PageSpeed API&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the fast-moving web of 2026, data fragmentation is the enemy of speed. Choosing an all-in-one provider like WebSight allows you to spend less time on integration and more time building features that matter.&lt;/p&gt;

</description>
      <category>api</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>python</category>
    </item>
    <item>
      <title>5 Best AI Text Humanizer APIs in 2026 (Compared)</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Mon, 23 Mar 2026 16:34:09 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/5-best-ai-text-humanizer-apis-in-2026-compared-173k</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/5-best-ai-text-humanizer-apis-in-2026-compared-173k</guid>
      <description>&lt;h1&gt;
  
  
  5 Best AI Text Humanizer APIs in 2026 (Compared)
&lt;/h1&gt;

&lt;p&gt;The best AI text humanizer API in 2026 is &lt;strong&gt;AI Text Humanizer API by george.the.developer&lt;/strong&gt; for its combination of speed (&amp;lt;500ms), low cost ($0.003/text), and 12-pass algorithmic approach.&lt;/p&gt;

&lt;p&gt;As AI-generated content becomes the baseline for digital communication in 2026, the challenge has shifted from simply generating text to ensuring that text resonates with human readers and bypasses increasingly sophisticated detection systems. Whether you are building an automated content pipeline, a customer support bot, or a marketing suite, integrating a reliable "humanization" layer is no longer optional—it's a requirement for maintaining SEO rankings and user trust.&lt;/p&gt;

&lt;p&gt;In this guide, we compare the five leading AI text humanizer APIs available to developers this year, focusing on latency, cost-efficiency, and the underlying logic used to transform robotic prose into natural, rhythmic human speech.&lt;/p&gt;




&lt;h2&gt;
  
  
  At a Glance: 2026 Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Entry Price&lt;/th&gt;
&lt;th&gt;Latency&lt;/th&gt;
&lt;th&gt;Logic / Method&lt;/th&gt;
&lt;th&gt;Key Features&lt;/th&gt;
&lt;th&gt;Primary Interface&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Text Humanizer API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.003 / text&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&amp;lt;500ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12-Pass Algorithmic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5 Styles, API-First, Bulk&lt;/td&gt;
&lt;td&gt;REST API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Quillbot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$9.95 / mo&lt;/td&gt;
&lt;td&gt;2–5s&lt;/td&gt;
&lt;td&gt;Paraphrasing Engine&lt;/td&gt;
&lt;td&gt;7 Modes, Browser Ext.&lt;/td&gt;
&lt;td&gt;Web App / API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Undetectable.ai&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$14.99 / mo&lt;/td&gt;
&lt;td&gt;3–8s&lt;/td&gt;
&lt;td&gt;AI Rewriting&lt;/td&gt;
&lt;td&gt;3 Modes, AI Detection&lt;/td&gt;
&lt;td&gt;Web App&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;WriteHuman&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$12 / mo&lt;/td&gt;
&lt;td&gt;2–4s&lt;/td&gt;
&lt;td&gt;Humanization Layer&lt;/td&gt;
&lt;td&gt;Basic, Bypass Focus&lt;/td&gt;
&lt;td&gt;Web App&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HIX Bypass&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$12.99 / mo&lt;/td&gt;
&lt;td&gt;3–6s&lt;/td&gt;
&lt;td&gt;Multi-model Rewriting&lt;/td&gt;
&lt;td&gt;Multiple Bypass Modes&lt;/td&gt;
&lt;td&gt;Web App&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1. AI Text Humanizer API (by george.the.developer)
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://apify.com/george.the.developer/ai-text-humanizer-api" rel="noopener noreferrer"&gt;AI Text Humanizer API&lt;/a&gt; has emerged as the developer's choice in 2026. Unlike many competitors that rely on heavy, slow LLM calls to "rewrite" text, this API uses a specialized 12-pass algorithmic approach. This method deconstructs the syntax, injects lexical variance, and adjusts the "burstiness" of sentences—mimicking the natural patterns of human writers without the overhead of a general-purpose model.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Extreme Speed:&lt;/strong&gt; Sub-500ms response times make it suitable for real-time applications.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Developer-Centric:&lt;/strong&gt; Designed specifically for API integration with clear documentation and predictable JSON outputs.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Cost-Effective:&lt;/strong&gt; A pay-as-you-go model at $0.003 per text is significantly cheaper for high-volume users than monthly subscriptions.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;12-Pass Logic:&lt;/strong&gt; Ensures high-quality transformations that handle everything from formal reports to casual blog posts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Pure API Focus:&lt;/strong&gt; Lacks a flashy browser-based editor (though the API is easily wrapped in one).&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Technical Entry:&lt;/strong&gt; Requires basic knowledge of REST requests.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Quillbot
&lt;/h2&gt;

&lt;p&gt;Quillbot remains a titan in the writing assistance space. In 2026, it has expanded its API to better support developers, though its core strength remains its user-facing web application. It uses a powerful paraphrasing engine that allows users to toggle between seven different modes, such as "Creative," "Formal," and "Shorten."&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Versatility:&lt;/strong&gt; Excellent for general writing assistance and synonym replacement.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Brand Maturity:&lt;/strong&gt; Very stable and well-supported.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Integration:&lt;/strong&gt; Great browser extensions and Word plugins.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;High Latency:&lt;/strong&gt; The paraphrasing process is noticeably slower, often taking several seconds.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Subscription Model:&lt;/strong&gt; Monthly fees can be expensive if you only need the humanization feature.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Undetectable.ai
&lt;/h2&gt;

&lt;p&gt;Undetectable.ai pioneered the "bypass" niche. Their API is built specifically to outsmart AI detectors. It works by analyzing the "perplexity" and "burstiness" of the input and rewriting it until it falls within human-typical ranges.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Detection Focus:&lt;/strong&gt; Built-in tools to check against multiple AI detectors simultaneously.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Quality:&lt;/strong&gt; Produces text that is generally very high in "human" scores.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Slowest Latency:&lt;/strong&gt; The heavy rewriting process can take up to 8 seconds per request.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Aggressive Rewriting:&lt;/strong&gt; Sometimes changes the meaning or nuance of the original text more than desired.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. WriteHuman
&lt;/h2&gt;

&lt;p&gt;WriteHuman targets the simpler end of the market. It’s a straightforward tool designed to take AI-generated drafts and "scrub" them of robotic markers. It is highly effective for short-form content like emails and social media posts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Simplicity:&lt;/strong&gt; Very easy to use with a clean web interface.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Reliability:&lt;/strong&gt; Consistent results for standard prose.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Limited Styles:&lt;/strong&gt; Offers fewer customization options compared to the top picks.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Basic API:&lt;/strong&gt; The API lacks the granular control (like style selection) found in more robust offerings.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. HIX Bypass
&lt;/h2&gt;

&lt;p&gt;HIX Bypass uses a multi-model approach to humanize text. It essentially runs the input through several different transformation layers to ensure it bypasses "Enterprise-grade" AI detectors.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pros
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Multi-Mode:&lt;/strong&gt; Offers different "Bypass" intensities.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Global Support:&lt;/strong&gt; Handles multiple languages better than most.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Price:&lt;/strong&gt; One of the most expensive entry points for a monthly subscription.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Overkill:&lt;/strong&gt; For many developers, the complexity of the multi-model approach results in unnecessary latency and cost.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Implementation Example: AI Text Humanizer API
&lt;/h2&gt;

&lt;p&gt;Because the &lt;strong&gt;AI Text Humanizer API&lt;/strong&gt; is our top pick for 2026, here is how you can implement it in your stack using JavaScript (Node.js) and Python.&lt;/p&gt;

&lt;h3&gt;
  
  
  Node.js (JavaScript)
&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;axios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&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;humanizeText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&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;url&lt;/span&gt; &lt;span class="o"&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_APIFY_TOKEN&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;response&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;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&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="nx"&gt;input&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;blog&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// Options: creative, formal, casual, blog, technical&lt;/span&gt;
        &lt;span class="p"&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;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&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;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="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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Humanized Text:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;humanizedText&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error humanizing text:&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="nf"&gt;humanizeText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AI provides significant benefits to modern business operations.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;



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

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;humanize_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input_text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://george-the-developer--ai-text-humanizer-api.apify.actor/humanize&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer YOUR_APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;input_text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;style&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;casual&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&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;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Humanized Text:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;humanizedText&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Error:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;humanize_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The implementation of artificial intelligence facilitates improved efficiency.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Pricing Comparison: Unit Cost vs. Subscription
&lt;/h2&gt;

&lt;p&gt;When choosing an &lt;strong&gt;AI text humanizer API in 2026&lt;/strong&gt;, the pricing structure is often more important than the sticker price.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Pay-as-you-go (AI Text Humanizer API):&lt;/strong&gt; You pay $0.003 per request. If you process 1,000 texts a month, you pay $3.00. This is ideal for developers and startups scaling their usage.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Subscription (Quillbot, Undetectable.ai):&lt;/strong&gt; You pay a flat $10–$15 monthly fee. This is great for casual users who do a lot of manual rewriting through a web interface but can become a bottleneck for automated systems that require high volume.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Verdict: Which Humanize AI Text API Should You Use?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;For Developers &amp;amp; High-Volume Apps:&lt;/strong&gt; Choose &lt;strong&gt;AI Text Humanizer API&lt;/strong&gt;. The sub-500ms latency and $0.003 unit cost are unbeatable for production environments.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;For Manual Writing &amp;amp; Students:&lt;/strong&gt; Choose &lt;strong&gt;Quillbot&lt;/strong&gt;. Its browser extension and writing suite are perfectly tuned for individual productivity.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;For Maximum Detection Bypass:&lt;/strong&gt; Choose &lt;strong&gt;Undetectable.ai&lt;/strong&gt; or &lt;strong&gt;HIX Bypass&lt;/strong&gt;. If your only goal is passing a specific AI detector and you don't mind the 5+ second wait, these tools are built for that specific battle.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Final Thought:&lt;/strong&gt; The "Best AI Humanizer API" for your project depends on your latency requirements. If you need speed and predictability, the 12-pass algorithmic approach is the gold standard for 2026.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>One API Call to Analyze Any Website: Tech Stack, SEO, Contacts and More</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Mon, 23 Mar 2026 11:06:59 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/one-api-call-to-analyze-any-website-tech-stack-seo-contacts-and-more-1np8</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/one-api-call-to-analyze-any-website-tech-stack-seo-contacts-and-more-1np8</guid>
      <description>&lt;p&gt;I got tired of calling 7 different APIs just to understand a single website. So I built one that does everything in a single call.&lt;/p&gt;

&lt;p&gt;Historically, getting a complete picture of a website required a "Frankenstein" stack of integrations. You would need one API for tech stack detection (like Wappalyzer), another for SEO metrics, a third for email/contact scraping, a fourth for WHOIS data, and yet another to clean the HTML into Markdown for your LLMs. &lt;/p&gt;

&lt;p&gt;Managing seven different API keys, seven different billing cycles, and seven different JSON formats is a developer's nightmare. It introduces latency, increases costs, and creates multiple points of failure.&lt;/p&gt;

&lt;p&gt;Enter the &lt;strong&gt;WebSight API&lt;/strong&gt;. Hosted on the Apify platform, this tool collapses those seven layers into a single, high-performance API call. In this tutorial, we will explore how to use the WebSight API to extract tech stacks, SEO audits, contacts, and AI-ready content in one go.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: The Seven-API Burden
&lt;/h2&gt;

&lt;p&gt;Before we dive into the solution, let's look at what developers typically have to juggle to get comprehensive &lt;strong&gt;website intelligence&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Tech Stack Detection:&lt;/strong&gt; Identifying if a site uses React, Shopify, or WordPress.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;SEO Audit:&lt;/strong&gt; Checking meta tags, H1 headers, and internal link structures.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Contact Extraction:&lt;/strong&gt; Finding emails, LinkedIn profiles, and Twitter handles.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Structured Data:&lt;/strong&gt; Parsing JSON-LD or Microdata for products or events.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;AI Content Scoring:&lt;/strong&gt; Determining the readability and "human-ness" of the content.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Domain Intel:&lt;/strong&gt; Checking SSL status, WHOIS records, and server location.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Clean Content Extraction:&lt;/strong&gt; Converting messy HTML into clean Markdown for GPT-4 or Claude.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Using separate services for these tasks means your application has to wait for seven different round-trips to various servers. &lt;strong&gt;WebSight API&lt;/strong&gt; solves this by performing all these checks server-side in a single execution.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introducing WebSight API
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;WebSight API&lt;/strong&gt; is a comprehensive &lt;strong&gt;website analysis api&lt;/strong&gt; designed for speed and depth. By calling a single endpoint, you receive a structured JSON object containing everything from the site's underlying framework to the social media profiles of its founders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Endpoint:&lt;/strong&gt; &lt;code&gt;https://george-the-developer--websight-api.apify.actor/analyze?url=URL&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The 7 Modules of WebSight
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Tech Stack Detection API:&lt;/strong&gt; Identifies over 5,000 technologies, including CMS, UI frameworks, analytics, and payment processors.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;SEO Audit API:&lt;/strong&gt; Provides a real-time health check on title tags, descriptions, canonicals, and image alt texts.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Contact &amp;amp; Social Intel:&lt;/strong&gt; Scrapes the DOM and headers for emails, phone numbers, and links to platforms like X, LinkedIn, and Instagram.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Structured Data Parser:&lt;/strong&gt; Extracts and flattens Schema.org data, making it easy to read product prices or review scores.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;AI Content Metrics:&lt;/strong&gt; Scores the content for reading ease and provides a summary of the page's intent.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Infrastructure &amp;amp; Security:&lt;/strong&gt; Returns SSL details, IP addresses, and hosting providers.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Markdown Engine:&lt;/strong&gt; Delivers the main content of the page in clean Markdown, stripped of ads and navigation menus—perfect for RAG (Retrieval-Augmented Generation) applications.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Implementation: JavaScript and Python
&lt;/h2&gt;

&lt;p&gt;Integrating WebSight into your workflow is straightforward. Below are examples of how to call the API using the two most popular languages for web automation.&lt;/p&gt;

&lt;h3&gt;
  
  
  JavaScript (Fetch API)
&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;analyzeWebsite&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;targetUrl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;apiEndpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;`https://george-the-developer--websight-api.apify.actor/analyze?url=&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;{encodeURIComponent(targetUrl)}&lt;/span&gt;&lt;span class="se"&gt;\`&lt;/span&gt;&lt;span class="s2"&gt;;

    try {
        const response = await fetch(apiEndpoint);
        if (!response.ok) throw new Error('Network response was not ok');

        const data = await response.json();
        console.log("Tech Stack:", data.tech_stack);
        console.log("SEO Health:", data.seo.score);
        console.log("Main Content (Markdown):", data.content.markdown.substring(0, 100) + "...");
    } catch (error) {
        console.error("Error analyzing website:", error);
    }
};

analyzeWebsite('https://stripe.com');
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Python (Requests)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_website_intel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target_url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;api_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://george-the-developer--websight-api.apify.actor/analyze?url=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&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="c1"&gt;# Accessing specific modules
&lt;/span&gt;        &lt;span class="n"&gt;contacts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;contacts&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
        &lt;span class="n"&gt;tech&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tech_stack&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Emails Found: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;contacts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;emails&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Technologies: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tech&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Failed to retrieve data: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;intel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_website_intel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://stripe.com&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Realistic Output: Analyzing Stripe.com
&lt;/h2&gt;

&lt;p&gt;When you point the WebSight API at a sophisticated site like &lt;strong&gt;Stripe.com&lt;/strong&gt;, you get a glimpse of its true power. Instead of a wall of HTML, you get a clean, actionable &lt;strong&gt;website intelligence api&lt;/strong&gt; response.&lt;/p&gt;

&lt;h3&gt;
  
  
  JSON Output Fragment (Stripe.com)
&lt;/h3&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&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;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Stripe | Financial Infrastructure for the Internet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&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 is a suite of APIs powering online payment processing and commerce solutions for internet businesses of all sizes."&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;"tech_stack"&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;"React"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Next.js"&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 Payments"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Amazon Web Services"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Google Analytics"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Marketo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"HSTS"&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;"seo"&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;94&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"h1_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"missing_alt_tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"is_mobile_friendly"&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;"sitemap_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="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;"contacts"&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;"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="s2"&gt;"support@stripe.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@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;"social"&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;"twitter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://twitter.com/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;"linkedin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://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;"github"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/stripe"&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;span class="nl"&gt;"infrastructure"&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;"ip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3.233.126.24"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Amazon Data Services"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ssl_expiry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-12-01T00:00:00Z"&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;"content"&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;"word_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1240&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"readability_score"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"College Level"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"markdown"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"# Financial infrastructure for the internet..."&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;h2&gt;
  
  
  Key Use Cases
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Competitive Intelligence
&lt;/h3&gt;

&lt;p&gt;Monitor your competitors' tech stacks. Did they just switch from Shopify to Next.js? Are they using a new A/B testing tool? WebSight API allows you to track these changes at scale without manual inspection.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Hyper-Targeted Lead Generation
&lt;/h3&gt;

&lt;p&gt;For B2B companies, the "Tech Stack Detection API" is a goldmine. If you sell a React performance monitoring tool, you can use WebSight to find every company in a specific niche that is using React and has a low SEO score, then reach out to them via the extracted emails.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. SEO Auditing at Scale
&lt;/h3&gt;

&lt;p&gt;Instead of running a manual audit tool for every new client, agencies can programmatically generate a health report in seconds. By checking meta tags, H1s, and site speed indicators in one call, you can provide instant value during discovery calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Giving AI Agents "Eyes"
&lt;/h3&gt;

&lt;p&gt;If you are building an AI agent that needs to "browse" the web, providing it with raw HTML is expensive and noisy. WebSight API provides the AI with clean Markdown and structured metadata. This reduces token usage and improves the accuracy of the AI's summaries and actions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The era of fragmented web scraping is over. By consolidating tech detection, SEO auditing, contact extraction, and content cleaning into a single &lt;strong&gt;website analysis api&lt;/strong&gt;, the WebSight API allows developers to focus on building features rather than managing infrastructure.&lt;/p&gt;

&lt;p&gt;Whether you are building the next big SaaS or a simple automation script, the ability to get 360-degree website intelligence with one API call is a game-changer for your development velocity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ready to try it?&lt;/strong&gt; Head over to the &lt;a href="https://george-the-developer--websight-api.apify.actor/analyze?url=https://stripe.com" rel="noopener noreferrer"&gt;WebSight API on Apify&lt;/a&gt; and start analyzing.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>javascript</category>
      <category>python</category>
    </item>
    <item>
      <title>How to Detect AI-Generated Text with a Free API</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Mon, 23 Mar 2026 11:06:02 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/how-to-detect-ai-generated-text-with-a-free-api-2lni</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/how-to-detect-ai-generated-text-with-a-free-api-2lni</guid>
      <description>&lt;p&gt;Everyone's arguing about whether AI detectors work. I built one as an API and here's what I learned about what actually triggers them.&lt;/p&gt;

&lt;p&gt;With LLMs generating a huge chunk of web content, the ability to distinguish between a human's lived experience and a machine's statistical average has become a survival skill for developers, editors, and SEOs.&lt;/p&gt;

&lt;p&gt;Whether you're building a content moderation tool, verifying freelance submissions, or just trying to keep your "human-only" community actually human, you need a reliable way to spot the bots. But here's the kicker: most "premium" detectors like GPTZero or Originality.ai are expensive black boxes. You send text, get a percentage, and have no idea &lt;em&gt;why&lt;/em&gt; it was flagged.&lt;/p&gt;

&lt;p&gt;Today, we're looking at a different approach—a math-based, transparent detection system accessible via a simple API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why AI Detection Matters in 2026
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Search Engine Trust:&lt;/strong&gt; Google and Bing have moved beyond "is it AI?" to "is it helpful?". However, pure AI text often lacks the "Information Gain" that search engines now prioritize.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Brand Integrity:&lt;/strong&gt; If your blog starts sounding like a generic support manual, you lose your audience.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Academic &amp;amp; Professional Integrity:&lt;/strong&gt; In a world of "vibe coding" and automated reports, knowing the source of a document is about accountability.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The 9-Factor Scoring System: How the API Thinks
&lt;/h3&gt;

&lt;p&gt;Most detectors try to use another AI to catch the first AI. It's "poison vs. poison." This API uses a different philosophy: &lt;strong&gt;Statistical Fingerprinting.&lt;/strong&gt; It analyzes 9 specific linguistic signals that machines consistently fail to replicate.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Sentence Length Uniformity:&lt;/strong&gt; AI loves the middle ground. Humans write 5-word punches followed by 40-word explanations. AI stays in the 15-25 word "safe zone."&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;AI Phrase Density:&lt;/strong&gt; Tracks the "tell-tale" transitions like &lt;em&gt;furthermore&lt;/em&gt;, &lt;em&gt;it is worth noting&lt;/em&gt;, and &lt;em&gt;in the realm of&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Vocabulary Diversity:&lt;/strong&gt; AI uses high-probability words. Humans use "jagged" vocabulary with unexpected synonyms.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Starter Diversity:&lt;/strong&gt; Machines often start 60% of sentences with "The," "It," or "This." Humans vary their sentence openings significantly more.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Paragraph Uniformity:&lt;/strong&gt; Analyzes if paragraphs are eerily similar in structure and length.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Comma Patterns:&lt;/strong&gt; AI tends to use commas with mathematical precision (e.g., always after introductory phrases), whereas human punctuation is more stylistic.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Burstiness:&lt;/strong&gt; This is the "rhythm" of the text. Human writing has high variance in consecutive sentence lengths (bursts of info). AI is smooth and monotone.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Readability Grade Targeting:&lt;/strong&gt; Most LLMs default to a grade 8-12 reading level. Human text is wildly inconsistent, ranging from grade 4 to 16+.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Structure Repetition:&lt;/strong&gt; Detects if the underlying "template" of sentences (Noun-Verb-Adjective) repeats too frequently.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Calling the API: Code Examples
&lt;/h3&gt;

&lt;p&gt;The endpoint we're using is hosted on Apify: &lt;code&gt;https://george-the-developer--ai-text-humanizer-api.apify.actor/detect&lt;/code&gt;. It's a POST request that expects a JSON body with a &lt;code&gt;text&lt;/code&gt; field.&lt;/p&gt;

&lt;h4&gt;
  
  
  JavaScript (Fetch API)
&lt;/h4&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;detectAI&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;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/detect&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;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="nx"&gt;content&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="s2"&gt;`AI Score: &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;ai_score&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;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="s2"&gt;`Verdict: &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;verdict&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;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="s2"&gt;`Confidence: &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;confidence&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;myText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;In the rapidly evolving landscape of AI, it is worth noting...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;detectAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Python (Requests)
&lt;/h4&gt;



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

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;detect_ai_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://george-the-developer--ai-text-humanizer-api.apify.actor/detect&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&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="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Verdict: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;verdict&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AI Probability: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ai_score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Human Probability: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;human_score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;sample_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I went to the store and bought some milk. It was a sunny day, and I felt great.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="nf"&gt;detect_ai_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sample_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Reading the Results: AI vs. Human
&lt;/h3&gt;

&lt;p&gt;When you call the &lt;code&gt;/detect&lt;/code&gt; endpoint, you don't just get a "Yes/No." You get a weighted analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample AI Output (GPT-4o):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;AI Score:&lt;/strong&gt; 82%&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Verdict:&lt;/strong&gt; &lt;code&gt;ai_generated&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Details:&lt;/strong&gt; High uniformity (22.5), low burstiness, and 4 flagged phrases (&lt;em&gt;delve into&lt;/em&gt;, &lt;em&gt;tapestry&lt;/em&gt;, &lt;em&gt;landscape&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sample Human Output:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;AI Score:&lt;/strong&gt; 14%&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Verdict:&lt;/strong&gt; &lt;code&gt;human_written&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Details:&lt;/strong&gt; High burstiness (35.2 variance), varied starters, and 0 flagged AI phrases.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The beauty of this 9-factor system is that it's harder to "prompt engineer" your way around it. Even if you tell an AI to "be creative," its underlying statistical distribution of sentence lengths and comma placements usually gives it away.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Antidote: The Humanizer Endpoint
&lt;/h3&gt;

&lt;p&gt;If you're on the other side of the fence—perhaps you're a writer using AI to brainstorm but want to ensure your final draft doesn't trigger every detector on the planet—the same API offers a "humanize" endpoint.&lt;/p&gt;

&lt;p&gt;While the &lt;code&gt;/detect&lt;/code&gt; endpoint finds the patterns, the &lt;code&gt;/humanize&lt;/code&gt; endpoint breaks them. It injects burstiness, varies the sentence structures, and swaps out the "robot vocabulary" for something more organic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it out:&lt;/strong&gt; If your text is getting flagged, hit the humanizer endpoint to see how a few surgical changes in structure can completely shift the statistical fingerprint of your writing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;AI content detection isn't about "banning" AI; it's about transparency. In a world of automated noise, the ability to verify the signal is priceless. By focusing on measurable math—burstiness, uniformity, and phrase density—we can build a more trustworthy web.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>javascript</category>
      <category>ai</category>
    </item>
    <item>
      <title>Scrape LinkedIn Employees at Scale (Without Getting Banned)</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Sun, 22 Mar 2026 10:18:56 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/scrape-linkedin-employees-at-scale-without-getting-banned-3bk2</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/scrape-linkedin-employees-at-scale-without-getting-banned-3bk2</guid>
      <description>&lt;p&gt;As developers, we've all been there. A client or a marketing team drops a request: "We need a list of employees from these 50 companies." You open LinkedIn, start scrolling, and within minutes you realize this is going to take forever. Worse, LinkedIn starts throwing captchas and login walls at you like you just committed a crime.&lt;/p&gt;

&lt;p&gt;I got tired of this cycle, so I built the &lt;strong&gt;LinkedIn Company Employees Scraper&lt;/strong&gt; — and it handles all the messy anti-bot stuff so you don't have to.&lt;/p&gt;

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

&lt;p&gt;LinkedIn is notorious for its aggressive anti-scraping measures. If you try to build a scraper from scratch using Selenium or Puppeteer, you'll likely face:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Login Wall&lt;/strong&gt;: You need an account, which gets flagged almost immediately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IP Rate Limiting&lt;/strong&gt;: Your residential or data center IP is blocked after a few requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session Expiry&lt;/strong&gt;: Managing cookies and headers is a nightmare.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;Unlike traditional scrapers that require you to manage your own browser sessions or risk your personal LinkedIn account, this tool operates &lt;strong&gt;without login or cookies&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It uses optimized search queries and residential proxies to navigate LinkedIn's public pages. It can handle pagination across thousands of employees, extracting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full Names&lt;/li&gt;
&lt;li&gt;Job Titles&lt;/li&gt;
&lt;li&gt;Locations&lt;/li&gt;
&lt;li&gt;LinkedIn Profile URLs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By offloading the anti-bot bypass logic to the Apify platform, you can focus on what matters: the data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation in JavaScript
&lt;/h2&gt;

&lt;p&gt;Integrating this into your workflow is straightforward. You can use the &lt;code&gt;apify-client\&lt;/code&gt; package to trigger the scraper and fetch results in just a few lines of code.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;\&lt;/code&gt;`javascript&lt;br&gt;
const { ApifyClient } = require('apify-client');&lt;/p&gt;

&lt;p&gt;const client = new ApifyClient({&lt;br&gt;
    token: 'YOUR_APIFY_TOKEN',&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;(async () =&amp;gt; {&lt;br&gt;
    const input = {&lt;br&gt;
        companyUrls: ["&lt;a href="https://www.linkedin.com/company/google/%22" rel="noopener noreferrer"&gt;https://www.linkedin.com/company/google/"&lt;/a&gt;],&lt;br&gt;
        maxItems: 100,&lt;br&gt;
    };&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const run = await client.actor("george.the.developer/linkedin-company-employees-scraper").call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) =&amp;gt; {
    console.dir(item);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;})();&lt;br&gt;
`&lt;code&gt;\&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Stats &amp;amp; Social Proof
&lt;/h2&gt;

&lt;p&gt;I'm a big believer in building in public. Since launching this tool, it has seen incredible traction within the developer community. As of today, the scraper has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;99 active users&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1,077 successful runs&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't just vanity metrics; they represent hundreds of hours saved by developers who no longer have to manually copy-paste data or fix broken scraper scripts.&lt;/p&gt;

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

&lt;p&gt;Scaling shouldn't break the bank. I've priced this tool to be accessible for both solo developers and large enterprises.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost per run&lt;/strong&gt;: $0.005&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For less than a penny per run, you get clean, structured JSON data without the headache of infrastructure maintenance.&lt;/p&gt;

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

&lt;p&gt;Ready to automate your LinkedIn data extraction? You can find the actor, read the full documentation, and start your first run here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://apify.com/george.the.developer/linkedin-company-employees-scraper" rel="noopener noreferrer"&gt;LinkedIn Company Employees Scraper on Apify&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Happy scraping!&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>javascript</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Stop Hunting for B2B Data: How to Automate Company Enrichment in JavaScript</title>
      <dc:creator>George Kioko</dc:creator>
      <pubDate>Sun, 22 Mar 2026 10:18:02 +0000</pubDate>
      <link>https://dev.to/the_aientrepreneur_7ae85/stop-hunting-for-b2b-data-how-to-automate-company-enrichment-in-javascript-gb0</link>
      <guid>https://dev.to/the_aientrepreneur_7ae85/stop-hunting-for-b2b-data-how-to-automate-company-enrichment-in-javascript-gb0</guid>
      <description>&lt;p&gt;If you've ever built a CRM, a lead gen tool, or any kind of B2B sales dashboard, you've probably hit this wall before: you have a pile of company domains, but zero context behind them. No industry data, no headcount, no social links, no HQ address. Just... domains. And manually Googling each one? Nobody has time for that.&lt;/p&gt;

&lt;p&gt;That's exactly why I built the &lt;strong&gt;Company Enrichment API&lt;/strong&gt; — to turn a raw domain into a full company profile, programmatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: The Stale Data Trap
&lt;/h2&gt;

&lt;p&gt;Data decays fast. A company that was "11-50 employees" last year might be 200+ today. If your sales team is working off spreadsheets or static databases, they are losing deals before they even send the first email. &lt;/p&gt;

&lt;p&gt;Most "enrichment" services are either:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Overpriced:&lt;/strong&gt; Charging thousands in annual contracts.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Rigid:&lt;/strong&gt; Hard to integrate into a custom CI/CD or data pipeline.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Incomplete:&lt;/strong&gt; Missing the "long tail" of smaller startups or international firms.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How it Works
&lt;/h2&gt;

&lt;p&gt;The Company Enrichment API acts as a bridge between a simple domain name and a full-scale corporate profile. When you pass a URL to the API, it crawls publicly available sources, business directories, and social signals to synthesize a structured JSON object.&lt;/p&gt;

&lt;p&gt;It's built on top of the Apify platform, meaning it benefits from industrial-grade browser rotation and proxy management — so you don't get blocked while gathering data.&lt;/p&gt;

&lt;h2&gt;
  
  
  JavaScript Implementation
&lt;/h2&gt;

&lt;p&gt;Integrating this into your Node.js backend is straightforward. Here is how you can enrich a company profile using the &lt;code&gt;apify-client\&lt;/code&gt; library:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;\&lt;/code&gt;`javascript&lt;br&gt;
import { ApifyClient } from 'apify-client';&lt;/p&gt;

&lt;p&gt;const client = new ApifyClient({&lt;br&gt;
    token: 'YOUR_APIFY_TOKEN',&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;const input = {&lt;br&gt;
    "domains": ["apify.com", "stripe.com"],&lt;br&gt;
    "maxResults": 10&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;(async () =&amp;gt; {&lt;br&gt;
    const run = await client.actor("george.the.developer/company-enrichment-api").call(input);&lt;br&gt;
    const { items } = await client.dataset(run.defaultDatasetId).listItems();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;items.forEach((item) =&amp;gt; {
    console.log(\`Company: \${item.name}\`);
    console.log(\`Industry: \${item.industry}\`);
    console.log(\`Socials: \${item.linkedinUrl}\`);
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;})();&lt;br&gt;
`&lt;code&gt;\&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Stats &amp;amp; Performance
&lt;/h2&gt;

&lt;p&gt;Since its launch, the API has been gaining steady traction among developers who need reliable B2B data without the enterprise bloat.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Current Users:&lt;/strong&gt; 10 Active Developers&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Total Runs:&lt;/strong&gt; 230 successful enrichments&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Reliability:&lt;/strong&gt; Built on the Apify SDK for 99.9% uptime.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Forget $5k/year minimums. The Company Enrichment API operates on a &lt;strong&gt;Pay-As-You-Go&lt;/strong&gt; model via the Apify platform. You only pay for the compute resources you actually use.&lt;/p&gt;

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

&lt;p&gt;Ready to stop manually copying and pasting from LinkedIn? Try it out directly in the browser or via the API console.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check it out here:&lt;/strong&gt; &lt;a href="https://apify.com/george.the.developer/company-enrichment-api" rel="noopener noreferrer"&gt;Company Enrichment API on Apify&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy hacking!&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>javascript</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
