MetaMask é a porta de entrada padrão para Ethereum para dezenas de milhões de usuários, e se você executa um dApp, a API do MetaMask é o que fica entre sua interface de usuário e suas chaves de assinatura. A “API do MetaMask” é duas coisas disfarçadas: o provedor window.ethereum injetado definido pelo EIP-1193, e o SDK do MetaMask que estende a mesma superfície para aplicativos móveis, React Native e backends Node.js. Entenda o provedor, e você terá aprendido 80% de todas as integrações de carteira na web.
Este guia aborda como detectar o provedor, solicitar contas, ler a cadeia atual, assinar mensagens com personal_sign e EIP-712, enviar transações, adicionar ou trocar cadeias, e usar o SDK do MetaMask quando você estiver fora de uma extensão de navegador. Você também verá onde ethers.js v6 e viem se encaixam como wrappers de nível superior, e onde Apidog se encaixa no fluxo de trabalho quando você deseja testar as chamadas JSON-RPC subjacentes sem escrever código frontend descartável.
Se você está construindo algo que envolve carteiras, marque isto junto com nosso guia sobre a melhor API de carteira de criptomoedas para uma visão mais ampla do cenário de provedores.
TL;DR
- A API do MetaMask é o provedor EIP-1193 exposto em
window.ethereumnos navegadores, além do SDK do MetaMask para mobile e Node. - Comece com
eth_requestAccountspara solicitar ao usuário que se conecte, então ouça os eventosaccountsChangedechainChanged. - Assine mensagens com
personal_sign, e assine dados estruturados cometh_signTypedData_v4(EIP-712). - Troque de redes com
wallet_switchEthereumChain(EIP-3326) e adicione novas comwallet_addEthereumChain(EIP-3085). - Bibliotecas de nível superior como ethers.js v6, viem e wagmi encapsulam o provedor bruto; Snaps estende o próprio MetaMask.
- Use Apidog para testar endpoints JSON-RPC, simular respostas de transação e depurar assinaturas antes de implantar.
O que é a API do MetaMask?
A API do MetaMask é a interface que o MetaMask expõe a páginas web e aplicativos para interagir com Ethereum e cadeias compatíveis com EVM. Em um navegador, a extensão injeta um objeto provedor em window.ethereum, e esse objeto segue o padrão EIP-1193. Qualquer dApp que vise esse padrão funciona com MetaMask, Coinbase Wallet, Rabby, Frame e dezenas de outros com zero alterações no código.
Fora do navegador, o SDK do MetaMask oferece a mesma estrutura de provedor em React Native, Node.js puro, aplicativos desktop Electron e até scripts do lado do servidor. O SDK lida com o deep-linking e a dança do QR-code que permite que uma carteira MetaMask móvel assine transações solicitadas por um processo desktop ou backend. Por baixo dos panos, ele ainda se comunica via EIP-1193, então o código do seu aplicativo mal muda.
O MetaMask também oferece Snaps, um sistema de plugins que permite que terceiros estendam a carteira com novas cadeias, métodos RPC personalizados e tipos de conta. Snaps estão fora do escopo aqui, mas vale a pena conhecer se você quiser suportar cadeias não-EVM ou fluxos de assinatura personalizados dentro do próprio MetaMask.
Autenticação e configuração
Não há chaves de API para o próprio provedor. A autenticação é o usuário aprovando cada solicitação em sua interface de carteira. Você precisa de duas coisas: uma maneira de detectar o provedor e uma maneira de ouvir as mudanças.
Comece com a detecção. O helper @metamask/detect-provider lida com casos extremos como múltiplas carteiras instaladas, mas você também pode verificar diretamente.
// Detecção com Vanilla JS
import detectEthereumProvider from '@metamask/detect-provider';
const provider = await detectEthereumProvider({ mustBeMetaMask: true });
if (!provider) {
alert('Por favor, instale o MetaMask');
} else {
console.log('MetaMask detectado');
}
Depois de ter o provedor, configure os listeners de eventos antes de solicitar qualquer coisa. Perder o evento accountsChanged é o bug de integração do MetaMask mais comum.
window.ethereum.on('accountsChanged', (accounts) => {
if (accounts.length === 0) {
console.log('Usuário desconectado');
} else {
console.log('Conta ativa:', accounts[0]);
}
});
window.ethereum.on('chainChanged', (chainId) => {
// Boa prática: recarregar a página na mudança de cadeia
window.location.reload();
});
Para aplicativos React, o wagmi lida com tudo isso para você e detecta o MetaMask automaticamente através de seu conector injetado.
Endpoints principais
Todas as chamadas do provedor passam por window.ethereum.request({ method, params }). O nome do método é uma string JSON-RPC, e params é um array ou objeto dependendo do método. Aqui estão as chamadas que cobrem 95% das integrações de dApps.
Solicitar contas e ler a cadeia
// Solicita ao usuário para conectar
const accounts = await window.ethereum.request({
method: 'eth_requestAccounts',
});
const account = accounts[0];
// Lê a cadeia atual
const chainId = await window.ethereum.request({
method: 'eth_chainId',
});
console.log(account, chainId); // '0x...' '0x1' (Ethereum mainnet)
A chamada JSON-RPC bruta equivalente, que você pode disparar em qualquer nó Ethereum, se parece com isto com curl.
curl https://mainnet.infura.io/v3/YOUR_KEY \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'
Para chamadas somente leitura, você não precisa do MetaMask; provedores de nós como Alchemy ou Infura servem o mesmo RPC. Veja nosso [guia da API da Alchemy](http://apidog.com/blog/how-to-use-alchemy-api) para ter a visão completa sobre nós Ethereum hospedados.
Assinar uma mensagem simples
personal_sign é a assinatura clássica legível por humanos. Ela prefixa a mensagem para que os usuários não possam ser enganados a assinar bytes de transação arbitrários.
const message = 'Sign in to Apidog at ' + new Date().toISOString();
const signature = await window.ethereum.request({
method: 'personal_sign',
params: [message, account],
});
Assinar dados estruturados com EIP-712
Para qualquer coisa complexa, como uma permissão ou um desafio de login, use eth_signTypedData_v4. O MetaMask renderiza os campos de forma clara no popup de confirmação, o que protege os usuários e constrói confiança.
const typedData = {
domain: { name: 'Apidog Demo', version: '1', chainId: 1 },
types: {
EIP712Domain: [
{ name: 'name', type: 'string' },
{ name: 'version', type: 'string' },
{ name: 'chainId', type: 'uint256' },
],
Login: [
{ name: 'wallet', type: 'address' },
{ name: 'nonce', type: 'uint256' },
],
},
primaryType: 'Login',
message: { wallet: account, nonce: 42 },
};
const sig = await window.ethereum.request({
method: 'eth_signTypedData_v4',
params: [account, JSON.stringify(typedData)],
});
Enviar uma transação
Transações usam eth_sendTransaction. O MetaMask lida com a estimativa de gás e o gerenciamento de nonce automaticamente.
const txHash = await window.ethereum.request({
method: 'eth_sendTransaction',
params: [{
from: account,
to: '0xRecipientAddressHere',
value: '0x38d7ea4c68000', // 0.001 ETH em wei, hexadecimal
}],
});
Trocar ou adicionar uma cadeia
EIP-3326 e EIP-3085 cobrem a troca para uma cadeia conhecida e a adição de uma nova.
// Trocar para Polygon (chainId 137 = 0x89)
try {
await window.ethereum.request({
method: 'wallet_switchEthereumChain',
params: [{ chainId: '0x89' }],
});
} catch (err) {
if (err.code === 4902) {
// Cadeia ainda não adicionada
await window.ethereum.request({
method: 'wallet_addEthereumChain',
params: [{
chainId: '0x89',
chainName: 'Polygon',
rpcUrls: ['https://polygon-rpc.com'],
nativeCurrency: { name: 'MATIC', symbol: 'MATIC', decimals: 18 },
}],
});
}
}
React com o SDK do MetaMask
O SDK também funciona bem no React comum quando você deseja um único caminho de integração que cubra extensão desktop, deep-link móvel e navegador in-app.
import { MetaMaskProvider, useSDK } from '@metamask/sdk-react';
function Connect() {
const { sdk, connected, account } = useSDK();
return (
<button onClick={() => sdk?.connect()}>
{connected ? account : 'Conectar MetaMask'}
</button>
);
}
export default function App() {
return (
<MetaMaskProvider sdkOptions={{ dappMetadata: { name: 'My dApp' } }}>
<Connect />
</MetaMaskProvider>
);
}
Para aplicativos de produção, envolva o provedor bruto em ethers.js v6 ou viem. Eles oferecem contratos tipados, decodificadores ABI e melhores mensagens de erro, enquanto ainda se comunicam com a mesma API do MetaMask por baixo. Se você também precisar de login por e-mail ou social como fallback, combine o MetaMask com uma carteira embutida através do nosso [guia da API Privy](http://apidog.com/blog/how-to-use-privy-api).
Erros comuns e limites de taxa
MetaMask retorna códigos de erro JSON-RPC padrão. Os que você encontrará com mais frequência:
4001: Usuário rejeitou a solicitação. Mostre uma notificação amigável de “conexão cancelada” e não tente novamente automaticamente.4100: Não autorizado. A conta não está conectada; chameeth_requestAccountsprimeiro.4200: Método não suportado. Raro, mas confirme se a carteira é MetaMask antes de chamar métodos específicos do fornecedor.4902: Cadeia não adicionada. Continue comwallet_addEthereumChain.-32002: Solicitação já pendente. Usuários às vezes clicam no botão duas vezes; implemente um debounce do seu lado.
O provedor em si não tem limite de taxa, mas o RPC subjacente tem. Se você está fazendo proxy de leituras através de Infura ou Alchemy, você está vinculado ao seu nível de serviço. Para fluxos fiduciários como conversão de ETH para USD, a maioria das equipes combina esta integração com uma API de on-ramp e off-ramp fiduciário para que os usuários possam recarregar sem sair do dApp.
Preços da API do MetaMask
A extensão MetaMask e o SDK são gratuitos. Não há cobrança por conexão, por assinatura ou por transação. O MetaMask gera receita através de taxas de swap quando os usuários negociam dentro da carteira e através do MetaMask Card, não de desenvolvedores de dApps.
Os custos que você pagará vêm do endpoint RPC que seu dApp acessa para leituras. Uma camada gratuita da Alchemy ou Infura atende à maioria dos aplicativos pequenos; dApps de produção geralmente custam entre $49 e $299 por mês para um throughput dedicado.
Testando a API do MetaMask com Apidog
A assinatura baseada em navegador é difícil de depurar porque o fluxo de solicitação abrange uma extensão, uma página e, às vezes, um deep-link móvel. É aí que o Apidog ganha seu lugar no kit de ferramentas de desenvolvimento de carteiras. Você pode acessar o endpoint JSON-RPC bruto que seu dApp usa, confirmar que eth_chainId e eth_getBalance retornam o que você espera, e salvar todo o fluxo como uma suíte de testes.
Importe a especificação JSON-RPC do Ethereum, defina a URL do seu nó como uma variável de ambiente, e você terá uma coleção reutilizável para cada cadeia EVM. O Apidog também simula respostas, para que seus desenvolvedores frontend possam construir contra um eth_sendTransaction falso enquanto o contrato inteligente ainda está em auditoria. Para CI, você pode executar a mesma coleção da linha de comando e falhar a build se o formato da resposta mudar. Se você tem lutado com coleções do Postman que nunca sincronizam entre a equipe, nosso guia sobre teste de API sem Postman em 2026 explica por que o Apidog lida melhor com o teste de dApps multi-protocolo.
Baixe o Apidog para começar.
FAQ
- A API do MetaMask funciona no celular?Sim. Use o SDK do MetaMask, que faz deep-link para o aplicativo móvel para assinatura. A superfície do provedor é idêntica à extensão do navegador, então seu código permanece o mesmo. Para uma comparação mais aprofundada com outros SDKs de carteiras móveis, veja nosso resumo das melhores APIs de carteiras de criptomoedas.
- Qual a diferença entre
eth_sign,personal_signeeth_signTypedData_v4?eth_signassina bytes brutos e é perigoso; o MetaMask alerta os usuários de forma agressiva.personal_signprefixa uma mensagem legível por humanos.eth_signTypedData_v4assina dados estruturados EIP-712 e mostra os campos de forma clara na interface do MetaMask. Use os dois últimos; eviteeth_sign. - Preciso de uma chave de API separada do MetaMask?Não. O provedor é gratuito e sem chave. Você precisa de um provedor RPC como Alchemy ou Infura para leituras fora da carteira, que possuem suas próprias chaves.
- Posso usar ethers.js ou viem com o MetaMask?Sim, ambos encapsulam o provedor
window.ethereum. Ethers v6 expõeBrowserProvider(window.ethereum), e viem temcreateWalletClient({ transport: custom(window.ethereum) }). A maioria dos dApps de produção usa um dos dois. - O que acontece se um usuário tiver várias carteiras instaladas?MetaMask implementa EIP-6963, então os dApps podem detectar todas as carteiras instaladas em vez de competir por
window.ethereum. Wagmi e RainbowKit lidam com isso automaticamente. - O MetaMask Snaps está pronto para produção?Sim, Snaps foi lançado para disponibilidade geral em 2024. A maioria dos usos em produção é para suporte a cadeias não-EVM, insights personalizados de transações e integrações de carteiras de hardware.
