Перейти к содержимому
Курс USDC:$1,0000Газ:
Arcscan

API Arc mainnet

Каждый блок Arc mainnet — от нулевого до того, который предлагается прямо сейчас — через типизированный REST API и через API в форме Etherscan, на языке которого ваш код уже говорит.

Проиндексировано с блока 0

Сеть 5042 проиндексирована с нулевого блока без пропусков, а узел за ней хранит полную историю. Любой блок, любая транзакция, любая квитанция, любой баланс — на всю глубину цепочки.

Не верьте на слово: это утверждает один запрос, и цифры ниже прочитаны из его ответа.

Вживую из сети Arc, идентификатор 5042:
Первый проиндексированный блок0
Последний проиндексированный блок15 111 165
Блоков хранится15 111 166
ПропускиНет
Архивная историяНет

Читается из /v1/chain и обновляется не чаще раза в час.

Базовый URL

Базовый URL один, и вот он.

https://api.arc-scan.io

Вызывается прямо из браузера: в ответе есть access-control-allow-origin: *, разрешены GET, HEAD и OPTIONS. Открыты ETag, заголовки лимитов и X-Request-Id — клиент может их прочитать, а не угадывать. Только эти три метода: POST из браузера сюда не пройдёт, поэтому эндпоинт MCP так недостижим. На curl, бэкенд, бота или индексатор это не влияет.

Точка JSON-RPC

JSON-RPC основной сети Arc на нашем собственном имени. Без ключа, без регистрации, без тарифов — отправьте POST, и она ответит.

https://rpc.arc-scan.io

Вызывается прямо из браузера: в ответе есть access-control-allow-origin: *. Не более 50 вызовов в пакете и 131072 байт в теле; при превышении любого из двух отказ придёт в виде JSON-RPC, а не HTML-страницы ошибки.

Текущая высота

Больше ничего не нужно — ни ключа, ни заголовков, кроме типа содержимого.

curl -s -X POST https://rpc.arc-scan.io -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber"}'

Вернулось

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "0xe0d313"
}

Чего она не сделает

Семейства trace_ и debug_ отклоняются — один измеренный trace_block вернул 28 530 байт на один блок, а каждый вызов этой точки стоит нам денег. Методы подписи отклоняются, потому что у нас нет ключей: подписывайте локально и присылайте eth_sendRawTransaction. Подписки отклоняются потому, что это HTTP и отдавать их здесь не по чему. В каждом отказе указано, какой это из случаев — в поле data.policy, — и прямо сказано, что это наше решение, а не ограничение сети Arc.

И отказ, чтобы вы видели его форму

Отклонённый метод получает −32601 — код, который любая клиентская библиотека уже понимает как «здесь не поддерживается», поэтому определение возможностей деградирует, а не падает с исключением.

curl -s -X POST https://rpc.arc-scan.io -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"trace_block","params":["0x1"]}'

Вернулось

{
  "jsonrpc": "2.0",
  "id": 1,
  "error": {
    "code": -32601,
    "message": "arc-scan.io does not serve trace_block on this endpoint. This is our own policy decision, not a limitation of the Arc network. Trace responses are very large - one measured block returned 28,530 bytes - and this endpoint is metered.",
    "data": {
      "reason": "refused_by_policy",
      "method": "trace_block",
      "policy": "cost",
      "documentation": "https://arc-scan.io/developers"
    }
  }
}

С чего начать

Каждая команда на этой странице была выполнена на работающем сервисе, и каждый показанный ответ — это то, что вернулось.

Что хранится и насколько оно свежее

Константы сети, возможности узла и точный диапазон проиндексированных блоков. Один вызов — и всё остальное на этой странице не приходится принимать на веру.

curl -s -H 'User-Agent: my-app/1.0' https://api.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

Назовите свой клиент в заголовке User-Agent. Наш периметр отвечает error 1010 на несколько строк агента по умолчанию — Python-urllib/3.12 получает 403, — поэтому нетронутый HTTP-клиент падает на первом же запросе, так и не дойдя до нас.

