Verify an Ethereum signature: recover the signer of a message
Verify an Ethereum personal_sign (EIP-191) signature: recover the address that signed a message and, given an expected address, say whether it matches. Works for ordinary wallets (EOAs); smart-contract wallets sign by ERC-1271, which this offline check does not cover. Use for sign-in-with-wallet, proving wallet ownership or checking a signed order. A malformed signature is 400, uncharged.
Inputs
| Name | Type | Description |
|---|---|---|
message (required) | string | The exact message that was signed (or 0x hex with raw=true) |
signature (required) | string | 0x signature, 65 bytes (130 hex characters) |
address | string | Optional expected signer address to compare |
raw | string | true to treat a 0x message as raw bytes instead of text |
Request
Over HTTP, with a card key from /credits:
curl -H "Authorization: Bearer adt_…" "https://agent-data-tools.revmesh2074.workers.dev/evm/verify-signature?message=hello&signature=0xf16ea9a3478698f695fd1401bfe27e9e4a7e8e3da94aa72b021125e31fa899cc573c48ea3fe1d4ab61a9db10c19032026e3ed2dbccba5a178235ac27f94504311c"
Or one of your 25 free calls, no key:
curl "https://agent-data-tools.revmesh2074.workers.dev/evm/verify-signature?message=hello&signature=0xf16ea9a3478698f695fd1401bfe27e9e4a7e8e3da94aa72b021125e31fa899cc573c48ea3fe1d4ab61a9db10c19032026e3ed2dbccba5a178235ac27f94504311c&trial=1"
Without a key, the same URL answers 402 Payment Required with x402 and MPP terms, so an agent with a wallet pays per call in USDC (Base, Polygon, Arbitrum or Solana over x402; Base or Tempo over MPP) and retries.
Example result
{
"recovered": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"expected": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
"valid": true,
"standard": "EIP-191 personal_sign"
}
From an AI agent (MCP)
Add the MCP server to Claude, Cursor or any MCP client. This tool is evm_verify_signature, and the first 25 successful calls are free:
https://agent-data-tools.revmesh2074.workers.dev/mcp