Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Deploy Apollo.io integrations to production. Use when deploying Apollo integrations, configuring production environments, or setting up deployment pipelines. Trigger with phrases like "deploy apollo", "apollo production deploy", "apollo deployment pipeline", "apollo to production".
.claude/skills/jeremylongshore-apollo-deploy-integration/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -2% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 81% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 58% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 84% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 5% | 0% |
Deploy Apollo.io integrations to production with configurations for Vercel, GCP Cloud Run, and Kubernetes. All configurations use x-api-key header auth, health check endpoints verifying Apollo connectivity, and secret management best practices.
Every deployment needs a health endpoint that verifies Apollo API connectivity.
typescript// src/health.ts import axios from 'axios'; import { Router } from 'express'; export const healthRouter = Router(); healthRouter.get('/health', async (req, res) => { const checks: Record<string, string> = { apiKey: process.env.APOLLO_API_KEY ? 'set' : 'MISSING', nodeEnv: process.env.NODE_ENV ?? 'not set', }; try { const start = Date.now(); const resp = await axios.get('https://api.apollo.io/api/v1/auth/health', { headers: { 'x-api-key': process.env.APOLLO_API_KEY! }, timeout: 5000, }); checks.apollo = resp.data.is_logged_in ? `ok (${Date.now() - start}ms)` : 'invalid key'; } catch (err: any) { checks.apollo = `error: ${err.response?.status ?? err.message}`; } const healthy = checks.apollo.startsWith('ok') && checks.apiKey === 'set'; res.status(healthy ? 200 : 503).json({ status: healthy ? 'healthy' : 'unhealthy', checks }); });
dockerfileFROM node:20-slim AS build WORKDIR /app COPY package*.json ./ RUN npm ci --production=false COPY . . RUN npm run build FROM node:20-slim WORKDIR /app COPY --from=build /app/dist ./dist COPY --from=build /app/node_modules ./node_modules COPY package*.json ./ EXPOSE 8080 CMD ["node", "dist/index.js"]
bash# Store API key in GCP Secret Manager echo -n "$APOLLO_API_KEY" | gcloud secrets create apollo-api-key --data-file=- # Deploy with secret injection gcloud run deploy apollo-integration \ --source . \ --region us-central1 \ --set-secrets "APOLLO_API_KEY=apollo-api-key:latest" \ --set-env-vars "NODE_ENV=production" \ --min-instances 1 --max-instances 10 \ --port 8080
json{ "name": "apollo-integration", "builds": [{ "src": "src/index.ts", "use": "@vercel/node" }], "routes": [{ "src": "/(.*)", "dest": "src/index.ts" }], "env": { "APOLLO_API_KEY": "@apollo-api-key", "NODE_ENV": "production" } }
bashvercel secrets add apollo-api-key "$APOLLO_API_KEY" vercel --prod
yaml# k8s/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: apollo-integration spec: replicas: 2 selector: matchLabels: { app: apollo-integration } template: metadata: labels: { app: apollo-integration } spec: containers: - name: apollo image: gcr.io/my-project/apollo-integration:latest ports: [{ containerPort: 8080 }] envFrom: - secretRef: { name: apollo-credentials } env: - { name: NODE_ENV, value: "production" } livenessProbe: httpGet: { path: /health, port: 8080 } initialDelaySeconds: 10 periodSeconds: 30 readinessProbe: httpGet: { path: /health, port: 8080 } initialDelaySeconds: 5 periodSeconds: 10 resources: requests: { memory: "128Mi", cpu: "100m" } limits: { memory: "256Mi", cpu: "500m" } --- apiVersion: v1 kind: Secret metadata: name: apollo-credentials type: Opaque stringData: APOLLO_API_KEY: "your-master-key-here"
typescript// src/scripts/pre-deploy.ts async function preDeployCheck() { const checks: Array<{ name: string; pass: boolean }> = []; // API key set checks.push({ name: 'APOLLO_API_KEY set', pass: !!process.env.APOLLO_API_KEY }); // Auth works try { const resp = await axios.get('https://api.apollo.io/api/v1/auth/health', { headers: { 'x-api-key': process.env.APOLLO_API_KEY! }, }); checks.push({ name: 'Apollo auth valid', pass: resp.data.is_logged_in }); } catch { checks.push({ name: 'Apollo auth valid', pass: false }); } // Build succeeds try { const { execSync } = await import('child_process'); execSync('npm run build', { stdio: 'pipe' }); checks.push({ name: 'Build succeeds', pass: true }); } catch { checks.push({ name: 'Build succeeds', pass: false }); } const allPass = checks.every((c) => c.pass); checks.forEach((c) => console.log(`${c.pass ? 'PASS' : 'FAIL'} ${c.name}`)); console.log(`\nDeploy: ${allPass ? 'READY' : 'BLOCKED'}`); process.exit(allPass ? 0 : 1); } preDeployCheck();
| Issue | Resolution | |-------|------------| | Health check 503 | Check APOLLO_API_KEY secret is mounted correctly | | Container crash loop | Review startup logs, verify secret names match | | Rollback needed | gcloud run deploy --revision, vercel rollback, or kubectl rollout undo | | Secret rotation | Update secret, redeploy — health check confirms new key works |
Proceed to apollo-webhooks-events for webhook implementation.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 19,551 | 11,111 | -43% | 1 | 1 | 0% | 4,481 | 4,406 | -2% | 0 | 0 | — |
case-02 | fail→fail | 14,520 | 9,746 | -33% | 1 | 1 | 0% | 3,209 | 4,064 | +27% | 0 | 0 | — |
case-03 | fail→pass | 9,917 | 9,373 | -5% | 1 | 1 | 0% | 2,207 | 3,996 | +81% | 0 | 0 | — |
case-04 | fail→pass | 9,914 | 6,826 | -31% | 1 | 1 | 0% | 2,079 | 3,292 | +58% | 0 | 0 | — |
case-05 | pass→pass | 13,037 | 10,168 | -22% | 1 | 1 | 0% | 2,619 | 3,861 | +47% | 0 | 0 | — |
case-06 | fail→fail | 5,480 | 5,438 | -1% | 1 | 1 | 0% | 1,054 | 2,798 | +165% | 0 | 0 | — |
case-07 | fail→pass | 6,942 | 4,074 | -41% | 1 | 1 | 0% | 1,481 | 2,731 | +84% | 0 | 0 | — |
case-08 | fail→fail | 5,505 | 3,505 | -36% | 1 | 1 | 0% | 1,016 | 2,521 | +148% | 0 | 0 | — |
case-09 | pass→pass | 3,969 | 3,681 | -7% | 1 | 1 | 0% | 784 | 2,551 | +225% | 0 | 0 | — |
case-10 | fail→pass | 12,054 | 5,216 | -57% | 1 | 1 | 0% | 2,714 | 2,838 | +5% | 0 | 0 | — |
case-11 | pass→pass | 3,870 | 3,870 | 0% | 1 | 1 | 0% | 801 | 2,542 | +217% | 0 | 0 | — |
case-12 | fail→fail | 11,286 | 10,567 | -6% | 1 | 1 | 0% | 2,080 | 3,691 | +77% | 0 | 0 | — |
case-13 | fail→pass | 12,019 | 7,810 | -35% | 1 | 1 | 0% | 2,180 | 3,270 | +50% | 0 | 0 | — |
case-14 | pass→fail | 10,597 | 9,558 | -10% | 1 | 1 | 0% | 2,142 | 3,410 | +59% | 0 | 0 | — |
case-15 | fail→fail | 6,006 | 7,814 | +30% | 1 | 1 | 0% | 1,071 | 3,473 | +224% | 0 | 0 | — |
case-16 | pass→pass | 9,950 | 2,736 | -73% | 1 | 1 | 0% | 2,025 | 2,394 | +18% | 0 | 0 | — |
case-17 | fail→fail | 9,664 | 7,085 | -27% | 1 | 1 | 0% | 1,905 | 3,222 | +69% | 0 | 0 | — |
case-18 | fail→pass | 11,721 | 7,671 | -35% | 1 | 1 | 0% | 2,372 | 3,271 | +38% | 0 | 0 | — |
case-19 | fail→pass | 9,747 | 4,455 | -54% | 1 | 1 | 0% | 1,918 | 2,617 | +36% | 0 | 0 | — |
case-20 | pass→pass | 14,593 | 16,539 | +13% | 1 | 1 | 0% | 2,804 | 5,749 | +105% | 0 | 0 | — |
case-21 | pass→pass | 10,231 | 10,460 | +2% | 1 | 1 | 0% | 2,377 | 4,180 | +76% | 0 | 0 | — |
case-22 | pass→pass | 9,258 | 8,804 | -5% | 1 | 1 | 0% | 2,170 | 3,821 | +76% | 0 | 0 | — |
case-23 | fail→pass | 11,994 | 10,084 | -16% | 1 | 1 | 0% | 2,018 | 3,884 | +92% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +35 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.