Тот же вызов, который делает ваш существующий код для Etherscan

Ключ передаётся в строке запроса как <mono>apikey</mono> — именно туда его уже кладут клиенты Etherscan.

curl -s -H 'User-Agent: my-app/1.0' "https://api.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

Замените базовый URL. Продолжайте передавать apikey как параметр строки запроса. Больше не меняется ничего: конверт, строковый result и HTTP 200 на каждый ответ остаются тем же контрактом.

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.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: одно событие на каждый зафиксированный блок, около двух в секунду на полусекундной цепочке, и каждое несёт собственные часы сервера, чтобы потребитель мог скорректировать расхождение. Держите соединение открытым — блоки будут приходить. Опрашивать нечего и интервал подбирать не нужно.

Следить за головой цепочки

Эта команда не завершается. Ниже — два подряд идущих события из живого соединения, с разницей в три секунды.

curl -N -H 'User-Agent: my-app/1.0' https://api.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}

Что отдаётся

Проверено вручную, по одному маршруту, на работающем сервисе mainnet, а не сгенерировано из схемы. Сервис публикует больше маршрутов, чем перечислено; перечислено то, что поддерживается.

ЭндпоинтНа что отвечает
/v1/chainИдентификатор сети, нативный токен, возможности узла и точный диапазон блоков, который держит каждый поток индексатора.
/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Транзакции от новых к старым, одна транзакция со статусом и причиной отката, восстановленные для неё фреймы внутренних вызовов, а также неизменённые объекты узла за ней.
/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}/csvCSV для транзакций, внутренних транзакций, логов и переводов токенов, а также маршрут, который переводит диапазон дат в диапазон блоков.Выгрузка всегда про один адрес: address обязателен, а диапазон её сужает, а не заменяет.
/v1/actions/categoriesКатегории, по которым классифицируется то, что транзакция на самом деле сделала.
/v1/stream/headСобытия server-sent, по одному на зафиксированный блок, каждое несёт часы сервера, чтобы потребитель мог скорректировать расхождение.

Поверхность в форме Etherscan

Один путь, диспетчеризация по module и action в строке запроса. Каждый ответ — HTTP 200, так что строгая клиентская библиотека не падает на коде статуса. Принимаются и GET, и POST в форме form-encoded, а module=proxy пропускает тринадцать методов JSON-RPC прямо к узлу.

moduleactionНа что отвечает
accountbalanceНативный баланс, целое строкой с 18 знаками
accountbalancemultiДо 20 адресов за вызов
accounttxlistТранзакции, отправленные адресом или полученные им, из индекса
accounttokentxОтдаётся из просканированного окна; требует startblock и endblockПоля с именем, символом и числом знаков токена в этой сети приходят пустыми. Читайте разрядность из маршрута токена, а не из записи перевода.
accounttokenbalanceНастоящий запрос ERC-20; возвращает собственный масштаб контракта
accountaddresstokenbalanceВсе балансы токенов одного адреса
blockgetblockrewardblockReward — это сумма комиссий транзакций; эмиссии нет, награды за дядей нет
blockgetblocknobytimeДвоичный поиск по высотам; неизменяемо, кешируется навсегда
blockgetblockcountdownИспользует измеренное время блока, а не константу
transactiongetstatusСтатус исполнения
transactiongettxreceiptstatusСтатус квитанции
logsgetLogsДиапазон ограничен; на запрос сверх лимита в ответе назван максимальный размах
contractgetabiABI контракта, верифицированного на ArcscanНи один контракт в этой сети пока не верифицирован, поэтому getabi отвечает NOTOK, а getsourcecode — пустой записью. Развёрнутый байт-код отдаётся в любом случае.
contractgetsourcecodeВерифицированный исходник, настройки компилятора и ABIНи один контракт в этой сети пока не верифицирован, поэтому getabi отвечает NOTOK, а getsourcecode — пустой записью. Развёрнутый байт-код отдаётся в любом случае.
tokentokenholderlistДержатели и балансы по одному токену
statstokensupplyОбщее предложение, прочитанное у самого контракта
statsethsupplyНативное предложение, целое строкой с 18 знаками
statsethpriceТокен газа здесь по построению равен доллару, поэтому возвращается 1.00
statsdailytxnfeeСуммарные комиссии за каждые полные сутки UTC
statsdailynewaddressАдреса, впервые увиденные за каждые полные сутки UTC
proxyeth_*Методы блока, транзакции, вызова, кода, хранилища, газа и сырой отправки

