Overview
Run enrichment on demand from Claude Code. A single command pulls the contact list from HubSpot, enriches each with Scavio public-data signal, and upserts custom properties back to HubSpot. No Clay, no Apollo, no seat fees.
Trigger
Slash command in Claude Code or cron
Schedule
Daily at 7 AM or on demand
Workflow Steps
Pull contacts from HubSpot
Use HubSpot's Contacts API to fetch records missing enrichment fields.
For each contact, SERP the domain
Scavio query 'domain news' and 'domain funding' for recent signal.
Reddit mention check
Scavio Reddit search for brand name sentiment and complaint volume.
YouTube mention check
Scavio YouTube search for founder interviews or product demos.
Synthesize one-liner
Claude turns raw results into a one-line contact brief.
Upsert to HubSpot properties
Write brief, last_signal_date, and reddit_mention_count to HubSpot custom fields.
Python Implementation
import os, requests
SCAVIO = os.environ["SCAVIO_API_KEY"]
HUBSPOT = os.environ["HUBSPOT_TOKEN"]
SH = {"x-api-key": SCAVIO}
HH = {"Authorization": f"Bearer {HUBSPOT}"}
contacts = requests.get("https://api.hubapi.com/crm/v3/objects/contacts?limit=100",
headers=HH).json().get("results", [])
for c in contacts:
domain = c["properties"].get("company_domain")
if not domain: continue
serp = requests.post("https://api.scavio.dev/api/v1/search",
headers=SH, json={"query": f"{domain} funding news"}).json()
requests.patch(f"https://api.hubapi.com/crm/v3/objects/contacts/{c['id']}",
headers=HH, json={"properties": {"scavio_signal_count": len(serp.get("organic_results", []))}})JavaScript Implementation
const SCAVIO = process.env.SCAVIO_API_KEY;
const HUBSPOT = process.env.HUBSPOT_TOKEN;
const SH = { "x-api-key": SCAVIO, "content-type": "application/json" };
const HH = { Authorization: "Bearer " + HUBSPOT, "content-type": "application/json" };
const contacts = await fetch("https://api.hubapi.com/crm/v3/objects/contacts?limit=100", { headers: HH })
.then(r => r.json());
for (const c of contacts.results) {
const domain = c.properties.company_domain;
if (!domain) continue;
const serp = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: SH,
body: JSON.stringify({ query: domain + " funding news" })
}).then(r => r.json());
await fetch("https://api.hubapi.com/crm/v3/objects/contacts/" + c.id, {
method: "PATCH", headers: HH,
body: JSON.stringify({ properties: { scavio_signal_count: serp.organic_results?.length || 0 } })
});
}Platforms Used
Web search with knowledge graph, PAA, and AI overviews
Community, posts & threaded comments from any subreddit
YouTube
Video search with transcripts and metadata