<?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: Stuart McLeod</title>
    <description>The latest articles on DEV Community by Stuart McLeod (@stuartwmcleod).</description>
    <link>https://dev.to/stuartwmcleod</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%2F4024051%2F1188eeaa-1830-456e-9576-0604402b39fe.png</url>
      <title>DEV Community: Stuart McLeod</title>
      <link>https://dev.to/stuartwmcleod</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stuartwmcleod"/>
    <language>en</language>
    <item>
      <title>Search for an agent is not search for a human</title>
      <dc:creator>Stuart McLeod</dc:creator>
      <pubDate>Tue, 14 Jul 2026 07:13:53 +0000</pubDate>
      <link>https://dev.to/abmdev/search-for-an-agent-is-not-search-for-a-human-3lap</link>
      <guid>https://dev.to/abmdev/search-for-an-agent-is-not-search-for-a-human-3lap</guid>
      <description>&lt;p&gt;&lt;em&gt;A person searches to browse. An agent searches to act. That one difference changes the whole API.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When you search for a company, you get a page of ten results and your eyes do the rest. You know which "Acme" you meant. You click the right one. The ambiguity was never the search engine's problem, it was yours, and you solved it in half a second without noticing.&lt;/p&gt;

&lt;p&gt;An agent can't do that. Hand it ten Acmes and it has to guess, or stop and ask, or worse, pick the wrong one and enrich a company you've never heard of. Search built for people leans on a human to disambiguate at the end. Search built for agents has to remove the ambiguity up front.&lt;/p&gt;

&lt;p&gt;So abm.dev's Search has two doors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exact, when you know something hard.&lt;/strong&gt; Give it a domain or an email and you get the one company or the one person, resolved, no page of maybes. This is the door an agent should reach for whenever it can, because a domain is unambiguous and a name never is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fuzzy, when you're still looking.&lt;/strong&gt; By keyword, across LinkedIn and the web: the companies in a segment, the people in a role, the posts on a topic. This is the top of the funnel, where you don't yet have the domain, and it's honest about being a starting point, not an answer.&lt;/p&gt;

&lt;p&gt;And then the verb people forget: &lt;strong&gt;sourcing the buying committee.&lt;/strong&gt; Give it a company and a role, who runs RevOps at the account you're chasing, and it goes and finds them, as an async job, and hands back candidates with their profiles. Not a database lookup. A search that runs, the way a good rep would, then comes back.&lt;/p&gt;

&lt;p&gt;Here's why it matters. Search is the first verb, and everything downstream inherits its mistakes. Enrich the wrong person and you get beautiful, cited, confident data about a stranger. Create outreach off that and you've emailed the wrong human on your behalf. The whole chain is only as good as whether Search returned the thing you actually meant.&lt;/p&gt;

&lt;p&gt;That's why we made it resolve, not just retrieve. One key, one call, and the answer is a real entity you can hand straight to Enrich, not a list you have to babysit.&lt;/p&gt;

&lt;p&gt;If you're building an agent that acts on who it finds, come make it prove it finds the right one. There's a free playground at &lt;a href="https://abm.dev" rel="noopener noreferrer"&gt;abm.dev&lt;/a&gt;, and &lt;code&gt;LAUNCHCODES&lt;/code&gt; puts about twenty in credits on your account. Search an account you know cold and see if it comes back with the one you meant.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>agents</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>82% email: what a B2B enrichment API actually returns</title>
      <dc:creator>Stuart McLeod</dc:creator>
      <pubDate>Tue, 14 Jul 2026 05:48:03 +0000</pubDate>
      <link>https://dev.to/abmdev/82-email-what-a-b2b-enrichment-api-actually-returns-4397</link>
      <guid>https://dev.to/abmdev/82-email-what-a-b2b-enrichment-api-actually-returns-4397</guid>
      <description>&lt;p&gt;&lt;em&gt;Everyone publishes coverage numbers. Almost nobody publishes their own. So we ran our engine over five hundred and nineteen people and wrote down exactly what came back.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Enrichment vendors love a big number. "300M contacts." "10 data sources." "The most accurate database." None of it tells you the only thing that matters: give it a real person, how often does the thing you need actually come back?&lt;/p&gt;

&lt;p&gt;So we measured our own. Not a benchmark, not a customer's data. Five hundred and nineteen people and twenty-nine companies run through abm.dev's own pipeline, every field logged with its source and a confidence score. Here is the honest read.&lt;/p&gt;

&lt;h2&gt;
  
  
  People: the find-rate, per field
&lt;/h2&gt;

&lt;p&gt;Across 519 people:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LinkedIn URL: 99.6%.&lt;/strong&gt; Near-universal. If someone has a professional life online, we find the profile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Title: 97.5%.&lt;/strong&gt; Almost always, and usually current.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Work email: 82%.&lt;/strong&gt; Four in five. This is the number everyone actually cares about, and it's the one everyone is vaguest about.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phone: 6%.&lt;/strong&gt; Phone is the weak spot, and we'd rather show you the number than bury it. Direct dials go stale quickly, so we lean on the channels where the trail stays live, email and LinkedIn. Where we don't have a number, the field comes back empty.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the pattern throughout. A field that isn't there comes back empty, not invented.&lt;/p&gt;

&lt;h2&gt;
  
  
  Confidence: the miss is knowable
&lt;/h2&gt;

&lt;p&gt;Every value carries a score from zero to one. Across roughly fourteen thousand field-values, the median confidence was &lt;strong&gt;0.87&lt;/strong&gt;. Forty-three percent scored 0.9 or higher. Four percent came back under 0.5.&lt;/p&gt;

