Research angles
The canonical schema can’t know what you specifically sell. Research angles let you ask your own question on every enrichment that matches — with the same evidence, citations, and confidence treatment as the canonical fields.
The shape of an angle
An angle is a saved prompt. It carries a name, an instruction, the evidence methods it’s allowed to use, and a cost cap. Whenever you enrich an entity it applies to, the angle runs against the same evidence the synthesis agents see and returns its own envelope — typed value or narrative, confidence, citations.
{ "name": "growth_signal_summary", "applies_to": "company", "instructions": "Read the evidence and produce a 2-sentence summary of growth signals: recent head-count changes, regional expansion, M&A activity. Cite each claim.", "evidence_methods": ["perplexity", "tavily"], "output_shape": "narrative", "mode": "eager", "max_tokens": 1500 }Eager versus lazy
Pick when you want the cost to land.
Eager — runs on every enrichment
The angle runs automatically when a matching enrichment completes. The result lands in the same response. Cost is per enrichment, every time. Use for questions you always want an answer to.
Lazy — runs on demand
The angle is saved but doesn’t fire automatically. You call POST /resolve when you want the answer. First call charges, subsequent calls hit the cache. Use for expensive questions you only sometimes need.
There's a third option: inline
options.additional_research_angles[] on the enrichment request itself and the angle runs for that one job only. Nothing persists at the org level. Good for one-shot questions and for testing an angle before saving it.Working with saved angles
# List angles for the org curl https://abm.dev/v1/orgs/{org_id}/research-angles # Create one curl -X POST https://abm.dev/v1/orgs/{org_id}/research-angles \\ -H 'Content-Type: application/json' \\ -d '{ "name": "regulatory_exposure", "applies_to": "company", "instructions": "Summarise FCA, sanctions, audit thresholds. 3 sentences.", "evidence_methods": ["perplexity"], "mode": "eager" }' # Read results for one enrichment curl https://abm.dev/v1/enrichments/{id}/research-angles # Resolve a lazy angle on demand curl -X POST https://abm.dev/v1/enrichments/{id}/research-angles/{angle_id}/resolveWhat you get back
The angle result is just another field envelope. Same citations, same confidence, same provenance — the difference is the prompt was yours.
{ "angle_name": "growth_signal_summary", "result": { "value": "Headcount grew 28% over the last 12 months, driven by a new Manchester office opened in March 2026 and a fintech acquisition completed in Q4 2025. The firm is hiring aggressively in customer success and compliance.", "source": "synthesis", "confidence": 0.84, "citations": [ "https://www.linkedin.com/company/example/about/", "https://example.com/blog/manchester-office", "https://www.fnlondon.com/articles/example-acquires-fintech-q4-2025" ], "as_of_date": "2026-04-01", "observed_at": "2026-05-14T09:23:17Z" } }Patterns we’ve seen work
The qualifying question
For an audit firm: “Are they likely tendering this year? Cite their fiscal year-end and rotation history.” Eager. Result colours every account view.
The pre-meeting briefing
“Give me three talking points for a first meeting with the CFO. Tie each to a citation.” Lazy. Costs nothing until the call lands on the calendar.
The risk screen
“Surface anything in the public record that would block KYC: sanctions, litigation, regulatory enforcement. None? Say none.” Eager. The angle that says “none” is just as useful as the one that finds something.
The guards we put in
Cost ceilings
Every angle declares max_cost_usd. We refuse to blow past it. Lazy angles also check the cache first — you’re not charged twice for the same question on the same enrichment.
Evidence methods, declared
An angle picks the methods it’s allowed — perplexity, tavily, the entity’s own snapshot. We don’t silently expand its budget.