14 KiB
Track API Contracts
Complete API contract definitions for all 4 tracks of SolaceScanScout Explorer.
Track 1: Public Meta Explorer (No Auth Required)
Base URL
/api/v1/track1
Rate Limits
- Anonymous: 10 req/s, 100 req/min per IP
- Caching: 10-30s TTL via Redis
Endpoints
GET /api/v1/track1/blocks/latest
Get latest blocks.
Query Parameters:
limit(optional, default: 10, max: 50): Number of blocks to returnpage(optional, default: 1): Page number
Response:
{
"data": [
{
"number": 12345,
"hash": "0x...",
"timestamp": "2024-01-20T10:30:00Z",
"transaction_count": 42,
"gas_used": "15000000",
"gas_limit": "30000000"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 1000
}
}
Error Responses:
429 Too Many Requests: Rate limit exceeded500 Internal Server Error: RPC error
GET /api/v1/track1/txs/latest
Get latest transactions.
Query Parameters:
limit(optional, default: 10, max: 50): Number of transactions to returnpage(optional, default: 1): Page number
Response:
{
"data": [
{
"hash": "0x...",
"from": "0x...",
"to": "0x...",
"value": "1000000000000000000",
"block_number": 12345,
"timestamp": "2024-01-20T10:30:00Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 5000
}
}
GET /api/v1/track1/block/:number
Get block by number.
Path Parameters:
number(required): Block number (integer)
Response:
{
"data": {
"number": 12345,
"hash": "0x...",
"parent_hash": "0x...",
"timestamp": "2024-01-20T10:30:00Z",
"transaction_count": 42,
"gas_used": "15000000",
"gas_limit": "30000000",
"base_fee_per_gas": "20000000000",
"miner": "0x...",
"difficulty": "0"
}
}
Error Responses:
404 Not Found: Block not found400 Bad Request: Invalid block number
GET /api/v1/track1/tx/:hash
Get transaction by hash.
Path Parameters:
hash(required): Transaction hash (0x...)
Response:
{
"data": {
"hash": "0x...",
"from": "0x...",
"to": "0x...",
"value": "1000000000000000000",
"gas": "21000",
"gas_price": "20000000000",
"block_number": 12345,
"block_hash": "0x...",
"transaction_index": 0,
"status": "success",
"timestamp": "2024-01-20T10:30:00Z"
}
}
Error Responses:
404 Not Found: Transaction not found400 Bad Request: Invalid hash format
GET /api/v1/track1/address/:addr/balance
Get address ETH balance.
Path Parameters:
addr(required): Ethereum address (0x...)
Response:
{
"data": {
"address": "0x...",
"balance": "1000000000000000000",
"balance_wei": "1000000000000000000",
"balance_ether": "1.0"
}
}
Error Responses:
400 Bad Request: Invalid address format
GET /api/v1/track1/bridge/status
Get bridge monitoring status.
Response:
{
"data": {
"status": "operational",
"chains": {
"138": {
"name": "Defi Oracle Meta Mainnet",
"status": "operational",
"last_sync": "2024-01-20T10:30:00Z"
},
"1": {
"name": "Ethereum Mainnet",
"status": "operational",
"last_sync": "2024-01-20T10:29:00Z"
}
},
"total_transfers_24h": 150,
"total_volume_24h": "5000000000000000000000"
}
}
Track 2: Full Indexed Explorer (Track 2 Required)
Base URL
/api/v1/track2
Authentication
- Required: JWT token with
track: 2claim - Header:
Authorization: Bearer <token>
Rate Limits
- Track 2: 100 req/s, 1000 req/min per user
Endpoints
GET /api/v1/track2/address/:addr/txs
Get address transaction history (paginated).
Path Parameters:
addr(required): Ethereum address (0x...)
Query Parameters:
page(optional, default: 1): Page numberlimit(optional, default: 20, max: 100): Items per pagetype(optional): Filter by type (sent,received,all)
Response:
{
"data": [
{
"hash": "0x...",
"from": "0x...",
"to": "0x...",
"value": "1000000000000000000",
"block_number": 12345,
"timestamp": "2024-01-20T10:30:00Z",
"status": "success",
"direction": "sent"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 500,
"total_pages": 25
}
}
Error Responses:
401 Unauthorized: Missing or invalid token403 Forbidden: Insufficient track level400 Bad Request: Invalid address format
GET /api/v1/track2/address/:addr/tokens
Get address token balances (ERC-20).
Path Parameters:
addr(required): Ethereum address (0x...)
Response:
{
"data": {
"address": "0x...",
"tokens": [
{
"contract": "0x...",
"symbol": "USDC",
"name": "USD Coin",
"decimals": 6,
"balance": "1000000",
"balance_formatted": "1.0",
"price_usd": "1.00",
"value_usd": "1.00"
}
],
"total_tokens": 5,
"total_value_usd": "1500.00"
}
}
GET /api/v1/track2/token/:contract
Get token information and stats.
Path Parameters:
contract(required): Token contract address (0x...)
Response:
{
"data": {
"contract": "0x...",
"symbol": "USDC",
"name": "USD Coin",
"decimals": 6,
"total_supply": "1000000000000000",
"holders": 5000,
"transfers_24h": 1500,
"volume_24h": "5000000000000"
}
}
GET /api/v1/track2/search?q=
Unified search endpoint.
Query Parameters:
q(required): Search query (address, tx hash, or block number)
Response:
{
"data": {
"type": "address",
"result": {
"address": "0x...",
"balance": "1000000000000000000",
"tx_count": 500
}
}
}
Search Types:
address: Returns address datatransaction: Returns transaction datablock: Returns block data
GET /api/v1/track2/address/:addr/internal-txs
Get internal transactions for an address.
Path Parameters:
addr(required): Ethereum address (0x...)
Query Parameters:
page(optional, default: 1): Page numberlimit(optional, default: 20, max: 100): Items per page
Response:
{
"data": [
{
"transaction_hash": "0x...",
"from": "0x...",
"to": "0x...",
"value": "1000000000000000000",
"block_number": 12345,
"timestamp": "2024-01-20T10:30:00Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 100
}
}
Track 3: Analytics & Forensics (Track 3 Required)
Base URL
/api/v1/track3
Authentication
- Required: JWT token with
track: 3claim - Header:
Authorization: Bearer <token>
Rate Limits
- Track 3: 50 req/s, 500 req/min per user (lower due to complexity)
Endpoints
GET /api/v1/track3/analytics/flows
Get flow tracking data (address → address).
Query Parameters:
from(optional): Source addressto(optional): Destination addresstoken(optional): Token contract addressstart_date(optional): Start date (ISO 8601)end_date(optional): End date (ISO 8601)limit(optional, default: 50, max: 200): Number of flows
Response:
{
"data": {
"flows": [
{
"from": "0x...",
"to": "0x...",
"token": "0x...",
"amount": "1000000000000000000",
"count": 5,
"first_seen": "2024-01-20T10:00:00Z",
"last_seen": "2024-01-20T10:30:00Z"
}
],
"total_flows": 100,
"total_volume": "5000000000000000000000"
}
}
GET /api/v1/track3/analytics/bridge
Get bridge analytics and flow history.
Query Parameters:
chain_from(optional): Source chain IDchain_to(optional): Destination chain IDstart_date(optional): Start date (ISO 8601)end_date(optional): End date (ISO 8601)
Response:
{
"data": {
"transfers_24h": 150,
"volume_24h": "5000000000000000000000",
"chains": {
"138": {
"outbound": 75,
"inbound": 75,
"volume_out": "2500000000000000000000",
"volume_in": "2500000000000000000000"
}
},
"top_tokens": [
{
"token": "0x...",
"symbol": "USDC",
"transfers": 50,
"volume": "2000000000000000000000"
}
]
}
}
GET /api/v1/track3/analytics/token-distribution
Get token concentration and distribution analysis.
Path Parameters:
contract(required): Token contract address (0x...)
Query Parameters:
top_n(optional, default: 100): Number of top holders
Response:
{
"data": {
"contract": "0x...",
"symbol": "USDC",
"total_supply": "1000000000000000",
"holders": 5000,
"distribution": {
"top_10_percent": "60.5",
"top_1_percent": "25.0",
"gini_coefficient": "0.75"
},
"top_holders": [
{
"address": "0x...",
"balance": "100000000000000",
"percentage": "10.0"
}
]
}
}
GET /api/v1/track3/analytics/address-risk
Get address risk analysis.
Path Parameters:
addr(required): Ethereum address (0x...)
Response:
{
"data": {
"address": "0x...",
"risk_score": 0.25,
"risk_level": "low",
"factors": {
"suspicious_activity": false,
"known_scam": false,
"high_volume": true,
"token_concentration": "medium"
},
"flags": []
}
}
Track 4: Operator Tools (Track 4 Required)
Base URL
/api/v1/track4
Authentication
- Required: JWT token with
track: 4claim - Additional: Wallet signature verification
- Header:
Authorization: Bearer <token> - Header:
X-Wallet-Signature: <signature>
Security
- IP Whitelist: Required
- Role Allow-list: Required
- Audit Logging: All requests logged immutably
Rate Limits
- Track 4: 20 req/s, 200 req/min per user (strict limits)
Endpoints
GET /api/v1/track4/operator/bridge/events
Get bridge operator events and control state.
Query Parameters:
chain_id(optional): Filter by chain IDevent_type(optional): Filter by event typestart_date(optional): Start date (ISO 8601)end_date(optional): End date (ISO 8601)
Response:
{
"data": {
"events": [
{
"id": "evt_123",
"chain_id": 138,
"event_type": "transfer",
"timestamp": "2024-01-20T10:30:00Z",
"status": "completed",
"details": {}
}
],
"control_state": {
"paused": false,
"maintenance_mode": false,
"last_update": "2024-01-20T10:30:00Z"
}
}
}
Error Responses:
401 Unauthorized: Missing or invalid token403 Forbidden: Insufficient track level or not on IP whitelist403 Forbidden: Invalid wallet signature
GET /api/v1/track4/operator/validators
Get validator/sequencer status and information.
Response:
{
"data": {
"validators": [
{
"address": "0x...",
"status": "active",
"stake": "1000000000000000000000",
"uptime": "99.5",
"last_block": 12345,
"last_seen": "2024-01-20T10:30:00Z"
}
],
"total_validators": 10,
"active_validators": 9
}
}
GET /api/v1/track4/operator/contracts
Get contract registry and status.
Query Parameters:
chain_id(optional): Filter by chain IDtype(optional): Filter by contract type
Response:
{
"data": {
"contracts": [
{
"address": "0x...",
"chain_id": 138,
"type": "bridge",
"name": "CCIP Router",
"status": "active",
"version": "1.0.0",
"last_verified": "2024-01-20T10:00:00Z"
}
]
}
}
GET /api/v1/track4/operator/protocol-state
Get protocol configuration and state.
Response:
{
"data": {
"protocol_version": "1.0.0",
"chain_id": 138,
"config": {
"bridge_enabled": true,
"max_transfer_amount": "1000000000000000000000000",
"fee_structure": {}
},
"state": {
"total_locked": "50000000000000000000000000",
"total_bridged": "10000000000000000000000000",
"active_bridges": 2
},
"last_updated": "2024-01-20T10:30:00Z"
}
}
Common Error Responses
All endpoints may return these common errors:
400 Bad Request
{
"error": "bad_request",
"message": "Invalid request parameters",
"details": {}
}
401 Unauthorized
{
"error": "unauthorized",
"message": "Authentication required"
}
403 Forbidden
{
"error": "forbidden",
"message": "Insufficient permissions",
"required_track": 2
}
404 Not Found
{
"error": "not_found",
"message": "Resource not found"
}
429 Too Many Requests
{
"error": "rate_limit_exceeded",
"message": "Rate limit exceeded",
"retry_after": 60
}
500 Internal Server Error
{
"error": "internal_error",
"message": "An internal error occurred",
"request_id": "req_123"
}
Authentication Flow
Wallet Authentication (Tracks 2-4)
-
Request Nonce
POST /api/v1/auth/nonce Body: { "address": "0x..." } Response: { "nonce": "random_string", "expires_at": "..." } -
Sign and Authenticate
POST /api/v1/auth/wallet Body: { "address": "0x...", "signature": "0x...", "nonce": "random_string" } Response: { "token": "jwt_token", "expires_at": "...", "track": 2, "permissions": [...] } -
Use Token
Authorization: Bearer <jwt_token>
Rate Limit Headers
All responses include rate limit headers:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1640995200
Pagination
Paginated endpoints use consistent pagination:
Query Parameters:
page: Page number (1-indexed)limit: Items per page
Response:
{
"pagination": {
"page": 1,
"limit": 20,
"total": 500,
"total_pages": 25,
"has_next": true,
"has_prev": false
}
}