Alchemy API (avec clé API)
Guide de référence et d'intégration pour intégrer les APIs Alchemy dans le code d'application en utilisant une clé API standard. Ce fichier seul suffit pour déployer une intégration basique ; le répertoire references/ offre une couverture approfondie de chaque surface produit.
Quand utiliser cette skill (scope_in)
Utilisez alchemy-api quand tous les points suivants sont vrais :
- L'utilisateur intègre Alchemy dans du code d'application (serveur, backend, dApp, worker, script) qui s'exécute en dehors de la session agent actuelle
- Il dispose, ou est disposé à créer, une clé API Alchemy (gratuite sur dashboard.alchemy.com)
C'est le chemin d'intégration app préféré pour une utilisation serveur/backend standard.
Quand NE PAS utiliser cette skill (scope_out, handoff)
| Situation | Utilisez cette skill à la place |
|---|---|
| Données NFT/token, recherche, stats de collection | opensea-api |
| Acheter/vendre NFTs, listings, offres, fulfillment Seaport | opensea-marketplace |
| Swaps de tokens ERC20 | opensea-swaps |
| Configuration signature de wallet | opensea-wallet |
| Construire/enregistrer/gater les outils d'agent IA | opensea-tool-sdk |
Travail agent live dans cette session (requêtes, admin, automatisation locale) et @alchemy/cli est installé localement — ou CLI et MCP disponibles |
alchemy-cli |
| Travail agent live dans cette session et seul MCP est intégré au client (pas de CLI) | alchemy-mcp |
| Travail agent live et aucun n'est disponible | installer alchemy-cli et utiliser alchemy-cli |
| Code d'application sans clé API — agent autonome payant par requête, ou l'utilisateur explicitement veut x402/MPP | alchemy-agentic-gateway |
Ne pas utiliser cette skill pour exécuter des requêtes live ad-hoc depuis la session agent — c'est le chemin alchemy-cli / alchemy-mcp. Cette skill est pour le code qu'on déploie.
Vérification préalable obligatoire
Avant de rédiger du code d'application ou d'effectuer tout appel réseau :
- Confirmer que l'utilisateur construit du code d'application (ne demande pas à l'agent d'exécuter une requête live). Si l'utilisateur demande du travail live, rediriger vers
alchemy-cli(préféré) oualchemy-mcp. - Vérifier que
$ALCHEMY_API_KEYest définie (ex.echo $ALCHEMY_API_KEY). - Si
$ALCHEMY_API_KEYest non définie ou vide, appliquer le premier qui s'applique :- Pont CLI (recommandé si
@alchemy/cliest installé localement) : la CLI peut récupérer une clé depuis le compte Alchemy de l'utilisateur sans jamais quitter le terminal. Voir Bridging from the CLI to an API key ci-dessous. - Dire à l'utilisateur qu'il peut créer une clé API gratuite sur https://dashboard.alchemy.com/, ou
- Basculer vers la skill
alchemy-agentic-gateway(gateway x402/MPP, auth basée wallet, pas de clé API nécessaire).
- Pont CLI (recommandé si
Vous NE DEVEZ PAS appeler de fallback sans clé ou public (incluant .../v2/demo) sauf si l'utilisateur demande explicitement cet endpoint. Pas d'endpoints RPC publics (publicnode, llamarpc, cloudflare-eth, etc.) comme fallback.
Bridging from the CLI to an API key
Si @alchemy/cli est installé localement (vérifier avec command -v alchemy), utilisez-le pour obtenir une clé sans quitter le terminal et persistez-la dans le fichier .env du projet pour qu'elle survive aux redémarrages de terminal et soit disponible à l'app au runtime.
Sécurité : NE JAMAIS afficher, imprimer ou exposer la valeur de clé API extraite dans la sortie de conversation. Référencez-la seulement en tant que
$ALCHEMY_API_KEYaprès export. Traitez-la comme un mot de passe.
# 1. Essayer de lire une clé en cache depuis la config CLI (lecture seule, sûr d'exécuter non-interactivement).
KEY="$(alchemy --no-interactive --json --reveal config get api-key 2>/dev/null | jq -r .value)"
# 2. Si vide/null (aucune clé en cache encore), exécuter le flux interactif.
# Note: auth login ouvre un navigateur et apps select affiche un picker, donc NE PAS passer
# --no-interactive ici. Si vous connaissez déjà l'id de l'app, passez-le explicitement pour sauter
# le picker: `alchemy --no-interactive --json apps select <id>`.
if [ -z "$KEY" ] || [ "$KEY" = "null" ]; then
alchemy auth login # ouvre le navigateur; dérive les credentials d'auth
alchemy --json apps select # picker interactif (omettez --no-interactive pour qu'il puisse s'afficher)
KEY="$(alchemy --no-interactive --json --reveal config get api-key | jq -r .value)"
fi
# 3. Persister dans le .env du projet (pratique standard pour le code app pour que la clé
# survive aux redémarrages de terminal et soit chargée par dotenv / chargeurs d'env de framework).
# Utilisez .env.local à la place si votre framework l'attend (ex. Next.js).
ENV_FILE=".env" # ou ".env.local" selon la convention du projet
touch "$ENV_FILE"
if grep -q '^ALCHEMY_API_KEY=' "$ENV_FILE"; then
# Remplacer la ligne existante en place (portable entre sed BSD/GNU)
sed -i.bak "s|^ALCHEMY_API_KEY=.*|ALCHEMY_API_KEY=$KEY|" "$ENV_FILE" && rm "$ENV_FILE.bak"
else
echo "ALCHEMY_API_KEY=$KEY" >> "$ENV_FILE"
fi
# 4. S'assurer que le fichier env est git-ignoré.
grep -qxF "$ENV_FILE" .gitignore 2>/dev/null || echo "$ENV_FILE" >> .gitignore
# 5. Exporter aussi pour le shell courant pour que l'agent puisse immédiatement appeler l'API.
export ALCHEMY_API_KEY="$KEY"
Pourquoi on persiste dans
.env: sans cela, la clé n'est définie que pour la session shell courant et disparaît quand l'onglet terminal se ferme. Le code d'application charge généralement.envviadotenv(Node),python-dotenv(Python),direnv, ou chargeurs natifs de framework (Next.js, Vite, Bun, Deno, Rails, etc.), donc écrire dans.envest le moyen canonique de rendre la clé durable à la fois pournpm run devet pour la copie locale de l'app déployée.
Pourquoi ce flux entier fonctionne : la CLI est un exécuteur runtime (skill
alchemy-cli). Quand l'utilisateur l'a installée, vous pouvez l'utiliser pour provisionner la credential que cette skill de code d'app a besoin, l'écrire dans un endroit que l'application chargera, puis passer à la suite du fluxalchemy-api. Après l'étape 5, continuer avec Base URLs + auth et Quickstart ci-dessous.
Piège : si
auth logina réussi maisconfig get api-keyretourne toujours "not found," lesetup statusde la CLI a peut-être faussement rapportécomplete: trueavec seulement unauth_token. Ré-exécuteralchemy --json apps select(ou passer un<id>explicite avec--no-interactive) pour lier une app par défaut, puis réessayer. Voir la skillalchemy-clipour le même piège documenté sous Preflight.
Résumé
Un guide autonome pour que les agents IA intègrent les APIs Alchemy en utilisant une clé API. Ce fichier seul devrait suffire à déployer une intégration basique. Utilisez les fichiers de référence pour la profondeur, les cas limites, et les workflows avancés.
Les développeurs peuvent toujours créer une clé API gratuite sur https://dashboard.alchemy.com/.
Faire ceci en premier
- Confirmer la portée d'intégration app (voir Mandatory preflight gate).
- Choisir le bon produit en utilisant Endpoint selector ci-dessous.
- Utiliser la table Base URLs + auth pour l'endpoint et les headers corrects.
- Copier un exemple Quickstart et tester contre un testnet d'abord.
Base URLs + auth (cheat sheet)
| Produit | Base URL | Auth | Notes |
|---|---|---|---|
| Ethereum RPC (HTTPS) | https://eth-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY |
Clé API dans l'URL | Lectures et écritures EVM standard. |
| Ethereum RPC (WSS) | wss://eth-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY |
Clé API dans l'URL | Subscriptions et realtime. |
| Base RPC (HTTPS) | https://base-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY |
Clé API dans l'URL | EVM L2. |
| Base RPC (WSS) | wss://base-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY |
Clé API dans l'URL | Subscriptions et realtime. |
| Arbitrum RPC (HTTPS) | https://arb-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY |
Clé API dans l'URL | EVM L2. |
| Arbitrum RPC (WSS) | wss://arb-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY |
Clé API dans l'URL | Subscriptions et realtime. |
| BNB RPC (HTTPS) | https://bnb-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY |
Clé API dans l'URL | EVM L1. |
| BNB RPC (WSS) | wss://bnb-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY |
Clé API dans l'URL | Subscriptions et realtime. |
| Solana RPC (HTTPS) | https://solana-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY |
Clé API dans l'URL | JSON-RPC Solana. |
| Solana Yellowstone gRPC | https://solana-mainnet.g.alchemy.com |
X-Token: $ALCHEMY_API_KEY |
gRPC streaming (Yellowstone). |
| Sui gRPC | sui-mainnet.g.alchemy.com:443 |
Authorization: Bearer $ALCHEMY_API_KEY |
API gRPC Sui (objets, txs, balances, streaming). |
| NFT API | https://<network>.g.alchemy.com/nft/v3/$ALCHEMY_API_KEY |
Clé API dans l'URL | Propriété et métadonnées NFT. |
| Prices API | https://api.g.alchemy.com/prices/v1/$ALCHEMY_API_KEY |
Clé API dans l'URL | Prix par symbole ou adresse. |
| Portfolio API | https://api.g.alchemy.com/data/v1/$ALCHEMY_API_KEY |
Clé API dans l'URL | Vues de wallet multi-chaîne. |
| Notify API | https://dashboard.alchemy.com/api |
X-Alchemy-Token: <ALCHEMY_NOTIFY_AUTH_TOKEN> |
Générer le token dans le dashboard. |
Endpoint selector (top tasks)
| Vous avez besoin de | Utilisez ceci | Skill / fichier |
|---|---|---|
| Lecture/écriture EVM | JSON-RPC eth_* |
references/node-json-rpc.md |
| Événements realtime | eth_subscribe |
references/node-websocket-subscriptions.md |
| Balances de tokens | alchemy_getTokenBalances |
references/data-token-api.md |
| Métadonnées de token | alchemy_getTokenMetadata |
references/data-token-api.md |
| Historique de transfers | alchemy_getAssetTransfers |
references/data-transfers-api.md |
| Propriété NFT | GET /getNFTsForOwner |
references/data-nft-api.md |
| Métadonnées NFT | GET /getNFTMetadata |
references/data-nft-api.md |
| Prix (spot) | GET /tokens/by-symbol |
references/data-prices-api.md |
| Prix (historique) | POST /tokens/historical |
references/data-prices-api.md |
| Portfolio (multi-chaîne) | POST /assets/*/by-address |
references/data-portfolio-apis.md |
| Simuler tx | alchemy_simulateAssetChanges |
references/data-simulation-api.md |
| Créer webhook | POST /create-webhook |
references/webhooks-details.md |
| Données NFT Solana | getAssetsByOwner (DAS) |
references/solana-das-api.md |
| Objets/txs Sui | GetObject, GetTransaction (gRPC) |
references/sui-grpc-objects-and-ledger.md |
| Balances Sui | GetBalance, ListBalances (gRPC) |
references/sui-grpc-state-and-balances.md |
| Stream de checkpoints Sui | SubscribeCheckpoints (gRPC) |
references/sui-grpc-subscriptions.md |
One-file quickstart (copy/paste)
Pas de clé API ? Utilisez la skill
alchemy-agentic-gatewayà la place. Remplacez les URLs avec clé API parhttps://x402.alchemy.com/eth-mainnet/v2et ajoutezAuthorization: SIWE <token>(ouSIWS <token>pour un wallet Solana). Voir la skillalchemy-agentic-gatewaypour la setup.
EVM JSON-RPC (read)
curl -s https://eth-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'
Token balances
curl -s https://eth-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"alchemy_getTokenBalances","params":["0x00000000219ab540356cbb839cbe05303d7705fa"]}'
Transfer history
curl -s https://eth-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"alchemy_getAssetTransfers","params":[{"fromBlock":"0x0","toBlock":"latest","toAddress":"0x00000000219ab540356cbb839cbe05303d7705fa","category":["erc20"],"withMetadata":true,"maxCount":"0x3e8"}]}'
NFT ownership
curl -s "https://eth-mainnet.g.alchemy.com/nft/v3/$ALCHEMY_API_KEY/getNFTsForOwner?owner=0x00000000219ab540356cbb839cbe05303d7705fa"
Prices (spot)
curl -s "https://api.g.alchemy.com/prices/v1/$ALCHEMY_API_KEY/tokens/by-symbol?symbols=ETH&symbols=USDC"
Prices (historical)
curl -s -X POST "https://api.g.alchemy.com/prices/v1/$ALCHEMY_API_KEY/tokens/historical" \
-H "Content-Type: application/json" \
-d '{"symbol":"ETH","startTime":"2024-01-01T00:00:00Z","endTime":"2024-01-02T00:00:00Z"}'
Create Notify webhook
curl -s -X POST "https://dashboard.alchemy.com/api/create-webhook" \
-H "Content-Type: application/json" \
-H "X-Alchemy-Token: $ALCHEMY_NOTIFY_AUTH_TOKEN" \
-d '{"network":"ETH_MAINNET","webhook_type":"ADDRESS_ACTIVITY","webhook_url":"https://example.com/webhook","addresses":["0x00000000219ab540356cbb839cbe05303d7705fa"]}'
Verify webhook signature (Node)
import crypto from "crypto";
export function verify(rawBody: string, signature: string, secret: string) {
const hmac = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
return crypto.timingSafeEqual(Buffer.from(hmac), Buffer.from(signature));
}
Network naming rules
- Les Data APIs et JSON-RPC utilisent des enums de réseau en minuscules comme
eth-mainnet. - L'API Notify utilise des enums en majuscules comme
ETH_MAINNET.
Pagination + limits (cheat sheet)
| Endpoint | Limite | Notes |
|---|---|---|
alchemy_getTokenBalances |
maxCount <= 100 |
Utiliser pageKey pour la pagination. |
alchemy_getAssetTransfers |
maxCount par défaut 0x3e8 |
Utiliser pageKey pour la pagination. |
| Balances de tokens Portfolio | 3 paires adresse/réseau, 20 réseaux total | pageKey supporté. |
| NFTs Portfolio | 2 paires adresse/réseau, 15 réseaux chacun | pageKey supporté. |
| Prix par adresse | 25 adresses, 3 réseaux | POST body addresses[]. |
| Historique de transactions (beta) | 1 paire adresse/réseau, 2 réseaux | ETH et BASE mainnets seulement. |
Common token addresses
| Token | Chaîne | Adresse |
|---|---|---|
| ETH | ethereum | 0x0000000000000000000000000000000000000000 |
| WETH | ethereum | 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 |
| USDC | ethereum | 0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eB48 |
| USDC | base | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 |
Failure modes + retries
- HTTP
429signifie rate limit. Utiliser exponential backoff avec jitter. - Les erreurs JSON-RPC arrivent dans les champs
errormême avec HTTP 200. - Utiliser
pageKeypour reprendre la pagination après les défaillances. - Dédupliquer les événements websocket lors de la reconnexion.
Skill map
Pour l'index complet de tous les 90+ fichiers de référence organisés par domaine produit (Node, Data, Webhooks, Solana, Sui gRPC, Wallets, Rollups, Recipes, Operational, Ecosystem), voir references/skill-map.md.
Aperçu rapide des catégories :
- Node : JSON-RPC, WebSocket, Debug, Trace, Enhanced APIs, Utility
- Data : NFT, Portfolio, Prices, Simulation, Token, Transfers
- Webhooks : Address Activity, Custom (GraphQL), NFT Activity, Payloads, Signatures
- Solana : JSON-RPC, DAS, Yellowstone gRPC (streaming), Wallets
- Sui gRPC : Objects, Transactions, Balances, Move Packages, Name Service, Subscriptions, Signature Verification
- Wallets : Account Kit, Bundler, Gas Manager, Wallet APIs (anciennement « Smart Wallets »)
- Rollups : Aperçu déploiement L2/L3
- Recipes : 10 workflows d'intégration bout en bout
- Operational : Auth, Rate Limits, Monitoring, Best Practices
- Ecosystem : viem, ethers, wagmi, Hardhat, Foundry, Anchor, et plus
Handing off to other skills
| L'utilisateur veut... | Hand off to |
|---|---|
| Exécuter une requête live ponctuelle, commande admin, ou automatisation locale dans cette session (CLI installée) | alchemy-cli |
| Exécuter une requête live ponctuelle dans cette session (seulement MCP intégré) | alchemy-mcp |
| Construire du code d'app sans clé API (agent autonome, ou x402/MPP explicite) | alchemy-agentic-gateway |
Troubleshooting
API key not working
- Vérifier que
$ALCHEMY_API_KEYest définie :echo $ALCHEMY_API_KEY - Confirmer que la clé est valide sur dashboard.alchemy.com
- Vérifier si des allowlists restreignent la clé à des IPs/domaines spécifiques (voir
references/operational-allowlists.md)
HTTP 429 (rate limited)
- Utiliser exponential backoff avec jitter avant de réessayer
- Vérifier votre budget d'unités de calcul dans le dashboard Alchemy
- Voir
references/operational-rate-limits-and-compute-units.mdpour les limites par plan
Wrong network slug
- Data APIs et JSON-RPC utilisent minuscules :
eth-mainnet,base-mainnet - Notify API utilise majuscules :
ETH_MAINNET,BASE_MAINNET - Voir
references/operational-supported-networks.mdpour la liste complète
JSON-RPC error with HTTP 200
- Alchemy retourne les erreurs JSON-RPC dans le champ
errormême avec un statut 200 - Toujours vérifier
response.erroren plus du statut HTTP