# REST API Specification ## Overview This document specifies the REST API for the explorer platform. The API follows RESTful principles and provides comprehensive access to blockchain data, search, and analytics. **Base URL**: `https://api.explorer.d-bis.org/v1` **Authentication**: API Key via `X-API-Key` header (optional for read-only endpoints with rate limits) ## API Design Principles 1. **RESTful**: Use HTTP methods appropriately (GET, POST, etc.) 2. **Consistent**: Uniform response format 3. **Versioned**: `/v1` in path, version in response headers 4. **Paginated**: All list endpoints support pagination 5. **Filtered**: Support filtering and sorting 6. **Documented**: OpenAPI 3.0 specification ## Response Format ### Success Response ```json { "data": { ... }, "meta": { "pagination": { "page": 1, "page_size": 20, "total": 100, "total_pages": 5 } } } ``` ### Error Response ```json { "error": { "code": "not_found", "message": "Resource not found", "details": {}, "request_id": "uuid" } } ``` ## Endpoints ### Blocks #### List Blocks `GET /blocks` **Query Parameters**: - `chain_id` (integer, required): Chain ID - `page` (integer, default: 1): Page number - `page_size` (integer, default: 20, max: 100): Items per page - `min_block` (integer): Minimum block number - `max_block` (integer): Maximum block number - `miner` (string): Filter by miner address - `sort` (string, default: "number"): Sort field (number, timestamp, gas_used) - `order` (string, default: "desc"): Sort order (asc, desc) **Response**: ```json { "data": [ { "chain_id": 138, "number": 12345, "hash": "0x...", "timestamp": "2024-01-01T00:00:00Z", "miner": "0x...", "transaction_count": 100, "gas_used": 15000000, "gas_limit": 20000000 } ], "meta": { "pagination": {...} } } ``` #### Get Block by Number `GET /blocks/{chain_id}/{number}` **Response**: Single block object #### Get Block by Hash `GET /blocks/{chain_id}/hash/{hash}` **Response**: Single block object ### Transactions #### List Transactions `GET /transactions` **Query Parameters**: - `chain_id` (integer, required) - `block_number` (integer): Filter by block - `from_address` (string): Filter by sender - `to_address` (string): Filter by recipient - `status` (string): Filter by status (success, failed) - `min_value` (string): Minimum value - `page`, `page_size`, `sort`, `order` **Response**: Array of transaction objects #### Get Transaction by Hash `GET /transactions/{chain_id}/{hash}` **Response**: Single transaction object with full details **Includes**: - Transaction data - Receipt data - Logs - Traces (if available) #### Get Transaction Receipt `GET /transactions/{chain_id}/{hash}/receipt` **Response**: Transaction receipt object ### Addresses #### Get Address Info `GET /addresses/{chain_id}/{address}` **Response**: ```json { "address": "0x...", "chain_id": 138, "balance": "1000000000000000000", "balance_usd": "3000.00", "transaction_count": 500, "token_count": 10, "label": "My Wallet", "tags": ["wallet"], "is_contract": false } ``` #### Get Address Transactions `GET /addresses/{chain_id}/{address}/transactions` **Query Parameters**: Standard pagination and filtering **Response**: Array of transactions #### Get Address Token Holdings `GET /addresses/{chain_id}/{address}/tokens` **Query Parameters**: - `type` (string): Filter by token type (ERC20, ERC721, ERC1155) - `page`, `page_size` **Response**: Array of token holdings with balances #### Get Address NFTs `GET /addresses/{chain_id}/{address}/nfts` **Response**: Array of NFT holdings (ERC-721/1155) ### Tokens #### List Tokens `GET /tokens` **Query Parameters**: - `chain_id` (integer, required) - `type` (string): Filter by type - `verified` (boolean): Filter verified tokens - `search` (string): Search by name or symbol - `page`, `page_size`, `sort`, `order` **Response**: Array of token objects #### Get Token Info `GET /tokens/{chain_id}/{address}` **Response**: Token details including metadata #### Get Token Holders `GET /tokens/{chain_id}/{address}/holders` **Query Parameters**: Pagination **Response**: Array of holder addresses with balances #### Get Token Transfers `GET /tokens/{chain_id}/{address}/transfers` **Query Parameters**: Pagination, `from_address`, `to_address` **Response**: Array of token transfers ### Contracts #### Get Contract Info `GET /contracts/{chain_id}/{address}` **Response**: Contract details including verification status, source code, ABI #### Verify Contract `POST /contracts/{chain_id}/{address}/verify` **Request Body**: ```json { "compiler_version": "0.8.19", "optimization_enabled": true, "optimization_runs": 200, "source_code": "...", "constructor_arguments": "0x...", "verification_method": "standard_json" } ``` **Response**: Verification status #### Get Contract Source Code `GET /contracts/{chain_id}/{address}/source` **Response**: Source code and metadata #### Get Contract ABI `GET /contracts/{chain_id}/{address}/abi` **Response**: Contract ABI JSON ### Logs #### Get Logs `GET /logs` **Query Parameters**: - `chain_id` (integer, required) - `address` (string): Filter by contract address - `topic0` (string): Filter by event signature - `from_block` (integer): Start block - `to_block` (integer): End block - `page`, `page_size` **Response**: Array of log objects ### Traces #### Get Transaction Traces `GET /transactions/{chain_id}/{hash}/traces` **Response**: Array of trace objects #### Get Block Traces `GET /blocks/{chain_id}/{number}/traces` **Response**: Array of trace objects for all transactions in block ### Search #### Unified Search `GET /search` **Query Parameters**: - `chain_id` (integer, optional): Filter by chain - `q` (string, required): Search query - `type` (string): Filter by type (block, transaction, address, token, contract) - `page`, `page_size` **Response**: Mixed array of results with type indicators ### Analytics #### Network Stats `GET /analytics/{chain_id}/network/stats` **Response**: ```json { "current_block": 12345, "tps": 15.5, "gps": 30000000, "avg_gas_price": 20000000000, "pending_transactions": 50 } ``` #### Gas Price Statistics `GET /analytics/{chain_id}/gas/price` **Query Parameters**: - `period` (string): Time period (1h, 24h, 7d, 30d) **Response**: Gas price statistics (min, max, avg, percentiles) #### Top Contracts `GET /analytics/{chain_id}/contracts/top` **Query Parameters**: - `by` (string): Sort by (transactions, gas_used, value) - `limit` (integer, default: 100) **Response**: Array of top contracts ## Pagination All list endpoints support pagination: **Query Parameters**: - `page` (integer, default: 1): Page number (1-indexed) - `page_size` (integer, default: 20, max: 100): Items per page **Response Metadata**: ```json { "meta": { "pagination": { "page": 1, "page_size": 20, "total": 500, "total_pages": 25, "has_next": true, "has_prev": false } } } ``` ## Filtering and Sorting **Common Filter Parameters**: - Date ranges: `from_date`, `to_date` - Block ranges: `from_block`, `to_block` - Value ranges: `min_value`, `max_value` - Address filters: `from_address`, `to_address` **Sorting**: - `sort` (string): Field to sort by - `order` (string): `asc` or `desc` ## Rate Limiting See API Gateway specification for rate limiting details. **Rate Limit Headers**: - `X-RateLimit-Limit`: Request limit - `X-RateLimit-Remaining`: Remaining requests - `X-RateLimit-Reset`: Reset timestamp ## OpenAPI Specification Full OpenAPI 3.0 specification available at: - `/api-docs/openapi.json` - Interactive docs: `/api-docs` (Swagger UI) ## Versioning **Current Version**: v1 **Version Header**: `API-Version: 1` **Deprecation**: Deprecated endpoints return `Deprecation` header with deprecation date ## References - API Gateway: See `api-gateway.md` - GraphQL API: See `graphql-api.md` - Etherscan-Compatible API: See `etherscan-compatible-api.md`