Лимит запросов, ошибки и постраничность

Лимит запросов

Публичному вызывающему доступен всплеск в 300 запросов, пополняющийся со скоростью 60 в секунду. Каждый ответ сообщает, где вы находитесь, а отказ — это HTTP 429 с заголовком retry-after.

Ведро привязано к адресу вызывающего в том виде, в каком его видит наш периметр, поэтому все за одним NAT или за одним облачным исходящим адресом делят одно ведро.

x-ratelimit-limit: 300
x-ratelimit-remaining: 299

Ошибки

На /api отказ — это HTTP 200, где status равен 0, а в result лежит фраза о причине; это никогда не 404, так что строгая клиентская библиотека на нём не падает.

На /v1 запрос, отклонённый как некорректный, возвращается через периметр как 404, а не как 400. Проверьте параметры, прежде чем решить, что маршрута нет.

Постраничность

Списочные маршруты используют курсор: в ответе есть page.next, и если передать его обратно как cursor, придёт следующая страница. Размер страницы ограничен сотней.

На что этот API не отвечает

Опубликовано, чтобы вы это обходили заранее, а не обнаруживали в процессе.

Внутренние транзакции

Спросите про одну транзакцию — и получите её внутренние вызовы: маршрут трассировки одной транзакции отвечает 200 с настоящими фреймами, а account/txlistinternal отдаёт те же фреймы, если передать txhash. Спросите про адрес или про всю сеть — и получите отказ, потому что в этой установке собственный индекс трассировок Arcscan не содержит ни одного блока: /v1/explore/internal-txs отвечает 501 CAPABILITY_UNAVAILABLE с указанием недостающей возможности, account/txlistinternal по address отказывает и называет причину, а CSV-выгрузка internal возвращает только заголовок без строк. Это отказ, который видно, а не укороченный список, которого не видно. Изменения состояния — отдельный пробел: маршрут состояния одной транзакции по-прежнему отвечает 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
Наш поток балансов хранит только взаимозаменяемые балансы — одну сумму на пару «токен и держатель», без измерения по идентификатору токена, — поэтому инвентарь NFT из него прочитать нельзя. На форму того же вопроса для ERC-20 ответ есть.
token.tokeninfo
Большинство полей этого действия находятся вне сети: цена, капитализация, сайт, ссылки на соцсети. Arcscan не хранит внесетевых данных о токенах и не обращается к ценовому оракулу. Ончейн-половина — имя, символ, десятичные знаки, общее предложение, число держателей — обслуживается маршрутом токена.
contract.verifysourcecode
Верификация не принимает поля формы Etherscan со «сплющенным» исходником. Отправляйте стандартный JSON для Solidity через страницу верификации — именно там этот маршрут доступен.

Как попросить ключ

Если вы строите что-то на этих данных, напишите нам: кто вы, что вы делаете и какой примерно объём ожидаете. Это формирует требования к системе ключей, и так вы узнаете об отдельном адресе API до объявления.

А пока базовый URL выше отдаёт данные без аутентификации, а параметр apikey принимается и игнорируется, так что существующий клиент Etherscan продолжает работать без изменений.

Полный справочник по маршрутам, сгенерированный из собственной схемы сервиса, находится на странице документации API.

API Arc mainnet — Arc от Circle, ID сети 5042 | Arcscan