{"openapi":"3.1.0","info":{"title":"ERC Detector API","version":"1.0.0","description":"Tell what kind of contract an address actually is — live, by asking the chain itself. It probes the contract over the public JSON-RPC (eth_call, no key): an ERC-165 interface sweep (ERC-721, ERC-1155 and their metadata/enumerable/royalty extensions) plus an ERC-20 function probe (name, symbol, decimals, totalSupply), and classifies the address as an ERC-20 token, an NFT (ERC-721), a multi-token (ERC-1155), a plain contract or an externally-owned account. A dedicated endpoint returns a token's live on-chain ERC-20 metadata — working for ANY token, including brand-new ones no token list has yet indexed. The \"what is this address\" primitive every wallet, explorer, scanner and security tool needs, across Ethereum, Base, Arbitrum, Optimism, BNB, Polygon and more. Reads straight from the chain; live, short cache only.","contact":{"name":"PremiumApi","url":"https://www.oanor.com/by/premiumapi"}},"servers":[{"url":"https://api.oanor.com/ercdetector-api","description":"oanor gateway"}],"tags":[{"name":"Detect"},{"name":"Reference"},{"name":"Meta"}],"components":{"securitySchemes":{"oanorKey":{"type":"apiKey","in":"header","name":"x-oanor-key","description":"Get your key at https://www.oanor.com/developer/keys"}}},"security":[{"oanorKey":[]}],"paths":{"/v1/detect":{"get":{"operationId":"get_v1_detect","tags":["Detect"],"summary":"Classify an address: ERC-20 / ERC-721 / ERC-1155 / contract / EOA","description":"","parameters":[{"name":"address","in":"query","required":true,"description":"Contract or wallet address (0x + 40 hex)","schema":{"type":"string"},"example":"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},{"name":"chain","in":"query","required":false,"description":"Chain name or id (ethereum, base, arbitrum, optimism, bsc, polygon...)","schema":{"type":"string"},"example":"ethereum"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"Classification from a live ERC-165 interface sweep plus an ERC-20 function probe via eth_call. erc20 holds the token metadata when the address behaves like an ERC-20.","type":"ERC-20 (token)","chain":"ethereum","erc20":{"name":"USD Coin","symbol":"USDC","decimals":6,"total_supply":"51367842183271264"},"erc165":false,"source":"public JSON-RPC (publicnode)","address":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","standards":["ERC-20"],"interfaces":[],"is_contract":true},"meta":{"timestamp":"2026-06-14T08:04:10.808Z","request_id":"c973555b-20f6-4eae-947d-f225549a8a7f"},"status":"ok","message":"Contract type detected successfully","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/erc20":{"get":{"operationId":"get_v1_erc20","tags":["Detect"],"summary":"Live on-chain ERC-20 metadata for any token","description":"","parameters":[{"name":"address","in":"query","required":true,"description":"Token contract address (0x + 40 hex)","schema":{"type":"string"},"example":"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},{"name":"chain","in":"query","required":false,"description":"Chain name or id","schema":{"type":"string"},"example":"ethereum"}],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"name":"USD Coin","note":"Live on-chain ERC-20 metadata read via eth_call (name/symbol/decimals/totalSupply). Works for any token, including ones no token list has indexed. total_supply is the raw integer — divide by decimals.","chain":"ethereum","source":"public JSON-RPC (publicnode)","symbol":"USDC","address":"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48","decimals":6,"total_supply":"51367842183271264"},"meta":{"timestamp":"2026-06-14T08:04:10.896Z","request_id":"0913d88c-2b58-484d-bfea-c4c2bf91b291"},"status":"ok","message":"ERC-20 metadata retrieved successfully","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/interfaces":{"get":{"operationId":"get_v1_interfaces","tags":["Reference"],"summary":"Known ERC-165 interface ids and ERC-20 selectors checked","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"note":"Known ERC-165 interface ids checked by /v1/detect, plus the ERC-20 function selectors probed.","count":9,"source":"static reference","interfaces":[{"name":"ERC-165","interface_id":"0x01ffc9a7"},{"name":"ERC-721","interface_id":"0x80ac58cd"},{"name":"ERC-721 Metadata","interface_id":"0x5b5e139f"},{"name":"ERC-721 Enumerable","interface_id":"0x780e9d63"},{"name":"ERC-721 Receiver","interface_id":"0x150b7a02"},{"name":"ERC-4906 (Metadata Update)","interface_id":"0x49064906"},{"name":"ERC-1155","interface_id":"0xd9b67a26"},{"name":"ERC-1155 Metadata URI","interface_id":"0x0e89341c"},{"name":"ERC-2981 (Royalties)","interface_id":"0x2a55205a"}],"erc20_selectors":{"name":"0x06fdde03","symbol":"0x95d89b41","decimals":"0x313ce567","totalSupply":"0x18160ddd"}},"meta":{"timestamp":"2026-06-14T08:04:10.980Z","request_id":"9cf46238-4cbf-4eac-8924-312189b24d09"},"status":"ok","message":"Known interfaces retrieved successfully","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}},"/v1/meta":{"get":{"operationId":"get_v1_meta","tags":["Meta"],"summary":"Service metadata, supported chains & live sample","description":"","parameters":[],"security":[{"oanorKey":[]}],"responses":{"200":{"description":"OK","content":{"application/json":{"example":{"data":{"chains":["ethereum","base","arbitrum","optimism","bsc","polygon","avalanche","gnosis","fantom","linea","scroll","blast"],"sample":{"type":"ERC-20 (token)","chain":"ethereum","symbol":"USDC"},"source":"public JSON-RPC nodes (publicnode.com) via eth_call / eth_getCode; decoding computed locally","service":"ercdetector-api","endpoints":{"GET /v1/meta":"This document.","GET /v1/erc20":"Live ERC-20 metadata (name/symbol/decimals/totalSupply) for any token (chain, address).","GET /v1/detect":"Classify an address: ERC-20 / ERC-721 / ERC-1155 / contract / EOA (chain, address).","GET /v1/interfaces":"Known ERC-165 interface ids and ERC-20 selectors checked."},"description":"Detect what kind of contract an address is — ERC-20 token, ERC-721 NFT, ERC-1155 multi-token or plain contract — live, by probing it over eth_call (ERC-165 interface sweep + ERC-20 function probe). A dedicated endpoint returns live on-chain ERC-20 metadata for any token. The 'what is this address' primitive for wallets, scanners and security tooling. Live, short cache only.","upstream_status":"ok"},"meta":{"timestamp":"2026-06-14T08:04:11.053Z","request_id":"505a42d0-a929-4aa1-8a5e-c59835c43789"},"status":"ok","message":"Meta","success":true}}}},"401":{"description":"Missing or invalid x-oanor-key header"},"402":{"description":"Active subscription required"},"429":{"description":"Rate-limit or monthly quota reached"},"502":{"description":"Upstream did not respond"}}}}},"x-oanor-pricing":[{"slug":"free","name":"Free","price_cents_month":0,"monthly_call_quota":5800,"rps_limit":3,"hard_limit":true},{"slug":"starter","name":"Starter","price_cents_month":990,"monthly_call_quota":125000,"rps_limit":8,"hard_limit":true},{"slug":"pro","name":"Pro","price_cents_month":3650,"monthly_call_quota":760000,"rps_limit":20,"hard_limit":true},{"slug":"business","name":"Business","price_cents_month":10800,"monthly_call_quota":4900000,"rps_limit":50,"hard_limit":true}],"x-oanor-marketplace-url":"https://www.oanor.com/api/ercdetector-api"}