How to get a Polygon RPC endpoint for stablecoins (2026 guide)

TL;DR
The moment a stablecoin payment app on Polygon catches a burst — payday, a merchant settlement window, an airdrop claim — the public RPC starts returning 429 Too Many Requests at around 40 requests per second, and the balanceOf read or transfer confirmation that decides whether to credit a user’s account silently fails. On a payments rail moving native USDC and USDT at sub-cent fees, a dropped confirmation is not a glitch — it is a missing or double-counted payment. This guide shows how to choose and provision a Polygon RPC endpoint that holds up under stablecoin transfer load, and how to read Polygon’s ~5-second finality correctly so you never credit a reorged transfer.
What is a Polygon stablecoin RPC endpoint
A Polygon RPC endpoint is the JSON-RPC interface your stablecoin app uses to talk to the Polygon PoS network — chain ID 137, with POL as the native gas token since the MATIC-to-POL migration completed in 2024. Polygon PoS runs a two-layer design: Bor handles block production (roughly 2-second blocks) and Heimdall handles checkpointing and finality. For a payments application, every action — checking a wallet’s USDC balance, watching for an incoming USDT transfer, broadcasting a signed transaction that moves a stablecoin — is a JSON-RPC call against a Bor node exposing the standard eth, net, and web3 namespaces.
For a stablecoin workload specifically, the endpoint is on the critical path for:
- Reading wallet balances with
balanceOf(eth_call) before showing a user their dollar balance - Detecting incoming payments by filtering ERC-20
Transferevents witheth_getLogs - Broadcasting mint, burn, and transfer transactions with
eth_sendRawTransaction - Estimating fees with
eth_gasPrice/eth_estimateGasso a POL-denominated gas cost can be sponsored or passed through - Confirming settlement by polling
eth_getTransactionReceiptand checking against thefinalizedblock tag
You can review the exact transfer flow and contract interactions for native USDC in Polygon’s official USDC transfer documentation, which mirrors the calls your endpoint has to serve under load.
Here is the part that bites stablecoin teams: Polygon’s traffic is not smooth. A single merchant batch or a Revolut-style consumer flow turns hundreds of balance reads and confirmation polls into a synchronized spike, and a shared endpoint that was fine in testing returns 429 exactly when real money is moving. Endpoint quality on Polygon is measured by how it behaves in that burst, not on an idle afternoon.
How Polygon RPC differs from Ethereum RPC
Polygon is EVM-equivalent, so the method signatures match Ethereum — but the operating characteristics that matter for stablecoin settlement are different.
| Property | Ethereum mainnet | Polygon PoS |
|---|---|---|
| Block time | ~12 seconds | ~2 seconds |
| Finality | ~13 minutes (2 epochs) | ~5 seconds (Heimdall v2, July 2025) |
| Throughput | ~15-30 TPS | 1,000+ TPS (Bhilai), targeting 5,000+ |
| Gas token | ETH | POL |
| Typical transfer fee | dollars | ~$0.002 |
| Reorg behavior | rare, shallow | capped at 2 blocks post-Heimdall v2 |
For a stablecoin app these differences are not trivia. Sub-cent fees and ~5-second finality are precisely why USDC and USDT settlement has migrated to Polygon — but the ~2-second blocks and high throughput mean your endpoint serves far more confirmation polls and eth_getLogs queries per minute than the same app would on Ethereum. The provider you pick has to absorb that call volume without throttling, which is exactly where shared public endpoints fall down.
Polygon stablecoin RPC endpoint options
Public vs private Polygon RPC endpoints
For a stablecoin app, the public-vs-private decision comes down to one question: what happens to a payment confirmation when traffic spikes? Public endpoints are shared, so your burst competes with everyone else’s, and the throttle that kicks in is the throttle that drops your settlement read.
Official public endpoints:
- Mainnet:
https://polygon-rpc.com - Testnet (Amoy):
https://rpc-amoy.polygon.technology/
⚠️ The public Polygon mainnet RPC begins returning
429 Too Many Requestsat roughly 40 requests per second across all callers sharing it, and exposes no production WebSocket. For a payments workload — where a single settlement window fans out into hundreds of concurrentbalanceOfand receipt calls — the Polygon PoS RPC endpoints reference itself notes these endpoints carry rate limits and points teams to professional RPC providers for anything beyond development.
| Factor | Public endpoint | Private endpoint |
|---|---|---|
| Access | Free and open | Restricted access |
| Resources | Shared infrastructure | Dedicated resources |
| Best use case | Development & testing | Production workloads |
| Rate limit | ~40 req/s shared, then 429 | No aggressive throttling |
| WebSocket support | Not available publicly | Available (HTTPS + WSS) |
| Archive access | Not available | Available |
On a settlement rail, throttling is not a performance footnote — it is the difference between crediting a user’s USDC deposit on time and showing them a stale balance. That is why stablecoin teams move to managed infrastructure before launch, not after the first incident.
📖 For a detailed comparison of Polygon RPC providers — with a section specifically on stablecoin and payment flows — see Best Polygon RPC providers for high-throughput apps in 2026.
Full node vs archive Polygon node
For a stablecoin app, historical access decides whether you can answer questions like “what was this treasury wallet’s USDC balance at the block of last month’s audit” — full nodes only serve recent state, so anything older returns a “missing trie node” error.
| Full node access | Archive node access |
|---|---|
| Current USDC/USDT balance checks | Historical balance at any past block (audits, reconciliation) |
| Real-time transfer confirmation | Backfilling months of Transfer events for accounting |
| Live fee estimation and broadcasting | Replaying settlement history for dispute resolution |
If you are running compliance reporting, reconciling stablecoin flows against off-chain ledgers, or backfilling a payments dashboard, you need archive access — and Chainstack supports Polygon archive nodes so you can query the full mainnet history rather than only the recent window a full node retains.
HTTPS vs WebSockets
Stablecoin apps live and die on detecting incoming transfers the instant they land, so the transport question is really about how you watch for Transfer events. Polling eth_getLogs over HTTPS works but multiplies your request count; a WebSocket subscription pushes events to you and keeps your request budget for the calls that matter.
| Feature | HTTPS | WebSocket |
|---|---|---|
| Model | Request/response | Persistent connection |
| Complexity | Simple operationally | Requires reconnect/heartbeat logic |
| Best for | Balance reads, broadcasting, receipt polling | Live Transfer event subscriptions, mempool watching |
| Latency | Standard | Lower for frequent updates |
| Connection overhead | Per request | One-time handshake |
The public Polygon endpoint does not offer a production WebSocket, so any real-time stablecoin notification flow built on eth_subscribe requires a managed provider that exposes a WSS endpoint.
How to get a private Polygon RPC endpoint with Chainstack

- Log in to the Chainstack console (or create an account)
- Create a new project
- Select Polygon as your blockchain protocol
- Choose network: Polygon Mainnet or Amoy testnet
- Deploy the node
- Open Access and credentials and copy your HTTPS and WebSocket endpoints
- Run a quick connectivity check before wiring it into production code
You can deploy a private Polygon RPC node on Chainstack in minutes, then connect with the chain’s primary SDK. Here is a minimal ethers.js setup that reads a wallet’s USDC balance:
const { ethers } = require("ethers");
// 137 is the Polygon PoS mainnet network ID
const provider = new ethers.providers.JsonRpcProvider("YOUR_CHAINSTACK_ENDPOINT", 137);
// Native USDC on Polygon PoS
const USDC = "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359";
const abi = ["function balanceOf(address) view returns (uint256)"];
const usdc = new ethers.Contract(USDC, abi, provider);
usdc.balanceOf("0xYourWalletAddress").then((bal) => {
// USDC uses 6 decimals, not 18
console.log(ethers.utils.formatUnits(bal, 6));
});
📖 For the full integration guide, see the Chainstack Polygon tooling documentation.
You can also access Chainstack Polygon RPC directly from Claude, Cursor, Codex, Gemini, or Windsurf using Chainstack MCP. Learn more about Chainstack MCP.
Using Chainlist
Polygon is on Chainlist under chain ID 137, which makes it easy to add the network to MetaMask and other wallets in one click. Chainlist is a wallet convenience tool, not an infrastructure provider — the RPC URLs it surfaces are public, shared endpoints. For a stablecoin app handling real settlement, replace any Chainlist URL with a managed endpoint before you go to production.
Chainstack pricing for Polygon RPC
Chainstack bills on request units with predictable monthly tiers, which makes a stablecoin app’s spiky traffic far easier to forecast than the compute-unit models that vary cost per method. See the full Chainstack pricing page for plan details and overage rates.
| Plan | Cost | Requests/Month | RPS | Overage (per 1M extra) |
|---|---|---|---|---|
| Developer | $0 | 3M | 25 | $20 |
| Growth | $49 | 20M | 250 | $15 |
| Pro | $199 | 80M | 400 | $12.50 |
| Business | $499 | 200M | 600 | $10 |
| Enterprise | $990+ | 400M+ | Unlimited | $5 |
Advanced options relevant to a Polygon stablecoin deployment:
- Archive Node add-on — for historical balance and
Transferevent reconciliation; archive requests consume 2 request units each - Unlimited Node — flat-fee, RPS-tiered nodes for predictable cost under sustained payment load
- Dedicated Nodes: from $0.50/hour per node (+ storage), for isolated infrastructure with extended
debugandtxpoolnamespaces
How to estimate monthly cost
- Count your steady-state reads — balance checks and receipt polls per active user per day
- Add your event-watching load —
eth_getLogsqueries or WebSocket subscriptions forTransferdetection - Multiply by expected daily active wallets to get a baseline request volume
- Map that baseline to a plan tier with RPS headroom above your average
- On Polygon, size for the burst, not the average — a stablecoin payment app’s request rate around payouts and settlement windows can run several times its baseline, so pick a plan whose RPS ceiling covers the spike, not the mean
Production readiness checklist
- Primary + fallback RPC provider configured
- Request timeout policy set
- Retry logic with exponential backoff implemented
- Credentials stored in env/secret manager (never hardcoded)
- Monitoring for latency, error rate, and throttling
- Alerts for sustained degradation
- Settlement logic reads the
finalizedblock tag — not just a receipt — before crediting a stablecoin payment, so a 2-block reorg cannot cause a double-credit - Rate limiter in place to prevent your own confirmation-polling loop from self-throttling during a payment burst
- Stablecoin decimals handled correctly (USDC and USDT use 6 decimals on Polygon, not 18)
Troubleshooting common Polygon RPC issues
| Symptom | Cause | How to fix |
|---|---|---|
429 Too Many Requests | Public endpoint throttle (~40 req/s shared) hit during a payment burst | Move to a managed endpoint with dedicated RPS; add backoff |
| WebSocket disconnects | Idle timeout or network blip on subscription | Implement reconnect + heartbeat, and backfill missed Transfer events with eth_getLogs on reconnect |
| Stablecoin credited then reversed | App confirmed on a receipt inside a 2-block reorg window | Gate credits on the finalized block tag (~5s post-Heimdall v2), not the first receipt |
| Balance shows wrong amount (off by 10^12) | Treating USDC/USDT as 18 decimals | Use 6 decimals for both USDC and USDT on Polygon when formatting |
eth_getLogs returns empty or times out | Range too wide, or full node lacks the historical block | Narrow the block range; use an archive node for historical Transfer backfills |
missing trie node on a historical balance | Querying past state on a full (pruned) node | Route historical reads to an archive node |
Conclusion
The failure mode that hurts a Polygon stablecoin app is not dramatic — it is a 429 that arrives during a settlement spike, drops the balanceOf read or receipt poll that decides whether to credit a user, and leaves you with a payment that the chain settled but your app never recorded. Worse is the inverse: crediting a transfer off a single receipt, only for a 2-block reorg to roll it back and hand you a double-spend at the application layer. Both are silent. Both surface as support tickets about “missing” or “duplicate” balances, days later, with no error in your logs.
The pattern that works is simple and non-negotiable. Provision a managed endpoint with RPS headroom sized to your payment bursts, not your average. Watch for incoming transfers over a WebSocket subscription and keep HTTPS for reads and broadcasts. And gate every credit on Polygon’s finalized block tag — with ~5-second finality post-Heimdall v2, you wait seconds, not minutes, and you never act on a block that can still reorg.
Spin up a Polygon node on the free Developer tier to test your settlement flow, then move to a dedicated or unlimited node when real stablecoin volume starts arriving.
FAQ
Which SDK should I use to build a stablecoin app on Polygon? Polygon is EVM-equivalent, so any Ethereum tooling works — ethers.js, web3.js, web3.py, or viem for the client, and Hardhat or Foundry for contracts. There is no Polygon-specific SDK requirement; the only thing to get right is using POL for gas and the correct 6-decimal handling for USDC and USDT.
Is the public Polygon RPC enough for a stablecoin payments app? No. The public endpoint throttles at roughly 40 requests per second across all shared users and offers no production WebSocket. A payments workload generates synchronized bursts of balance reads and confirmation polls that blow past that limit exactly when money is moving, so a managed endpoint with dedicated RPS is a launch requirement, not an optimization.
How does Polygon’s ~5-second finality affect when I credit a stablecoin transfer? Heimdall v2 (July 2025) cut finality to about 5 seconds and capped reorg depth at 2 blocks. That means you should not credit a payment off the first transaction receipt — wait for the transaction’s block to be referenced by the finalized block tag. The wait is seconds, and it eliminates the risk of crediting a transfer that a shallow reorg later reverses.
How do I reliably detect incoming USDC or USDT payments? Subscribe to the ERC-20 Transfer event for the stablecoin contract over a WebSocket connection, filtered to your receiving addresses. Keep a fallback eth_getLogs poll over HTTPS to backfill any events missed during a WebSocket reconnect, and only mark a payment settled once its block reaches finality.
Do I need an archive node for a stablecoin app? For live payments, a full node is enough. You need an archive node when you reconcile historical stablecoin flows, reconstruct a wallet’s balance at a past block for an audit, or backfill months of Transfer events — anything querying state older than a full node’s pruning window.
What metrics should I monitor on a Polygon stablecoin endpoint? Track error rate (especially 429 responses), p95/p99 latency on eth_call and eth_getTransactionReceipt, WebSocket reconnect frequency, and the lag between a transaction’s receipt and its block reaching finality. A rising 429 rate during predictable windows is the earliest signal you have outgrown your current RPS tier.
Additional resources
- Chainstack Polygon tooling documentation
- Polygon PoS RPC endpoints reference — official Polygon documentation
- More Polygon tutorials and articles on the Chainstack Blog
- Public Polygon RPC: complete endpoint catalogue — Chainstack Blog