SKILL.md
Apollo Upgrade Migration
Current State
!npm list axios 2>/dev/null | head -5
Overview
Plan and execute safe upgrades for Apollo.io API integrations. Apollo has made several breaking changes historically (query param auth to header auth, endpoint URL changes, new search endpoints). This covers auditing current usage, building compatibility layers, and migrating safely.
Prerequisites
- Valid Apollo API key
- Node.js 18+
Instructions
Step 1: Audit Current API Usage
// src/scripts/api-audit.ts
import { execSync } from 'child_process';
interface EndpointUsage { endpoint: string; files: string[]; status: 'current' | 'deprecated'; }
const ENDPOINT_MAP = [
// Current endpoints
{ pattern: '/mixed_people/api_search', status: 'current' as const },
{ pattern: '/mixed_companies/search', status: 'current' as const },
{ pattern: '/people/match', status: 'current' as const },
{ pattern: '/people/bulk_match', status: 'current' as const },
{ pattern: '/organizations/enrich', status: 'current' as const },
{ pattern: '/contacts/search', status: 'current' as const },
{ pattern: '/emailer_campaigns', status: 'current' as const },
{ pattern: '/email_accounts', status: 'current' as const },
{ pattern: '/opportunities', status: 'current' as const },
// Deprecated patterns
{ pattern: '/people/search', status: 'deprecated' as const }, // old search endpoint
{ pattern: '/organizations/search', status: 'deprecated' as const },
{ pattern: 'api_key.*=', status: 'deprecated' as const }, // query param auth
{ pattern: 'api.apollo.io/v1', status: 'deprecated' as const }, // old base URL (should be /api/v1)
];
function auditUsage(srcDir: string = 'src'): EndpointUsage[] {
const results: EndpointUsage[] = [];
for (const ep of ENDPOINT_MAP) {
try {
const files = execSync(
`grep -rl "${ep.pattern}" ${srcDir} --include="*.ts" --include="*.js" 2>/dev/null`,
{ encoding: 'utf-8' },
).trim().split('\n').filter(Boolean);
if (files.length > 0) results.push({ endpoint: ep.pattern, files, status: ep.status });
} catch { /* no matches */ }
}
console.log('=== Apollo API Usage Audit ===');
for (const r of results) {
const icon = r.status === 'deprecated' ? 'WARN' : 'OK';
console.log(`${icon} ${r.endpoint} (${r.files.length} files)`);
r.files.forEach((f) => console.log(` ${f}`));
}
const deprecated = results.filter((r) => r.status === 'deprecated');
if (deprecated.length > 0) {
console.log(`\n${deprecated.length} deprecated pattern(s) found — migration needed`);
}
return results;
}
