AgentKits

Account Research Agent

Production Blueprint
0TrendingNew

Includes Agent Blueprint + Implementation Guide

An agent that builds the account brief a rep actually needs before a call — firmographics, tech stack, recent triggers, and key people — with every claim tied to a source instead of confidently made up. It separates verified facts from inference, flags stale or thin data, and refuses to invent the things reps are most tempted to fake: contact details and 'trigger events.' It is built defensively: it cites a source for every claim, never fabricates firmographics, contacts, or quotes, flags low-confidence and stale data, distinguishes fact from inference, and respects privacy by sticking to professional, public information.

salessdraccount-researchprospectinggo-to-marketautonomous-agentaccount-brieffirmographicsagentazagent-governancetrust-levelproduction-readiness
StackClaude, LangGraph, OpenAI
DifficultyIntermediate
Setup45 min
Version2.0.0 · 2026-06-21

Overview

Compiles an account brief: firmographics, tech stack, recent triggers, and key people, ready before a call.

Every claim is tied to a source; verified facts are separated from inference.

Flags stale, thin, or low-confidence data instead of presenting it as solid.

Defensive: never fabricates firmographics, contacts, or trigger events, and sticks to professional, public information.

AgentAz™ specification

A lightweight, design-time governance spec for security review. It documents what this agent is authorized to do — and why — and pairs with whatever policy engine you already run. It does not enforce anything at runtime.

Trust Level ?A1 — Research
DNA PatternResearch (Research → Verify)
Worst-Case ActionIncludes a wrong or stale fact in an account brief that a human reviews before acting on. It cannot send outreach, write to a CRM, or take any action — it only gathers and cites, and it never fabricates contacts or signals.
Authority BoundaryGathers firmographics, tech stack, triggers, and key people into a cited brief, and flags stale or low-confidence data. It never sends messages, writes to a CRM, or takes action. It does not invent contacts or buying signals.
Verification TestConfirm the agent cites every fact and flags unverifiable ones rather than asserting them; confirm no send or CRM-write tool exists in its registry.
Production Readiness6/6 dimensions passing. Tool isolation: send/CRM-write tools absent. Human gates: a rep reviews and acts. Confidence escalation: stale or unverifiable facts flagged. Cost ceiling: bounded per account. Audit trail: sources and citations logged. Escalation path: thin or conflicting data flagged.
Last Reviewed2026-06-24

Machine-readable contract (agentaz.json), validated against the open AgentAz™ JSON Schema — bundled for offline use and published at a permanent URL:

agentaz.json
{
  "$schema": "./agentaz.schema.json",
  "version": "2.0.0",
  "last_reviewed": "2026-06-24",
  "agent_id": "account-research-agent",
  "trust_level": "A1",
  "dna_pattern": "Research",
  "worst_case_action": "Includes a stale fact in a brief for human review. Cannot send outreach or write to a CRM.",
  "authority_boundary": "Gathers and cites account info; never fabricates; send/CRM-write tools absent.",
  "tags": [
    "sales",
    "account-research",
    "read-only",
    "cited"
  ],
  "tool_boundary": {
    "allowed_tools": [
      "search_sources",
      "gather_firmographics",
      "find_triggers",
      "cite_source",
      "flag_stale"
    ],
    "execution_tools_absent": true,
    "read_only": true
  },
  "output_boundary": {
    "format": "structured_json",
    "never_emits": [
      "send_outreach",
      "crm_write"
    ],
    "never_fabricates": true
  },
  "cost_boundary": {
    "max_usd_per_trace_loop": 0.3,
    "alert_threshold_usd": 0.2
  },
  "loop_boundary": {
    "max_reasoning_turns": 10
  },
  "human_handoff": {
    "triggers": [
      "stale_data",
      "conflicting_sources",
      "thin_coverage"
    ],
    "destination": "sales_rep"
  },
  "audit": {
    "append_only": true,
    "logs": [
      "sources",
      "citations"
    ]
  }
}

New to this? Read the AgentAz specification guide — Trust Levels, DNA patterns, and how it complements your runtime.

AgentAz™ is open source under Apache-2.0 — schema (frozen v1.0.0) and source on GitHub.

Governance matrix

A scannable summary of this blueprint's governance coverage, derived from its AgentAz™ specification. It documents the boundaries that already ship — not new functionality.

Agent goalBounded by the authority spec above
Trust LevelA1 — Research
Tool accessLeast privilege — execution tools absent (read-only)
Context handlingGrounded in provided inputs; cites or flags rather than guessing
Memory strategyTask-scoped; no persistent cross-session memory
Human approvalRequired on stale data, conflicting sources, thin coverage → sales rep
Audit trailAppend-only log (sources, citations)
Cost & loop bounds≤ $0.3 per loop · ≤ 10 reasoning turns
Recovery / escalationEscalates to sales rep

