Alchemy Common Errors
Overview
Troubleshooting guide for Alchemy SDK errors covering rate limits, RPC failures, invalid parameters, and network-specific issues.
Error Reference
Authentication & Rate Limits
| HTTP Code |
Error |
Root Cause |
Fix |
401 |
Unauthorized |
Invalid or missing API key |
Verify key in Alchemy Dashboard |
403 |
Forbidden |
API key disabled or app deleted |
Create new app in Dashboard |
429 |
Too Many Requests |
Rate limit exceeded |
Implement backoff; upgrade plan |
429 |
Compute Units exceeded |
CU quota depleted |
Check CU usage in Dashboard |
Alchemy Rate Limits by Plan
| Plan |
Compute Units/sec |
Throughput |
| Free |
330 CU/s |
~25 requests/s |
| Growth |
660 CU/s |
~50 requests/s |
| Scale |
Custom |
Custom |
RPC & Query Errors
// Common RPC error handler
import { Alchemy, Network } from 'alchemy-sdk';
async function safeAlchemyCall<T>(
operation: () => Promise<T>,
context: string
): Promise<T | null> {
try {
return await operation();
} catch (error: any) {
const code = error.code || error.response?.status;
switch (code) {
case -32602: // Invalid params
console.error(`[${context}] Invalid parameters: ${error.message}`);
console.error('Common causes: wrong address format, invalid block number, missing 0x prefix');
break;
case -32600: // Invalid request
console.error(`[${context}] Malformed JSON-RPC request`);
break;
case -32601: // Method not found
console.error(`[${context}] RPC method not available on this network`);
console.error('Some Enhanced APIs are Ethereum-only');
break;
case -32000: // Server error
console.error(`[${context}] Node server error — usually transient, retry`);
break;
case 429:
const retryAfter = error.response?.headers?.['retry-after'] || 1;
console.error(`[${context}] Rate limited — retry after ${retryAfter}s`);
break;
default:
console.error(`[${context}] Unknown error: ${code} — ${error.message}`);
}
return null;
}
}
NFT API Errors
| Error |
Root Cause |
Fix |
Empty ownedNfts |
Address has no NFTs on this chain |
Check correct network |
Missing image.cachedUrl |
IPFS/Arweave gateway timeout |
Use image.originalUrl fallback |
getNftsForContract empty |
Contract not indexed |
Wait for indexing; try refreshContract |
| Spam NFTs in results |
No spam filter |
Add excludeFilters: ['SPAM'] option |
getNftMetadataBatch fails |
Batch too large |
Limit to 100 tokens per batch |
Enhanced API Errors
| Error |
Root Cause |
Fix |
getAssetTransfers empty |
Wrong category |
Include all: EXTERNAL, ERC20, ERC721, ERC1155 |
getTokenBalances timeout |
Too many tokens |
Paginate or use specific contract addresses |
getTokenMetadata null fields |
Token not verified |
Handle null name/symbol gracefully |
| WebSocket disconnect |
Idle timeout (5 min) |
Implement auto-reconnect logic |
Network-Specific Issues
// Diagnostic function
async function diagnoseAlchemyIssue(alchemy: Alchemy): Promise<string[]> {
const issues: string[] = [];
try {
const blockNumber = await alchemy.core.getBlockNumber();
console.log(`Connected: block #${blockNumber}`);
} catch (err: any) {
if (err.message?.includes('apiKey')) issues.push('API key invalid or missing');
else if (err.code === 'ECONNREFUSED') issues.push('Cannot reach Alchemy servers — check network');
else issues.push(`Connection error: ${err.message}`);
}
return issues;
}
Quick Diagnostic
# Test Alchemy API directly
curl -s "https://eth-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":0}' | jq .
# Check CU usage (requires auth token)
curl -s "https://dashboard.alchemy.com/api/stats" \
-H "Authorization: Bearer ${ALCHEMY_AUTH_TOKEN}" | jq .
Output
- Error classified by type (auth, rate limit, RPC, network)
- Root cause identified with specific fix
- Diagnostic function for automated troubleshooting
Resources
Next Steps
For collecting debug bundles, see alchemy-debug-bundle.
1---2name: alchemy-common-errors3description: |4 Diagnose and fix common Alchemy SDK and Web3 API errors.5 Use when encountering rate limits, RPC failures, invalid parameters,6 or blockchain query errors with the Alchemy SDK.7 Trigger: "alchemy error", "alchemy not working", "alchemy 429",8 "alchemy debug", "fix alchemy issue".9allowed-tools: Read, Write, Edit, Bash(curl:*), Grep10version: 1.0.011license: MIT12author: Jeremy Longshore <jeremy@intentsolutions.io>13tags: [saas, blockchain, web3, alchemy, troubleshooting]14compatible-with: claude-code15---1617# Alchemy Common Errors1819## Overview2021Troubleshooting guide for Alchemy SDK errors covering rate limits, RPC failures, invalid parameters, and network-specific issues.2223## Error Reference2425### Authentication & Rate Limits2627| HTTP Code | Error | Root Cause | Fix |28|-----------|-------|-----------|-----|29| `401` | Unauthorized | Invalid or missing API key | Verify key in Alchemy Dashboard |30| `403` | Forbidden | API key disabled or app deleted | Create new app in Dashboard |31| `429` | Too Many Requests | Rate limit exceeded | Implement backoff; upgrade plan |32| `429` | Compute Units exceeded | CU quota depleted | Check CU usage in Dashboard |3334### Alchemy Rate Limits by Plan3536| Plan | Compute Units/sec | Throughput |37|------|-------------------|------------|38| Free | 330 CU/s | ~25 requests/s |39| Growth | 660 CU/s | ~50 requests/s |40| Scale | Custom | Custom |4142### RPC & Query Errors4344```typescript45// Common RPC error handler46import { Alchemy, Network } from 'alchemy-sdk';4748async function safeAlchemyCall<T>(49 operation: () => Promise<T>,50 context: string51): Promise<T | null> {52 try {53 return await operation();54 } catch (error: any) {55 const code = error.code || error.response?.status;5657 switch (code) {58 case -32602: // Invalid params59 console.error(`[${context}] Invalid parameters: ${error.message}`);60 console.error('Common causes: wrong address format, invalid block number, missing 0x prefix');61 break;6263 case -32600: // Invalid request64 console.error(`[${context}] Malformed JSON-RPC request`);65 break;6667 case -32601: // Method not found68 console.error(`[${context}] RPC method not available on this network`);69 console.error('Some Enhanced APIs are Ethereum-only');70 break;7172 case -32000: // Server error73 console.error(`[${context}] Node server error — usually transient, retry`);74 break;7576 case 429:77 const retryAfter = error.response?.headers?.['retry-after'] || 1;78 console.error(`[${context}] Rate limited — retry after ${retryAfter}s`);79 break;8081 default:82 console.error(`[${context}] Unknown error: ${code} — ${error.message}`);83 }84 return null;85 }86}87```8889### NFT API Errors9091| Error | Root Cause | Fix |92|-------|-----------|-----|93| Empty `ownedNfts` | Address has no NFTs on this chain | Check correct network |94| Missing `image.cachedUrl` | IPFS/Arweave gateway timeout | Use `image.originalUrl` fallback |95| `getNftsForContract` empty | Contract not indexed | Wait for indexing; try `refreshContract` |96| Spam NFTs in results | No spam filter | Add `excludeFilters: ['SPAM']` option |97| `getNftMetadataBatch` fails | Batch too large | Limit to 100 tokens per batch |9899### Enhanced API Errors100101| Error | Root Cause | Fix |102|-------|-----------|-----|103| `getAssetTransfers` empty | Wrong category | Include all: EXTERNAL, ERC20, ERC721, ERC1155 |104| `getTokenBalances` timeout | Too many tokens | Paginate or use specific contract addresses |105| `getTokenMetadata` null fields | Token not verified | Handle null `name`/`symbol` gracefully |106| WebSocket disconnect | Idle timeout (5 min) | Implement auto-reconnect logic |107108### Network-Specific Issues109110```typescript111// Diagnostic function112async function diagnoseAlchemyIssue(alchemy: Alchemy): Promise<string[]> {113 const issues: string[] = [];114115 try {116 const blockNumber = await alchemy.core.getBlockNumber();117 console.log(`Connected: block #${blockNumber}`);118 } catch (err: any) {119 if (err.message?.includes('apiKey')) issues.push('API key invalid or missing');120 else if (err.code === 'ECONNREFUSED') issues.push('Cannot reach Alchemy servers — check network');121 else issues.push(`Connection error: ${err.message}`);122 }123124 return issues;125}126```127128## Quick Diagnostic129130```bash131# Test Alchemy API directly132curl -s "https://eth-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}" \133 -X POST \134 -H "Content-Type: application/json" \135 -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":0}' | jq .136137# Check CU usage (requires auth token)138curl -s "https://dashboard.alchemy.com/api/stats" \139 -H "Authorization: Bearer ${ALCHEMY_AUTH_TOKEN}" | jq .140```141142## Output143144- Error classified by type (auth, rate limit, RPC, network)145- Root cause identified with specific fix146- Diagnostic function for automated troubleshooting147148## Resources149150- [Alchemy Error Codes](https://www.alchemy.com/docs/reference/error-reference)151- [Alchemy Rate Limits](https://www.alchemy.com/docs/reference/rate-limits)152- [JSON-RPC Error Codes](https://www.jsonrpc.org/specification#error_object)153154## Next Steps155156For collecting debug bundles, see `alchemy-debug-bundle`.157