&lt;p&gt;That distribution is the product. An agent acting on this data doesn't get a flat "here you go." It gets an 82% email &lt;em&gt;and&lt;/em&gt; a number telling it how sure to be. Act on the 0.94. Hold the 0.51. Route the low ones to a human. The 18% we miss on email isn't a silent gap you discover after a bounce. It's a field that isn't there, next to fields that tell you their own odds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Companies
&lt;/h2&gt;

&lt;p&gt;The company sample is smaller and honesty demands the caveat: twenty-nine firms, so read these as directional, not gospel. Headquarters came back every time. Employee count 97%. Revenue 69%, which is about right for a figure that's genuinely private for most private companies.&lt;/p&gt;

&lt;h2&gt;
  
  
  The caveat we're not hiding
&lt;/h2&gt;

&lt;p&gt;These were people with a real professional footprint, the kind you'd actually want to reach. Run the same engine over a cold, random, scraped list and the email number drops. Enrichment is only as good as the person's public trail, and ours is honest about that: it tells you when it's guessing instead of guessing in a confident voice.&lt;/p&gt;

&lt;p&gt;Every field here was corroborated across more than one provider, Perplexity, Tavily, LinkedIn and Hunter among them, aggregated and reconciled into one answer. One key, one call. No per-source bills. No fabricated data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we published this
&lt;/h2&gt;

&lt;p&gt;Because the buyer is increasingly an agent, and an agent can't act on a marketing claim. It can act on 82% and a confidence score. The vendors quoting database sizes are answering a question nobody's agent is asking.&lt;/p&gt;

&lt;p&gt;Run it on an account you know cold and check our working. There's a free playground at &lt;a href="https://abm.dev" rel="noopener noreferrer"&gt;abm.dev&lt;/a&gt;, and &lt;code&gt;LAUNCHCODES&lt;/code&gt; puts about twenty in credits on your account. Tell us where the 82% is wrong. That's the useful part.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>data</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>Your AI agent shouldn't act on data it can't cite</title>
      <dc:creator>Stuart McLeod</dc:creator>
      <pubDate>Tue, 14 Jul 2026 04:59:58 +0000</pubDate>
      <link>https://dev.to/abmdev/your-ai-agent-shouldnt-act-on-data-it-cant-cite-4naj</link>
      <guid>https://dev.to/abmdev/your-ai-agent-shouldnt-act-on-data-it-cant-cite-4naj</guid>
      <description>&lt;p&gt;&lt;em&gt;A great rep once knew every account. An agent doesn't, unless you tell it what's true and how sure to be.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Enrichment APIs hand your agent a value. An email. A job title. A funding round. The agent acts on it: writes the email, books the play, updates the CRM. But was that email verified, or guessed? Most APIs won't say. For a human scanning a spreadsheet, fine, you eyeball it. For an agent sending on your behalf, an unmarked guess is how it emails a made-up address with total confidence.&lt;/p&gt;

&lt;p&gt;So we built &lt;a href="https://abm.dev" rel="noopener noreferrer"&gt;abm.dev&lt;/a&gt; the other way round. Every field carries its own source and a confidence score. Not a blended trust rating for the record. Per field.&lt;/p&gt;

&lt;p&gt;Eighty-nine canonical fields on an enrichment, forty-three on a person, forty-six on a company. Ten providers behind one call, LinkedIn, Companies House, Hunter, Perplexity, Tavily and five more, aggregated, deduped, reconciled. One key, one schema, no per-source bills. And every value comes back wrapped:&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;"work_email"&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;"value"&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@acme.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;"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;0.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;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hunter.io"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"verified"&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;"employee_count"&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;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;240&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;0.61&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"linkedin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"note"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"companies-house filing says 180; both kept"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When sources disagree, we don't silently pick a winner. We keep both and tell you. No fabricated data. No silent fallbacks.&lt;/p&gt;

&lt;p&gt;That envelope is the whole point for an agent. It can gate on confidence: act on &lt;code&gt;0.94&lt;/code&gt;, hold on &lt;code&gt;0.61&lt;/code&gt;, route the low ones to a human. It can cite its own work, so when someone asks &lt;em&gt;why did you email this person&lt;/em&gt;, there's a source, not a shrug. Grounding is the difference between an agent that builds pipeline and one that hallucinates it.&lt;/p&gt;

&lt;p&gt;And the honest bit, because an agent needs the honest bit: it's near-useless on companies with no public footprint. The difference is it tells you when it's guessing, instead of guessing in a confident voice.&lt;/p&gt;

&lt;p&gt;Three verbs sit on top of the same idea. &lt;strong&gt;Search&lt;/strong&gt; the accounts and people. &lt;strong&gt;Enrich&lt;/strong&gt; them into cited fields. &lt;strong&gt;Create&lt;/strong&gt; the records and the outreach. Over a plain REST call, or as a &lt;a href="https://abm.dev/docs/integrations/claude-connector" rel="noopener noreferrer"&gt;Claude Connector&lt;/a&gt; your agent talks to directly over MCP.&lt;/p&gt;

&lt;p&gt;If you're building anything that acts on B2B data without a human in the loop, come make it prove itself. There's a free playground at &lt;a href="https://abm.dev" rel="noopener noreferrer"&gt;abm.dev&lt;/a&gt;, and &lt;code&gt;LAUNCHCODES&lt;/code&gt; puts about twenty in credits on your account to try it on an account you know cold. Tell me where it's wrong, that's the useful part.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>agents</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