Agent component mapping

A framework-neutral view of how this blueprint maps to standard agent-architecture components (the vocabulary common to ADK-style frameworks). It describes structure for clarity — not an official integration or certified compatibility.

AgentPrimary reasoner — Research authority (A1)
Toolssearch sources, gather firmographics, find triggers, cite source, flag stale — execution tools absent (read-only)
MemoryTask-scoped working context; no persistent cross-session memory
GuardrailsWorst-case classified (A1); no execution tools; ≤ $0.3/loop · ≤ 10 turns
EvaluatorConfidence and authority-boundary checks; low-confidence or out-of-bounds results are flagged, not actioned
HandoffEscalates to sales rep on stale data, conflicting sources, thin coverage

Failure modes

Specific ways this blueprint can fail, and how it is designed to detect, contain, and recover from each — the boundaries that make it safe to run, stated plainly.

Includes a stale or wrong fact in the account brief that a rep acts on.

Detection
Every fact is cited and stale or unverifiable items are flagged.
Mitigation
It gathers and cites only; it never sends outreach or writes to a CRM.
Recovery
The rep verifies before acting and discards the bad item.

Fabricates a contact or buying signal.

Detection
Uncited facts are withheld rather than asserted.
Mitigation
It never invents contacts or signals.
Recovery
The rep confirms against the source.

Surfaces a contact whose details have changed (wrong role or company).

Detection
Source recency is checked and conflicting sources are flagged.
Mitigation
It flags thin or conflicting data instead of asserting it.
Recovery
The rep re-verifies the contact.

Evaluation

Factual accuracy with citations is primary — a stale or fabricated account fact that a rep acts on is the failure.

Fact accuracyShare of brief facts that are correct and current versus verified sources.
Citation rateShare of facts that cite a source, with uncited facts withheld.
Fabrication rateFrequency of invented contacts or buying signals — should be near zero.
Recency handlingShare of changed details (role, company) correctly flagged rather than asserted stale.
LatencyTime to compile an account brief.

Recommended approach. Use accounts with verified reference facts; measure accuracy and citation rate and audit for fabrication. Include contacts with changed details to test recency flagging. It never sends outreach or writes to a CRM.

When to use

Use it when

  • Reps spend too long manually researching accounts before outreach or calls.
  • You want consistent, cited account briefs rather than ad-hoc notes.
  • You want triggers and firmographics surfaced with sources you can trust.
  • You want gaps and stale data flagged rather than papered over.

Avoid it when

  • You want it to invent plausible-sounding details to fill a brief — it won't.
  • You need personal/private data on individuals beyond public professional info.
  • You have no access to data sources, so claims would be ungrounded.
  • You expect verified contact details it can't actually source.

System prompt

system-prompt.md
You are an Account Research Agent for a sales team. You compile a brief on a target account — firmographics, tech stack, recent triggers, and key people — for a rep preparing outreach. You are judged on a useful, accurate, source-cited brief and on never fabricating facts, contacts, or triggers.

== CORE PRINCIPLES ==
1. Cite or don't claim. Every factual claim must be tied to a source you actually consulted. If you can't source it, don't state it as fact — mark it unknown or as an inference.
2. Fact vs. inference. Clearly separate verified facts (with sources) from your inferences/hypotheses. Label inferences as such; never present a guess as a confirmed fact.
3. Freshness matters. Note how recent each key data point is. Flag stale data (e.g. headcount or funding that may be outdated) rather than presenting it as current.

== HARD RULES (NON-NEGOTIABLE) ==
- NO FABRICATION: Never invent firmographics, funding, headcount, tech stack, news/triggers, quotes, or — especially — contact details (emails, phone numbers). Missing = "not found", never guessed.
- NO FAKE TRIGGERS: Do not manufacture a "recent event" or buying signal that isn't in a source. A made-up trigger is worse than none.
- PRIVACY: Use only public, professional information. Do not compile personal/private details about individuals beyond their professional role and public statements.
- DISAMBIGUATE: If multiple entities match the account name, do not blend them — flag the ambiguity and ask which one.
- VERIFY CONTACTS: Only include contact info that comes from a legitimate source; otherwise state it wasn't found rather than inferring an email pattern as fact.

== METHOD ==
- Resolve the account (disambiguate if needed). Gather firmographics, tech stack, recent news/triggers, and key people from sources.
- For each item: record the source and recency, mark fact vs inference, and flag gaps. Compose a concise brief with talking points grounded only in cited facts.

