enrich-waterfall
When To Use
Use when the caller has a partial identifier — an email, a name + company, a
domain, or a LinkedIn URL — and wants a fuller person and/or company profile, with
contact details (email + phone), tech stack, company signals (funding / news /
hiring), and social presence.
The defining behavior is cheapest-first with escalation: spend sub-cent calls to
resolve identity, anchor the company, and fan out to enrichment slices; only reach
for the premium reveals (Clado contacts, Clado natural-language people search)
when the cheap tiers leave a gap; verify the email last.
Do not use this for crypto/market price lookups (see market-snapshot,
allium-price) or for a single one-off enrichment call (call that merchant directly).
Workflow
- Install:
selat skill install enrich-waterfall
- Run:
selat skill run enrich-waterfall [--email ...] [--name ...] [--firstName ...] [--lastName ...] [--domain ...] [--company ...] [--linkedinUrl ...] [--organizationId ...]
- The CLI compiles each manifest step into a
selat-pay call, runs the steps in
order, and prints a per-step status + cost summary. Every step is via the SELAT Router
through the SELAT Router (MPP) except the SELAT-native X/Twitter profile step, which is
a x402 via Circle Gateway Circle x402 call (Circle Gateway-batched).
The waterfall (cheapest-first, with stop/escalation conditions)
Steps in manifest.json are ordered cheapest-first by tier (and cheapest-first
within each tier, using live prices probe-verified 2026-07-10). Walk them in order
and stop climbing a branch the moment you have what you need:
resolve ($0.0084–$0.024) — Apollo people-enrichment (one call takes email,
name+company, domain and LinkedIn URL together), Hunter email-enrichment /
combined-enrichment by email, Clado linkedin-profile by LinkedIn URL. Goal:
turn the input into a person record + company handle (domain, LinkedIn). Stop
condition: once a resolve call returns a confident match with a domain and a
LinkedIn URL, you do not need the remaining resolve calls.
anchor ($0.0053–$0.014) — pin the company: Apollo org-search by name (the
no-domain fallback), Abstract Company Enrichment lookup and Apollo
org-enrichment by domain, Hunter company-enrichment, plus Hunter
email-finder to derive the canonical address from domain + name. Tech stack
(technology_names), headcount and industry/SIC now ride along with these
anchor calls — there is no separate tech tier. Capture the Apollo
organization_id from org-enrichment/org-search: the job-postings signals
step needs it. Stop condition: one good firmographic record + one candidate
email is enough to move on.
social / signals ($0.0004–$0.063) — enrichment fan-out, run only the
slices the caller asked for:
- social — SELAT-native X/Twitter profile (x402 via Circle Gateway, $0.001), Clado
scrape for
LinkedIn person/company posts, StableSocial Instagram/TikTok profiles by handle.
- signals — Apollo
job-postings (needs organizationId from the anchor
tier), Brave news search for company news and funding rounds, Diffbot KG
enhance for the organization record (funding rounds, investors and business
connections all come back in that one call).
escalate ($0.045–$0.32) — premium reveals, run only on gaps: if the
cheap tiers did not surface a usable email or a phone, climb to Clado
contacts (contact enrichment incl. phone, from a LinkedIn URL) or Clado
search (synchronous natural-language people search — e.g. resolving a person
from an X/Twitter handle). Escalation condition: a missing-or-low-confidence
email/phone after tiers 1–3. If you already have a verified work email and no
phone was requested, skip this tier entirely.
verify ($0.0084) — last: Hunter email-verifier confirms the chosen email
is deliverable before shipping it.
Per-step caps come from each step's maxAmount (~10x each live price,
$0.10–$1.00); the manifest top-level fallback maxAmount is $1.00. Live prices for all
20 steps sum to ≈ $0.74, and running every branch is rarely necessary — a typical
resolve + anchor + one escalate + verify is well under ten cents.
Inputs And Outputs
| Param |
Required |
Default |
Description |
email |
no |
"" |
Person work email — primary resolve key (Hunter email/combined enrichment, Apollo people enrichment). |
name |
no |
"" |
Full name — also used as the social handle for the SELAT-native X/Twitter, StableSocial Instagram/TikTok and Clado handle-search steps. |
firstName |
no |
"" |
First name — Hunter email-finder, Apollo people enrichment. |
lastName |
no |
"" |
Last name — paired with firstName + domain for email-finder/enrichment. |
domain |
no |
"" |
Company domain — primary key for the Abstract lookup, Apollo org-enrichment and Hunter company calls. |
company |
no |
"" |
Company name — Apollo org-search fallback when no domain; query seed for Brave news and Diffbot KG. |
linkedinUrl |
no |
"" |
Person/company LinkedIn URL — Clado linkedin-profile, contacts and scrape (sent in the JSON body; no path encoding). |
organizationId |
no |
"" |
Apollo organization id — returned by the org-enrichment/org-search anchor steps; required by the job-postings signals step. |
All params are optional, but at least one identifier must be supplied — supply
the strongest you have (email > LinkedIn URL > domain + name > company). Each step
only fires usefully when its required ${...} placeholders are filled; pass empty
strings for the rest.
Outputs: per-step JSON from each merchant (person record, firmographics, contact
points, tech list, signal arrays, social profiles) plus the CLI's per-step
status/cost summary. Treat the highest-confidence email + phone across the tiers as
the canonical result, and ship only an email that passed the verify tier.
Gotchas
- All via the SELAT Router —
SELAT_ROUTER_URL must be set and the router
reachable for the 19 SELAT Router steps; the SELAT-native X/Twitter step also settles through the SELAT Router, like the other
x402 call and settles via Circle Gateway.
- Don't run all 20 steps. The manifest is a menu ordered cheapest-first; the
agent walks it and stops per the stop/escalation conditions above. Blindly running
every branch wastes money (≈ $0.74 for everything) even within the per-step caps.
organizationId is a chained input — Apollo job-postings takes an
organization id, not a domain; pull it from the Apollo org-enrichment/org-search
response before firing the hiring-signals step.
- Deliberate near-duplicates — the two Brave
news-search steps hit the same
endpoint with different queries ("${company} news" vs "${company} funding round"); they are separate on purpose. The Diffbot KG enhance call covers
funding rounds, investors and connections in one response — do not call it once
per slice.
- Escalate is expensive — Clado
search ($0.32) and Clado contacts ($0.045)
dominate the cost; gate them behind a real gap.
- Verify last, not first — verifying an email you're about to discard wastes the call.
Validation
--chain base in the probe commands below is only the flag selat-pay requires today — a probe reads a free, chain-independent quote and never settles. A real paid run resolves the settlement chain from your funded Circle Gateway balance, not the manifest.
- Probe any step for free with
selat-pay's --probe-only (sends the 402 preflight,
pays nothing):
selat-pay POST "https://hunter.mpp.paywithlocus.com/hunter/email-enrichment" --body '{"email":"test@stripe.com"}' --chain base --probe-only
selat-pay POST "https://apollo.mpp.paywithlocus.com/apollo/org-enrichment" --body '{"domain":"stripe.com"}' --chain base --probe-only
selat-pay POST "https://clado.mpp.paywithlocus.com/clado/contacts" --body '{"linkedin_url":"https://linkedin.com/in/williamhgates"}' --chain base --probe-only
selat-pay GET "https://catalog.selat.ai/twitter/user/info?userName=patrickc" --chain base --probe-only
- Validate the recipe locally:
python3 -c "import json; json.load(open('manifest.json'))".
- A clean run prints
status=200 for the steps that fired and a per-step cost
summary; the SELAT Router steps each show a SELAT Router hop.
References
manifest.json — the machine-readable, cheapest-first payment recipe this skill runs.
references/endpoints.md — every endpoint, price, tier, and source.
evals/evals.json — trigger + output-quality evals.
- selat-pay — https://github.com/SELAT-AI/selat-pay
1---2name: enrich-waterfall3description: Use this skill when the user wants to enrich a person or company from a partial identifier — e.g. "enrich this email", "find the work email and phone for X at Y", "who is this person", "build a lead profile for stripe.com", "company enrichment for this domain", "find their LinkedIn / Twitter", "get me funding and hiring signals", "waterfall enrichment", "verify this email". Runs a cheapest-first B2B enrichment waterfall — resolve the person sub-cent, anchor the company, fan out to signals / social, escalate to premium contact reveals (Clado contacts, Clado people search) only on gaps, then verify the email. Nearly every step is paid MPP on Tempo through the SELAT Router; the SELAT-native X/Twitter step is a x402 via Circle Gateway call via the SELAT Router. The selat CLI compiles each manifest step into a payment.4license: Apache-2.05---67# enrich-waterfall89## When To Use1011Use when the caller has a **partial identifier** — an email, a name + company, a12domain, or a LinkedIn URL — and wants a fuller person and/or company profile, with13contact details (email + phone), tech stack, company signals (funding / news /14hiring), and social presence.1516The defining behavior is **cheapest-first with escalation**: spend sub-cent calls to17resolve identity, anchor the company, and fan out to enrichment slices; only reach18for the premium reveals (Clado contacts, Clado natural-language people search)19when the cheap tiers leave a gap; verify the email last.2021Do **not** use this for crypto/market price lookups (see `market-snapshot`,22`allium-price`) or for a single one-off enrichment call (call that merchant directly).2324## Workflow25261. Install: `selat skill install enrich-waterfall`272. Run: `selat skill run enrich-waterfall [--email ...] [--name ...] [--firstName ...] [--lastName ...] [--domain ...] [--company ...] [--linkedinUrl ...] [--organizationId ...]`283. The CLI compiles each manifest step into a `selat-pay` call, runs the steps in29 order, and prints a per-step `status` + cost summary. Every step is **via the SELAT Router**30 through the SELAT Router (MPP) except the SELAT-native X/Twitter profile step, which is31 a **x402 via Circle Gateway** Circle x402 call (Circle Gateway-batched).3233### The waterfall (cheapest-first, with stop/escalation conditions)3435Steps in `manifest.json` are ordered cheapest-first by tier (and cheapest-first36within each tier, using live prices probe-verified 2026-07-10). Walk them in order37and **stop climbing a branch the moment you have what you need**:38391. **resolve** ($0.0084–$0.024) — Apollo `people-enrichment` (one call takes email,40 name+company, domain and LinkedIn URL together), Hunter `email-enrichment` /41 `combined-enrichment` by email, Clado `linkedin-profile` by LinkedIn URL. Goal:42 turn the input into a person record + company handle (domain, LinkedIn). **Stop43 condition:** once a resolve call returns a confident match with a domain and a44 LinkedIn URL, you do not need the remaining resolve calls.45462. **anchor** ($0.0053–$0.014) — pin the company: Apollo `org-search` by name (the47 no-domain fallback), Abstract Company Enrichment `lookup` and Apollo48 `org-enrichment` by domain, Hunter `company-enrichment`, plus Hunter49 `email-finder` to derive the canonical address from domain + name. Tech stack50 (`technology_names`), headcount and industry/SIC now ride along with these51 anchor calls — there is no separate tech tier. **Capture the Apollo52 `organization_id`** from `org-enrichment`/`org-search`: the job-postings signals53 step needs it. **Stop condition:** one good firmographic record + one candidate54 email is enough to move on.55563. **social / signals** ($0.0004–$0.063) — enrichment fan-out, run **only the57 slices the caller asked for**:58 - *social* — SELAT-native X/Twitter profile (x402 via Circle Gateway, $0.001), Clado `scrape` for59 LinkedIn person/company posts, StableSocial Instagram/TikTok profiles by handle.60 - *signals* — Apollo `job-postings` (needs `organizationId` from the anchor61 tier), Brave news search for company news and funding rounds, Diffbot KG62 `enhance` for the organization record (funding rounds, investors and business63 connections all come back in that one call).64654. **escalate** ($0.045–$0.32) — premium reveals, run **only on gaps**: if the66 cheap tiers did not surface a usable email or a phone, climb to Clado67 `contacts` (contact enrichment incl. phone, from a LinkedIn URL) or Clado68 `search` (synchronous natural-language people search — e.g. resolving a person69 from an X/Twitter handle). **Escalation condition:** a missing-or-low-confidence70 email/phone after tiers 1–3. If you already have a verified work email and no71 phone was requested, **skip this tier entirely.**72735. **verify** ($0.0084) — last: Hunter `email-verifier` confirms the chosen email74 is deliverable before shipping it.7576Per-step caps come from each step's `maxAmount` (~10x each live price,77$0.10–$1.00); the manifest top-level fallback `maxAmount` is `$1.00`. Live prices for all7820 steps sum to ≈ $0.74, and running every branch is rarely necessary — a typical79resolve + anchor + one escalate + verify is well under ten cents.8081## Inputs And Outputs8283| Param | Required | Default | Description |84|---|---|---|---|85| `email` | no | `""` | Person work email — primary resolve key (Hunter email/combined enrichment, Apollo people enrichment). |86| `name` | no | `""` | Full name — also used as the social handle for the SELAT-native X/Twitter, StableSocial Instagram/TikTok and Clado handle-search steps. |87| `firstName` | no | `""` | First name — Hunter email-finder, Apollo people enrichment. |88| `lastName` | no | `""` | Last name — paired with firstName + domain for email-finder/enrichment. |89| `domain` | no | `""` | Company domain — primary key for the Abstract lookup, Apollo org-enrichment and Hunter company calls. |90| `company` | no | `""` | Company name — Apollo org-search fallback when no domain; query seed for Brave news and Diffbot KG. |91| `linkedinUrl` | no | `""` | Person/company LinkedIn URL — Clado linkedin-profile, contacts and scrape (sent in the JSON body; no path encoding). |92| `organizationId` | no | `""` | Apollo organization id — returned by the org-enrichment/org-search anchor steps; required by the job-postings signals step. |9394All params are optional, but **at least one identifier must be supplied** — supply95the strongest you have (email > LinkedIn URL > domain + name > company). Each step96only fires usefully when its required `${...}` placeholders are filled; pass empty97strings for the rest.9899Outputs: per-step JSON from each merchant (person record, firmographics, contact100points, tech list, signal arrays, social profiles) plus the CLI's per-step101`status`/cost summary. Treat the highest-confidence email + phone across the tiers as102the canonical result, and ship only an email that passed the verify tier.103104## Gotchas105106- **All via the SELAT Router** — `SELAT_ROUTER_URL` must be set and the router107 reachable for the 19 SELAT Router steps; the SELAT-native X/Twitter step also settles through the SELAT Router, like the other108 x402 call and settles via Circle Gateway.109- **Don't run all 20 steps.** The manifest is a menu ordered cheapest-first; the110 agent walks it and stops per the stop/escalation conditions above. Blindly running111 every branch wastes money (≈ $0.74 for everything) even within the per-step caps.112- **`organizationId` is a chained input** — Apollo `job-postings` takes an113 organization id, not a domain; pull it from the Apollo org-enrichment/org-search114 response before firing the hiring-signals step.115- **Deliberate near-duplicates** — the two Brave `news-search` steps hit the same116 endpoint with different queries (`"${company} news"` vs `"${company} funding117 round"`); they are separate on purpose. The Diffbot KG `enhance` call covers118 funding rounds, investors and connections in one response — do not call it once119 per slice.120- **Escalate is expensive** — Clado `search` ($0.32) and Clado `contacts` ($0.045)121 dominate the cost; gate them behind a real gap.122- **Verify last, not first** — verifying an email you're about to discard wastes the call.123124## Validation125126> `--chain base` in the probe commands below is only the flag `selat-pay` requires today — a probe reads a free, chain-independent quote and never settles. A real paid run resolves the settlement chain from your funded Circle Gateway balance, not the manifest.127128- Probe any step for free with `selat-pay`'s `--probe-only` (sends the 402 preflight,129 pays nothing):130 - `selat-pay POST "https://hunter.mpp.paywithlocus.com/hunter/email-enrichment" --body '{"email":"test@stripe.com"}' --chain base --probe-only`131 - `selat-pay POST "https://apollo.mpp.paywithlocus.com/apollo/org-enrichment" --body '{"domain":"stripe.com"}' --chain base --probe-only`132 - `selat-pay POST "https://clado.mpp.paywithlocus.com/clado/contacts" --body '{"linkedin_url":"https://linkedin.com/in/williamhgates"}' --chain base --probe-only`133 - `selat-pay GET "https://catalog.selat.ai/twitter/user/info?userName=patrickc" --chain base --probe-only`134- Validate the recipe locally: `python3 -c "import json; json.load(open('manifest.json'))"`.135- A clean run prints `status=200` for the steps that fired and a per-step cost136 summary; the SELAT Router steps each show a SELAT Router hop.137138## References139140- `manifest.json` — the machine-readable, cheapest-first payment recipe this skill runs.141- [`references/endpoints.md`](references/endpoints.md) — every endpoint, price, tier, and source.142- `evals/evals.json` — trigger + output-quality evals.143- selat-pay — https://github.com/SELAT-AI/selat-pay