Skip to main content
← Notes from the data layer

enrichment

How do I turn a raw domain or email into a full account profile my AI agent can act on?

Stuart McLeod5 min

Here is the call. One identifier in, a structured account profile out:

curl -X POST https://api.abm.dev/v1/enrich/company \
  -H "Authorization: Bearer $ABM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain": "stripe.com"}'

The response carries eighty-nine canonical fields — each tagged with a source citation and a confidence score. Your agent doesn't guess. It reads.

That's the premise. The rest of this post explains what actually happens between the request and the response, and why the architecture matters when an agent is the consumer.


Why does a raw seed produce bad data without a structured enrichment layer?

A domain is a hint, not a record. Left alone, an AI agent will hallucinate the rest — inferred titles, invented headcounts, plausible-sounding LinkedIn URLs that 404. The model is confident and wrong, and at machine speed that compounds fast.

The pattern is well-documented. Instantly.ai's B2B workflow guide makes the case: using corporate domains as the enrichment seed, you can turn one B2B email into full org charts — but only if you run it through a structured enrichment layer first. Skip that step and you're routing on guesswork.

DataForB2B's guide to enriching signups with Claude frames the gap plainly: a signup form asks for one thing — a work email. Sales wants a name, a title, a company, and a reason to call. That gap stalls most PLG motions before they start. The fix is to work outward from the seed, not to ask the agent to infer what it cannot verify.

The fix isn't more data. It's deterministic data — enrichment where every field carries a source and a confidence score, so the agent can reason about what it knows and act only on what it can verify.


What does the enrichment API actually do with a single domain or email?

The abm.dev Enrichment API runs a seed — a domain, an email address, or a company name — through ten providers simultaneously: LinkedIn, Hunter, Perplexity, Tavily, and others. It aggregates the results, dedupes conflicts, reconciles disagreements by confidence weight, and returns a single structured record.

No per-source bills. No six-tab enrichment dashboard. One call, ten providers behind it.

For a company seed, the canonical output includes firmographics, tech stack signals, funding stage, LinkedIn URL, ICP attributes, and a verified mailing address — each field tagged with a source citation and a confidence score.

For a contact seed, the output adds title, seniority, department, direct email (verified), and LinkedIn profile URL.

Every field ships with two metadata properties: source (which provider returned it) and confidence (a normalized score). An agent can filter on a confidence threshold before acting, log the source for audit, and flag low-confidence fields for human review rather than acting on them silently.

No fabricated facts. No silent fallbacks.

BounceWatch's company enrichment pipeline tutorial describes exactly this pattern: from a single signup email, one API call can automatically surface company name, industry, size, funding stage, tech stack, and live growth signals. The architecture is straightforward — the complexity is in the aggregation and reconciliation layer behind the call, not in the calling code itself.


How does an agent consume this inside a real workflow?

The abm.dev API is built for autonomous agent loops. The REST surface is designed for agent consumption — structured inputs, structured outputs, no UI dependency. An agent running inside Claude via the Claude Connector (MCP) or a custom workflow calls the enrichment endpoint the same way it calls any other tool: with a typed input, expecting a typed response.

Logic.inc's Onboarding Personalizer workflow captures the core use case: research a new user based on their signup email and return a structured profile — who they are, what company they work at, how big that company is, their likely role, and what industry they operate in. Real context, not a blank slate. The same pattern applies to outbound: seed in, structured profile out, agent acts.

A practical agent loop looks like this:

  1. Seed arrives — a domain from a form fill, an email from a LinkedIn scrape, a company name from a news trigger
  2. Enrichment callPOST /v1/enrich/company or POST /v1/enrich/contact with the seed
  3. Confidence filter — the agent checks field-level scores; fields below threshold are flagged, not acted on
  4. Profile assembly — the agent builds a structured account object: firmographics, contacts, GTM signals, ICP score
  5. Action routing — the agent decides the next move: personalized email, LinkedIn sequence, direct mail trigger, or hold for review

Step five is where the enrichment quality pays off. An agent that knows the target's tech stack, funding stage, and the name of the VP of Engineering doesn't send a generic blast. It writes a sentence that could only be written for that account.

A great rep once knew every account. Now your agents do.


Why does deterministic output matter more than volume?

Most enrichment tools optimize for coverage — how many fields they can return for how many records. That's the wrong metric when an agent is the consumer.

An agent doesn't browse a dashboard and use judgment to discount a suspicious field. It acts on what it receives. A hallucinated title in a human workflow is a minor embarrassment. A hallucinated title in an autonomous outbound loop is a personalization error sent to many accounts before anyone notices.

Deterministic enrichment means:

  • Every field has a source. The agent can cite it. The audit log can show it.
  • Confidence scores are first-class. Not a footnote — a field the agent uses in its decision logic.
  • No silent fallbacks. If a field can't be verified, it returns null and a reason, not a plausible guess.

This is the difference between enrichment built for human dashboard-watching and enrichment built for autonomous agent loops.


What's the API surface?

The abm.dev API is organized into three domains:

  • Enrichment — company and contact enrichment, ICP scoring, tech stack signals, mailing address verification
  • Content Generation — personalized outreach copy generated against the enriched profile, not a generic template
  • Content Publishing — send triggers for email, LinkedIn, and physical direct mail

The full API reference and resources live at abm.dev/resources.


Start here

Try abm.dev — the enrichment API for AI agents. The playground is free. Use code LAUNCHCODES for launch credits.

One call. Eighty-nine fields. Every one of them sourced, scored, and ready for your agent to act on.

Personalization, at scale.

Stuart McLeod · Co-founder, abm.dev