<?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: ntriq-gh</title>
    <description>The latest articles on DEV Community by ntriq-gh (@ntriqgh).</description>
    <link>https://dev.to/ntriqgh</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3866633%2F0cb29c65-2c42-4c66-ad18-6144c030d4bb.png</url>
      <title>DEV Community: ntriq-gh</title>
      <link>https://dev.to/ntriqgh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ntriqgh"/>
    <language>en</language>
    <item>
      <title>Check a list of usernames across 400+ sites without installing Sherlock</title>
      <dc:creator>ntriq-gh</dc:creator>
      <pubDate>Tue, 03 Nov 2026 01:03:06 +0000</pubDate>
      <link>https://dev.to/ntriqgh/check-a-list-of-usernames-across-400-sites-without-installing-sherlock-11pl</link>
      <guid>https://dev.to/ntriqgh/check-a-list-of-usernames-across-400-sites-without-installing-sherlock-11pl</guid>
      <description>&lt;p&gt;Sherlock is the tool most people reach for when they want to know where a username exists. It works well on your laptop. It gets awkward when the job is a list of handles, a schedule, or a pipeline that needs JSON instead of terminal output.&lt;/p&gt;

&lt;p&gt;I wrapped the open-source &lt;a href="https://github.com/sherlock-project/sherlock" rel="noopener noreferrer"&gt;Sherlock&lt;/a&gt; engine (MIT) as an Apify Actor so the setup step disappears. You send usernames, you get one row per site where the account exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;p&gt;For &lt;code&gt;johnsmith&lt;/code&gt; the Actor checks 400+ sites, including GitHub, Reddit, Instagram, TikTok, X, Steam and Twitch. Each confirmed account becomes one dataset row:&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;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"johnsmith"&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;"GitHub"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"profileUrl"&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/johnsmith"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Claimed"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"httpStatus"&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;"responseTimeS"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.41&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A username with no hits returns a single "No accounts found" row, so an empty result is still an answer you can store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Input
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"usernames"&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;"johnsmith"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"jsmith_dev"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sites"&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;"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;"Reddit"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timeout"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&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;ul&gt;
&lt;li&gt;
&lt;code&gt;usernames&lt;/code&gt;: up to 5 per run on paid plans&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sites&lt;/code&gt;: optional, limit the scan to the platforms you care about&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;timeout&lt;/code&gt;: per-request timeout in seconds, raise it if you suspect false negatives from slow sites&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;includeNsfw&lt;/code&gt;: off by default&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why bother with an Actor
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bulk and scheduled.&lt;/strong&gt; Put the handles in one run, or schedule a weekly run to see when a brand name shows up on a new platform.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API and integrations.&lt;/strong&gt; Start it from Python or JavaScript, or from Make, n8n or a webhook, and read the dataset as JSON, CSV or Excel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same Sherlock results.&lt;/strong&gt; Nothing is re-ranked or guessed. A row exists only if Sherlock confirmed the account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The free plan checks one username on the top 100 sites and shows up to 5 accounts, so you can see the real output before deciding anything. The last row of a free run says what was held back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits worth knowing
&lt;/h2&gt;

&lt;p&gt;Some sites rate-limit or block automated checks, which can produce false negatives. A hit also only shows that a handle exists, not that it belongs to the person you have in mind. Treat results as leads to verify.&lt;/p&gt;

&lt;p&gt;It reads only publicly reachable pages and never logs in. Use it on accounts you own or are authorized to investigate, and follow the laws that apply to you, including GDPR and similar privacy rules.&lt;/p&gt;

&lt;p&gt;The Actor: &lt;a href="https://apify.com/ntriqpro/sherlock-username-osint?utm_source=devto&amp;amp;utm_campaign=a6-sherlock-devto" rel="noopener noreferrer"&gt;Username Search &amp;amp; Lookup on Apify&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I build these Actors at Ntriq (Korea). If you need another output field, say so in the comments.&lt;/p&gt;

