Resumen
Audit Apollo.io contact listas by verifying cada contact's actual association con their listed company via Google search. Marcar stale registros antes de they bounce y damage sender reputation.
Desencadenador
CSV exportar de Apollo o programado semanal audit
Programación
Semanal o antes de cada campana
Pasos del flujo de trabajo
Exportar contacts de Apollo
Pull el objetivo contact lista de Apollo.io as CSV con nombre, titulo, company, dominio, y correo electronico campos.
Search cada contact
For cada fila, consulta Google for el contact nombre plus company dominio. Verificar if el person aun appears associated con el company in resultados de busqueda.
Puntuacion confidence
Count coincidencia senales: LinkedIn perfil at company, team pagina mencion, press quote, conference bio. More senales means higher confidence el contact es aun valid.
Marcar stale registros
Contacts con zero coincidencia senales son flagged as probable stale. Contacts con 1 senal son marked for manual resena. Contacts con 2+ senales son marked as verified.
Generar audit informe
Salida un CSV con original campos plus verification estado, confidence puntuacion, y senal detalles. Summary stats mostrar que porcentaje of el lista es stale.
Implementacion en Python
import requests, os, csv, json
H = {'x-api-key': os.environ['SCAVIO_API_KEY']}
def verify_contact(name, company, domain):
r = requests.post('https://api.scavio.dev/api/v1/search', headers=H,
json={'platform': 'google', 'query': f'{name} {company} {domain}'},
timeout=10).json()
organic = r.get('organic', [])[:5]
signals = []
for o in organic:
link = o.get('link', '').lower()
title = o.get('title', '').lower()
if domain.lower() in link or name.lower().split()[0] in title:
signals.append(o.get('title', '')[:80])
return {
'name': name, 'company': company,
'status': 'verified' if len(signals) >= 2 else 'review' if len(signals) == 1 else 'stale',
'confidence': min(len(signals) / 3, 1.0),
'signals': signals,
}
# Process CSV
with open('apollo_export.csv') as f:
reader = csv.DictReader(f)
results = []
for row in reader:
result = verify_contact(row['name'], row['company'], row['domain'])
results.append(result)
print(f"[{result['status'].upper()}] {result['name']} @ {result['company']}")
stale = sum(1 for r in results if r['status'] == 'stale')
print(f"\nAudit: {stale}/{len(results)} contacts flagged as stale ({stale/len(results)*100:.1f}%)")Implementacion en JavaScript
const H = {"x-api-key": process.env.SCAVIO_API_KEY, "Content-Type": "application/json"};
async function verifyContact(name, company, domain) {
const r = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST", headers: H,
body: JSON.stringify({platform: "google", query: `${name} ${company} ${domain}`})
}).then(r => r.json());
const organic = (r.organic || []).slice(0, 5);
const signals = organic.filter(o =>
(o.link || "").toLowerCase().includes(domain.toLowerCase()) ||
(o.title || "").toLowerCase().includes(name.toLowerCase().split(" ")[0])
).map(o => (o.title || "").slice(0, 80));
return {
name, company,
status: signals.length >= 2 ? "verified" : signals.length === 1 ? "review" : "stale",
confidence: Math.min(signals.length / 3, 1),
signals,
};
}
const contacts = [
{name: "Jane Smith", company: "Acme Corp", domain: "acme.com"},
{name: "John Doe", company: "Old Startup", domain: "oldstartup.io"},
];
(async () => {
const results = [];
for (const c of contacts) {
const r = await verifyContact(c.name, c.company, c.domain);
results.push(r);
console.log(`[${r.status.toUpperCase()}] ${r.name} @ ${r.company}`);
}
const stale = results.filter(r => r.status === "stale").length;
console.log(`\nAudit: ${stale}/${results.length} contacts flagged as stale`);
})();Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA