← Builder
Builder guide

Etherscan API V2 Base URL and Base Chain Endpoint Guide

Etherscan API V2 uses a shared multichain host. If you are querying Base, the practical pattern is to send requests to https://api.etherscan.io/v2/api and set chainid=8453.

That sounds simple, but teams still lose time when they mix older explorer URLs, chain-specific assumptions, and half-migrated request builders. This guide answers the exact lookup question first, then shows how to structure requests, debug failures, and keep multichain explorer integrations reviewable.

Section

The shortest correct answer

For the standard Etherscan V2 flow, start with this host:

https://api.etherscan.io/v2/api

For Base, add the chain selector:

chainid=8453

In practice, that means the “Etherscan API V2 base URL” question is really about two values used together: the shared V2 host and the chain ID that tells Etherscan which network you want.

Section

A request template for Base

If you need a drop-in example for scripts, server routes, or internal tooling, use this pattern:

GET https://api.etherscan.io/v2/api?chainid=8453&module=account&action=txlist&address=0xYourAddressHere&startblock=0&endblock=99999999&page=1&offset=10&sort=desc&apikey=YourApiKeyToken

The key point is that you do not switch to a different Base-specific V2 host. You keep the shared API host and change the request parameters.

Section

How Ethereum and Base differ in Etherscan V2

The most useful mental model is “same host, different chain selector.” Builders often overcomplicate the migration by assuming they need separate infrastructure for each chain when the request builder only needs to keep chain choice explicit.

Use caseHostchainidWhat changes
Ethereum mainnet requesthttps://api.etherscan.io/v2/api1Chain selection only
Base requesthttps://api.etherscan.io/v2/api8453Chain selection only
Same endpoint across chainshttps://api.etherscan.io/v2/apiVariesThe endpoint shape may stay similar, but chain support and behavior still need verification
Section

Examples for real request builders

Balance lookup on Base in JavaScript

const url = new URL("https://api.etherscan.io/v2/api");
url.searchParams.set("chainid", "8453");
url.searchParams.set("module", "account");
url.searchParams.set("action", "balance");
url.searchParams.set("address", "0xYourAddressHere");
url.searchParams.set("tag", "latest");
url.searchParams.set("apikey", process.env.ETHERSCAN_API_KEY!);

const response = await fetch(url);
const data = await response.json();

Balance lookup on Base in Python

import requests

params = {
    "chainid": "8453",
    "module": "account",
    "action": "balance",
    "address": "0xYourAddressHere",
    "tag": "latest",
    "apikey": "YourApiKeyToken",
}

response = requests.get("https://api.etherscan.io/v2/api", params=params, timeout=30)
print(response.json())

Why this structure scales better

A shared request builder makes host selection obvious, keeps chain IDs centralized, and lowers the risk that Ethereum-specific defaults quietly leak into Base calls.

Section

The failure checks to run first

Base request failures are usually easier to debug when the checks happen in a fixed order rather than through random retries.

First-pass debug checklist

  • 01confirm the request host is https://api.etherscan.io/v2/api
  • 02confirm chainid=8453 is present for Base
  • 03confirm module and action are valid for the endpoint you are calling
  • 04confirm the address and pagination parameters are well formed
  • 05confirm the runtime is actually sending the API key you expect

Once those are correct, the next layer is endpoint-specific behavior: data coverage, indexing timing, pagination assumptions, or feature-tier constraints.

Section

The mistakes that keep showing up in multichain explorer integrations

Hardcoding different hosts for every chain

A team may finish the UI work for Base while still routing requests through an outdated explorer host model. That turns the V2 migration into a long-lived partial migration.

Hiding chain selection inside scattered conditionals

If chain selection lives in several helpers, components, and cron jobs, it becomes difficult to prove which requests still default to Ethereum.

Treating endpoint docs as perfectly interchangeable

The shared V2 host is useful, but production content and production code should still verify endpoint coverage, indexing depth, and feature access before making broad claims.

Publishing stale operational advice

Rate limits, support notes, and feature tiers can change. Keep the page focused on the durable request pattern unless you have re-verified a fast-moving operational detail.

Section

A safer configuration pattern for teams

When more than one chain is supported, treat explorer configuration as data rather than scattered string literals.

const ETHERSCAN_V2_BASE_URL = "https://api.etherscan.io/v2/api";

const CHAIN_IDS = {
  ethereum: "1",
  base: "8453",
} as const;

function buildEtherscanUrl(params: Record<string, string>) {
  const url = new URL(ETHERSCAN_V2_BASE_URL);
  Object.entries(params).forEach(([key, value]) => url.searchParams.set(key, value));
  return url.toString();
}

That gives reviewers one obvious place to inspect when they need to answer three routine questions quickly: which host is the app using, is Base selected correctly, and which chain ID maps to each environment.

Section

When this guide is most useful

  • wallet dashboards that need Base balances or transaction history
  • bridge, onramp, or checkout flows that verify user activity across chains
  • portfolio and analytics backends that enrich explorer reads elsewhere
  • internal support or ops tools that need fast explorer lookups
  • builder documentation that should answer one exact integration problem instead of a generic blockchain question
Section

FAQ

Is the Etherscan API V2 base URL different for Base?

For the standard Etherscan V2 request pattern, the shared host is https://api.etherscan.io/v2/api. Base is selected with chainid=8453 rather than a separate Base-specific V2 hostname.

What chain ID should I use for Base in Etherscan V2?

Use chainid=8453 for Base when you are sending requests to the Etherscan V2 API host.

What usually breaks a Base request?

The most common issues are the wrong host, a missing or incorrect chainid, bad module or action parameters, malformed addresses, or stale assumptions carried over from older explorer integrations.

Can I assume every endpoint behaves identically across chains?

No. The shared V2 host pattern is useful, but production integrations should still verify endpoint coverage, indexing behavior, and any feature-tier constraints before making chain-wide assumptions.

Should I hardcode explorer configuration in multiple places?

It is safer to centralize the base URL and chain IDs in one request builder so host changes, chain selection, and endpoint parameters stay easy to review.

Next step

Solve the host and chain lookup first, then keep the builder workflow moving

The fast answer is the one most developers need immediately: use the shared Etherscan V2 host and set chainid=8453 for Base. Once that works, the harder implementation work shifts to endpoint selection, caching, retries, and how explorer reads fit into the broader app architecture.