AbsoluteJS

Discover

@absolutejs/discoverv0.0.9alphaCommerce & Growth

B2B decision-maker discovery from free open-data adapters with LLM plus web search as the fallback.

Finds the right person to contact at a company — the decision-maker lookup PDL and Apollo charge per person-search for. Orchestration is provider-agnostic: it consults importable open-data DatasetSource adapters first (free), then falls back to an injected web search plus LLM extraction only when it needs more. Results are deduped and ranked by confidence, and a failing source, search, or LLM contributes nothing rather than throwing.

#Installation

BASH
bun add @absolutejs/discover

#Capabilities

Overview

Find the right person to contact at a company — the decision-maker PDL/Apollo charge per person-search for. Provider-agnostic orchestration: it consults importable dataset adapters first (free), then falls to LLM + web only when it needs more.

Licensed under BSL 1.1 (converts to Apache 2.0 on 2030-06-06). Use it to build your product; you may not host it as a competing prospecting/sales- intelligence SaaS. See LICENSE.

The dataset adapter contract

Open-data sources are importable adapters implementing one interface, so seeded public data is free and the paid LLM/web path is the fallback:

@absolutejs/dataset-gleif, -sec-edgar, -github, … each implement this over a public dataset and normalize to one shape. Adapters are pure importers of public data. The self-collected, self-healing dataset (learned email patterns, the cross-member graph, outcomes) is deliberately not an adapter — it stays private; it's the product.

Bring your own LLM + web

discover stays provider-agnostic — you inject the capabilities:

With no deps it returns only what the adapters provide. With search + extract it discovers from the open web (the LLM is told to use only people who appear in the results — never to invent names). Results are deduped and ranked by confidence. Never throws — a failing source / search / LLM just contributes nothing.

Decision-maker discovery

discoverContacts takes a company plus a role intent and returns ranked contacts with title, confidence, LinkedIn URL, source, and a reason.

Dataset adapter contract

Open-data sources implement one DatasetSource interface (findPeople, findCompany) and normalize to one shape, so seeded public data stays free.

Bring your own LLM

You inject search (Brave, SerpAPI, RAG) and extract (any LLM completion) via DiscoverDeps; the package never picks a provider.

Grounded extraction

The LLM is instructed to use only people who appear in the search results — never to invent names — and results are deduped and confidence-ranked.

Failure-tolerant orchestration

discoverContacts never throws: a failing source, search, or LLM call simply contributes nothing to the result set.

Built-in caching helper

A withCache wrapper is exported for memoizing expensive source and search calls.

Outcomes

What you can build

Overview

Find the right person to contact at a company — the decision-maker PDL/Apollo charge per person-search for. Provider-agnostic orchestration: it consults importable dataset adapters first (free), then falls to LLM + web only when it needs more.

The dataset adapter contract

Open-data sources are importable adapters implementing one interface, so seeded public data is free and the paid LLM/web path is the fallback:

Bring your own LLM + web

discover stays provider-agnostic — you inject the capabilities:

Hardening checklist

Production guidance

Make every external boundary explicitPin the deployed @absolutejs/discover version, replace example or memory-backed dependencies with durable implementations, bound external calls, protect credentials, and emit enough evidence to retry or recover safely.

Follow in order

Troubleshooting path

1
Trace from the first failed boundary
Reproduce the smallest canonical @absolutejs/discover example, confirm the supported entry point and version in the API explorer, then inspect the first boundary that did not produce its documented result.

#@absolutejs/discover quick start

Partial snippet

# @absolutejs/discover

TS
import { discoverContacts } from "@absolutejs/discover";

await discoverContacts(
  { company: "Acme", domain: "acme.com", roleIntent: "head of partnerships" },
  { sources: [secEdgar, gleif], search: braveSearch, extract: askClaude },
);
// → [{ fullName: "Jane Doe", title: "Head of Partnerships", confidence: 90,
//      linkedinUrl: "...", source: "...", reason: "listed as partnerships lead" }]

#The dataset adapter contract

Partial snippet

Open-data sources are importable adapters implementing one interface, so seeded public data is free and the paid LLM/web path is the fallback:

TS
type DatasetSource = {
  name: string;
  findPeople?: (q: DatasetQuery) => Promise<NormalizedPerson[]>;
  findCompany?: (q: { name?; domain? }) => Promise<NormalizedCompany | null>;
};

#Bring your own LLM + web

Partial snippet

discover stays provider-agnostic — you inject the capabilities:

TS
type DiscoverDeps = {
  search?: (query: string) => Promise<WebSearchResult[]>; // Brave, SerpAPI, RAG
  extract?: (prompt: string) => Promise<string>;          // any LLM completion
  sources?: DatasetSource[];                               // importable adapters
};

#Quick Start

Partial snippet

Dataset adapters are consulted first for free; the injected search and extract capabilities only run when the adapters come up short.

TS
import { discoverContacts } from '@absolutejs/discover';

const contacts = await discoverContacts(
	{
		company: 'Acme',
		domain: 'acme.com',
		roleIntent: 'head of partnerships'
	},
	{ extract: askClaude, search: braveSearch, sources: [secEdgar, gleif] }
);
// → [{ fullName: 'Jane Doe', title: 'Head of Partnerships',
//      confidence: 90, linkedinUrl: '…', source: '…',
//      reason: 'listed as partnerships lead' }]

#The DatasetSource contract

Partial snippet

Every open-data adapter — GLEIF, SEC EDGAR, GitHub — implements this one interface over a public dataset and normalizes to one shape.

TS
type DatasetSource = {
	name: string;
	findPeople?: (q: DatasetQuery) => Promise<NormalizedPerson[]>;
	findCompany?: (q: {
		name?: string;
		domain?: string;
	}) => Promise<NormalizedCompany | null>;
};

#Dataset Adapters

Open-data sources are importable adapters implementing the DatasetSource interface, published from the dataset-adapters monorepo (Apache-2.0). Seeded public data is free; the paid LLM/web path is the fallback.

@absolutejs/dataset-githubv0.0.2Resolve a company to its GitHub org and surface its public members (founders/leads, occasionally a public email) for tech-company contact discovery.
@absolutejs/dataset-gleifv0.0.3Resolve a company to its official legal entity (LEI, jurisdiction, country) from open CC0 GLEIF registry data.
@absolutejs/dataset-sec-edgarv0.0.2Resolve a US public company (CIK) and its insiders (officers/directors via Form 3/4/5) from public-domain SEC EDGAR filings.
Alpha status
Early 0.0.x release — the DatasetSource and DiscoverDeps contracts are settling. Adapters are pure importers of public data; the self-collected dataset (learned email patterns, cross-member graph, outcomes) is deliberately not an adapter.

#API reference

Search the declarations exported by the current package type files. Expand a symbol to inspect its source-backed signature.

11 symbols
withCacheexportPermalink
TS
withCache
Exported from @absolutejs/discover
Use this API in an outcome:Build commerce growth

Continue toward an outcome

These playbooks show where this package fits, how to verify the combined system, and what changes before production.

Current package surface

What ships today

@absolutejs/discoverv0.0.9 · betaCommerce & GrowthnpmSource
3entry points12symbols

Import surface · click to copy