</description>
      <category>osint</category>
      <category>api</category>
      <category>opensource</category>
      <category>automation</category>
    </item>
    <item>
      <title>You have a name but no username: find public profiles on 3000+ sites with one API call</title>
      <dc:creator>ntriq-gh</dc:creator>
      <pubDate>Tue, 03 Nov 2026 01:01:09 +0000</pubDate>
      <link>https://dev.to/ntriqgh/you-have-a-name-but-no-username-find-public-profiles-on-3000-sites-with-one-api-call-2m3h</link>
      <guid>https://dev.to/ntriqgh/you-have-a-name-but-no-username-find-public-profiles-on-3000-sites-with-one-api-call-2m3h</guid>
      <description>&lt;p&gt;Most profile lookups start from a handle. In practice you often start from a name: a lead list, a candidate, a counterparty in a due diligence file. Nobody gives you the username.&lt;/p&gt;

&lt;p&gt;I built an Apify Actor around the open-source &lt;a href="https://github.com/soxoj/maigret" rel="noopener noreferrer"&gt;Maigret&lt;/a&gt; engine (MIT) that closes that gap. You send a name, it builds the usernames a real person would plausibly have picked, ranks them, and checks each one against the full Maigret site catalogue.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens to a name
&lt;/h2&gt;

&lt;p&gt;Give it "John Smith" and it tries candidates such as &lt;code&gt;johnsmith&lt;/code&gt;, &lt;code&gt;john.smith&lt;/code&gt;, &lt;code&gt;john_smith&lt;/code&gt; and &lt;code&gt;smithjohn&lt;/code&gt;, best guess first. Each candidate is checked against 3000+ sites. You get one row per confirmed public profile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Input
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;names&lt;/code&gt;: up to 10 names per run&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;maxPermutations&lt;/code&gt;: how many username candidates to build per name (default 6)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;siteScope&lt;/code&gt;: &lt;code&gt;top300&lt;/code&gt;, &lt;code&gt;top500&lt;/code&gt; or &lt;code&gt;all3000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;minConfidence&lt;/code&gt;: drop weak matches, useful for common names&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;monitorMode&lt;/code&gt;: on a schedule, return only what changed since the last run
&lt;/li&gt;
&lt;/ul&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;"names"&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;"John Smith"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxPermutations"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"siteScope"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"top500"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"minConfidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.5&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;
  
  
  Output
&lt;/h2&gt;

&lt;p&gt;Every row carries a &lt;code&gt;rowType&lt;/code&gt;, so filtering is one expression. A &lt;code&gt;profile-found&lt;/code&gt; row looks like this:&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;"rowType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"profile-found"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"John Smith"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"username"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"john.smith"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"site"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GitHub"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/john.smith"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Developer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.0&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;
  
  
  Confidence is about the person, not the account
&lt;/h2&gt;

&lt;p&gt;A match only tells you that a username exists on a site. The confidence score tries to answer a different question: how likely is it that this handle belongs to the person you named. A username that contains every part of the name scores high. A bare first name scores low, because thousands of unrelated people use it.&lt;/p&gt;

&lt;p&gt;Treat the result as a lead to verify, not as proof of identity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it fits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;sales and recruiting: find the public GitHub, X or Medium presence of a name on a list&lt;/li&gt;
&lt;li&gt;due diligence: a first pass before manual review&lt;/li&gt;
&lt;li&gt;monitoring: a weekly schedule that reports only new or changed profiles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By default the rows hold account-existence evidence only. Profile fields such as bio or location are opt-in. The Actor only reads publicly reachable pages and never logs in. Use it where you have a lawful basis, and follow the laws that apply to you, including GDPR and similar rules.&lt;/p&gt;

&lt;p&gt;The Actor: &lt;a href="https://apify.com/ntriqpro/social-media-finder-by-name?utm_source=devto&amp;amp;utm_campaign=a5-name-to-profiles" rel="noopener noreferrer"&gt;Social Media Finder by Name on Apify&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I build these Actors at Ntriq (Korea). If you want another output field, tell me in the comments.&lt;/p&gt;

