From apify-pack
Diagnoses and fixes common Apify Actor failures, API errors (429, 401), timeouts, and proxy issues with code snippets and CLI commands.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin apify-packThis skill is limited to using the following tools:
Quick diagnostic reference for the most common Apify errors. Covers Actor run failures, API errors, proxy problems, anti-bot blocks, and platform-specific issues.
Collects Apify debug bundles for failed Actor runs: metadata, logs, dataset samples, environment, and package info. For troubleshooting and support tickets.
Guides Apify Actor development: project creation/modification/debugging, template selection, input/output wiring, runtime logic, secure CLI setup, and deployment workflows.
Develop, debug, and deploy Apify Actors for web scraping, automation, and data processing. Guides CLI setup, login, and templates for JavaScript, TypeScript, Python.
Share bugs, ideas, or general feedback.
Quick diagnostic reference for the most common Apify errors. Covers Actor run failures, API errors, proxy problems, anti-bot blocks, and platform-specific issues.
Status: FAILED
StatusMessage: Process exited with code 1
Cause: Unhandled exception in Actor code.
Diagnosis:
// Check run log via API
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.run('RUN_ID').get();
console.log(run.statusMessage);
// Get the run log
const log = await client.run('RUN_ID').log().get();
console.log(log); // Full stdout/stderr output
Fix: Read the log, find the stack trace, fix the bug. Common causes:
Actor.getInput() returns null)Status: TIMED-OUT
StatusMessage: Actor timed out after 3600 seconds
Cause: Actor exceeded its configured timeout.
Fix:
// Increase timeout when calling via client
const run = await client.actor('user/actor').call(input, {
timeout: 7200, // 2 hours in seconds
});
// Or set in Actor configuration on platform
// Console > Actor > Settings > Timeout
Prevention: Reduce workload scope or increase maxConcurrency.
ApifyApiError: Rate limit exceeded (429)
Cause: More than 60 requests/second to a single API resource.
Fix: The apify-client package retries 429s automatically (up to 8 retries with exponential backoff). If you still hit limits:
// Add delays between API calls
import { sleep } from 'crawlee';
for (const item of items) {
await client.dataset(dsId).pushItems([item]);
await sleep(100); // 100ms between calls
}
// Better: batch push items (one API call)
await client.dataset(dsId).pushItems(items); // Up to 9MB per call
ApifyApiError: Authentication required (401)
Cause: Invalid, expired, or missing API token.
Diagnosis:
# Test your token
curl -s -H "Authorization: Bearer $APIFY_TOKEN" \
https://api.apify.com/v2/users/me | jq '.data.username'
Fix: Regenerate token at Console > Settings > Integrations.
Build failed: npm ERR! code ERESOLVE
Cause: Dependency conflicts in package.json or Dockerfile issues.
Diagnosis:
# Check build log on platform
apify builds ls
# Test build locally
docker build -t my-actor -f .actor/Dockerfile .
Fix: Run npm install locally first. Ensure package-lock.json is committed. Check Node.js version matches the base image.
Error: Proxy responded with 502 Bad Gateway
ProxyError: Could not connect to proxy
Cause: Proxy configuration issue or proxy credits exhausted.
Fix:
// Check proxy configuration
const proxyConfig = await Actor.createProxyConfiguration({
groups: ['BUYPROXIES94952'], // Verify group name in Console
});
// Test proxy connectivity
const proxyUrl = await proxyConfig.newUrl();
console.log('Proxy URL:', proxyUrl);
// Switch to residential if datacenter is blocked
const resProxy = await Actor.createProxyConfiguration({
groups: ['RESIDENTIAL'],
countryCode: 'US',
});
Error: Request blocked — received status 403
Error: Captcha detected on page
Cause: Target website detected scraping activity.
Fix:
const crawler = new PlaywrightCrawler({
proxyConfiguration: await Actor.createProxyConfiguration({
groups: ['RESIDENTIAL'],
}),
// Mimic real browser behavior
launchContext: {
launchOptions: {
args: ['--disable-blink-features=AutomationControlled'],
},
},
preNavigationHooks: [
async ({ page }) => {
// Randomize viewport
await page.setViewportSize({
width: 1280 + Math.floor(Math.random() * 200),
height: 720 + Math.floor(Math.random() * 200),
});
},
],
maxConcurrency: 3, // Lower concurrency = less suspicious
navigationTimeoutSecs: 60,
});
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed — JavaScript heap out of memory
Cause: Actor memory allocation too low for the workload.
Fix:
// Increase memory when running via API
const run = await client.actor('user/actor').call(input, {
memory: 4096, // MB — powers of 2: 128, 256, 512, 1024, 2048, 4096, ...
});
// Or reduce memory usage in Actor code
const crawler = new CheerioCrawler({
maxConcurrency: 5, // Fewer concurrent pages
maxRequestsPerCrawl: 1000, // Cap total requests
requestHandlerTimeoutSecs: 30, // Fail fast on slow pages
});
ApifyApiError: Payload too large (413) — max 9MB per request
Fix:
// Chunk large pushes
function chunkArray<T>(arr: T[], size: number): T[][] {
const chunks: T[][] = [];
for (let i = 0; i < arr.length; i += size) {
chunks.push(arr.slice(i, i + size));
}
return chunks;
}
for (const chunk of chunkArray(items, 500)) {
await client.dataset(dsId).pushItems(chunk);
}
ApifyApiError: Actor 'user/actor-name' not found (404)
Cause: Wrong Actor ID, or Actor is private and you lack access.
Fix: Actor IDs follow the format username/actor-name or the Actor's unique ID (alphanumeric). Check the correct ID at https://apify.com/username/actor-name.
# Check Apify platform status
curl -s https://api.apify.com/v2/health | jq '.'
# Verify your auth
curl -s -H "Authorization: Bearer $APIFY_TOKEN" \
https://api.apify.com/v2/users/me | jq '.data.username'
# Check installed package versions
npm list apify-client apify crawlee 2>/dev/null
# Get last run status
curl -s -H "Authorization: Bearer $APIFY_TOKEN" \
"https://api.apify.com/v2/acts/USER~ACTOR/runs?limit=1&desc=true" | \
jq '.data.items[0] | {status, statusMessage, startedAt, finishedAt}'
| HTTP Code | Meaning | Retryable | Action |
|---|---|---|---|
| 400 | Bad request | No | Fix input/params |
| 401 | Unauthorized | No | Check token |
| 403 | Forbidden | No | Check permissions |
| 404 | Not found | No | Verify resource ID |
| 408 | Timeout | Yes | Retry with backoff |
| 413 | Payload too large | No | Reduce batch size |
| 429 | Rate limited | Yes | Auto-retried by client |
| 500+ | Server error | Yes | Auto-retried by client |
For comprehensive debugging, see apify-debug-bundle.