Summary
Adding Polygon to MetaMask takes about a minute: open the network selector, choose Add network, and enter the Polygon mainnet chain settings (chain ID 137, POL gas token, and an RPC endpoint). The tricky part is usually the RPC URL, because public endpoints rate-limit and can fail during busy periods.
This page gives you the exact Polygon mainnet and Amoy testnet settings, a wallet configuration you can paste, and a short guide to choosing an RPC endpoint that stays responsive once you move past casual testing.
MetaMask does not ship with Polygon enabled by default, so the first time you want to use a Polygon dApp you have to add the network manually or let the dApp prompt you. The settings are short, but the RPC URL you choose decides whether the wallet stays usable after the first transaction.
This page gives you the exact Polygon mainnet and Amoy testnet values, a copy-paste wallet configuration, and a practical way to decide which endpoint to point MetaMask at.
Which Polygon network should you add first?
Most people searching for this are trying to do one of three things, and the right network depends on which one applies to you.
| Your goal | Network to add | Chain ID | Gas token |
|---|---|---|---|
| Use a live dApp, swap, or hold tokens | Polygon Mainnet | 137 | POL |
| Test a contract or dApp before deploying | Polygon Amoy | 80002 | POL |
| Follow a tutorial that mentions Mumbai | Amoy (Mumbai is deprecated) | 80002 | POL |
If you are interacting with real funds or a production dApp, add Polygon Mainnet. If you are a developer deploying contracts, add Amoy as a second network and keep Mainnet for read-only checks. Mumbai was the old testnet and is no longer the one to use for new work.
A quick note on the gas token: Polygon migrated its native token from MATIC to POL. MetaMask may still display the old MATIC label in some versions, but the symbol you enter when adding the network should be POL for current setups.
Polygon chain settings for MetaMask
These are the values you enter in the Add network form. Keep them consistent between your wallet, your scripts, and your backend.
| Field | Polygon Mainnet | Polygon Amoy (testnet) |
|---|---|---|
| Network name | Polygon | Polygon Amoy |
| RPC URL | https://polygon.api.onfinality.io/public | https://polygon-amoy.api.onfinality.io/public |
| Chain ID | 137 | 80002 |
| Currency symbol | POL | POL |
| Block explorer | https://polygonscan.com | https://amoy.polygonscan.com |
OnFinality exposes both networks as RPC API endpoints, and you can review the full network details on the Polygon RPC page. If you prefer to run your own endpoint instead of a shared one, that is covered under dedicated nodes.
Add Polygon to MetaMask step by step
- Open MetaMask and click the network selector at the top of the wallet.
- Choose Add network, then Add a network manually.
- Fill in the fields from the table above. Double-check the chain ID: 137 for mainnet, 80002 for Amoy.
- Save, then switch to the new network.
- Confirm the switch worked by checking that your address balance loads and that the network name shows Polygon.
If a dApp offers a one-click Add Polygon button, it will send the same values to MetaMask through wallet_addEthereumChain. You still end up with the same configuration, so it is worth knowing the values in case the prompt fails.
Adding the network from code
If you are building a dApp and want to add or switch networks programmatically, use the wallet RPC methods directly. This is the same payload MetaMask expects when a user clicks an add-network button.
// Add Polygon Mainnet to an injected wallet
await window.ethereum.request({
method: "wallet_addEthereumChain",
params: [
{
chainId: "0x89", // 137 in hex
chainName: "Polygon",
nativeCurrency: { name: "POL", symbol: "POL", decimals: 18 },
rpcUrls: ["https://polygon.api.onfinality.io/public"],
blockExplorerUrls: ["https://polygonscan.com"],
},
],
});
// Switch to it if the user is on another chain
await window.ethereum.request({
method: "wallet_switchEthereumChain",
params: [{ chainId: "0x89" }],
});
Note that chainId in these calls is hex, while the MetaMask form uses decimal. Mixing the two is one of the most common reasons an add-network prompt silently fails.
Choosing an RPC URL that survives real usage
This is the part most setup guides skip, and it is where people get stuck a week later. The RPC URL is the endpoint your wallet uses for every balance check, gas estimate, and transaction broadcast. A public endpoint that works for a single test transaction can start returning errors once you poll it constantly or send bursts of requests.
When you evaluate an endpoint for MetaMask or a dApp, look at these signals rather than a single speed test:
| Signal | Why it matters | What to check |
|---|---|---|
| Request capacity | Wallets poll frequently; dApps poll harder | Whether the plan is shared or dedicated |
| Transport support | Some features need WebSocket | Whether HTTP and WS are both available |
| Archive access | Historical state and logs need archive nodes | Whether archive queries are supported |
| Failover | One endpoint going down should not break the app | Whether you can configure a backup URL |
| Network coverage | You may add more chains later | Whether the provider covers the chains you plan to use |
OnFinality provides RPC API access and dedicated node infrastructure across a range of networks, so you can start on a shared endpoint and move to a dedicated node when your request volume or latency needs grow. You can compare options on the RPC pricing page and see the full list on supported RPC networks.
For MetaMask specifically, a shared endpoint is usually fine for personal use. For a dApp with many users, a dedicated node removes the noisy-neighbor problem where another project's traffic affects your response times.
Verify the connection before you trust it
After adding the network, confirm the endpoint actually responds. You can test it outside the wallet with a simple JSON-RPC call.
curl -s https://polygon.api.onfinality.io/public \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}'
The response should return 0x89, which is 137 in hex. If you get a different value, you are pointed at the wrong network. You can also check the latest block to confirm the endpoint is synced:
curl -s https://polygon.api.onfinality.io/public \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'
If eth_chainId works but eth_blockNumber lags behind a block explorer, the node may be catching up or the endpoint may be under load. That is a signal to switch endpoints rather than retry in the wallet.
Common problems after adding Polygon
Most issues people hit are not MetaMask bugs. They fall into a few repeatable categories.
Transactions stuck as pending. This is usually a gas price or nonce issue, not a network issue. Check the transaction on Polygonscan and, if needed, speed it up or cancel it in MetaMask.
Balance shows zero after switching. Confirm you are on the right chain (137 vs 80002) and that the token is added to the wallet. POL is the native token; other tokens need to be imported by contract address.
RPC errors or timeouts. Public endpoints rate-limit. If you see repeated -32005 or timeout errors, switch to a different RPC URL or move to a dedicated endpoint.
Wrong chain ID. If a dApp reports the wrong network, re-check that you entered 137 and not a testnet ID. Chain ID mismatches cause signature and transaction failures that look unrelated.
Testnet tokens missing. Amoy requires test POL from a faucet. Mainnet POL cannot be used on Amoy, and testnet POL has no value.
When to move off a public endpoint
A public RPC URL is a reasonable starting point. It stops being reasonable when any of the following becomes true:
- Your dApp has real users and you cannot tolerate intermittent RPC errors.
- You need archive data for historical balances or logs.
- You rely on WebSocket subscriptions for real-time updates.
- You are sending enough requests that shared rate limits get in the way.
- You need a support channel when something breaks.
At that point, the decision is between a managed shared endpoint and a dedicated node. Shared endpoints are cheaper and simpler; dedicated nodes give you isolated capacity and more predictable behavior under load. If you are weighing providers generally, the RPC provider selection guide walks through the criteria in more depth.
Key Takeaways
- Polygon Mainnet uses chain ID 137 and POL as the gas token; Amoy testnet uses 80002.
- You can add the network manually in MetaMask or via
wallet_addEthereumChainfrom a dApp. - The RPC URL is the setting that matters most over time, because public endpoints rate-limit under load.
- Verify your endpoint with
eth_chainIdandeth_blockNumberbefore trusting it in production. - Move to a dedicated node when shared limits, archive needs, or WebSocket requirements start to block you.
FAQ
Is Polygon the same as MATIC? Polygon is the network; MATIC was the older native token symbol. The network now uses POL, though some wallets still show the old label.
What chain ID does Polygon use?
Polygon Mainnet is 137. Polygon Amoy testnet is 80002. In wallet RPC calls, 137 is 0x89.
Do I need a special RPC URL for MetaMask? No. Any working Polygon RPC endpoint will do. A managed endpoint is more reliable than a public one once you use the wallet regularly or run a dApp.
Can I use the same RPC URL for mainnet and testnet? No. Mainnet and Amoy are separate networks with separate endpoints and separate chain IDs. Keep both configured if you develop on Polygon.
Why does MetaMask say the network is unavailable?
Usually the RPC endpoint is down, rate-limited, or misconfigured. Test the URL with a curl call to eth_chainId and switch endpoints if it fails.