</description>
      <category>osint</category>
      <category>api</category>
      <category>opensource</category>
      <category>automation</category>
    </item>
    <item>
      <title>Search one username across 3000+ sites with an API call (Maigret, hosted)</title>
      <dc:creator>ntriq-gh</dc:creator>
      <pubDate>Tue, 27 Oct 2026 23:39:10 +0000</pubDate>
      <link>https://dev.to/ntriqgh/search-one-username-across-3000-sites-with-an-api-call-maigret-hosted-44af</link>
      <guid>https://dev.to/ntriqgh/search-one-username-across-3000-sites-with-an-api-call-maigret-hosted-44af</guid>
      <description>&lt;p&gt;Checking a username across thousands of sites usually means running &lt;a href="https://github.com/soxoj/maigret" rel="noopener noreferrer"&gt;Maigret&lt;/a&gt; locally: install it, let it walk the site list, then clean up the console output. I wrapped the open-source Maigret engine (MIT) as an Apify Actor so the same search runs as an API call and comes back as structured rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you send
&lt;/h2&gt;

&lt;p&gt;The input is small. The fields you will actually touch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;usernames&lt;/code&gt;: an array, so a whole investigation list goes in one run&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;topSites&lt;/code&gt;: limit the search to the top N sites (0 means all 3000+, which is slower)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tags&lt;/code&gt; / &lt;code&gt;excludeTags&lt;/code&gt;: e.g. &lt;code&gt;coding,video&lt;/code&gt; to stay on developer and video sites&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sites&lt;/code&gt;: a fixed list like &lt;code&gt;GitHub,Twitter,Instagram&lt;/code&gt; when you only care about a few&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;noRecursion&lt;/code&gt;: skip the follow-up search on extra usernames Maigret discovers
&lt;/li&gt;
&lt;/ul&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;"usernames"&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;"some_handle"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"another_handle"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"topSites"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"coding,social"&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;
  
  
  What comes back
&lt;/h2&gt;

&lt;p&gt;One row per site where the handle is registered, each with the site name, a direct profile URL and the status. By default the rows hold account-existence evidence only. Turn on &lt;code&gt;extractProfileFields&lt;/code&gt; if you also need public profile fields such as name, bio or location. &lt;code&gt;printNotFound&lt;/code&gt; adds the misses too, which helps when you have to show what was checked.&lt;/p&gt;

&lt;p&gt;Because it is a dataset, you can pull it as JSON or CSV from the API and filter in code instead of grepping a console dump.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why 3000+ sites matter
&lt;/h2&gt;

&lt;p&gt;Most handle checkers cover a few hundred popular sites. The value of a bigger list is the long tail: forums, gaming, dating and developer sites where people reuse a handle and forget about it. That is where impersonation and fraud checks usually find the extra account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it fits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;brand-handle checks before you name a product&lt;/li&gt;
&lt;li&gt;due diligence on a counterparty's public handle&lt;/li&gt;
&lt;li&gt;the first pass of an OSINT workflow before manual review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use it only for public profile lookups on subjects you have a legitimate reason to check, and follow the laws that apply to you.&lt;/p&gt;

&lt;p&gt;The Actor: &lt;a href="https://apify.com/ntriqpro/maigret-actor?utm_source=devto&amp;amp;utm_campaign=a4-maigret-longtail" rel="noopener noreferrer"&gt;Maigret username search on Apify&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I build these Actors at Ntriq (Korea). If you want an output field added, say so in the comments.&lt;/p&gt;

</description>
      <category>osint</category>
      <category>security</category>
      <category>opensource</category>
      <category>api</category>
    </item>
    <item>
      <title>HTTP 402 + USDC: Pay-per-use AI APIs for Autonomous Agents</title>
      <dc:creator>ntriq-gh</dc:creator>
      <pubDate>Tue, 07 Apr 2026 23:02:13 +0000</pubDate>
      <link>https://dev.to/ntriqgh/http-402-usdc-pay-per-use-ai-apis-for-autonomous-agents-4g5d</link>
      <guid>https://dev.to/ntriqgh/http-402-usdc-pay-per-use-ai-apis-for-autonomous-agents-4g5d</guid>
      <description>&lt;h2&gt;
  
  
  The Problem with API Keys for AI Agents
&lt;/h2&gt;

