{ "schemes": [ "http", "https" ], "swagger": "2.0", "info": { "description": "This is the API documentation for the Dora Explorer application.", "title": "Dora Explorer API", "contact": {}, "version": "1.0" }, "basePath": "/api", "paths": { "/v1/clients/consensus": { "get": { "description": "Returns a list of all connected consensus clients with their node information, including PeerDAS support. Sensitive information (PeerID, NodeID, ENR) is only included if ShowSensitivePeerInfos is enabled in the configuration.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "clients" ], "summary": "Get consensus clients information", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/api.APIConsensusClientsResponse" } }, "429": { "description": "Rate limit exceeded", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "500": { "description": "Internal server error", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/v1/clients/execution": { "get": { "description": "Returns a list of all connected execution clients with their node information. Sensitive information (IP addresses, ports, enode) is only included if ShowSensitivePeerInfos is enabled in the configuration.", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "clients" ], "summary": "Get execution clients information", "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/api.APIExecutionClientsResponse" } }, "429": { "description": "Rate limit exceeded", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "500": { "description": "Internal server error", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/v1/das-guardian/mass-scan": { "post": { "description": "Performs DAS Guardian scans on all available consensus client nodes in parallel", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "das-guardian" ], "summary": "Scan all nodes using DAS Guardian", "parameters": [ { "description": "Mass scan parameters", "name": "request", "in": "body", "required": true, "schema": { "$ref": "#/definitions/api.APIDasGuardianMassScanRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/api.APIDasGuardianMassScanResponse" } }, "400": { "description": "Invalid request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "429": { "description": "Rate limit exceeded", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "500": { "description": "Internal server error", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/v1/das-guardian/scan": { "post": { "description": "Performs a comprehensive scan of a beacon node using eth-das-guardian to check P2P connectivity, fork digest validity, head accuracy, and custody information", "consumes": [ "application/json" ], "produces": [ "application/json" ], "tags": [ "das-guardian" ], "summary": "Scan a node using DAS Guardian", "parameters": [ { "description": "Node ENR to scan", "name": "request", "in": "body", "required": true, "schema": { "$ref": "#/definitions/api.APIDasGuardianScanRequest" } } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/api.APIDasGuardianScanResponse" } }, "400": { "description": "Invalid request", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "429": { "description": "Rate limit exceeded", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "500": { "description": "Internal server error", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/v1/epoch/{epoch}": { "get": { "description": "Returns information for a specified epoch by the epoch number or an epoch tag (can be latest or finalized)", "produces": [ "application/json" ], "tags": [ "Epoch" ], "summary": "Get epoch by number, latest, finalized", "parameters": [ { "type": "string", "description": "Epoch number, the string latest or the string finalized", "name": "epoch", "in": "path", "required": true } ], "responses": { "200": { "description": "Success", "schema": { "allOf": [ { "$ref": "#/definitions/api.ApiResponse" }, { "type": "object", "properties": { "data": { "$ref": "#/definitions/api.APIEpochResponseV1" } } } ] } }, "400": { "description": "Failure", "schema": { "$ref": "#/definitions/api.ApiResponse" } }, "500": { "description": "Server Error", "schema": { "$ref": "#/definitions/api.ApiResponse" } } } } }, "/v1/slot/{slotOrHash}": { "get": { "description": "Returns detailed information about a specific slot from the database. Accepts either slot number or block root (0x-prefixed hex)", "produces": [ "application/json" ], "tags": [ "Slot" ], "summary": "Get slot information", "parameters": [ { "type": "string", "description": "Slot number or block root (0x-prefixed hex)", "name": "slotOrHash", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/api.APISlotResponse" } }, "400": { "description": "Invalid slot number or root format", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "404": { "description": "Slot not found", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "500": { "description": "Internal server error", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/v1/slots": { "get": { "description": "Returns a list of slots with various filtering options, sorted by slot number descending", "produces": [ "application/json" ], "tags": [ "Slot" ], "summary": "Get filtered slots list", "parameters": [ { "type": "string", "description": "Filter by graffiti", "name": "graffiti", "in": "query" }, { "type": "boolean", "description": "Invert graffiti filter", "name": "graffiti_invert", "in": "query" }, { "type": "string", "description": "Filter by extra data", "name": "extra_data", "in": "query" }, { "type": "boolean", "description": "Invert extra data filter", "name": "extra_data_invert", "in": "query" }, { "type": "string", "description": "Filter by proposer index", "name": "proposer", "in": "query" }, { "type": "string", "description": "Filter by proposer name", "name": "proposer_name", "in": "query" }, { "type": "boolean", "description": "Invert proposer filter", "name": "proposer_invert", "in": "query" }, { "type": "integer", "description": "Include orphaned blocks (0=exclude, 1=include, 2=only orphaned)", "name": "with_orphaned", "in": "query" }, { "type": "integer", "description": "Include missing blocks (0=exclude, 1=include, 2=only missing)", "name": "with_missing", "in": "query" }, { "type": "number", "description": "Minimum sync aggregate participation (0-100)", "name": "min_sync", "in": "query" }, { "type": "number", "description": "Maximum sync aggregate participation (0-100)", "name": "max_sync", "in": "query" }, { "type": "integer", "description": "Minimum execution time in ms", "name": "min_exec_time", "in": "query" }, { "type": "integer", "description": "Maximum execution time in ms", "name": "max_exec_time", "in": "query" }, { "type": "integer", "description": "Minimum transaction count", "name": "min_tx_count", "in": "query" }, { "type": "integer", "description": "Maximum transaction count", "name": "max_tx_count", "in": "query" }, { "type": "integer", "description": "Minimum blob count", "name": "min_blob_count", "in": "query" }, { "type": "integer", "description": "Maximum blob count", "name": "max_blob_count", "in": "query" }, { "type": "string", "description": "Comma-separated list of fork IDs", "name": "fork_ids", "in": "query" }, { "type": "integer", "description": "Start slot for pagination (inclusive)", "name": "start_slot", "in": "query" }, { "type": "integer", "description": "Number of results to return (max 100, default 100)", "name": "limit", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "$ref": "#/definitions/api.APISlotsResponse" } }, "400": { "description": "Invalid parameters", "schema": { "type": "object", "additionalProperties": { "type": "string" } } }, "500": { "description": "Internal server error", "schema": { "type": "object", "additionalProperties": { "type": "string" } } } } } }, "/v1/validator": { "post": { "description": "This POST endpoint exists because the GET endpoint can lead to a \"URI too long\" error when searching for too many validators based on their pubkeys.", "produces": [ "application/json" ], "tags": [ "Validator" ], "summary": "Get up to 100 validators", "parameters": [ { "description": "Up to 100 validator indicesOrPubkeys, comma separated", "name": "indexOrPubkey", "in": "body", "required": true, "schema": { "$ref": "#/definitions/api.ApiValidatorRequestV1" } } ], "responses": { "200": { "description": "OK", "schema": { "allOf": [ { "$ref": "#/definitions/api.ApiResponse" }, { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/definitions/api.ApiValidatorResponseV1" } } } } ] } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/api.ApiResponse" } } } } }, "/v1/validator/eth1/{eth1address}": { "get": { "produces": [ "application/json" ], "tags": [ "Validator" ], "summary": "Get all validators that belong to an eth1 address", "parameters": [ { "type": "string", "description": "Eth1 address from which the validator deposits were sent", "name": "eth1address", "in": "path", "required": true }, { "type": "string", "description": "Limit the number of results (default: 2000)", "name": "limit", "in": "query" }, { "type": "string", "description": "Offset the results (default: 0)", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "allOf": [ { "$ref": "#/definitions/api.ApiResponse" }, { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/definitions/api.ApiValidatorEth1ResponseV1" } } } } ] } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/api.ApiResponse" } } } } }, "/v1/validator/withdrawalCredentials/{withdrawalCredentialsOrEth1address}": { "get": { "produces": [ "application/json" ], "tags": [ "Validator" ], "summary": "Get all validators that have a specific withdrawal credentials", "parameters": [ { "type": "string", "description": "Provide a withdrawal credential or an eth1 address with an optional 0x prefix", "name": "withdrawalCredentialsOrEth1address", "in": "path", "required": true }, { "type": "integer", "default": 10, "description": "Limit the number of results, maximum: 200", "name": "limit", "in": "query" }, { "type": "integer", "default": 0, "description": "Offset the number of results", "name": "offset", "in": "query" } ], "responses": { "200": { "description": "OK", "schema": { "allOf": [ { "$ref": "#/definitions/api.ApiResponse" }, { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/definitions/api.ApiWithdrawalCredentialsResponseV1" } } } } ] } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/api.ApiResponse" } } } } }, "/v1/validator/{indexOrPubkey}": { "get": { "description": "Searching for too many validators based on their pubkeys will lead to a \"URI too long\" error", "produces": [ "application/json" ], "tags": [ "Validator" ], "summary": "Get up to 100 validators", "parameters": [ { "type": "string", "description": "Up to 100 validator indicesOrPubkeys, comma separated", "name": "indexOrPubkey", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "allOf": [ { "$ref": "#/definitions/api.ApiResponse" }, { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/definitions/api.ApiValidatorResponseV1" } } } } ] } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/api.ApiResponse" } } } } }, "/v1/validator/{indexOrPubkey}/deposits": { "get": { "description": "Get all eth1 deposits for up to 100 validators", "produces": [ "application/json" ], "tags": [ "Validators" ], "summary": "Get validator execution layer deposits", "parameters": [ { "type": "string", "description": "Up to 100 validator indicesOrPubkeys, comma separated", "name": "indexOrPubkey", "in": "path", "required": true } ], "responses": { "200": { "description": "OK", "schema": { "allOf": [ { "$ref": "#/definitions/api.ApiResponse" }, { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/definitions/api.ApiValidatorDepositsResponseV1" } } } } ] } }, "400": { "description": "Bad Request", "schema": { "$ref": "#/definitions/api.ApiResponse" } } } } } }, "definitions": { "api.APIConsensusClientMetadata": { "type": "object", "properties": { "attnets": { "type": "string" }, "custody_group_count": { "description": "MetadataV3 field for Fulu", "type": "string" }, "seq_number": { "type": "string" }, "syncnets": { "type": "string" } } }, "api.APIConsensusClientNodeInfo": { "type": "object", "properties": { "client_name": { "type": "string" }, "client_type": { "type": "string" }, "column_indexes": { "type": "array", "items": { "type": "integer" } }, "enr": { "type": "string" }, "enr_decoded": { "type": "object", "additionalProperties": true }, "head_root": { "type": "string" }, "head_slot": { "type": "integer" }, "last_error": { "type": "string" }, "last_refresh": { "type": "string" }, "metadata": { "$ref": "#/definitions/api.APIConsensusClientMetadata" }, "node_id": { "type": "string" }, "peer_count": { "type": "integer" }, "peer_id": { "type": "string" }, "peers_inbound": { "type": "integer" }, "peers_outbound": { "type": "integer" }, "status": { "type": "string" }, "supports_data_column": { "type": "boolean" }, "version": { "type": "string" } } }, "api.APIConsensusClientsResponse": { "type": "object", "properties": { "clients": { "type": "array", "items": { "$ref": "#/definitions/api.APIConsensusClientNodeInfo" } }, "count": { "type": "integer" } } }, "api.APIDasGuardianEvalResult": { "type": "object", "properties": { "column_idx": { "type": "array", "items": { "type": "integer" } }, "downloaded_result": { "type": "array", "items": { "type": "array", "items": { "type": "string" } } }, "error": { "type": "string" }, "node_id": { "type": "string" }, "slots": { "type": "array", "items": { "type": "integer" } }, "valid_column": { "type": "array", "items": { "type": "array", "items": { "type": "boolean" } } }, "valid_kzg": { "type": "array", "items": { "type": "array", "items": { "type": "string" } } }, "valid_slot": { "type": "array", "items": { "type": "boolean" } } } }, "api.APIDasGuardianMassScanRequest": { "type": "object", "properties": { "random_count": { "description": "Number of random slots to select (default: 4)", "type": "integer" }, "random_mode": { "description": "Random slot selection mode: \"non_missed\", \"with_blobs\", \"available\"", "type": "string" }, "slots": { "description": "Optional slot numbers to scan", "type": "array", "items": { "type": "integer" } } } }, "api.APIDasGuardianMassScanResponse": { "type": "object", "properties": { "error": { "type": "string" }, "results": { "description": "ENR -\u003e node result", "type": "object", "additionalProperties": { "$ref": "#/definitions/api.APIMassNodeResult" } }, "slots": { "description": "The slots that were scanned", "type": "array", "items": { "type": "integer" } }, "success": { "type": "boolean" } } }, "api.APIDasGuardianMetadata": { "type": "object", "properties": { "attnets": { "type": "string" }, "custody_group_count": { "type": "integer" }, "seq_number": { "type": "integer" }, "syncnets": { "type": "string" } } }, "api.APIDasGuardianScanRequest": { "type": "object", "properties": { "enr": { "type": "string" }, "random_count": { "description": "Number of random slots to select (default: 4)", "type": "integer" }, "random_mode": { "description": "Random slot selection mode: \"non_missed\", \"with_blobs\", \"available\"", "type": "string" }, "slots": { "description": "Optional slot numbers to scan", "type": "array", "items": { "type": "integer" } } } }, "api.APIDasGuardianScanResponse": { "type": "object", "properties": { "error": { "type": "string" }, "result": { "$ref": "#/definitions/api.APIDasGuardianScanResult" }, "success": { "type": "boolean" } } }, "api.APIDasGuardianScanResult": { "type": "object", "properties": { "eval_result": { "description": "DAS Evaluation Result", "allOf": [ { "$ref": "#/definitions/api.APIDasGuardianEvalResult" } ] }, "libp2p_info": { "description": "P2P Information", "type": "object", "additionalProperties": true }, "remote_metadata": { "description": "Metadata (from RemoteMetadata)", "allOf": [ { "$ref": "#/definitions/api.APIDasGuardianMetadata" } ] }, "remote_status": { "description": "Status Information (from RemoteStatus)", "allOf": [ { "$ref": "#/definitions/api.APIDasGuardianStatus" } ] } } }, "api.APIDasGuardianStatus": { "type": "object", "properties": { "earliest_slot": { "type": "integer" }, "finalized_epoch": { "type": "integer" }, "finalized_root": { "type": "string" }, "fork_digest": { "type": "string" }, "head_root": { "type": "string" }, "head_slot": { "type": "integer" } } }, "api.APIEpochResponseV1": { "type": "object", "properties": { "attestationscount": { "type": "integer" }, "attesterslashingscount": { "type": "integer" }, "averagevalidatorbalance": { "type": "integer" }, "blockscount": { "type": "integer" }, "depositscount": { "type": "integer" }, "eligibleether": { "type": "integer" }, "epoch": { "type": "integer" }, "finalized": { "type": "boolean" }, "globalparticipationrate": { "type": "integer" }, "missedblocks": { "type": "integer" }, "orphanedblocks": { "type": "integer" }, "proposedblocks": { "type": "integer" }, "proposerslashingscount": { "type": "integer" }, "rewards_exported": { "type": "integer" }, "scheduledblocks": { "type": "integer" }, "totalvalidatorbalance": { "type": "integer" }, "ts": { "type": "integer" }, "validatorscount": { "type": "integer" }, "voluntaryexitscount": { "type": "integer" }, "votedether": { "type": "integer" }, "withdrawalcount": { "type": "integer" } } }, "api.APIExecutionClientNodeInfo": { "type": "object", "properties": { "client_name": { "type": "string" }, "enode": { "type": "string" }, "ip": { "type": "string" }, "last_update": { "type": "string" }, "node_id": { "type": "string" }, "port": { "type": "integer" }, "status": { "type": "string" }, "version": { "type": "string" } } }, "api.APIExecutionClientsResponse": { "type": "object", "properties": { "clients": { "type": "array", "items": { "$ref": "#/definitions/api.APIExecutionClientNodeInfo" } }, "count": { "type": "integer" } } }, "api.APIMassNodeResult": { "type": "object", "properties": { "custody_columns": { "description": "Custody column indices", "type": "array", "items": { "type": "integer" } }, "custody_group_count": { "description": "CGC from node metadata", "type": "integer" }, "earliest_slot": { "description": "Earliest available slot from node status", "type": "integer" }, "error": { "type": "string" }, "node_alias": { "type": "string" }, "slot_results": { "description": "Slot -\u003e result details", "type": "object", "additionalProperties": { "$ref": "#/definitions/api.SlotResult" } }, "success": { "type": "boolean" }, "total_columns": { "description": "Total number of columns per slot", "type": "integer" }, "valid_columns": { "description": "Per-slot array of column validity", "type": "array", "items": { "type": "array", "items": { "type": "boolean" } } } } }, "api.APISlotData": { "type": "object", "properties": { "attestationscount": { "type": "integer" }, "attesterslashingscount": { "type": "integer" }, "blob_count": { "type": "integer" }, "blockroot": { "type": "string" }, "depositscount": { "type": "integer" }, "epoch": { "type": "integer" }, "exec_base_fee_per_gas": { "type": "integer" }, "exec_block_hash": { "type": "string" }, "exec_block_number": { "type": "integer" }, "exec_extra_data": { "type": "string" }, "exec_fee_recipient": { "type": "string" }, "exec_gas_limit": { "type": "integer" }, "exec_gas_used": { "type": "integer" }, "exec_transactions_count": { "type": "integer" }, "graffiti": { "type": "string" }, "graffiti_text": { "type": "string" }, "parentroot": { "type": "string" }, "proposer": { "type": "integer" }, "proposerslashingscount": { "type": "integer" }, "slot": { "type": "integer" }, "stateroot": { "type": "string" }, "status": { "type": "string" }, "syncaggregate_participation": { "type": "number" }, "voluntaryexitscount": { "type": "integer" }, "withdrawalcount": { "type": "integer" } } }, "api.APISlotListItem": { "type": "object", "properties": { "attestation_count": { "type": "integer" }, "attester_slashing_count": { "type": "integer" }, "avg_exec_time": { "type": "integer" }, "blob_count": { "type": "integer" }, "block_root": { "type": "string" }, "block_size": { "type": "integer" }, "deposit_count": { "type": "integer" }, "el_extra_data": { "type": "string" }, "epoch": { "type": "integer" }, "eth_block_number": { "type": "integer" }, "eth_transaction_count": { "type": "integer" }, "execution_times": { "type": "array", "items": { "$ref": "#/definitions/models.ExecutionTimeDetail" } }, "exit_count": { "type": "integer" }, "finalized": { "type": "boolean" }, "gas_limit": { "type": "integer" }, "gas_used": { "type": "integer" }, "graffiti": { "type": "string" }, "graffiti_text": { "type": "string" }, "is_mev_block": { "type": "boolean" }, "max_exec_time": { "type": "integer" }, "mev_block_relays": { "type": "string" }, "min_exec_time": { "type": "integer" }, "parent_root": { "type": "string" }, "proposer": { "type": "integer" }, "proposer_name": { "type": "string" }, "proposer_slashing_count": { "type": "integer" }, "recv_delay": { "type": "integer" }, "scheduled": { "type": "boolean" }, "slot": { "type": "integer" }, "state_root": { "type": "string" }, "status": { "type": "string" }, "sync_aggregate_participation": { "type": "number" }, "time": { "type": "string" }, "with_eth_block": { "type": "boolean" } } }, "api.APISlotResponse": { "type": "object", "properties": { "data": { "$ref": "#/definitions/api.APISlotData" }, "status": { "type": "string" } } }, "api.APISlotsData": { "type": "object", "properties": { "next_slot": { "type": "integer" }, "slots": { "type": "array", "items": { "$ref": "#/definitions/api.APISlotListItem" } }, "total_count": { "type": "integer" } } }, "api.APISlotsResponse": { "type": "object", "properties": { "data": { "$ref": "#/definitions/api.APISlotsData" }, "status": { "type": "string" } } }, "api.ApiResponse": { "type": "object", "properties": { "data": {}, "status": { "type": "string" } } }, "api.ApiValidatorDepositsResponseV1": { "type": "object", "properties": { "amount": { "type": "integer" }, "block_number": { "type": "integer" }, "block_ts": { "type": "integer" }, "from_address": { "type": "string" }, "merkletree_index": { "type": "string" }, "publickey": { "type": "string" }, "removed": { "type": "boolean" }, "signature": { "type": "string" }, "tx_hash": { "type": "string" }, "tx_index": { "type": "integer" }, "tx_input": { "type": "string" }, "valid_signature": { "type": "boolean" }, "withdrawal_credentials": { "type": "string" } } }, "api.ApiValidatorEth1ResponseV1": { "type": "object", "properties": { "public_key": { "type": "string" }, "valid_signature": { "type": "boolean" }, "validator_index": { "type": "integer" } } }, "api.ApiValidatorRequestV1": { "type": "object", "properties": { "indicesOrPubkey": { "type": "string" } } }, "api.ApiValidatorResponseV1": { "type": "object", "properties": { "activationeligibilityepoch": { "type": "integer" }, "activationepoch": { "type": "integer" }, "balance": { "type": "integer" }, "effectivebalance": { "type": "integer" }, "exitepoch": { "type": "integer" }, "isonline": { "type": "boolean" }, "name": { "type": "string" }, "pubkey": { "type": "string" }, "slashed": { "type": "boolean" }, "status": { "type": "string" }, "validatorindex": { "type": "integer" }, "withdrawableepoch": { "type": "integer" }, "withdrawalcredentials": { "type": "string" } } }, "api.ApiWithdrawalCredentialsResponseV1": { "type": "object", "properties": { "publickey": { "type": "string" }, "validatorindex": { "type": "integer" } } }, "api.SlotResult": { "type": "object", "properties": { "error": { "type": "string" }, "total_columns": { "type": "integer" }, "valid_column_count": { "type": "integer" } } }, "models.ExecutionTimeDetail": { "type": "object", "properties": { "avg_time": { "type": "integer" }, "client_type": { "type": "string" }, "count": { "type": "integer" }, "max_time": { "type": "integer" }, "min_time": { "type": "integer" } } } }, "securityDefinitions": { "BasicAuth": { "type": "basic" } }, "tags": [ { "description": "Validator related endpoints", "name": "Validator" }, { "description": "Epoch related endpoints", "name": "Epoch" }, { "description": "Client information endpoints", "name": "clients" } ] }