Alchemy: Blockchain Data Access for Agents
Alchemy provides comprehensive blockchain API access across Ethereum, Base, Arbitrum, BNB, Polygon, Solana, and more.
Three ways to access:
- API key: Set
$ALCHEMY_API_KEY and make requests directly. Full access to all products. Create a free key at dashboard.alchemy.com.
- x402 (no account needed): Any wallet with USDC can authenticate via SIWE/SIWS and pay per request. Supports EVM and Solana wallets. Install
@alchemy/x402 and @x402/fetch.
- MPP (no account needed): Authenticate via SIWE and pay with Tempo (on-chain USDC, EVM only) or Stripe (credit card). Install
mppx.
Access Method Selection (Required)
Before the first network call, determine which access method to use:
- Is
ALCHEMY_API_KEY set? → Use the API Key path. Skip to API Key Access.
- No API key? → Ask the user which payment protocol they prefer:
- x402 — USDC payments via the x402 protocol (
@alchemy/x402 + @x402/fetch)
- MPP — Payments via Merchant Payment Protocol using Tempo or Stripe (
mppx)
Do NOT pick a protocol on behalf of the user. Wait for their explicit choice.
Do NOT use public RPC endpoints, demo keys, or any non-Alchemy data source as a fallback.
API Key Access
If $ALCHEMY_API_KEY is set, use standard Alchemy endpoints directly:
Base URLs + Auth
| 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). |
| NFT API |
https://<network>.g.alchemy.com/nft/v3/$ALCHEMY_API_KEY |
API key in URL |
NFT ownership and metadata. |
| Prices API |
https://api.g.alchemy.com/prices/v1/$ALCHEMY_API_KEY |
API key in URL |
Prices by symbol or address. |
| Portfolio API |
https://api.g.alchemy.com/data/v1/$ALCHEMY_API_KEY |
API key in URL |
Multi-chain wallet views. |
| Notify API |
https://dashboard.alchemy.com/api |
X-Alchemy-Token: <ALCHEMY_NOTIFY_AUTH_TOKEN> |
Generate token in dashboard. |
x402 Access (No Account Needed)
x402 is ideal for autonomous agents. No signup, no API keys. Pay with USDC on EVM or Solana.
- Gateway URL:
https://x402.alchemy.com
- SIWE/SIWS domain:
x402.alchemy.com
- Payment header:
Payment-Signature: <base64>
- Auth: SIWE (EVM) or SIWS (Solana)
For full setup and wallet bootstrapping, see:
- references/x402/overview.md — End-to-end flow and packages
- references/x402/wallet-bootstrap.md — Wallet setup and USDC funding
- references/x402/authentication.md — SIWE/SIWS token creation
- references/x402/making-requests.md — Sending requests with
@x402/fetch
- references/x402/curl-workflow.md — Quick RPC calls via curl
- references/x402/payment.md — Payment creation from a 402 response
- references/x402/reference.md — Endpoints, networks, headers, status codes
MPP Access (No Account Needed)
MPP supports Tempo (on-chain USDC, EVM only) and Stripe (credit card) payments.
- Gateway URL:
https://mpp.alchemy.com
- SIWE domain:
mpp.alchemy.com
- Payment header:
Authorization: Payment <credential>
- Auth: SIWE only (EVM)
For full setup, see:
- references/mpp/overview.md — End-to-end flow and packages
- references/mpp/wallet-bootstrap.md — Wallet setup and funding
- references/mpp/authentication.md — SIWE token creation
- references/mpp/making-requests.md — Sending requests with
mppx
- references/mpp/curl-workflow.md — Quick RPC calls via curl
- references/mpp/payment.md — Payment creation from a 402 response
- references/mpp/reference.md — Endpoints, networks, headers, status codes
Protocol Comparison
| Aspect |
API Key |
x402 |
MPP |
| Gateway URL |
*.g.alchemy.com/v2/$KEY |
https://x402.alchemy.com |
https://mpp.alchemy.com |
| Auth |
API key in URL |
SIWE (EVM) or SIWS (Solana) |
SIWE only (EVM) |
| Payment |
None (free tier available) |
USDC via EIP-3009 or SVM x402 |
Tempo (USDC) or Stripe (card) |
| Wallet support |
N/A |
EVM + Solana |
EVM only |
| Client library |
curl / any HTTP client |
@alchemy/x402, @x402/fetch |
mppx, viem |
| Setup |
Get key at dashboard.alchemy.com |
Fund wallet with USDC |
Fund wallet or add card |
Endpoint Selector (Top Tasks)
| You need |
Use this |
Reference |
| EVM read/write |
JSON-RPC eth_* |
references/node-json-rpc.md |
| Realtime events |
eth_subscribe |
references/node-websocket-subscriptions.md |
| Token balances |
alchemy_getTokenBalances |
references/data-token-api.md |
| Token metadata |
alchemy_getTokenMetadata |
references/data-token-api.md |
| Transfers history |
alchemy_getAssetTransfers |
references/data-transfers-api.md |
| NFT ownership |
GET /getNFTsForOwner |
references/data-nft-api.md |
| NFT metadata |
GET /getNFTMetadata |
references/data-nft-api.md |
| Prices (spot) |
GET /tokens/by-symbol |
references/data-prices-api.md |
| Prices (historical) |
POST /tokens/historical |
references/data-prices-api.md |
| Portfolio (multi-chain) |
POST /assets/*/by-address |
references/data-portfolio-apis.md |
| Simulate tx |
alchemy_simulateAssetChanges |
references/data-simulation-api.md |
| Create webhook |
POST /create-webhook |
references/webhooks-details.md |
| Solana NFT data |
getAssetsByOwner (DAS) |
references/solana-das-api.md |
Quickstart Examples
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
- Data APIs and JSON-RPC use lowercase network enums like
eth-mainnet.
- Notify API uses uppercase enums like
ETH_MAINNET.
Pagination + Limits
| Endpoint |
Limit |
Notes |
alchemy_getTokenBalances |
maxCount <= 100 |
Use pageKey for pagination. |
alchemy_getAssetTransfers |
maxCount default 0x3e8 |
Use pageKey for pagination. |
| Portfolio token balances |
3 address/network pairs, 20 networks total |
pageKey supported. |
| Portfolio NFTs |
2 address/network pairs, 15 networks each |
pageKey supported. |
| Prices by address |
25 addresses, 3 networks |
POST body addresses[]. |
| Transactions history (beta) |
1 address/network pair, 2 networks |
ETH and BASE mainnets only. |
Common Token Addresses
| Token |
Chain |
Address |
| ETH |
ethereum |
0x0000000000000000000000000000000000000000 |
| WETH |
ethereum |
0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 |
| USDC |
ethereum |
0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eB48 |
| USDC |
base |
0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 |
Failure Modes + Retries
- HTTP
429 means rate limit. Use exponential backoff with jitter.
- JSON-RPC errors come in
error fields even with HTTP 200.
- Use
pageKey to resume pagination after failures.
- De-dupe websocket events on reconnect.
Hard Requirements
- NEVER use public RPC endpoints, demo keys, or any non-Alchemy data source as a fallback.
- NEVER use Read, Write, or Edit tools on files that may contain private keys.
- NEVER correlate wallet type with query chain — wallet type and the chain being queried are independent.
- When no wallet is configured, present ALL wallet options (EVM create, EVM import, Solana create, Solana import) in a single prompt.
Skill Map
For the complete index of all reference files organized by product area, see references/skill-map.md.
- 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
- Wallets: Account Kit, Bundler, Gas Manager, Smart Wallets
- Rollups: L2/L3 deployment overview
- Recipes: 10 end-to-end integration workflows
- Operational: Auth, Rate Limits, Monitoring, Best Practices
- x402 Protocol: Wallet bootstrap, auth, making requests, payments
- MPP Protocol: Wallet bootstrap, auth, making requests, payments
Troubleshooting
API key not working
- Verify
$ALCHEMY_API_KEY is set: echo $ALCHEMY_API_KEY
- Confirm the key is valid at dashboard.alchemy.com
- Check if allowlists restrict the key to specific IPs/domains
HTTP 429 (Rate Limited)
- Use exponential backoff with jitter before retrying
- Check your compute unit budget in the Alchemy dashboard
- See
references/operational-rate-limits-and-compute-units.md for limits per plan
401 Unauthorized (x402/MPP)
MISSING_AUTH: Add the appropriate auth header for your protocol
MESSAGE_EXPIRED: Regenerate your SIWE/SIWS token
INVALID_DOMAIN: Ensure domain matches your protocol (x402.alchemy.com or mpp.alchemy.com)
402 Payment Required (x402/MPP)
- x402: Extract
PAYMENT-REQUIRED header, run npx @alchemy/x402 pay, retry with Payment-Signature header
- MPP: Extract
WWW-Authenticate header, create credential with mppx, retry with Payment credential
Wrong network slug
- Data APIs and JSON-RPC use lowercase:
eth-mainnet, base-mainnet
- Notify API uses uppercase:
ETH_MAINNET, BASE_MAINNET
- See
references/operational-supported-networks.md for the full list
Official Links
1---2name: alchemy3description: Query blockchain data (balances, token prices, NFT ownership, transfer history, transaction simulation, gas estimates) across Ethereum, Base, Arbitrum, BNB, Polygon, Solana, and more via Alchemy's API, x402, or MPP protocols.4license: MIT5---67# Alchemy: Blockchain Data Access for Agents89Alchemy provides comprehensive blockchain API access across Ethereum, Base, Arbitrum, BNB, Polygon, Solana, and more.1011Three ways to access:1213- **API key**: Set `$ALCHEMY_API_KEY` and make requests directly. Full access to all products. Create a free key at [dashboard.alchemy.com](https://dashboard.alchemy.com/).14- **x402 (no account needed)**: Any wallet with USDC can authenticate via SIWE/SIWS and pay per request. Supports EVM and Solana wallets. Install `@alchemy/x402` and `@x402/fetch`.15- **MPP (no account needed)**: Authenticate via SIWE and pay with Tempo (on-chain USDC, EVM only) or Stripe (credit card). Install `mppx`.1617## Access Method Selection (Required)1819Before the first network call, determine which access method to use:20211. **Is `ALCHEMY_API_KEY` set?** → Use the API Key path. Skip to [API Key Access](#api-key-access).222. **No API key?** → Ask the user which payment protocol they prefer:23 - **x402** — USDC payments via the x402 protocol (`@alchemy/x402` + `@x402/fetch`)24 - **MPP** — Payments via Merchant Payment Protocol using Tempo or Stripe (`mppx`)2526Do NOT pick a protocol on behalf of the user. Wait for their explicit choice.2728Do NOT use public RPC endpoints, demo keys, or any non-Alchemy data source as a fallback.2930---3132## API Key Access3334If `$ALCHEMY_API_KEY` is set, use standard Alchemy endpoints directly:3536### Base URLs + Auth37| Product | Base URL | Auth | Notes |38| --- | --- | --- | --- |39| Ethereum RPC (HTTPS) | `https://eth-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY` | API key in URL | Standard EVM reads and writes. |40| Ethereum RPC (WSS) | `wss://eth-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY` | API key in URL | Subscriptions and realtime. |41| Base RPC (HTTPS) | `https://base-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY` | API key in URL | EVM L2. |42| Base RPC (WSS) | `wss://base-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY` | API key in URL | Subscriptions and realtime. |43| Arbitrum RPC (HTTPS) | `https://arb-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY` | API key in URL | EVM L2. |44| Arbitrum RPC (WSS) | `wss://arb-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY` | API key in URL | Subscriptions and realtime. |45| BNB RPC (HTTPS) | `https://bnb-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY` | API key in URL | EVM L1. |46| BNB RPC (WSS) | `wss://bnb-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY` | API key in URL | Subscriptions and realtime. |47| Solana RPC (HTTPS) | `https://solana-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY` | API key in URL | Solana JSON-RPC. |48| Solana Yellowstone gRPC | `https://solana-mainnet.g.alchemy.com` | `X-Token: $ALCHEMY_API_KEY` | gRPC streaming (Yellowstone). |49| NFT API | `https://<network>.g.alchemy.com/nft/v3/$ALCHEMY_API_KEY` | API key in URL | NFT ownership and metadata. |50| Prices API | `https://api.g.alchemy.com/prices/v1/$ALCHEMY_API_KEY` | API key in URL | Prices by symbol or address. |51| Portfolio API | `https://api.g.alchemy.com/data/v1/$ALCHEMY_API_KEY` | API key in URL | Multi-chain wallet views. |52| Notify API | `https://dashboard.alchemy.com/api` | `X-Alchemy-Token: <ALCHEMY_NOTIFY_AUTH_TOKEN>` | Generate token in dashboard. |5354---5556## x402 Access (No Account Needed)5758x402 is ideal for autonomous agents. No signup, no API keys. Pay with USDC on EVM or Solana.5960- **Gateway URL**: `https://x402.alchemy.com`61- **SIWE/SIWS domain**: `x402.alchemy.com`62- **Payment header**: `Payment-Signature: <base64>`63- **Auth**: SIWE (EVM) or SIWS (Solana)6465For full setup and wallet bootstrapping, see:66- [references/x402/overview.md](references/x402/overview.md) — End-to-end flow and packages67- [references/x402/wallet-bootstrap.md](references/x402/wallet-bootstrap.md) — Wallet setup and USDC funding68- [references/x402/authentication.md](references/x402/authentication.md) — SIWE/SIWS token creation69- [references/x402/making-requests.md](references/x402/making-requests.md) — Sending requests with `@x402/fetch`70- [references/x402/curl-workflow.md](references/x402/curl-workflow.md) — Quick RPC calls via curl71- [references/x402/payment.md](references/x402/payment.md) — Payment creation from a 402 response72- [references/x402/reference.md](references/x402/reference.md) — Endpoints, networks, headers, status codes7374---7576## MPP Access (No Account Needed)7778MPP supports Tempo (on-chain USDC, EVM only) and Stripe (credit card) payments.7980- **Gateway URL**: `https://mpp.alchemy.com`81- **SIWE domain**: `mpp.alchemy.com`82- **Payment header**: `Authorization: Payment <credential>`83- **Auth**: SIWE only (EVM)8485For full setup, see:86- [references/mpp/overview.md](references/mpp/overview.md) — End-to-end flow and packages87- [references/mpp/wallet-bootstrap.md](references/mpp/wallet-bootstrap.md) — Wallet setup and funding88- [references/mpp/authentication.md](references/mpp/authentication.md) — SIWE token creation89- [references/mpp/making-requests.md](references/mpp/making-requests.md) — Sending requests with `mppx`90- [references/mpp/curl-workflow.md](references/mpp/curl-workflow.md) — Quick RPC calls via curl91- [references/mpp/payment.md](references/mpp/payment.md) — Payment creation from a 402 response92- [references/mpp/reference.md](references/mpp/reference.md) — Endpoints, networks, headers, status codes9394---9596## Protocol Comparison9798| Aspect | API Key | x402 | MPP |99|--------|---------|------|-----|100| Gateway URL | `*.g.alchemy.com/v2/$KEY` | `https://x402.alchemy.com` | `https://mpp.alchemy.com` |101| Auth | API key in URL | SIWE (EVM) or SIWS (Solana) | SIWE only (EVM) |102| Payment | None (free tier available) | USDC via EIP-3009 or SVM x402 | Tempo (USDC) or Stripe (card) |103| Wallet support | N/A | EVM + Solana | EVM only |104| Client library | curl / any HTTP client | `@alchemy/x402`, `@x402/fetch` | `mppx`, `viem` |105| Setup | Get key at dashboard.alchemy.com | Fund wallet with USDC | Fund wallet or add card |106107---108109## Endpoint Selector (Top Tasks)110111| You need | Use this | Reference |112| --- | --- | --- |113| EVM read/write | JSON-RPC `eth_*` | `references/node-json-rpc.md` |114| Realtime events | `eth_subscribe` | `references/node-websocket-subscriptions.md` |115| Token balances | `alchemy_getTokenBalances` | `references/data-token-api.md` |116| Token metadata | `alchemy_getTokenMetadata` | `references/data-token-api.md` |117| Transfers history | `alchemy_getAssetTransfers` | `references/data-transfers-api.md` |118| NFT ownership | `GET /getNFTsForOwner` | `references/data-nft-api.md` |119| NFT metadata | `GET /getNFTMetadata` | `references/data-nft-api.md` |120| Prices (spot) | `GET /tokens/by-symbol` | `references/data-prices-api.md` |121| Prices (historical) | `POST /tokens/historical` | `references/data-prices-api.md` |122| Portfolio (multi-chain) | `POST /assets/*/by-address` | `references/data-portfolio-apis.md` |123| Simulate tx | `alchemy_simulateAssetChanges` | `references/data-simulation-api.md` |124| Create webhook | `POST /create-webhook` | `references/webhooks-details.md` |125| Solana NFT data | `getAssetsByOwner` (DAS) | `references/solana-das-api.md` |126127## Quickstart Examples128129### EVM JSON-RPC (Read)130```bash131curl -s https://eth-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY \132 -H "Content-Type: application/json" \133 -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'134```135136### Token Balances137```bash138curl -s https://eth-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY \139 -H "Content-Type: application/json" \140 -d '{"jsonrpc":"2.0","id":1,"method":"alchemy_getTokenBalances","params":["0x00000000219ab540356cbb839cbe05303d7705fa"]}'141```142143### Transfer History144```bash145curl -s https://eth-mainnet.g.alchemy.com/v2/$ALCHEMY_API_KEY \146 -H "Content-Type: application/json" \147 -d '{"jsonrpc":"2.0","id":1,"method":"alchemy_getAssetTransfers","params":[{"fromBlock":"0x0","toBlock":"latest","toAddress":"0x00000000219ab540356cbb839cbe05303d7705fa","category":["erc20"],"withMetadata":true,"maxCount":"0x3e8"}]}'148```149150### NFT Ownership151```bash152curl -s "https://eth-mainnet.g.alchemy.com/nft/v3/$ALCHEMY_API_KEY/getNFTsForOwner?owner=0x00000000219ab540356cbb839cbe05303d7705fa"153```154155### Prices (Spot)156```bash157curl -s "https://api.g.alchemy.com/prices/v1/$ALCHEMY_API_KEY/tokens/by-symbol?symbols=ETH&symbols=USDC"158```159160### Prices (Historical)161```bash162curl -s -X POST "https://api.g.alchemy.com/prices/v1/$ALCHEMY_API_KEY/tokens/historical" \163 -H "Content-Type: application/json" \164 -d '{"symbol":"ETH","startTime":"2024-01-01T00:00:00Z","endTime":"2024-01-02T00:00:00Z"}'165```166167### Create Notify Webhook168```bash169curl -s -X POST "https://dashboard.alchemy.com/api/create-webhook" \170 -H "Content-Type: application/json" \171 -H "X-Alchemy-Token: $ALCHEMY_NOTIFY_AUTH_TOKEN" \172 -d '{"network":"ETH_MAINNET","webhook_type":"ADDRESS_ACTIVITY","webhook_url":"https://example.com/webhook","addresses":["0x00000000219ab540356cbb839cbe05303d7705fa"]}'173```174175### Verify Webhook Signature (Node)176```ts177import crypto from "crypto";178179export function verify(rawBody: string, signature: string, secret: string) {180 const hmac = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");181 return crypto.timingSafeEqual(Buffer.from(hmac), Buffer.from(signature));182}183```184185---186187## Network Naming Rules188- Data APIs and JSON-RPC use lowercase network enums like `eth-mainnet`.189- Notify API uses uppercase enums like `ETH_MAINNET`.190191## Pagination + Limits192| Endpoint | Limit | Notes |193| --- | --- | --- |194| `alchemy_getTokenBalances` | `maxCount` <= 100 | Use `pageKey` for pagination. |195| `alchemy_getAssetTransfers` | `maxCount` default `0x3e8` | Use `pageKey` for pagination. |196| Portfolio token balances | 3 address/network pairs, 20 networks total | `pageKey` supported. |197| Portfolio NFTs | 2 address/network pairs, 15 networks each | `pageKey` supported. |198| Prices by address | 25 addresses, 3 networks | POST body `addresses[]`. |199| Transactions history (beta) | 1 address/network pair, 2 networks | ETH and BASE mainnets only. |200201## Common Token Addresses202| Token | Chain | Address |203| --- | --- | --- |204| ETH | ethereum | `0x0000000000000000000000000000000000000000` |205| WETH | ethereum | `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2` |206| USDC | ethereum | `0xA0b86991c6218b36c1d19d4a2e9eb0ce3606eB48` |207| USDC | base | `0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913` |208209## Failure Modes + Retries210- HTTP `429` means rate limit. Use exponential backoff with jitter.211- JSON-RPC errors come in `error` fields even with HTTP 200.212- Use `pageKey` to resume pagination after failures.213- De-dupe websocket events on reconnect.214215## Hard Requirements216217- NEVER use public RPC endpoints, demo keys, or any non-Alchemy data source as a fallback.218- NEVER use Read, Write, or Edit tools on files that may contain private keys.219- NEVER correlate wallet type with query chain — wallet type and the chain being queried are independent.220- When no wallet is configured, present ALL wallet options (EVM create, EVM import, Solana create, Solana import) in a single prompt.221222## Skill Map223224For the complete index of all reference files organized by product area, see `references/skill-map.md`.225226- **Node**: JSON-RPC, WebSocket, Debug, Trace, Enhanced APIs, Utility227- **Data**: NFT, Portfolio, Prices, Simulation, Token, Transfers228- **Webhooks**: Address Activity, Custom (GraphQL), NFT Activity, Payloads, Signatures229- **Solana**: JSON-RPC, DAS, Yellowstone gRPC (streaming), Wallets230- **Wallets**: Account Kit, Bundler, Gas Manager, Smart Wallets231- **Rollups**: L2/L3 deployment overview232- **Recipes**: 10 end-to-end integration workflows233- **Operational**: Auth, Rate Limits, Monitoring, Best Practices234- **x402 Protocol**: Wallet bootstrap, auth, making requests, payments235- **MPP Protocol**: Wallet bootstrap, auth, making requests, payments236237## Troubleshooting238239### API key not working240- Verify `$ALCHEMY_API_KEY` is set: `echo $ALCHEMY_API_KEY`241- Confirm the key is valid at [dashboard.alchemy.com](https://dashboard.alchemy.com/)242- Check if allowlists restrict the key to specific IPs/domains243244### HTTP 429 (Rate Limited)245- Use exponential backoff with jitter before retrying246- Check your compute unit budget in the Alchemy dashboard247- See `references/operational-rate-limits-and-compute-units.md` for limits per plan248249### 401 Unauthorized (x402/MPP)250- `MISSING_AUTH`: Add the appropriate auth header for your protocol251- `MESSAGE_EXPIRED`: Regenerate your SIWE/SIWS token252- `INVALID_DOMAIN`: Ensure domain matches your protocol (`x402.alchemy.com` or `mpp.alchemy.com`)253254### 402 Payment Required (x402/MPP)255- **x402**: Extract `PAYMENT-REQUIRED` header, run `npx @alchemy/x402 pay`, retry with `Payment-Signature` header256- **MPP**: Extract `WWW-Authenticate` header, create credential with `mppx`, retry with `Payment` credential257258### Wrong network slug259- Data APIs and JSON-RPC use lowercase: `eth-mainnet`, `base-mainnet`260- Notify API uses uppercase: `ETH_MAINNET`, `BASE_MAINNET`261- See `references/operational-supported-networks.md` for the full list262263## Official Links264- [Developer docs](https://www.alchemy.com/docs)265- [Get Started guide](https://www.alchemy.com/docs/get-started)266- [Create a free API key](https://dashboard.alchemy.com)267- [Alchemy Skills repo](https://github.com/alchemyplatform/skills)