&lt;p&gt;AI agents need to call external APIs autonomously. But traditional API key auth has a fundamental mismatch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Who manages the keys?&lt;/strong&gt; The agent can't sign up for accounts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How does billing work?&lt;/strong&gt; Subscription tiers don't fit pay-per-task usage&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What about multi-agent systems?&lt;/strong&gt; Keys get shared, leaked, revoked&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's a better way: let agents pay directly, per request, with crypto.&lt;/p&gt;

&lt;h2&gt;
  
  
  x402: HTTP 402 as a Payment Protocol
&lt;/h2&gt;

&lt;p&gt;The HTTP 402 status code has been "reserved for future use" since 1991. &lt;a href="https://x402.org" rel="noopener noreferrer"&gt;x402&lt;/a&gt; finally uses it.&lt;/p&gt;

&lt;p&gt;The flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Agent → POST /document-intel
Server → 402 Payment Required
        { amount: "0.05", currency: "USDC", network: "eip155:8453" }
Agent → EIP-3009 signature (gasless transfer authorization)
Server → Facilitator validates → 200 OK + result
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No API keys. No subscriptions. No gas fees. The payment IS the authentication.&lt;/p&gt;

&lt;h2&gt;
  
  
  ntriq AgentShop: 6 Endpoints, $0.01–$0.05
&lt;/h2&gt;

&lt;p&gt;We built a document intelligence server on this protocol, running 100% local inference on a Mac Mini.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/document-intel&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.05&lt;/td&gt;
&lt;td&gt;qwen2.5vl:7b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/invoice-extract&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.03&lt;/td&gt;
&lt;td&gt;qwen2.5vl:7b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/screenshot-data&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.02&lt;/td&gt;
&lt;td&gt;qwen2.5vl:7b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/alt-text&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.01&lt;/td&gt;
&lt;td&gt;qwen2.5vl:7b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/pii-detect&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.02&lt;/td&gt;
&lt;td&gt;qwen2.5:7b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/sentiment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.01&lt;/td&gt;
&lt;td&gt;qwen2.5:7b&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Cost to run: $0&lt;/strong&gt; (local inference). Margin: ~100%.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 1: Hit the endpoint — you'll get a 402 back&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://x402.ntriq.co.kr/sentiment &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"text": "This product is amazing"}'&lt;/span&gt;

&lt;span class="c"&gt;# Response:&lt;/span&gt;
&lt;span class="c"&gt;# { "x402Version": 1, "accepts": [{ "amount": "10000", "currency": "USDC" }] }&lt;/span&gt;

&lt;span class="c"&gt;# Step 2: Sign with EIP-3009 and retry&lt;/span&gt;
&lt;span class="c"&gt;# The x402 client library handles this automatically&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why Local Inference?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero marginal cost&lt;/strong&gt;: Every request is pure profit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No rate limits&lt;/strong&gt;: Mac Mini handles concurrent requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy&lt;/strong&gt;: Documents never leave our infrastructure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed&lt;/strong&gt;: No network hop to OpenAI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;qwen2.5vl:7b handles documents, invoices, and screenshots with accuracy comparable to GPT-4V for structured extraction tasks.&lt;/p&gt;

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

&lt;p&gt;ntriq-agentshop is available as a ClawHub skill. Any agent using OpenClaw or Claude can discover and use these endpoints automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install via ClawHub&lt;/span&gt;
clawhub &lt;span class="nb"&gt;install &lt;/span&gt;ntriq-document-intelligence-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live server&lt;/strong&gt;: &lt;a href="https://x402.ntriq.co.kr" rel="noopener noreferrer"&gt;https://x402.ntriq.co.kr&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/ntriq-gh/ntriq-agentshop" rel="noopener noreferrer"&gt;https://github.com/ntriq-gh/ntriq-agentshop&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;x402 protocol&lt;/strong&gt;: &lt;a href="https://x402.org" rel="noopener noreferrer"&gt;https://x402.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Listed on&lt;/strong&gt;: &lt;a href="https://github.com/punkpeye/awesome-mcp-servers" rel="noopener noreferrer"&gt;awesome-mcp-servers&lt;/a&gt; (PR #4364)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Built on Mac Mini M4, running 24/7. No cloud bills.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
