Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Secure Apify API tokens, configure proxy access, and protect Actor data. Use when hardening API key management, setting up environment-specific tokens, rotating a leaked token, or auditing Apify security configuration. Trigger with "apify security", "apify secrets", "secure apify token", "apify API key security", "rotate apify token".
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 1% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 67% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 4% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 25% | 0% |
Security best practices for Apify API tokens, Actor data, proxy credentials, and webhook verification. Apify uses personal API tokens (prefixed apify_api_) for all authentication. Because a single token grants full account access with no per-token scoping, token hygiene is the whole game.
Apify uses a single API token per user account for full API access. There is no scope-based permission system per token, so token security is critical.
| Token Type | Format | Where to Find | |------------|--------|---------------| | Personal API token | apify_api_... | Console > Settings > Integrations | | Proxy password | Alphanumeric | Console > Proxy > Connection settings |
Follow the six hardening steps in order. Each has a lean summary below; the full copy-paste code for every step is in references/implementation.md.
.env (never hardcoded) and add.env, .env.*.local, and storage/ to .gitignore. Validate presence at startup so the app fails fast:
typescript function requireToken(): string { const token = process.env.APIFY_TOKEN; if (!token) throw new Error('APIFY_TOKEN is required'); if (!token.startsWith('apify_api_')) console.warn('unexpected token prefix'); return token; }
accounts) for dev / staging / prod, injected via each platform's secret store (gh secret set, vercel env add, GCP Secret Manager).
every environment, verify it authenticates, then revoke the old one.
run ID in the payload actually exists, or gate on a shared URL secret compared with crypto.timingSafeEqual.
pushData; keepdatasets named and private (no public sharing).
proxyConfig.newUrl() (it embeds the proxypassword); log the proxy group only.
See references/implementation.md for the complete code of every step, and references/examples.md for end-to-end scenarios.
Applying this skill produces a hardened project state:
.gitignore that excludes .env* and storage/, with no token in the tree.APIFY_TOKEN.before storage.
APIFY_TOKEN stored in environment variables (never hardcoded).env and storage/ in .gitignoreIf a token is exposed:
git log --all -p -- '*.env' '*.json' | grep apify_api_| Issue | Detection | Mitigation | |-------|-----------|------------| | Token in git history | git log -p \| grep apify_api_ | Rotate token, use BFG to clean | | Unauthorized runs | Unexpected runs in Console | Rotate token immediately | | Proxy password exposed | Credentials in logs | Regenerate proxy password | | Data breach in dataset | PII in public dataset | Delete dataset, sanitize pipeline |
Quick starting point — bootstrap a new project's secrets safely:
bashcat >> .gitignore <<'EOF' .env .env.*.local storage/ EOF echo 'APIFY_TOKEN=apify_api_dev_token' > .env git status --short # .env must NOT appear
Four full worked scenarios — secure bootstrap, cross-environment rotation, webhook-verify-then-sanitize, and a git-history leak audit — are in references/examples.md.
For production deployment hardening beyond secrets — health checks, rate limits, and monitoring — see the apify-prod-checklist skill in this pack.
Other measured skills in the registry, with their headline benchmark lift.