El enriquecimiento de clientes potenciales agrega contexto a las listas de contactos sin procesar al completar el tamaño de la empresa, la industria, la tecnología, las noticias recientes y los datos de financiación. Los servicios de enriquecimiento tradicionales como Apollo cobran más de $49/usuario/mes por bases de datos prediseñadas que se vuelven obsoletas. Al utilizar una API de búsqueda, puede enriquecer los clientes potenciales con los datos más recientes disponibles públicamente por $0,005 por búsqueda. Este tutorial crea un canal de enriquecimiento de Python que toma un CSV de clientes potenciales, busca cada empresa y genera una hoja de cálculo enriquecida lista para las ventas salientes.
Requisitos previos
- Python 3.9+ instalado
- solicita biblioteca instalada
- Una clave API de Scavio de scavio.dev
- Un archivo CSV con nombres de empresas o dominios para enriquecer
Guia paso a paso
Paso 1: Cargue su lista de clientes potenciales desde CSV
Lea un CSV con al menos un nombre de empresa o una columna de dominio. El script buscará cada empresa y agregará columnas de enriquecimiento.
import csv
def load_leads(csv_path: str) -> list:
with open(csv_path) as f:
reader = csv.DictReader(f)
leads = list(reader)
print(f'Loaded {len(leads)} leads from {csv_path}')
return leads
# Expected CSV format:
# company,domain,contact_name,email
# Acme Corp,acme.com,John Doe,[email protected]
# BetaTech,betatech.io,Jane Smith,[email protected]Paso 2: Cree la función de búsqueda de enriquecimiento
Para cada cliente potencial, realice dos búsquedas específicas: una para obtener una descripción general de la empresa y otra para noticias recientes. Analice los fragmentos de SERP para extraer puntos de datos clave.
import requests, os
API_KEY = os.environ['SCAVIO_API_KEY']
def search(query: str) -> list:
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY, 'Content-Type': 'application/json'},
json={'query': query, 'country_code': 'us'})
return resp.json().get('organic_results', [])
def enrich_company(company: str, domain: str = '') -> dict:
# Company overview search
overview_query = f'{company} company overview' + (f' site:{domain}' if domain else '')
overview = search(overview_query)
overview_snippet = overview[0].get('snippet', '') if overview else ''
# Recent news search
news = search(f'{company} funding OR hiring OR launch 2026')
recent_news = [r.get('title', '') for r in news[:3]]
return {
'description': overview_snippet[:200],
'website': overview[0].get('link', '') if overview else '',
'recent_news': ' | '.join(recent_news),
'news_count': len(news)
}Paso 3: Extraer datos estructurados de fragmentos
Analice fragmentos de búsqueda para identificar indicadores del tamaño de la empresa, la industria y las menciones de la pila tecnológica. La concordancia simple de palabras clave es efectiva para esto.
import re
def extract_signals(snippets: list) -> dict:
text = ' '.join(snippets).lower()
# Company size signals
size_match = re.search(r'(\d+[,.]?\d*)\+?\s*employees', text)
size = size_match.group(0) if size_match else 'unknown'
# Industry detection
industries = ['saas', 'fintech', 'healthcare', 'ecommerce', 'edtech',
'cybersecurity', 'ai', 'logistics', 'real estate', 'marketing']
detected_industry = next((ind for ind in industries if ind in text), 'unknown')
# Funding signals
funding_match = re.search(r'raised\s+\$([\d.]+[mb])', text)
funding = funding_match.group(0) if funding_match else 'not found'
# Tech stack mentions
techs = ['react', 'python', 'aws', 'azure', 'kubernetes', 'shopify',
'salesforce', 'hubspot', 'stripe', 'twilio']
tech_stack = [t for t in techs if t in text]
return {'size': size, 'industry': detected_industry,
'funding': funding, 'tech_stack': tech_stack}Paso 4: Procesar todos los clientes potenciales con limitación de velocidad
Enriquezca cada cliente potencial con un retraso entre solicitudes. Dos búsquedas por cliente potencial significan que 200 clientes potenciales cuestan $2,00 en total.
import time
def enrich_all(leads: list) -> list:
enriched = []
for i, lead in enumerate(leads):
company = lead.get('company', '')
domain = lead.get('domain', '')
if not company:
continue
data = enrich_company(company, domain)
# Extract signals from overview snippet
snippets_query = search(f'{company} company')
snippets = [r.get('snippet', '') for r in snippets_query[:5]]
signals = extract_signals(snippets)
enriched_lead = {**lead, **data, **signals}
enriched.append(enriched_lead)
if (i + 1) % 10 == 0:
print(f' Enriched {i + 1}/{len(leads)}')
time.sleep(0.3)
return enriched
leads = load_leads('leads.csv')
enriched = enrich_all(leads)
print(f'Enriched {len(enriched)} leads')Paso 5: Guarde clientes potenciales enriquecidos en CSV
Vuelva a escribir los datos enriquecidos en un CSV. El resultado incluye todas las columnas originales más las nuevas columnas de enriquecimiento.
def save_enriched(leads: list, output_path: str) -> None:
if not leads:
print('No leads to save')
return
fieldnames = list(leads[0].keys())
with open(output_path, 'w', newline='') as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
for lead in leads:
# Convert lists to strings for CSV
row = {k: ', '.join(v) if isinstance(v, list) else v
for k, v in lead.items()}
writer.writerow(row)
credits_used = len(leads) * 3 # 3 searches per lead
cost = credits_used * 0.005
print(f'Saved {len(leads)} enriched leads to {output_path}')
print(f'Credits used: {credits_used} (${cost:.2f})')
save_enriched(enriched, 'enriched_leads.csv')Ejemplo en Python
import os, csv, re, time, requests
API_KEY = os.environ['SCAVIO_API_KEY']
def search(query):
resp = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY, 'Content-Type': 'application/json'},
json={'query': query, 'country_code': 'us'})
return resp.json().get('organic_results', [])
def enrich(company, domain=''):
overview = search(f'{company} company overview')
news = search(f'{company} funding OR launch 2026')
return {
'description': overview[0].get('snippet', '')[:150] if overview else '',
'recent_news': news[0].get('title', '') if news else '',
}
def main():
companies = ['Stripe', 'Notion', 'Linear']
for c in companies:
data = enrich(c)
print(f'{c}: {data["description"][:60]}...')
print(f' News: {data["recent_news"][:60]}')
time.sleep(0.3)
print(f'Cost: ${len(companies) * 2 * 0.005:.3f}')
if __name__ == '__main__':
main()Ejemplo en JavaScript
const API_KEY = process.env.SCAVIO_API_KEY;
async function search(query) {
const resp = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query, country_code: 'us' })
});
return (await resp.json()).organic_results || [];
}
async function enrich(company) {
const [overview, news] = await Promise.all([
search(`${company} company overview`),
search(`${company} funding OR launch 2026`)
]);
return {
description: overview[0]?.snippet?.slice(0, 150) || '',
news: news[0]?.title || ''
};
}
async function main() {
for (const company of ['Stripe', 'Notion', 'Linear']) {
const data = await enrich(company);
console.log(`${company}: ${data.description.slice(0, 60)}...`);
}
}
main().catch(console.error);Salida esperada
Loaded 50 leads from leads.csv
Enriched 10/50
Enriched 20/50
Enriched 30/50
Enriched 40/50
Enriched 50/50
Enriched 50 leads
Saved 50 enriched leads to enriched_leads.csv
Credits used: 150 ($0.75)
Stripe: Stripe is a financial infrastructure platform for businesses...
News: Stripe Raises Series I at $70B Valuation (2026)
Notion: Notion is a connected workspace for docs, wikis, and projects...
News: Notion Launches AI-Powered Project Management