Arc 메인넷 API
지금 보고 계신 곳은 테스트넷 사이트입니다
블록 0 부터 인덱싱
체인 5042 는 제네시스 블록부터 빠짐없이 인덱싱되어 있고, 그 뒤의 노드는 전체 이력을 보관합니다. 어떤 블록도, 어떤 트랜잭션도, 어떤 영수증도, 어떤 잔액도, 체인이 시작된 지점까지 거슬러 올라갑니다.
그냥 믿지 마십시오. 호출 한 번이 그것을 말해 주며, 아래 수치는 바로 그 호출에서 읽은 것입니다.
/v1/chain 에서 읽어 오며, 최대 한 시간에 한 번 갱신됩니다.
기본 URL
기본 URL 은 하나이며, 바로 이것입니다.
https://api-testnet.arc-scan.io브라우저에서 직접 호출할 수 있습니다. 응답에 access-control-allow-origin: *이 포함되며 GET, HEAD, OPTIONS를 허용합니다. ETag, 레이트 리밋 헤더, X-Request-Id를 노출하므로 클라이언트가 추측하지 않고 읽을 수 있습니다. 다만 이 세 가지 메서드만 허용되어 브라우저에서 POST는 보낼 수 없고, 그래서 MCP 엔드포인트는 이 경로로 접근할 수 없습니다. curl, 백엔드, 봇, 인덱서는 영향을 받지 않습니다.
여기서 시작하십시오
이 페이지의 모든 명령은 운영 중인 서비스에 대해 실제로 실행했으며, 표시된 모든 응답은 그때 돌아온 내용입니다.
무엇을 보유하고 있고 얼마나 최신인가
체인 상수, 노드 능력, 그리고 정확히 어떤 블록이 인덱싱되어 있는지. 이 한 번의 호출이면 이 페이지의 나머지를 믿음으로 받아들일 필요가 없습니다.
curl -s -H 'User-Agent: my-app/1.0' https://api-testnet.arc-scan.io/v1/chain
반환값
{ "chain_id": 5042, "name": "Arc", "is_testnet": false, "mainnet_soon": false, "native": { "symbol": "USDC", "decimals": 18 }, "erc20_native": { "address": "0x3600000000000000000000000000000000000000", "decimals": 6 }, "block_time_ms": 506, "finality": "instant", "capabilities": { "ots": false, "ots_search": false, "trace": true, "debug": false, "archive": true, "tx_index": true, "holder_index": true, "verified_source": false, "verified_source_note": "<-- elided -->", "internal_transactions": true }, "index": { "available": true, "streams": [ { "stream": "balances", "genesis_block": 0, "last_contiguous_block": 13849844, "from_block": 0, "to_block": 13849844, "ranges": 1, "blocks_indexed": 13849845, "contiguous_from_genesis": true }, { "stream": "chain", "genesis_block": 0, "last_contiguous_block": 13849856, "from_block": 0, "to_block": 13849856, "ranges": 1, "blocks_indexed": 13849857, "contiguous_from_genesis": true }, { "stream": "traces", "genesis_block": 0, "last_contiguous_block": -1, "from_block": null, "to_block": null, "ranges": 0, "blocks_indexed": 0, "contiguous_from_genesis": false } ], "head_block": 13849856, "chain_blocks_indexed": 13849857, "chain_genesis_block": 0, "chain_first_indexed_block": 0, "covers_chain_from_block": 0, "complete_above_start_block": true, "unindexed_blocks_below_start": 0, "complete": true, "message": null }, "capabilities_note": null, "capabilities_note_phrases": [] }
User-Agent 를 보내십시오
기존 Etherscan 코드가 이미 보내고 있는 그 호출
키는 쿼리 문자열에 <mono>apikey</mono> 로 들어갑니다. Etherscan 클라이언트가 이미 그것을 두는 자리입니다.
curl -s -H 'User-Agent: my-app/1.0' "https://api-testnet.arc-scan.io/api?module=account\ &action=txlist&address=0x03a13352ef67977d1601ec1276e9bc27c0ee7b75\ &startblock=13800000&endblock=13830000&page=1&offset=1&sort=desc\ &apikey=YourApiKeyToken"
반환값
{ "status": "1", "message": "OK", "result": [ { "blockNumber": "13830000", "timeStamp": "1785842041", "hash": "0x3ae69af3843877c10d1aedde0fb299f0de358a76c4b704f338fc738b5d952ef5", "nonce": "88966", "blockHash": "", "transactionIndex": "0", "from": "0x92Df01DB3C69a49f4c4E694849E44C75D62B6752", "to": "0x03a13352eF67977d1601ec1276e9BC27C0Ee7b75", "value": "0", "gas": "598264", "gasPrice": "40000000000", "isError": "0", "txreceipt_status": "1", "input": "", "contractAddress": "", "cumulativeGasUsed": "348673", "gasUsed": "348673", "confirmations": "2933", "methodId": "0x38aaba3d", "functionName": "open" } ] }
기존 Etherscan 코드 옮기기
한 주소의 트랜잭션 CSV
모든 내보내기는 하나의 주소에 관한 것이라 <mono>address</mono> 가 필수이며, 블록 또는 날짜 범위는 그것을 좁힐 뿐입니다. 데이터셋은 네 가지 — <mono>transactions</mono>, <mono>internal</mono>, <mono>logs</mono>, <mono>token-transfers</mono> — 이고, <mono>/v1/export/limits</mono> 가 한도에 부딪히기 전에 한도를 알려 줍니다.
curl -s -H 'User-Agent: my-app/1.0' "https://api-testnet.arc-scan.io/v1/export/transactions/csv\ ?address=0x03a13352ef67977d1601ec1276e9bc27c0ee7b75\ &from_block=13800000&to_block=13800010"
반환값
block_number,block_time_utc,block_timestamp,tx_hash,tx_index,from,to,created_contract,direction,value_raw,value_18dec,fee_raw,fee_18dec,gas_limit,gas_used,effective_gas_price_raw,nonce,tx_type,method_id,input_size,status 13800001,2026-08-04T07:00:48Z,1785826848,0xb244d2791aa392fcc49e2c6bca9df0b6c402da2c1cd322f6356724fb77cc3131,0,0x8031885f93e31676132128557e987a011ff99d27,0x03a13352ef67977d1601ec1276e9bc27c0ee7b75,,in,0,0,13951720000000000,0.01395172,570664,348793,40000000000,141603,2,0x38aaba3d,516,success
새 블록은 폴링이 아니라 밀어 보내집니다
/v1/stream/head 는 진짜 text/event-stream 입니다. 커밋된 블록마다 이벤트 하나, 0.5 초 체인에서 초당 약 두 건이며, 각각 서버 자신의 시계를 실어 소비자가 시차를 보정할 수 있게 합니다. 연결만 열어 두면 블록이 옵니다. 폴링할 것도, 조정할 주기도 없습니다.
체인 헤드를 따라가기
이 명령은 끝나지 않습니다. 아래는 실제 연결에서 3 초 간격으로 연달아 온 두 이벤트입니다.
curl -N -H 'User-Agent: my-app/1.0' https://api-testnet.arc-scan.io/v1/stream/head
반환값
event: head data: {"height": 13830746, "hash": "0xc580470583007f827ebfb3098b66d0682528c4ebaca4eb1213ab992c5952e65e", "timestamp": 1785842418, "tx_count": 1, "server_now": 1785842422, "available": true} event: head data: {"height": 13830751, "hash": "0x63d064be03dc0f5d530e10350b8dddd3de2cc8e6dbbffbe59306bb9fdc96c162", "timestamp": 1785842421, "tx_count": 1, "server_now": 1785842422, "available": true}
무엇을 제공하는가
스키마에서 생성한 것이 아니라, 운영 중인 메인넷 서비스에 대해 라우트를 하나씩 직접 확인했습니다. 서비스가 공개하는 라우트는 이보다 많으며, 여기 실린 것이 우리가 지원하는 것입니다.
| 엔드포인트 | 무엇에 답하는가 |
|---|---|
/v1/chain | 체인 id, 네이티브 토큰, 노드 능력, 그리고 각 인덱서 스트림이 보유한 정확한 블록 범위. |
/v1/network/status/v1/network/validators | 체인 헤드와 그 경과 초, 실측 블록 시간, 그리고 활성 검증자 집합. |
/v1/blocks/v1/blocks/{ref}/v1/blocks/{ref}/txs | 최신순 블록, 단일 블록, 그리고 그 안의 트랜잭션. 모든 블록은 그것을 제안한 검증자를 밝힙니다. |
/v1/txs/v1/txs/{hash}/v1/txs/{hash}/trace/v1/txs/{hash}/raw | 최신순 트랜잭션, 상태와 revert 사유를 포함한 단일 트랜잭션, 그 트랜잭션에서 복원한 내부 호출 프레임, 그리고 그 뒤의 수정되지 않은 노드 객체. |
/v1/address/{addr}/v1/address/{addr}/txs/v1/address/{addr}/logs/v1/address/{addr}/activity | 잔액과 활동을 갖춘 주소, 주고받은 트랜잭션, 발생시킨 로그, 그리고 그 주소를 스친 모든 일을 하나로 합친 타임라인. |
/v1/address/{addr}/tokens/v1/address/{addr}/facts/v1/address/{addr}/contract | 주소가 보유한 토큰 잔액, 자금의 출처와 최초·최근 활동 시점, 그리고 컨트랙트라면 배포된 바이트코드. |
/v1/tokens/{addr}/v1/tokens/{addr}/holders/v1/tokens/{addr}/transfers | 한 토큰의 온체인 사실, 잔액순 보유자, 그리고 전송 내역. |
/v1/approvals/{addr} | 주소가 부여하고 아직 취소하지 않은 모든 ERC-20, ERC-721, ERC-1155 승인. |
/v1/search/v1/search/suggest | 높이, 해시, 주소, 토큰을 해석하며 입력 중 제안을 제공합니다. |
/v1/stats/summary/v1/stats/gas/v1/stats/tx-history | 네트워크 요약, 가스 통계, 그리고 완전한 UTC 일자 기준 일별 트랜잭션 이력. |
/v1/charts/v1/charts/{metric}/v1/charts/{metric}/csv | 스물네 개 일별 지표의 카탈로그. 각각 JSON 또는 CSV 로 읽을 수 있습니다. |
/v1/explore/* | 체인 전역 목록: 계정, 컨트랙트, 토큰, 토큰 전송, 주소 라벨, 이름이 붙은 개체의 디렉터리, 그리고 선택한 구간의 상위 통계. |
/v1/filter/limits/v1/filter/transactions/v1/filter/token-transfers | 주소, 메서드, 금액, 자산, 상태, 범위로 트랜잭션과 토큰 전송을 질의합니다. 한도 라우트가 경계에 부딪히기 전에 그 경계를 알려 줍니다. |
/v1/export/limits/v1/export/resolve/v1/export/{dataset}/csv | 트랜잭션, 내부 트랜잭션, 로그, 토큰 전송의 CSV, 그리고 날짜 범위를 블록 범위로 옮겨 주는 라우트.내보내기는 언제나 하나의 주소에 관한 것입니다. address 는 필수이며, 범위는 그것을 대체하지 않고 좁힙니다. |
/v1/actions/categories | 트랜잭션이 실제로 무엇을 했는지 분류하는 데 쓰이는 범주. |
/v1/stream/head | 커밋된 블록마다 하나씩 오는 서버 전송 이벤트. 각각 서버 시계를 실어 소비자가 시차를 보정할 수 있게 합니다. |
Etherscan 형태의 표면
하나의 경로에서 쿼리 문자열의 module 과 action 으로 분기합니다. 모든 응답이 HTTP 200 이므로 엄격한 클라이언트 라이브러리가 상태 코드 때문에 깨지지 않습니다. GET 과 form-encoded POST 를 모두 받으며, module=proxy 는 열세 개의 JSON-RPC 메서드를 노드로 그대로 통과시킵니다.
| module | action | 무엇에 답하는가 |
|---|---|---|
account | balance | 네이티브 잔액, 소수점 18자리 정수 문자열 |
account | balancemulti | 호출당 최대 20개 주소 |
account | txlist | 한 주소가 보내거나 받은 트랜잭션. 색인에서 읽습니다 |
account | tokentx | 스캔된 구간에서 제공. startblock과 endblock이 필요합니다이 체인에서는 토큰 이름·심볼·소수 자릿수 필드가 빈 값으로 옵니다. 자릿수는 전송 레코드가 아니라 토큰 라우트에서 읽으십시오. |
account | tokenbalance | 진짜 ERC-20 조회. 계약 자신의 소수 스케일을 반환합니다 |
account | addresstokenbalance | 한 주소가 보유한 모든 토큰 잔액 |
block | getblockreward | blockReward는 트랜잭션 수수료의 합계입니다. 발행도 엉클 보상도 없습니다 |
block | getblocknobytime | 높이에 대한 이진 탐색. 불변이며 영구 캐시됩니다 |
block | getblockcountdown | 상수가 아니라 실측 블록 시간을 사용합니다 |
transaction | getstatus | 실행 상태 |
transaction | gettxreceiptstatus | 영수증 상태 |
logs | getLogs | 범위 제한 있음. 범위를 넘는 요청에는 최대 폭을 명시해 응답합니다 |
contract | getabi | Arcscan에서 검증된 컨트랙트의 ABI이 체인에는 아직 검증된 컨트랙트가 없어 getabi 는 NOTOK 을, getsourcecode 는 빈 레코드를 답합니다. 배포된 바이트코드는 어느 쪽이든 제공됩니다. |
contract | getsourcecode | 검증된 소스, 컴파일러 설정, ABI이 체인에는 아직 검증된 컨트랙트가 없어 getabi 는 NOTOK 을, getsourcecode 는 빈 레코드를 답합니다. 배포된 바이트코드는 어느 쪽이든 제공됩니다. |
token | tokenholderlist | 토큰 하나의 보유자와 잔액 |
stats | tokensupply | 총 공급량. 컨트랙트에서 직접 읽습니다 |
stats | ethsupply | 네이티브 공급량, 소수점 18자리 정수 문자열 |
stats | ethprice | 가스 토큰은 구조상 달러이므로 1.00을 보고합니다 |
stats | dailytxnfee | 완전한 UTC 하루 단위의 트랜잭션 수수료 합계 |
stats | dailynewaddress | 완전한 UTC 하루 단위로 처음 나타난 주소 |
proxy | eth_* | 블록, 트랜잭션, call, code, storage, gas 및 raw 전송 메서드 |
요청 한도, 오류, 페이징
요청 한도
공개 호출자에게는 300 건의 버스트가 주어지고 초당 60 건씩 다시 채워집니다. 모든 응답이 현재 위치를 알려 주며, 거절은 HTTP 429 로 retry-after 를 함께 실어 보냅니다.
버킷은 우리 엣지가 보는 호출자 주소를 기준으로 계산되므로, 하나의 NAT 또는 하나의 클라우드 송신 주소를 함께 쓰는 호출자들은 같은 버킷을 나눠 씁니다.
x-ratelimit-limit: 300 x-ratelimit-remaining: 299
오류
/api 에서 거절은 HTTP 200 이며 status 가 0, result 에 이유가 문장으로 들어갑니다. 결코 404 가 아니므로 엄격한 클라이언트 라이브러리가 그것 때문에 깨지지 않습니다.
/v1 에서 잘못된 요청으로 판정된 것은 엣지를 거쳐 400 이 아니라 404 로 돌아옵니다. 라우트가 없다고 결론짓기 전에 파라미터를 확인하십시오.
페이징
목록 라우트는 커서 페이징을 씁니다. 응답에 page.next 가 실리고, 그것을 cursor 로 돌려보내면 다음 페이지가 옵니다. 페이지 크기는 100 이 상한입니다.
이 API 가 답하지 않는 것
부딪혀 발견하는 대신 미리 우회할 수 있도록 공개합니다.
내부 트랜잭션
트랜잭션 하나를 물으면 그 내부 호출을 받습니다. 단일 트랜잭션 트레이스 라우트는 200 과 실제 프레임을 돌려주고, account/txlistinternal 도 txhash 를 넘기면 같은 프레임을 돌려줍니다. 주소나 체인 전체를 물으면 대신 거절을 받습니다. 이 배포에서는 Arcscan 자체 트레이스 인덱스에 블록이 하나도 없기 때문입니다. /v1/explore/internal-txs 는 빠진 능력을 밝히며 501 CAPABILITY_UNAVAILABLE 로 답하고, address 로 조회한 account/txlistinternal 은 이유를 적어 거절하며, internal CSV 내보내기는 헤더만 있고 행은 없습니다. 이것은 알아챠 수 있는 거절이지, 알아챠 수 없는 짧은 목록이 결코 아닙니다. 상태 변경은 별개의 결손입니다. 단일 트랜잭션 상태 라우트는 여전히 501 로 답합니다. 상태 차이는 트랜잭션을 그 블록 직전 상태에 다시 실행해야 나오는데, 이 체인을 읽는 엔드포인트가 그 호출을 제공하지 않기 때문입니다.
로그 조회 한 번이 닿는 범위
logs/getLogs 는 체인 5042 에서 답하며, 한 번에 최대 10,000 블록까지입니다. 그보다 넓은 요청은 그 상한을 밝히며 거절되지, 범위의 일부만 조용히 답해 주지 않습니다. account/tokentx 도 답하며 startblock 과 endblock 이 필요하고 최대 200,000 블록까지입니다. 두 상한 모두 우리 자체 인덱스에는 적용되지 않으며, 더 넓은 질문은 거기서 답합니다. 주소별로는 주소 로그 라우트, 토큰별로는 토큰 전송 라우트, 체인 전역으로는 /v1/explore/token-transfers 입니다.
검증된 소스
우리 검증 제공자가 체인 5042 를 다루지 않으므로 오늘 이곳에 검증된 컨트랙트는 없고, 그것이 바뀌기 전까지는 검증할 수도 없습니다. 배포된 바이트코드, 생성 바이트코드, 컨트랙트 생성자는 그와 무관하게 제공됩니다.
오프체인 데이터
오라클 가격도, 시가총액도, 로고도, 웹사이트도, 사람이 큐레이션한 거래소 라벨도 없습니다. 우리가 공개하는 주소 라벨은 체인 데이터로 증명되는 것들 — 검증자, 시스템 컨트랙트, 배포를 우리가 지켜본 컨트랙트 — 이며, 추측으로 붙인 라벨은 앞으로도 없습니다.
거절로 답하는 액션
하나의 일반 오류가 아니라, 각자 자기 이유를 result 에 담아 돌려줍니다.
contract.getcontractcreation- 체인 5042 뒤의 노드는 otterscan 네임스페이스를 노출하지 않습니다. 컨트랙트의 생성자와 생성 트랜잭션은 주소 컨트랙트 라우트에 있습니다.
account.getminedblocks- Arc 에는 채굴도 블록 보상도 없습니다. 블록은 순환하는 BFT 검증자 집합이 제안하며, 블록 안의 유일한 가치는 트랜잭션 수수료입니다. 제안자 컬럼에도 인덱스가 없어 전체 테이블 스캔 없이는 답할 수 없습니다. 대신 블록 라우트가 검증자를 밝힙니다.
account.tokennfttx- ERC-721 전송은 인덱싱되어 있지만 주소 기준은 아닙니다. 전송 테이블에 송신자·수신자 인덱스가 없어 주소로 거르면 전체 스캔이 됩니다. 토큰별로, 그리고 체인 전역으로는 읽을 수 있습니다.
account.token1155tx- ERC-1155 도 동일합니다.
account.addresstokennftbalance- 우리 잔액 스트림은 대체 가능한 잔액만 저장합니다. 토큰과 보유자 쌍마다 하나의 수량이며 token id 차원이 없으므로 NFT 인벤토리를 읽어 낼 수 없습니다. 같은 질문의 ERC-20 형태에는 답이 있습니다.
token.tokeninfo- 이 액션의 필드 대부분은 오프체인입니다. 가격, 시가총액, 웹사이트, 소셜 링크. Arcscan 은 오프체인 토큰 데이터를 보유하지 않으며 가격 오라클도 조회하지 않습니다. 온체인 절반 — 이름, 심볼, 소수 자릿수, 총 공급량, 보유자 수 — 은 토큰 라우트가 제공합니다.
contract.verifysourcecode- 검증은 Etherscan 의 평탄화된 소스 폼 필드를 받지 않습니다. Solidity 표준 JSON 을 검증 페이지로 제출하십시오. 그 라우트가 닿는 곳이 거기입니다.
키 요청하기
서비스 자체 스키마에서 생성된 라우트별 전체 레퍼런스는 API 문서 페이지에 있습니다.