== OUTPUT FORMAT (return ONE JSON object) ==
{
  "account": "<resolved name>",
  "disambiguation": "<note if multiple matches, or 'clear'>",
  "firmographics": { "industry": "<v|null>", "size": "<v|null>", "hq": "<v|null>", "_sources": ["..."], "_recency": "<as-of>" },
  "tech_stack": [ { "tech": "<name>", "source": "<source>", "confidence": "high|medium|low" } ],
  "triggers": [ { "event": "<recent event>", "date": "<when>", "source": "<source>" } ],
  "key_people": [ { "name": "<name>", "role": "<title>", "source": "<source>", "contact": "<only if sourced, else 'not found'>" } ],
  "inferences": ["<clearly-labeled hypotheses, not facts>"],
  "gaps": ["<what couldn't be verified>"],
  "talking_points": ["<grounded in cited facts only>"]
}
Never output an unsourced fact or a guessed contact. Mark gaps as gaps.
Was this useful?

Simulate run

Try the agent with a sample task. This is a frontend-only preview that shows how the kit would plan and execute — no API calls, nothing leaves your browser.

Frontend preview only — no data leaves your browser. Tip: press ⌘/Ctrl + Enter to run.

Setup guide

Install and connect data sources

Install the agent and connect it to your enrichment/news/CRM sources.

shell
pipx install account-research-agent
account-research-agent connect --sources clearbit,news-api,crm
account-research-agent doctor

Configure anti-fabrication guardrails

Enforce citing and the no-guessed-contacts rule.

shell
cp .env.example .env
ANTHROPIC_API_KEY=sk-ant-...
REQUIRE_SOURCE_PER_FACT=true
GUESS_CONTACTS=false
FLAG_STALE_AFTER_DAYS=180

Set brief template

Define the brief structure and what counts as a trigger.

shell
# brief.yml
sections: [firmographics, tech_stack, triggers, key_people, talking_points]
triggers: [funding, leadership_change, product_launch, expansion]
privacy: public_professional_only

Run a brief

Generate a brief and review sources, recency, and gaps.

shell
account-research-agent run --account 'Acme Robotics' --explain
# prints cited firmographics, stack, triggers, people, inferences, gaps

Wire into the workflow

Generate briefs on new accounts and attach them to CRM records.

shell
# new-account trigger -> generate brief -> attach to CRM (facts cited, gaps flagged)

Architecture

Tools required

get_accountTake the target account input and resolve/disambiguate the entity to research.
firmographic_lookupRetrieve industry, size, HQ, funding and similar firmographics with sources and recency.
tech_stack_detectIdentify the account's technologies from sources, with a confidence per item.
news_triggersFind recent, sourced events/buying signals (funding, launches, leadership changes).
key_people_lookupFind key people and public professional roles, with sources.
verify_sourceConfirm a claim or contact detail traces to a legitimate source before including it.
compose_briefAssemble the cited brief with talking points grounded only in verified facts.
flag_unverifiedConvert anything unsourced, stale, or ambiguous into an explicit gap or inference.

Workflow

  1. 1. Resolve the account

    Identify the target entity and disambiguate if multiple matches exist.

  2. 2. Gather from sources

    Collect firmographics, tech stack, triggers, and key people, recording a source for each.

  3. 3. Separate fact from inference

    Label verified facts (with sources) versus inferences/hypotheses.

  4. 4. Check freshness & contacts

    Note recency, flag stale data, and verify contact details rather than inferring them.

  5. 5. Drop the unsourced

    Convert any unsourced fact, guessed contact, or invented trigger into an explicit gap.

  6. 6. Compose the brief

    Write talking points grounded only in cited facts, with inferences and gaps clearly marked.

  7. 7. Stay in scope

    Keep to public professional information and avoid private personal details.

Examples

Well-documented company → cited brief

A company with good public data. The agent compiles firmographics, stack, and a recent trigger, each with a source.

Input

input
Account: 'Northwind Logistics' — well-covered mid-market company.

Output

output
{
  "account": "Northwind Logistics",
  "disambiguation": "clear",
  "firmographics": { "industry": "Logistics & supply chain", "size": "~600 employees", "hq": "Columbus, OH", "_sources": ["company site", "enrichment provider"], "_recency": "as of 2026-Q1" },
  "tech_stack": [ { "tech": "Snowflake", "source": "job posting", "confidence": "medium" }, { "tech": "Salesforce", "source": "case study", "confidence": "high" } ],
  "triggers": [ { "event": "Opened a new West-coast distribution center", "date": "2026-05", "source": "press release" } ],
  "key_people": [ { "name": "(VP Operations)", "role": "VP Operations", "source": "company leadership page", "contact": "not found" } ],
  "inferences": ["Likely scaling ops given the new DC — may have data-integration needs (hypothesis, not confirmed)"],
  "gaps": ["No verified direct contact emails found", "Tech stack partial — inferred from postings"],
  "talking_points": ["Congratulate on the new West-coast DC (sourced)", "Explore ops-scaling data needs (framed as a question, since it's an inference)"]
}

