SKILL.md
Apollo Production Checklist
Overview
Comprehensive pre-production checklist for Apollo.io integrations with automated validation scripts. Covers authentication, resilience, observability, compliance, and credit management.
Prerequisites
- Valid Apollo.io API credentials
- Node.js 18+
- Completed
apollo-install-authsetup
Instructions
Step 1: Authentication & Key Management
// src/scripts/prod-checklist.ts
import axios from 'axios';
interface Check { category: string; name: string; pass: boolean; detail: string; }
const results: Check[] = [];
// 1.1 API key is set (not hardcoded)
results.push({
category: 'Auth', name: 'API key from env/secrets',
pass: !!process.env.APOLLO_API_KEY,
detail: process.env.APOLLO_API_KEY ? 'Loaded from env' : 'NOT SET',
});
// 1.2 Using x-api-key header (not query param)
const { execSync } = await import('child_process');
let usesHeader = true;
try { execSync('grep -rn "params.*api_key" src/ --include="*.ts"', { stdio: 'pipe' }); usesHeader = false; } catch {}
results.push({ category: 'Auth', name: 'x-api-key header auth', pass: usesHeader, detail: usesHeader ? 'OK' : 'Switch to x-api-key header' });
// 1.3 API key is valid
try {
const resp = await axios.get('https://api.apollo.io/api/v1/auth/health', {
headers: { 'x-api-key': process.env.APOLLO_API_KEY! },
});
results.push({ category: 'Auth', name: 'Key valid', pass: resp.data.is_logged_in, detail: resp.data.is_logged_in ? 'OK' : 'Invalid key' });
} catch (err: any) {
results.push({ category: 'Auth', name: 'Key valid', pass: false, detail: `HTTP ${err.response?.status}` });
}
// 1.4 .env gitignored
const gitIgnored = execSync('git check-ignore .env 2>/dev/null || echo NOT').toString().trim();
results.push({ category: 'Auth', name: '.env gitignored', pass: gitIgnored !== 'NOT', detail: gitIgnored !== 'NOT' ? 'OK' : 'Add .env to .gitignore' });
Step 2: Resilience & Error Handling
async function fileContains(dir: string, pattern: string): Promise<boolean> {
try { execSync(`grep -r "${pattern}" ${dir} --include="*.ts" -l`, { stdio: 'pipe' }); return true; }
catch { return false; }
}
results.push({ category: 'Resilience', name: 'Rate limiting',
pass: await fileContains('src/', 'rate-limiter\\|SlidingWindow\\|RateLimit'),
detail: 'Rate limiter implementation' });
results.push({ category: 'Resilience', name: 'Retry logic',
pass: await fileContains('src/', 'withRetry\\|withBackoff\\|exponential'),
detail: 'Exponential backoff for 429/5xx' });
results.push({ category: 'Resilience', name: 'Error categorization',
pass: await fileContains('src/', 'categorizeError\\|ApolloApiError'),
detail: 'Typed error handling' });
results.push({ category: 'Resilience', name: 'Timeout configured',
pass: await fileContains('src/', 'timeout.*\\d'),
detail: 'Request timeout set' });
