skills/alchemy-api/SKILL.md
Wire Alchemy into application code (server, backend, dApp, script) using a standard API key. Preferred app-integration path for normal server/backend usage. Covers EVM JSON-RPC, WebSocket subscriptions, Simulation, Webhooks/Notify, Solana RPC, Solana DAS, Solana Yellowstone gRPC, Sui gRPC, Wallets/Account Kit, Account Abstraction, and operational topics. Requires `$ALCHEMY_API_KEY`. For app code without an API key (autonomous agent paying per-request, or explicit x402/MPP), use `alchemy-agentic-gateway` instead.
npx skillsauth add allium-labs/skills alchemy-apiInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Reference and integration guide for wiring Alchemy APIs into application code using a standard API key. This file alone is enough to ship a basic integration; the references/ directory contains deeper coverage of every product surface.
Use alchemy-api when all of the following are true:
This is the preferred app-integration path for normal server/backend usage.
| Situation | Use this skill instead |
| --- | --- |
| Live agent work in this session (queries, admin, on-machine automation) and @alchemy/cli is installed locally — or both CLI and MCP are available | alchemy-cli |
| Live agent work in this session and only MCP is wired into the client (no CLI) | alchemy-mcp |
| Live agent work and neither is available | install alchemy-cli and use alchemy-cli |
| Application code without an API key — autonomous agent paying per-request, or user explicitly wants x402/MPP | agentic-gateway |
Do not use this skill to run ad-hoc live queries from inside the agent session — that's the alchemy-cli / alchemy-mcp path. This skill is for code that ships.
Before writing application code or making any network call:
alchemy-cli (preferred) or alchemy-mcp.$ALCHEMY_API_KEY is set (e.g. echo $ALCHEMY_API_KEY).$ALCHEMY_API_KEY is unset or empty, take the first of these that applies:
@alchemy/cli is installed locally): the CLI can fetch a key from the user's Alchemy account so they never have to leave the terminal. See Bridging from the CLI to an API key below.agentic-gateway skill (x402/MPP gateway, wallet-based auth, no API key needed).You MUST NOT call any keyless or public fallback (including .../v2/demo) unless the user explicitly asks for that endpoint. No public RPC endpoints (publicnode, llamarpc, cloudflare-eth, etc.) as a fallback.
If @alchemy/cli is installed locally (verify with command -v alchemy), use it to obtain a key without leaving the terminal and persist it to the project's .env file so it survives across terminal sessions and is available to the app at runtime.
Security: NEVER echo, print, or otherwise surface the extracted API key value in conversation output. Refer to it only as
$ALCHEMY_API_KEYafter exporting. Treat it the same as a password.
# 1. Try to read a cached key from the CLI config (read-only, safe to run non-interactively).
KEY="$(alchemy --no-interactive --json --reveal config get api-key 2>/dev/null | jq -r .value)"
# 2. If empty/null (no key cached yet), run the interactive flow.
# Note: auth login opens a browser and apps select shows a picker, so do NOT pass
# --no-interactive here. If you already know the app id, pass it explicitly to skip
# the picker: `alchemy --no-interactive --json apps select <id>`.
if [ -z "$KEY" ] || [ "$KEY" = "null" ]; then
alchemy auth login # opens browser; derives auth credentials
alchemy --json apps select # interactive picker (omit --no-interactive so it can render)
KEY="$(alchemy --no-interactive --json --reveal config get api-key | jq -r .value)"
fi
# 3. Persist to the project's .env (standard practice for app code so the key
# survives terminal restarts and is loaded by dotenv / framework env loaders).
# Use .env.local instead if your framework expects that (e.g. Next.js).
ENV_FILE=".env" # or ".env.local" depending on the project convention
touch "$ENV_FILE"
if grep -q '^ALCHEMY_API_KEY=' "$ENV_FILE"; then
# Replace existing line in-place (portable across BSD/GNU sed)
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. Make sure the env file is git-ignored.
grep -qxF "$ENV_FILE" .gitignore 2>/dev/null || echo "$ENV_FILE" >> .gitignore
# 5. Also export to the current shell so the agent can immediately call the API.
export ALCHEMY_API_KEY="$KEY"
Why we persist to
.env: without it, the key is only set for the current shell session and disappears when the terminal tab closes. App code typically loads.envviadotenv(Node),python-dotenv(Python),direnv, or framework-native loaders (Next.js, Vite, Bun, Deno, Rails, etc.), so writing to.envis the canonical way to make the key durable for bothnpm run devand the deployed app's local copy.
Why this whole flow works: the CLI is a runtime executor (
alchemy-cliskill). When the user has it installed, you can use it to provision the credential that this app-code skill needs, write it to a place the application will load, then hand off to the rest of thealchemy-apiflow. After step 5, continue with the Base URLs + auth and Quickstart below.
Gotcha: if
auth loginsucceeded butconfig get api-keystill returns "not found," the CLI'ssetup statusmay have falsely reportedcomplete: truewith only anauth_token. Re-runalchemy --json apps select(or pass an explicit<id>with--no-interactive) to bind a default app, then retry. See thealchemy-cliskill for the same gotcha documented under Preflight.
A self-contained guide for AI agents integrating Alchemy APIs using an API key. This file alone should be enough to ship a basic integration. Use the reference files for depth, edge cases, and advanced workflows.
Developers can always create a free API key at https://dashboard.alchemy.com/.
| Product | Base URL | Auth | Notes |
| --- | --- | --- | --- |
| Ethereum RPC (HTTPS) | https://eth-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY | API key in URL | Standard EVM reads and writes. |
| Ethereum RPC (WSS) | wss://eth-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY | API key in URL | Subscriptions and realtime. |
| Base RPC (HTTPS) | https://base-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY | API key in URL | EVM L2. |
| Base RPC (WSS) | wss://base-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY | API key in URL | Subscriptions and realtime. |
| Arbitrum RPC (HTTPS) | https://arb-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY | API key in URL | EVM L2. |
| Arbitrum RPC (WSS) | wss://arb-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY | API key in URL | Subscriptions and realtime. |
| BNB RPC (HTTPS) | https://bnb-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY | API key in URL | EVM L1. |
| BNB RPC (WSS) | wss://bnb-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY | API key in URL | Subscriptions and realtime. |
| Solana RPC (HTTPS) | https://solana-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY | API key in URL | Solana JSON-RPC. |
| 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 | Sui gRPC API (objects, txs, balances, streaming). |
| Notify API | https://dashboard.alchemy.com/api | X-Alchemy-Token: <ALCHEMY_NOTIFY_AUTH_TOKEN> | Generate token in dashboard. |
| You need | Use this | Skill / file |
| --- | --- | --- |
| EVM read/write | JSON-RPC eth_* | references/node-json-rpc.md |
| Realtime events | eth_subscribe | references/node-websocket-subscriptions.md |
| Simulate tx | alchemy_simulateAssetChanges | references/data-simulation-api.md |
| Create webhook | POST /create-webhook | references/webhooks-details.md |
| Solana DAS | getAssetsByOwner (DAS) | references/solana-das-api.md |
| Sui objects/txs | GetObject, GetTransaction (gRPC) | references/sui-grpc-objects-and-ledger.md |
| Sui balances | GetBalance, ListBalances (gRPC) | references/sui-grpc-state-and-balances.md |
| Sui checkpoints stream | SubscribeCheckpoints (gRPC) | references/sui-grpc-subscriptions.md |
No API key? Use the
agentic-gatewayskill instead. Replace API-key URLs withhttps://x402.alchemy.com/eth-mainnet/v2and addAuthorization: SIWE <token>(orSIWS <token>for a Solana wallet). See theagentic-gatewayskill for setup.
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":[]}'
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"]}'
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));
}
eth-mainnet.ETH_MAINNET.| Token | Chain | Address |
| --- | --- | --- |
| ETH | ethereum | 0x0000000000000000000000000000000000000000 |
| WETH | ethereum | 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 |
| USDC | ethereum | 0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eB48 |
| USDC | base | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 |
429 means rate limit. Use exponential backoff with jitter.error fields even with HTTP 200.pageKey to resume pagination after failures.For the complete reference index organized by product area, see references/skill-map.md.
Quick category overview:
| The user wants to... | Hand off to |
| --- | --- |
| Run a one-off live query, admin command, or on-machine automation in this session (CLI installed) | alchemy-cli |
| Run a one-off live query in this session (only MCP wired in) | alchemy-mcp |
| Build app code without an API key (autonomous agent, or explicit x402/MPP) | agentic-gateway |
$ALCHEMY_API_KEY is set: echo $ALCHEMY_API_KEYreferences/operational-allowlists.md)references/operational-rate-limits-and-compute-units.md for limits per planeth-mainnet, base-mainnetETH_MAINNET, BASE_MAINNETreferences/operational-supported-networks.md for the full listerror field even with a 200 status coderesponse.error in addition to HTTP statustools
Query blockchain data using the allium CLI. Token prices, wallet balances, transactions, PnL, historical holdings, and SQL analytics across 80+ chains. Supports API key, x402 micropayments, and Tempo auth. Use when user asks about crypto prices, wallet balances, on-chain analytics, or blockchain data. Always use this skill for any Allium data queries, blockchain lookups, or on-chain analysis tasks.
development
Wire Alchemy into application code without an API key, using the x402 or MPP gateway with wallet-based auth (SIWE/SIWS) and per-request payments (USDC via x402, or USDC/credit-card via MPP). Specialized app-integration path. Use when the user is building application code AND no API key is available, or they're an autonomous agent that needs to pay for itself, or they explicitly want x402/MPP. For normal app code with an Alchemy API key, use `alchemy-api`.
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.