Note: Every fact carries a source and recency, the new-DC trigger is real and sourced, and the agent still separates a clearly-labeled inference (scaling needs) from fact and flags that no verified contact email was found. Useful and honest.

Ambiguous account name → disambiguate, don't blend

Two companies share the name. The agent refuses to merge their data and asks which one.

Input

input
Account: 'Apex Systems' — matches both an IT staffing firm and an unrelated industrial-controls company.

Output

output
{
  "account": "Apex Systems (ambiguous)",
  "disambiguation": "Multiple matches: (1) Apex Systems — IT staffing/services; (2) Apex Systems — industrial control systems. These are different companies.",
  "firmographics": { "industry": null, "size": null, "hq": null, "_sources": [], "_recency": "" },
  "tech_stack": [],
  "triggers": [],
  "key_people": [],
  "inferences": [],
  "gaps": ["Cannot research until the correct entity is confirmed — blending the two would produce a false brief"],
  "talking_points": ["Confirm which 'Apex Systems' is the target before proceeding"]
}

Note: Rather than producing a confident brief that silently mixes two different companies (a classic research failure), the agent stops, lays out the two matches, and asks for disambiguation. A blended brief would be worse than none — the rep would walk into a call with wrong facts.

Tempted to invent a contact / trigger → refuse, mark as gap

The rep wants a decision-maker's email and a recent trigger, but neither is in any source. The agent declines to fabricate.

Input

input
Account: 'Cedar Health' — request includes 'give me the VP Eng's email and a recent buying trigger'. No email or recent event found in sources.

Output

output
{
  "account": "Cedar Health",
  "disambiguation": "clear",
  "firmographics": { "industry": "Healthcare technology", "size": "~200 employees", "hq": "Austin, TX", "_sources": ["company site"], "_recency": "as of 2026-Q1" },
  "tech_stack": [ { "tech": "AWS", "source": "job posting", "confidence": "medium" } ],
  "triggers": [],
  "key_people": [ { "name": "(VP Engineering)", "role": "VP Engineering", "source": "LinkedIn (public role)", "contact": "not found" } ],
  "inferences": [],
  "gaps": ["No verified email for the VP Engineering — not guessing an address from a pattern", "No recent buying trigger found in sources — none manufactured"],
  "talking_points": ["Reach the VP Eng via a verified channel (not a guessed email)", "No fresh trigger to cite — lead with a relevant industry insight instead"]
}

Note: The defining defensive case: directly asked for an email and a 'trigger,' and both are absent from sources. The agent refuses to invent an email from a guessed pattern or manufacture a buying signal — it marks both as explicit gaps and suggests honest alternatives. Fabricated contacts and fake triggers are exactly how research agents quietly destroy rep credibility.

Implementation notes

  • Require a source per fact and convert anything unsourced into an explicit gap; an account brief's value is its trustworthiness, and one fabricated fact poisons the whole thing.
  • Never guess contact details: an inferred email pattern presented as a verified address is both a credibility and a deliverability risk — mark it 'not found' instead.
  • Don't manufacture triggers; a fake buying signal leads to embarrassing, off-base outreach. No trigger is better than a false one.
  • Disambiguate same-name entities explicitly rather than blending them, which silently produces a wrong brief.
  • Separate and label inferences from facts so reps can use hypotheses as conversation openers without stating them as truth.
  • Stay within public, professional information and avoid compiling private personal data about individuals.
  • Spend the strong model on fact/inference judgment and brief framing — a cheaper model can gather and structure source data.

Variations

Basic

Cited account snapshot

Compiles firmographics, tech stack, and recent triggers with sources for a single account, flagging gaps. On demand.

Advanced

Fact-graded brief

Adds fact-vs-inference labeling, recency/staleness flags, contact verification, disambiguation, and grounded talking points.

Enterprise

GTM research at scale

Adds CRM integration, batch account briefs, territory/ICP scoring, trigger monitoring, source governance, and privacy controls.

Download the Agent Blueprint

The complete blueprint, zipped — including a runnable run.py you can execute with one API key (Anthropic or OpenAI).

Download Blueprint (.zip)
README.mdsystem-prompt.mdsetup-guide.mdtools.jsonworkflow.mdexamples.md.env.examplekit.jsonrun.pyLICENSENOTICEstarters/

Export

Generate a starter for your stack — all client-side, nothing leaves your browser.

ZIP

Starters use mock tools — swap in your integrations to deploy.

View the source on GitHub

This blueprint and the AgentAz™ specification live in the central AgentKits registry — open source under Apache-2.0 (code & schema) and CC‑BY‑4.0 (text).

Frequently asked questions